Streams全库复制

一、设置标识

SQL*Plus: Release 10.2.0.1.0 - Production on 星期六9月 1 09:36:23 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> set sqlprompt 'JSSWEB> ';

JSSWEB>

二、创建辅助实例

1. 创建辅助实例

   C:\WINDOWS\system32>oradim –new –sid jssstr

   实例创建。

2. 创建辅助实例的密码文件

   C:\WINDOWS\system32>orapwd file=c:\oracle\database\PWDjssstr.ora password=oracle entries=30

3. 创建助实例的初始化参数文件

1). 创建相应的目录

 

 

2). 创建并修改本地初始化参数

从源库创建初始华文件:

JSSWEB> create pfile='c:\admin\jssstr\pfile\20120901.ora' from spfile;

用记事打开并更改相应的参数。并添加以下两参数:

db_file_name_convert='oradata\jssweb','oradata\jssstr'
log_file_name_convert='oradata\jssweb','oradata\jssstr'

接着:

JSSSTR> create spfile from pfile='c:\admin\jssstr\pfile\20120901.ora';

 

文件已创建。

JSSSTR> startup force nomount;

例程已经启动。

Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             339741572 bytes

Database Buffers          264241152 bytes

Redo Buffers                7135232 bytes

JSSSTR>

 三、查看初始化参数

使用 pfile的修改init<SID>.ora 文件,使用spfile的通过alter system命令修改spile文件,主要包括以下几项(源和目标数据库都需要设置):

  • COMPATIBLE:数据库的兼容版本不能低于10.2.0.1
  • GLOBAL_NAMES:必需设置为true
  • JOB_QUEUE_PROCESSES:设置实例最大同时启用的job里程数不能小于2
  • STREAMS_POOL_SIZE:为streams分配适当的缓存区。参数值不能为0

sql> alter system set global_names=true scope=both;

sql> alter system set aq_tm_processes=10 scope=both;

sql> alter system set streams_pool_size=200m scope=spfile;

执行完成后重启数据库

四、检查归档模式

c:> sqlplus ‘/ as sysdba’

 

sql> alter system set log_archive_dest_1=’location=c:/jssweb/arch’ scope=spfile;

sql> alter system set log_archive_start=TRUE scope=spfile;

sql> alter system set log_archive_format=’ arch%t_%s_%r.arc’ scope=spfile;

sql> shutdown immediate;

sql> startup mount;

sql> alter database archivelog;

sql> alter database open;

 

数据库置为归档模式后,可以按如下方式检验一下

 

sql> archive log list;

 

五、创建表空间及管理员帐户(源库操作)

sql> create tablespace stream_tbs datafile '/data/oradata/jssweb/stream01.dbf' size 200m;

将logminer 的数据字典从system表空间转移到新建的表空间,防止撑满system表空间

sql> execute dbms_logmnr_d.set_tablespace('stream_tbs');

创建管理员

sql> create user strmadmin identified by strmadmin default tablespace stream_tbs quota unlimited on stream_tbs;

 

分配权限

sql> grant connect,resource,dba,aq_administrator_role to strmadmin;

sql> begin

    dbms_streams_auth.grant_admin_privilege( grantee => 'strmadmin', grant_privileges =>true);

   end;

六、 创建数据库链接(源库操作)

以strmadmin身份登录创建:

sql> create database link jssstr connect to strmadmin identified by strmadmin using 'jssstr';

--查看db links

sql> select owner,db_link,host from all_db_links;

 

七、源库执行初始化过程

JSSWEB> declare

  2   empty_tbs dbms_streams_tablespace_adm.tablespace_set;

  3  begin

  4    dbms_streams_adm.pre_instantiation_setup(

  5  maintain_mode => 'global',

  6  tablespace_names => empty_tbs,

  7  source_database => 'jssweb.jss.cn',

  8  destination_database => 'jssstr.jss.cn',

  9  perform_actions => true,

 10  bi_directional => false,

 11  include_ddl => true,

 12  start_processes => true,

 13  exclude_schemas => 'strmadmin',

 14  exclude_flags => dbms_streams_adm.exclude_flags_full +

 15      dbms_streams_adm.exclude_flags_dml +

 16      dbms_streams_adm.exclude_flags_ddl);

 17  end;

 18  /

 

PL/SQL 过程已成功完成。

maintain_mode 只有两个值:GLOBAL,表示数据库级的复制;TRANSPORTABLE TABLESPACES,表示表空间级的复制,需要同时指定 tablespace_names参数,表空间可以是多个PRE_INSTANTIATION_SETUP/POST_INSTANTIATION_SETUP创建表空间级的复制环境。

tablespace_names :要复制的表空间,此处为数据库级的复制,因此此参数为空,不过该参数不能直接指定为null,因为该参数类型为 DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET,因此我们在执行过程前先declare了一个 empty_tbs的变量。

source_datebase :连接到源端数据库的数据库链 。

destination_database :连接到目标端数据库的数据库链 。

perform_actions :如果为true,则过程直接执行。如果为false,则过程并不直接生成复制环境,而是创建复制环境的配置脚本,由dba手动执行(或修改编辑后执 行),因此必须同时设置script_name和script_directory_object两参数,指定脚本输出路径和脚本文件名,不然过程执行将 直接报错。

bi_directional :true时表示启用双向复制。false表示源库向目录库单向复制。

include_ddl :是否同步ddl语句 。

start_processes :是否启用捕获和应用进程 。

