Oracle数据库定时同步
通过执行定时任务从源数据库(sourceDb)向目标数据库(targetDb)进行数据同步操作。
- 数据库版本一致 是进行数据同步的前置条件;
从源数据库导出数据
在配置oracle客户端的服务器上执行以下命令:
exp username/password@sourceDb file=/export/home/oracle/DataSync/table/tableA.dmp tables="(tableA)" &
exp username/password@sourceDb file=/export/home/oracle/DataSync/table/tableB.dmp tables="(tableB)" &
exp username/password@sourceDb file=/export/home/oracle/DataSync/table/tableC.dmp tables="(tableC)" &
如果需要多导出几张表的话,可以进行扩展,该命令需要注意以下事项:
- sourceDb 对应了%ORACLE_HOME%\network\admin\tnsnames.ora 配置文件的数据库名称;
- 每行导出命令后都需要用 &符号 进行连接,这样可以实现同时导出,提高导出效率;
- 执行导出命令的服务器需要与源数据库网络互通;
清空目标数据库数据
清空数据库数据是通过脚本去执行 .sql 文件
脚本:
#!/bin/sh
sqlplus username/password@targetDb <<EOF
@/export/home/oracle/DataSync/list_table.sql;
EOF
.sql文件:
truncate table tableA ;
delete from tableB where 1=1 ;
drop table tableC ;
需要注意以下事项:
- 主键约束 如果要清空的表和其他表有主键约束,需要先将从表drop,再将主表drop;
- 主键约束的小表,可以通过 delete from 命令进行清空;
- 其他的表通过truncate、drop都可以;
可以通过sql语句查看当前数据库的主键约束情况
select (select a.table_name from user_constraints a where a.constraint_name = c.r_constraint_name) 主表表名, c.r_constraint_name 主表主键键约束名, c.table_name 从表表名, c.constraint_name 从表外键约束名 from user_constraints c where c.constraint_type = 'R' ;
目标数据库的数据导入
在进行数据导入时,需要注意主键约束表的导入先后顺序,先导入主表再导入从表,这样的话才能建立起主键约束关系
imp username/password@targetDb full=y file=/export/home/oracle/DataSync/table/tableA.dmp ignore=y
imp username/password@targetDb full=y file=/export/home/oracle/DataSync/table/tableB.dmp ignore=y
imp username/password@targetDb full=y file=/export/home/oracle/DataSync/table/tableC.dmp ignore=y
定时任务的制定
在这里提一下自己遇到的坑:
- 最开始的时候是直接在root用户下新增定时任务,然后定时任务执行脚本时失败,因为root用户下不能够直接执行 exp imp脚本命令;
- 后来把定时任务添加到oracle用户下,新增一个定时任务还是不能直接执行exp imp命令;
- 通过查看网上资料,可以通过配置环境变量 /etc/profile ,在环境变量里面新增oracle的配置,后续在定时任务中新增source /etc/profile 即可执行导出导入命令;
定时任务如下:
30 00 * * * source /etc/profile;cd /export/home/oracle/DataSync;nohup ./clear.sh > clear.out 2>&1
新增环境变量如下
#Oracle
ORACLE_BASE=/export/home/oracle
ORACLE_HOME=/export/home/oracle/product/11.2.0
export ORACLE_BASE ORACLE_HOME
export NLS_LANG=american_america.ZHS16GBK
export LC_ALL=zh_CN.gb2312
LD_LIBRARY_PATH=/export/home/oracle/product/11.2.0/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:$CLASSPATH
export CLASSPATH
export PATH=/export/home/oracle/product/11.2.0/bin:$PATH:.
总结
该方式仅仅适用于对数据实时性要求不高的需求,如果要求实时性很高的话,可以考虑通过高级复制的方式来进行数据同步