一、设置标识
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 过程已成功完成。