exclude_schemas :指定不包含在复制环境中的schemas。*表示全不包括,null表示全部包括(一个bu字,意义千差万别,汉字太奇妙啦),注意,由于源端的捕获进 程不会捕获SYS/SYSTEM/CTXSYS这三个schema,因此即使此处指定null,这三个schema也不会被同步。另外,此参数仅在 MAINTAIN_MODE=>¨GLOBAL¨时有效。

exclude_flags : 这个要好好说说,这个选项是与exclude_schemas组合使用,同时由于该参数值具有多个组合属性,因此设置时也特别需要注意。

有如下可选值:

DBMS_STREAMS_ADM.EXCLUDE_FLAGS_FULL :排除指定schemas中所有对象操作。

DBMS_STREAMS_ADM.EXCLUDE_FLAGS_UNSUPPORTED :排除指定schemas中不支持的对象操作。

上述两值仅能同时选一个,如果两个同时选择在配置时会抛出异常。同时还有下列两个附加选项:

DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML :排除对不支持对象的DML操作。

DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL :排除对不支持对象的DDL操作。

上述四个属性值可以通过"+"号连接来达到同时支持的目的。

比如,对于exclude_schemas参数中指定的schemas对象,复制其DML操作但不复制DDL操作,则设置exclude_flags参数值如下可满足要求:

DBMS_STREAMS_ADM.EXCLUDE_FLAGS_FULL + 

DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL

八、源库创建RMAN备份

RMAN> run{

2> allocate channel c1 device type disk;

3> backup database plus archivelog delete input;

4> }

然后马上查看一下当前系统的scn,并且归档当前的redo

JSSWEB> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

------------------------

                  687812

JSSWEB> alter system archive log current;

System altered.

九、 执行RMAN Duplicate复制数据库

C:\WINDOWS\system32>rman target sys/oracle@jssweb auxiliary/

RMAN> run{

2>  set until scn 687812;

3> duplicate target database to jssstr  open restricted;

9> }

十、连接目标数据库检查global_name

十一、创建目标数据库到源数据库的链接

JSSSTR> conn strmadmin/strmadmin

已连接。

JSSSTR> create database link jssweb connect to strmadmin identified by strmadmin using ‘jssweb’;

不过由于jssstr数据库是由jssweb复制过来的,因此strmadmin用户下也存在一个jssstr.jss.cn的dblink, 如果看其不爽可以将它删除,不过直接删除是不行的,肯定会报ORA-02082错误,因为不能删除与global_name同名的dblink。如果确实 想删除该dblink,方法有二:

A>. 先修改global_name,再删除dblink

JSSSTR> alter database rename global_name to test.jss.cn;

数据库已更改。

JSSSTR> drop database link jssstr.jss.cn;

数据库链接已删除。

JSSSTR> alter database rename global_name to jssstr.jss.cn;

数据库已更改。

B>. 直接删除字典表

JSSSTR> conn / as sysdba

已连接。

JSSSTR> delete link$ where name=¨JSSSTR.JSS.CN¨;

已删除 1 行。

JSSSTR> commit;

提交完成。

十二、在源数据库执行Post_INSTANTIATION_SETUP过程

JSSWEB> declare

  2   empty_tbs dbms_streams_tablespace_adm.tablespace_set;

  3    begin

  4     dbms_streams_adm.post_instantiation_setup(

  5     maintain_mode =>'GLOBAL',

  6     tablespace_names=>empty_tbs,

  7     source_database => 'jssweb.jss.cn',

  8     destination_database =>'jssstr.jss.cn',

  9     perform_actions => true,

 10     bi_directional => false,

 11     include_ddl => true,

 12     start_processes => true,

 13     instantiation_scn => 687811,

 14      exclude_schemas => 'strmadmin',

 15   exclude_flags=>dbms_streams_adm.exclude_flags_full +

 16     dbms_streams_adm.exclude_flags_dml +

 17     dbms_streams_adm.exclude_flags_ddl);

 18  end;

 19  /

 

PL/SQL 过程已成功完成。

十三、 在目标端执行,取消受限连接:

JSSSTR> conn / as sysdba

已连接。

JSSSTR> ALTER SYSTEM DISABLE RESTRICTED SESSION;

系统已更改。

至此,单向同步的streams整库复制环境就算完成了

 

十四、文件路径转换

JSSSTR> conn strmadmin/strmadmin

已连接。

JSSSTR> create or replace procedure file_convert (in_any IN ANYDATA) authid current_user is 

  2    ddl_lcr  SYS.LCR$_DDL_RECORD;

  3    ddl_text CLOB;

  4    rc PLS_INTEGER;

  5  begin

  6    rc := in_any.GETOBJECT(ddl_lcr);

  7    DBMS_LOB.CREATETEMPORARY(ddl_text, true);

  8    ddl_lcr.GET_DDL_TEXT(ddl_text);

  9    ddl_text := replace(ddl_text,’oradata\jssweb’,’oradata\jssstr’);

 10    execute immediate to_char(ddl_text);

 11    DBMS_LOB.FREETEMPORARY(ddl_text);

 12  end;

 13  /

过程已创建。

设置ddl handler:

JSSSTR> select apply_name from dba_apply;

APPLY_NAME                     

------------------------------

APPLY$_JSSWEB_44

JSSSTR> exec DBMS_APPLY_ADM.ALTER_APPLY(apply_name=>‘APPLY$_JSSWEB_44,,ddl_handler=>’strmadmin.file_convert’);

PL/SQL  过程已成功完成。

 

 

 

 

posted @ 2012-09-01 20:20  南宫元耘  阅读(337)  评论(0编辑  收藏  举报