在 $ORACLE_HOME/network/admin/tnsnames.ora 配置服務名(或直接使用 Easy Connect):
TARGET_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.19.27.21)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = TESTDB))
)
測試:tnsping TARGET_DB、sqlplus user/pwd@TARGET_DB。
CREATE DATABASE LINK dblink_target
CONNECT TO target_user IDENTIFIED BY target_pwd
USING 'TARGET_DB'; -- 或 '172.19.27.21:1521/TESTDB'
權限需求:CREATE DATABASE LINK(私有) 或CREATE PUBLIC DATABASE LINK(公共)。
SELECT * FROM dual@dblink_target; -- 基礎連通
SELECT * FROM target_table@dblink_target; -- 業務表查詢
場景:每 2 分鐘透過 DB Link 向目標庫中間表插入數據。
CREATE OR REPLACE PROCEDURE sync_to_target IS
PRAGMA AUTONOMOUS_TRANSACTION; -- 確保職務失敗不影響主事務
BEGIN
INSERT INTO target_table@dblink_target (col1, col2, sync_time)
SELECT col1, col2, SYSDATE FROM local_source_table
WHERE sync_flag = 'N';
UPDATE local_source_table SET sync_flag = 'Y' WHERE sync_flag = 'N';
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Sync failed: ' || SQLERRM);
-- 可選:寫入錯誤日誌表、發送告警郵件
END;
/
VARIABLE job_no NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
job => :job_no,
what => 'sync_to_target;',
next_date => SYSDATE,
interval => 'SYSDATE + 1/24/60' -- 每 2 分鐘
);
COMMIT;
END;
/
PRINT job_no
| 需求 | INTERVAL 值 |
|---|---|
| 每天 1 次 | 'SYSDATE + 1' |
| 每小時 1 次 | 'SYSDATE + 1/24' |
| 每 10 分鐘 | 'SYSDATE + 10/(24*60)' |
| 每 30 秒 | 'SYSDATE + 30/(24*60*60)' |
| 每天固定 08:30 | 'TRUNC(SYSDATE+1) + 8.5/24' |
| 每週二中午 12:00 | 'NEXT_DAY(TRUNC(SYSDATE), ''TUESDAY'') + 0.5' |
| 每月 1 號 00:00 | 'TRUNC(LAST_DAY(SYSDATE)+1)' |
| 不再執行(刪除) | NULL |
-- 查看
SELECT job, what, next_date, interval, failures, broken
FROM dba_jobs WHERE what LIKE '%sync_to_target%';
-- 強制立即執行一次
EXEC DBMS_JOB.RUN(job_no);
-- 修改間隔
EXEC DBMS_JOB.INTERVAL(job_no, 'SYSDATE + 1/24'); -- 改為每小時
-- 暫停/恢復
EXEC DBMS_JOB.BROKEN(job_no, TRUE); -- 暫停
EXEC DBMS_JOB.BROKEN(job_no, FALSE); -- 恢復
-- 刪除
EXEC DBMS_JOB.REMOVE(job_no);
DBMS_JOB 為舊版 API,功能受限(無日曆、無事件驅動、無資源管理)。新專案請使用 DBMS_SCHEDULER:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'SYNC_TO_TARGET_JOB',
job_type => 'STORED_PROCEDURE',
job_action => 'sync_to_target',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY; INTERVAL=2', -- 每 2 分鐘
enabled => TRUE,
comments => 'Sync local to target via DB Link every 2 min'
);
END;
/
-- 查看執行歷史
SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME='SYNC_TO_TARGET_JOB';
CREATE DATABASE LINK ... AUTHENTICATED BY ... 或 Wallet。SQLNET.OUTBOUND_CONNECT_TIMEOUT、TCP.CONNECT_TIMEOUT 防止 Job 掛起。FAILURES > 0 或 BROKEN = 'Y' 觸發告警。SYS.JOB$ 歷史或啟用 Scheduler 自動清理。掌握 DB Link + 定時任務組合,即可輕鬆實現跨庫數據同步、異構遷移、報表數據推送等常見集成場景。