1. 源端信息采集
1.1 确认源端需要复制表名
先查出2016年需要复制的表。步骤7的Source table:就是打印出复制的列表。
set pagesize 0
select table_name from dba_tables
where owner ='LC00029999'
后续的年份2017,2018..2026,需要复制的表的前缀也如上面的2016年的表。
1.2 需要复制的表所在的表空间
步骤7的Source tablespace:是打印表空间列表
select distinct tablespace_name from dba_segments where owner = 'LC00029999' and segment_name in(
select table_name from dba_tables
where owner ='LC00029999' ;
);
查询结果
CWBASE0002
1.3 当前系统的scn号
步骤7的Source database scn:是打印表空间列表
col current_scn for 9999999999999999
select current_scn from v$database;
18364756374
2. 目标端配置
2.1 目标端先停止复制进程
GGSCI (db01) 18> stop rep_lj
2.2 目标端调整复制进程的参数
根据1.1查出的表名,配置映射关系 (如map luqiaojianshe.LSHSXM2020, target luqiaojianshe.LSHSXM2020;)。配置从2016到2026年的表映射关系。
对于2016年的表,要配置其复制的起点( 参考1.3查到的scn号),如(map LC00029999.LSHSXM2016, target luqiaojianshe.LSHSXM2016,FILTER ( @GETENV ("TRANSACTION", "CSN") > 18364756374);)。
参考:路桥建设,补充的映射关系见附件。
步骤7的Target goldengate relicat params:是打印目标端需要补充的参数
3. 源端数据导出
根据1.1查出的表名和1.3查出的scn号,导出表数据。
导出的表,参照1.1查询的结果。Scn号参照1.3的查询结果。
路桥建设的数据导出参数如下:
userid="/ as sysdba"
directory=dump_dir
dumpfile=lqjs_LC00029999_2016.dump
logfile=lqjs_LC00029999_2016.log
tables=LC00029999.LSHSXM2016,LC00029999.LSXMLB2016,LC00029999.LSCP2016,LC00029999.LSCPLB2016,LC00029999.ZWFZYE2016,LC00029999.ZWFZYS
2016,LC00029999.ZWFZYSJK2016,LC00029999.ZWFZYSLOG2016,LC00029999.ZWPZLX2016,LC00029999.ZWPZFL2016,LC00029999.ZWPZFLJK2016,LC00029999
.ZWPZFLLOG2016,LC00029999.ZWPZK2016,LC00029999.ZWPZKJK2016,LC00029999.ZWPZKLOG2016,LC00029999.LSGSCS2016,LC00029999.LSSETS2016,LC000
29999.ZWKMZD2016,LC00029999.ZWKMYE2016
FLASHBACK_SCN=18364756374
expdp使用上诉参数导出。
步骤7的EXPDP parameter:是打印源端expdp的参数
4. 目标端数据导入
将数据装入到目标端.
表空间映射关系:1源端的表空间参见1.2的查询结果;目标端的表空间是目标端对应用户的表空间(本例是路桥建设的表空间luqiaojianshe)。
路桥建设的数据导入参数如下
userid="/ as sysdba"
directory=DUMP_DIR
dumpfile=lqjs_LC00029999_2016.dump
logfile=impdp_luqiaojianshe2016.log
EXCLUDE=trigger
tables=LC00029999.LSHSXM2016,LC00029999.LSXMLB2016,LC00029999.LSCP2016,LC00029999.LSCPLB2016,LC00029999.ZWFZYE2016,LC00029999.ZWFZYS2016,LC00029999.ZWFZYSJK2016,LC00029999.ZWFZYSLOG2016,LC00029999.ZWPZLX2016,LC00029999.ZWPZFL2016,LC00029999.ZWPZFLJK2016,LC00029999.ZWPZFLLOG2016,LC00029999.ZWPZK2016,LC00029999.ZWPZKJK2016,LC00029999.ZWPZKLOG2016,LC00029999.LSGSCS2016,LC00029999.LSSETS2016,LC00029999.ZWKMZD2016,LC00029999.ZWKMYE2016
remap_schema=LC00029999:luqiaojianshe
remap_tablespace=CWBASE0002:luqiaojianshe
cluster=N
parallel=2
impdp使用上诉参数导入。
步骤7的IMPDP parameter:是打印目标端impdp的参数
5. 启动复制进程
5.1 启动进程
启动前提:1,当数据正确导入,2复制进程参数已经调整好(步骤2.2)
GGSCI (db01) 20> start rep_lj
5.2 取消2016年的scn过滤
取消scn过滤的前提:当前复制进程已经复制到晚于scn号(步骤1.3查询的结果)的点。
取消方法
1,先stop复制进程
2,删除2016年表映射关系后面的filter
如 map LC00029999.LSHSXM2016, target luqiaojianshe.LSHSXM2016,FILTER ( @GETENV ("TRANSACTION", "CSN") > 18364756374);
变更为 map LC00029999.LSHSXM2016, target luqiaojianshe.LSHSXM2016;
3,启动复制进程
6. 创建2017到2026年的表
参建2016年的表结构,创建2017到2026年的表。需要创建的表的前缀参见1.1的查询结果
如:
create table luqiaojianshe.LSHSXM2017 as select * from luqiaojianshe.LSHSXM2016 where 1 = 0;
create table luqiaojianshe.LSHSXM2018 as select * from luqiaojianshe.LSHSXM2016 where 1 = 0;
...
create table luqiaojianshe.LSHSXM2026 as select * from luqiaojianshe.LSHSXM2016 where 1 = 0;
步骤7的target create table:是打印目标端创建2017到2026年表的代码。
7. 附件脚本
下面的脚本,能自动生产上述步骤需要的代码。
使用方法,先在源端执行脚本,生产procedure。
在源端调用脚本。调用方式如下:
SQL> exec proc_ogg_2016('LC00019999', 'SIGONGJU'); -- 第一个参数是源端数据库的schema,第二个参数是目标端复制的schema
需要注意项:
1,这里expdp和impdp用的directory都是dump_dir,需要在源端和目标端确认是否存在该directory对象,没有的话自己创建。
2,一定要先停目标端的复制,在执行该脚本。步骤之间有依赖关系,不要任意调整执行步骤。
3,这里scn必须是统一的。所以,用到的所有代码,必须是同一次执行该存储过程获得的。
4,这里默认的目标端表空间和目标端的复制schema相同。如果不同,请手动修改。
5,脚本只是提高工作效率的。人工校验是必不可少的环节。确认无误后,粘贴执行。
6,脚本内容过长的话,可以先spool,再执行存储过程。
set serveroutput on
set linesize 500
create or replace procedure proc_ogg_2016 (p_source_schema varchar2, p_target_schema varchar2)
is
type typ_tabname
is
table of varchar2(100);
tab_tabname typ_tabname;
tab_tablespace typ_tabname;
int_scn number;
str_table_list varchar2(5000);
begin
select table_name bulk collect into tab_tabname
from dba_tables
where owner =p_source_schema
and (table_name like 'ZWKMYE%2016'
or table_name like 'ZWKMZD%2016'
or table_name like 'LSSETS%2016'
or table_name like 'LSGSCS%2016'
or table_name like 'ZWPZK%2016'
or table_name like 'ZWPZFL%2016'
or table_name like 'ZWPZLX%2016'
or table_name like 'ZWFZYS%2016'
or table_name like 'ZWFZYE%2016'
or table_name like 'LSDWLB%2016'
or table_name like 'LSWLDW%2016'
or table_name like 'LSCPLB%2016'
or table_name like 'LSCP%2016'
or table_name like 'LSBMZD%2016'
or table_name like 'LSZGZD%2016'
or table_name like 'LSXMLB%2016'
or table_name like 'LSHSXM%2016');
for i in 1 .. tab_tabname.count loop
dbms_output.put_line(tab_tabname(i));
end loop;
select distinct tablespace_name bulk collect into tab_tablespace
from dba_segments where owner = p_source_schema and segment_name in(
select table_name from dba_tables
where owner =p_source_schema and
(table_name like 'ZWKMYE%2016' or
table_name like 'ZWKMZD%2016' or
table_name like 'LSSETS%2016' or
table_name like 'LSGSCS%2016' or
table_name like 'ZWPZK%2016' or
table_name like 'ZWPZFL%2016' or
table_name like 'ZWPZLX%2016' or
table_name like 'ZWFZYS%2016' or
table_name like 'ZWFZYE%2016' or
table_name like 'LSDWLB%2016' or
table_name like 'LSWLDW%2016' or
table_name like 'LSCPLB%2016' or
table_name like 'LSCP%2016' or
table_name like 'LSBMZD%2016' or
table_name like 'LSZGZD%2016' or
table_name like 'LSXMLB%2016' or
table_name like 'LSHSXM%2016')
);
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('Source tablespace: ');
for i in 1 .. tab_tablespace.count loop
dbms_output.put_line(tab_tablespace(i));
end loop;
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('Source database scn: ');
select current_scn into int_scn from v$database;
dbms_output.put_line(int_scn);
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('Target goldengate relicat params: ');
for i in 1 .. tab_tabname.count loop
dbms_output.put_line( 'map ' || p_source_schema || '.' || tab_tabname(i) || ', target ' || p_target_schema || '.' || tab_tabname(i) || ',FILTER ( @GETENV ("TRANSACTION", "CSN") > ' || int_scn || ');');
end loop;
for j in 2017 .. 2026 loop
for i in 1 .. tab_tabname.count loop
dbms_output.put_line( 'map ' || p_source_schema || '.' || replace(tab_tabname(i), '2016', j) || ', target ' || p_target_schema || '.' || replace(tab_tabname(i), '2016', j) || ';');
end loop;
end loop;
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('EXPDP parameter: ');
dbms_output.put_line('export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK');
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('userid="/ as sysdba"');
dbms_output.put_line('directory=dump_dir');
dbms_output.put_line('dumpfile=' || p_target_schema || '_' || p_source_schema || '_2016.dump');
dbms_output.put_line('logfile=' || p_target_schema || '_' || p_source_schema || '_2016.log');
for i in 1 .. tab_tabname.count loop
str_table_list := str_table_list || p_source_schema || '.' || tab_tabname(i) || ',';
end loop;
str_table_list := rtrim(str_table_list, ',');
dbms_output.put_line('tables=' || str_table_list );
dbms_output.put_line('FLASHBACK_SCN=' || int_scn);
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('IMPDP parameter: ');
dbms_output.put_line('export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK');
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('userid="/ as sysdba"');
dbms_output.put_line('directory=dump_dir');
dbms_output.put_line('dumpfile=' || p_target_schema || '_' || p_source_schema || '_2016.dump');
dbms_output.put_line('logfile=' || 'impdp_' || p_target_schema || '_' || p_source_schema || '_2016.log');
dbms_output.put_line('EXCLUDE=trigger');
dbms_output.put_line('tables=' || str_table_list );
dbms_output.put_line('remap_schema=' || p_source_schema || ':' || p_target_schema);
for i in 1 .. tab_tablespace.count loop
dbms_output.put_line('remap_tablespace=' || tab_tablespace(i) || ':' || p_target_schema);
end loop;
dbms_output.put_line('cluster=N');
dbms_output.put_line('parallel=2');
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
dbms_output.put_line('target create table: ');
dbms_output.put_line('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
for j in 2017 .. 2026 loop
for i in 1 .. tab_tabname.count loop
dbms_output.put_line( 'create table ' || p_target_schema || '.' || replace(tab_tabname(i), '2016', j) || ' as select * from ' || p_target_schema || '.' ||tab_tabname(i) || ' where 1 = 0;');
end loop;
end loop;
end;
/