提供如下解决方案,实现不同网段数据库之间数据的同步更新:
1.在目的数据库上,创建dblink
create public database link link名字 connect to 源数据库用户名 identified by "密码"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =服务名)
)
)';
如果创建dblink不成功:
查看该用户是否具有权限?
若无权限则使用管理员账户赋权:
grant create public database link to 当前用户;
2.查看dblink
select owner,object_name from dba_objects where object_type='DATABASE LINK';(上述语句执行需具有管理员用户权限)
select * from test;
select * from test@TESTLINK;
删除dblink:
drop public database link dblinkname;
3.创建存储过程
CREATE OR REPLACE
PROCEDURE test_name AS
BEGIN
delete from test;
insert into test
select * from test@TESTLINK;
commit;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE ('Exception happened,data was rollback');
ROLLBACK;
END;
删除存储过程:
如果该存储过程存在则删除
drop procedure if exists test_name;
查看存储过程(名字都变为大写):
SELECT text
FROM user_source
WHERE NAME = 'TEST_NAME'
ORDER BY line;
5.创建定时任务
declare
job_id number;
begin
dbms_job.submit(
job_id,
'test;', --存储过程名字
sysdate, --下次执行时间
'TRUNC(sysdate) + 1 +2 / (24)' --执行频率
);
dbms_output.put_line(job_id);
end;
job的运行频率设置
1.例如:每天的凌晨2点执行
Interval => TRUNC(sysdate) + 1 +2 / (24)
删除定时任务操作:
begin
dbms_job.remove(21); --job id
end;
6.查看定时任务
SELECT * FROM USER_JOBS;
7.开启定时任务
BEGIN
DBMS_JOB.RUN(38); --job id
END;
若定时任务自动执行失败:
sql命令行输入:show parameter job_queue_processes
查看 value 是否为0?
若为0 执行:
alter system set job_queue_processes=10 scope=both;
至此,迁移流程结束,当然数据同步的实现方案很多,以实际情况采取最优,有问题也可一起讨论解决