在OGG同步的项目中,总会遇到默写表同步失败需要重新表级初始化。这时候采用数据泵来导入导出就需要考虑数据一致性问题,确保我们导出的数据是基于某个scn或者某个时间戳,这样做才能让已经停止的复制进程(replicat)知道从哪里开始追加数据库变化。
12c中数据泵为我们提供了两种一致性导出的参数,一个是基于scn的FLASHBACK_SCN,另一个是基于时间戳的FLASHBACK_TIME
1, 取得当前的scn
这里可以采用两种方法,一种是通过函数取得的,能精确到当前的scn。另一种是向前滚动加1的scn。通常生产环境的数据库都在不停的产生数据变化,scn也随之飞快的变化,选择那种获取scn的方式都可以,能想起哪个就用哪个吧。
方法一, 获取当前的scn
SYS@ora12c >select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
2096931
方法二, 生成当前的scn,该生成动作会促使scn+1
SYS@ora12c >select current_scn from v$database;
CURRENT_SCN
-----------
2096937
2,使用FLASHBACK_SCN参数一致性导出数据
由于语句比较长,在employees 后面采用了换行符号\,注意employee与\之间有空格。下一行的>是回车后自动生成的,表示后面的内容和前面的是一行的。
[oracle@snow ~]$ expdp dp/dp directory=dp_dir dumpfile=20150226.dmp tables=hr.employees \
> flashback_scn=2096937
3,使用FLASHBACK_TIME参数一致性导出数据
在这里建议使用参数文件的方式,这样会省去很多转移符
[oracle@snow ~]$ date
Mon Feb 9 16:08:01 EST 2015
[oracle@snow ~]$ vi flashback.par
userid=dp/dp
directory=dp_dir
dumpfile=20150226_1.dmp
logfile=20150226_1.log
flashback_time="to_timestamp('2015-02-09 16:00:00','yyyy-mm-dd hh24:mi:ss')"
[oracle@snow ~]$
expdp parfile=flashback.par
这里有个小插曲,如果是在虚拟机上做这个实验,并且经常挂起虚拟机(暂停)导致时钟和宿主机时钟不一致,通常是比宿主机慢,会报错。
简单的说就是虚拟机时间慢,为其设置了一个将来的时间导出而报错。使用date看看虚拟机的时间,自然就明白了。
ORA-39001: invalid argument value
ORA-39150: bad flashback time
ORA-08186: invalid timestamp specified
全文完
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29047826/viewspace-1441904/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29047826/viewspace-1441904/