:Windows到Linux異構(gòu)部署避坑指南)
簡介本資源是一份面向Oracle數(shù)據(jù)庫管理員與數(shù)據(jù)同步工程師的OGG跨平臺部署實戰(zhàn)指南聚焦Windows源庫到Linux目標庫的實時數(shù)據(jù)同步場景解決異構(gòu)環(huán)境間數(shù)據(jù)復(fù)制、災(zāi)備建設(shè)與業(yè)務(wù)連續(xù)性保障等核心問題。文檔以O(shè)racle GoldenGate 12.2.0.2版本為基礎(chǔ)系統(tǒng)覆蓋源/目標庫歸檔配置、強制日志與附加日志啟用、goldengate用戶權(quán)限授予、enable_goldengate_replication參數(shù)設(shè)置、OGG子目錄初始化、Manager/Extract/Replicat組件配置及基礎(chǔ)監(jiān)控要點內(nèi)容實操性強適合作為生產(chǎn)部署前的技術(shù)驗證與學(xué)習參考。資源為單文件PDF格式共1個文件大小496KB輕量易讀便于快速查閱關(guān)鍵命令與配置邏輯。目前已有296人學(xué)習下載讀者可直接獲取完整配置清單、SQL與Shell命令示例、權(quán)限分配明細及典型故障應(yīng)對提示特別適合需在有限環(huán)境中快速落地OGG同步方案的中級DBA與運維人員。1. Oracle OGG跨平臺同步實戰(zhàn)Windows源庫到Linux目標庫不是裝完就能跑的“黑匣子”你手頭有一套運行在 Windows Server 上的 Oracle 11g 生產(chǎn)庫業(yè)務(wù)要求把核心表實時同步到 LinuxRHEL 7上的災(zāi)備庫——別急著點下載鏈接先看清這個現(xiàn)實OGG 12.2 在 Windows 和 Linux 之間做異構(gòu)同步不是解壓、安裝、啟動三步走的傻瓜流程。我見過太多人卡在ADD EXTRACT后進程狀態(tài)永遠是STOPPED或START REPLICAT時日志里反復(fù)刷ORA-01017: invalid username/password結(jié)果發(fā)現(xiàn)是NLS_LANG編碼沒對齊、ORACLE_HOME路徑寫錯斜杠方向、甚至 Windows 端用的是ogg.exe而 Linux 端必須用./ggsci——這些細節(jié)不摳死同步鏈路就是個擺設(shè)。本文聚焦真實生產(chǎn)級部署從 Windows 源端Oracle 11.2.0.4到 Linux 目標端Oracle 11.2.0.4 / 12.2.0.1覆蓋 OGG 12.2.0.2 全流程重點拆解DDL 同步失效、SCN 初始化偏差、TRANDATA 添加失敗、MGR 端口不通四類高頻翻車點。適合已具備 Oracle DBA 基礎(chǔ)、正被跨平臺同步卡住進度的工程師新手請務(wù)必對照每條命令檢查環(huán)境變量和路徑分隔符。2. 源庫與目標庫底層配置歸檔、附加日志、權(quán)限三座大山必須推平OGG 同步不是“數(shù)據(jù)庫連上就行”它依賴 Oracle 底層日志機制。Windows 和 Linux 的 Oracle 實例雖同源但文件路徑、服務(wù)管理、字符集處理存在本質(zhì)差異。這里不講理論只列實操中必須親手敲、親手驗的硬核步驟。2.1 源庫Windows強制歸檔與日志增強配置注意Windows 下 Oracle 服務(wù)名為OracleServiceSID啟動前需確認服務(wù)已運行。所有 SQL 命令在sqlplus / as sysdba中執(zhí)行不要用 PL/SQL Developer 或 SQL Developer 圖形界面連避免 NLS 設(shè)置干擾。-- 步驟1確認實例處于 MOUNT 狀態(tài)非 OPEN SQL shutdown immediate; SQL startup mount; -- 步驟2開啟歸檔模式關(guān)鍵OGG 抽取依賴歸檔日志 SQL alter database archivelog; SQL alter database open; -- 步驟3開啟強制記錄日志FORCE LOGGING確保所有操作寫入重做日志 SQL alter database force logging; -- 步驟4開啟最小補充日志SUPPLEMENTAL LOG DATA這是 OGG 解析 DML 的基礎(chǔ) SQL alter database add supplemental log data; -- 步驟5立即驗證配置是否生效必須看到 YES YES SQL select SUPPLEMENTAL_LOG_DATA_MIN, FORCE_LOGGING from v$database; -- 正確輸出 -- SUPPLEME FOR -- -------- --- -- YES YES -- 步驟6強制切換日志使補充日志配置立即生效否則新事務(wù)可能不記錄 SQL alter system switch logfile;參數(shù)說明SUPPLEMENTAL_LOG_DATA_MIN YES表示最小補充日志已啟用OGG 可解析 UPDATE/DELETE 的 WHERE 條件FORCE_LOGGING YES是硬性要求防止某些 NOLOGGING 操作繞過日志導(dǎo)致同步丟失數(shù)據(jù)alter system switch logfile不是可選操作它生成新的歸檔日志文件讓 OGG Extract 進程能從最新位置開始讀取。2.2 源庫WindowsOGG 專用用戶創(chuàng)建與權(quán)限授予OGG 不允許用SYS或SYSTEM用戶運行 Extract必須創(chuàng)建獨立 schema。Windows 路徑使用反斜杠\但 OGG 內(nèi)部參數(shù)仍需正斜杠/這點極易出錯。-- 創(chuàng)建專用表空間路徑按實際調(diào)整注意 Windows 反斜杠 SQL create tablespace goldengate datafile D:\app\oracle\oradata\ORCL\ogg01.dbf size 300m autoextend on next 100m maxsize 2g; -- 創(chuàng)建用戶密碼建議用字母數(shù)字組合避免特殊字符引發(fā) ggsci 登錄失敗 SQL create user goldengate identified by GoldEng2024 default tablespace goldengate temporary tablespace temp quota unlimited on goldengate; -- 授予基礎(chǔ)連接與會話權(quán)限 SQL grant connect, resource, create session, alter session to goldengate; -- 授予閃回查詢權(quán)限用于初始化或修復(fù)數(shù)據(jù)不一致 SQL grant flashback any table to goldengate; -- 關(guān)鍵一步授予 OGG 管理員角色必須用 SYS 執(zhí)行且用戶名全大寫 SQL exec dbms_goldengate_auth.grant_admin_privilege(GOLDENGATE); -- 啟用 GoldenGate 復(fù)制功能11gR2 必須設(shè)置否則 Extract 啟動報 ORA-26885 SQL alter system set enable_goldengate_replication true scopeboth;邏輯說明dbms_goldengate_auth.grant_admin_privilege是 OGG 12c 引入的強制授權(quán)方式替代舊版GRANT GGS_GGSUSER_ROLEenable_goldengate_replication true是隱藏開關(guān)不設(shè)置會導(dǎo)致 Extract 進程無法 attach 到日志流狀態(tài)卡在INITIALIZINGWindows 下datafile路徑必須用單引號包裹且反斜杠無需轉(zhuǎn)義D:\path\file.dbf合法但若在 OGG 參數(shù)文件中引用該路徑需統(tǒng)一為正斜杠。2.3 目標庫Linux精簡配置不需附加日志但權(quán)限更苛刻Linux 目標庫配置比源庫簡單不需開歸檔、不需add supplemental log data但權(quán)限要求更高——Replicat 進程要執(zhí)行 DML必須有INSERT ANY TABLE等系統(tǒng)級權(quán)限。-- 創(chuàng)建表空間Linux 路徑用正斜杠注意磁盤空間充足 SQL create tablespace goldengate datafile /u01/app/oracle/oradata/TEST1/ogg01.dbf size 300m autoextend on next 100m maxsize 2g; -- 創(chuàng)建用戶密碼與源庫保持一致便于維護 SQL create user goldengate identified by GoldEng2024 default tablespace goldengate temporary tablespace temp quota unlimited on goldengate; -- 基礎(chǔ)權(quán)限同源庫 SQL grant connect, resource, create session, alter session to goldengate; -- 閃回權(quán)限同源庫 SQL grant flashback any table to goldengate; -- OGG 管理員權(quán)限必須 SQL exec dbms_goldengate_auth.grant_admin_privilege(GOLDENGATE); -- 關(guān)鍵權(quán)限Replicat 需要修改任意表注意不是 grant on specific table SQL grant insert any table, update any table, delete any table, drop any table to goldengate; -- 啟用 GoldenGate 復(fù)制同源庫 SQL alter system set enable_goldengate_replication true scopeboth;為什么目標庫不需要add supplemental log data因為 Replicat 是“寫入者”它從 Trail 文件中讀取已解析好的 SQL 或 ROW 信息直接應(yīng)用到目標庫不依賴目標庫自身的日志結(jié)構(gòu)。而源庫的 Extract 是“讀取者”必須靠補充日志才能從重做日志中還原出完整的 UPDATE/DELETE 操作。2.4 避坑源庫與目標庫配置四大血淚問題排查以下問題均來自真實部署現(xiàn)場每一條都對應(yīng)一個ggsci日志里的 ERROR 或 WARNING現(xiàn)象原因解決Extract 進程啟動后立即 ABEND日志報ORA-01017: invalid username/passwordWindows 源庫中NLS_LANG環(huán)境變量未設(shè)置或設(shè)置為AMERICAN_AMERICA.ZHS16GBK中文字符集導(dǎo)致密碼傳輸亂碼在 Windows 系統(tǒng)環(huán)境變量中添加NLS_LANGAMERICAN_AMERICA.AL32UTF8并重啟 OGG 服務(wù)或在edit params extgsxf中顯式寫SETENV (NLS_LANGAMERICAN_AMERICA.AL32UTF8)ADD TRANDATA test.t1執(zhí)行成功但后續(xù)同步時目標端出現(xiàn)Missing key column錯誤表test.t1無主鍵或唯一索引而ADD TRANDATA默認只對有主鍵的表生效OGG 無法定位 UPDATE/DELETE 的行方案一給表加主鍵ALTER TABLE test.t1 ADD CONSTRAINT pk_t1 PRIMARY KEY(object_id)方案二強制指定列ADD TRANDATA test.t1 COLUMNS(object_id)僅當確定該列能唯一標識行DBLOGIN成功但ADD CHECKPOINTTABLE報ORA-00942: table or view does not existCHECKPOINTTABLE名稱寫錯如goldengate.ggschkpt寫成goldengate.chkpt或用戶goldengate對goldengate表空間無配額執(zhí)行SELECT username, default_tablespace, temporary_tablespace FROM dba_users WHERE usernameGOLDENGATE;確認默認表空間執(zhí)行SELECT tablespace_name, bytes/1024/1024 MB FROM dba_free_space WHERE tablespace_nameGOLDENGATE;確認有空閑空間START MGR后INFO ALL顯示MANAGER STOPPEDggserr.log報Failed to bind port 7809Linux 目標庫防火墻未放行 7809 端口或該端口被其他進程占用如netstat -tuln | grep 7809執(zhí)行sudo firewall-cmd --permanent --add-port7809/tcp sudo firewall-cmd --reloadRHEL7或改用PORT 7810并同步修改RMTHOST參數(shù)3. OGG 核心進程配置Extract/Datapump/Replicat 三段式鏈路不能少OGG 同步不是 Extract 直連目標庫而是經(jīng)典的Extract → Datapump → Replicat三段式架構(gòu)。Windows 源端負責抽取Extract、投遞DatapumpLinux 目標端負責應(yīng)用Replicat。每一段的參數(shù)文件都必須精準匹配環(huán)境尤其注意路徑、端口、字符集。3.1 源端WindowsExtract 進程從歸檔日志中捕獲變更Extract 是整個鏈路的源頭它讀取 Oracle 歸檔日志或在線日志將 DML/DDL 轉(zhuǎn)換為 Trail 文件。Windows 下必須用ogg.exe啟動ggsci且ORACLE_HOME路徑中的反斜杠要小心處理。# 在 Windows 命令行中進入 OGG 安裝目錄假設(shè)為 D:\ogg C:\ cd D:\ogg C:\ ggsci # 創(chuàng)建子目錄必須執(zhí)行否則后續(xù)報錯 GGSCI (WIN-SOURCE) 1 CREATE SUBDIRS # 連接數(shù)據(jù)庫注意Windows 下密碼含特殊字符需用雙引號包裹 GGSCI (WIN-SOURCE) 2 DBLOGIN USERID goldengate PASSWORD GoldEng2024 # 編輯 Extract 參數(shù)文件文件名 extgsxf.prm存于 dirprm 子目錄 GGSCI (WIN-SOURCE) 3 EDIT PARAMS extgsxf-- extgsxf.prm 內(nèi)容關(guān)鍵參數(shù)已加注釋 EXTRACT extgsxf -- Windows 環(huán)境變量ORACLE_HOME 必須用正斜杠且路徑末尾不加 \ SETENV (ORACLE_HOMED:/app/oracle/product/11.2.0/db_1) SETENV (ORACLE_SIDORCL) -- 字符集必須與數(shù)據(jù)庫一致AL32UTF8 是 Oracle 11g 推薦值 SETENV (NLS_LANGAMERICAN_AMERICA.AL32UTF8) -- OGG 用戶登錄憑證密碼用雙引號防特殊字符解析錯誤 USERID goldengate, PASSWORD GoldEng2024 -- 輸出 Trail 文件路徑Windows 下路徑用正斜杠OGG 自動識別 EXTTRAIL ./dirdat/gs -- 關(guān)鍵禁用日志保留避免 Extract 卡在舊日志 TRANLOGOPTIONS LOGRETENTION DISABLED -- 提高日志讀取性能BRINTERVAL 20M 表示每 20 分鐘刷新一次緩沖區(qū) TRANLOGOPTIONS BRINTERVAL 20M -- 加大緩沖區(qū)解決大事務(wù)日志解析慢 TRANLOGOPTIONS BUFSIZE 2048000 -- 啟用獲取復(fù)制進程支持雙向同步擴展 GETREPLICATES -- 啟用緩存管理大事務(wù)必備 CACHEMGR CACHESIZE 2GB -- 啟用截斷操作同步重要否則 TRUNCATE TABLE 不同步 GETTRUNCATES -- DDL 同步包含表和索引的 DDLCREATE/DROP/ALTER DDL INCLUDE MAPPED, OBJTYPE TABLE DDL INCLUDE MAPPED, OBJTYPE INDEX -- DDL 選項自動添加補充日志失敗重試 DDLOPTIONS ADDTRANDATA RETRYOP RETRYDELAY 10 MAXRETRIES 10 -- 錯誤日志路徑用正斜杠 DISCARDFILE ./dirrpt/extgsxf.dsc, APPEND, MEGABYTES 1000 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 1 HOURS, RATE -- 長事務(wù)告警1 小時未提交即警告 FETCHWARNLONGTRANS 1H, CHECKINTERVAL 10m -- 同步所有 test 模式下的表 TABLE test.*;參數(shù)說明EXTTRAIL ./dirdat/gsTrail 文件前綴為gs存于dirdat目錄OGG 自動生成gs000000000等文件TRANLOGOPTIONS LOGRETENTION DISABLED是 Windows 源端關(guān)鍵項防止 Extract 因日志被歸檔刪除而中斷GETTRUNCATES必須開啟否則TRUNCATE TABLE操作不會被捕捉TABLE test.*;表示同步test用戶下所有表若只需同步部分表可寫TABLE test.t1; TABLE test.t2;。3.2 源端WindowsDataPump 進程解決網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致的 Trail 丟失Datapump 是 Extract 和 Replicat 之間的“快遞員”。它從本地 Trail 文件讀取數(shù)據(jù)通過 TCP 發(fā)送給目標端 MGR。沒有它Extract 生成的 Trail 文件只能存本地無法到達 Linux。# 在 ggsci 中編輯 DataPump 參數(shù) GGSCI (WIN-SOURCE) 4 EDIT PARAMS dpgskf-- dpgskf.prm 內(nèi)容 EXTRACT dpgskf PASSTHRU -- 不做任何轉(zhuǎn)換原樣投遞 DYNAMICRESOLUTION -- 目標端 MGR 地址和端口Linux IP 7809 RMTHOST 10.0.100.141, MGRPORT 7809 -- 目標端 Trail 文件前綴必須與 Replicat 的 EXTTRAIL 一致 RMTTRAIL ./dirdat/gs -- 錯誤日志 DISCARDFILE ./dirrpt/dpgskf.dsc, APPEND, MEGABYTES 100 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 1 HOURS, RATE -- 同步所有 test 模式下的表 TABLE test.*;邏輯說明PASSTHRU模式表示 Datapump 不解析數(shù)據(jù)只做二進制轉(zhuǎn)發(fā)性能最高RMTHOST的 IP 必須是 Linux 目標機的真實 IP非localhost或127.0.0.1且 Linux 防火墻需放行7809RMTTRAIL ./dirdat/gs與 Extract 的EXTTRAIL前綴一致確保數(shù)據(jù)流連貫。3.3 目標端LinuxReplicat 進程把 Trail 文件變成真實 SQLReplicat 運行在 Linux它讀取由 Datapump 發(fā)送來的 Trail 文件./dirdat/gs*解析成 SQL 并執(zhí)行。Linux 下路徑全部用正斜杠ORACLE_HOME必須指向真實的 Oracle 安裝路徑。# 在 Linux 終端進入 OGG 目錄假設(shè)為 /u01/app/ogg [oracletest2 ~]$ cd /u01/app/ogg [oracletest2 ogg]$ ./ggsci GGSCI (test2) 1 CREATE SUBDIRS GGSCI (test2) 2 DBLOGIN USERID goldengate PASSWORD GoldEng2024 GGSCI (test2) 3 EDIT PARAMS repgs1-- repgs1.prm 內(nèi)容 REPLICAT repgs1 -- Linux 環(huán)境變量路徑用正斜杠 SETENV (ORACLE_HOME/u01/app/oracle/product/11.2.0/db_1) SETENV (ORACLE_SIDTEST1) SETENV (NLS_LANGAMERICAN_AMERICA.AL32UTF8) USERID goldengate, PASSWORD GoldEng2024 -- 假設(shè)目標表定義與源端一致省去 DEFGEN 步驟 ASSUMETARGETDEFS -- 關(guān)閉外鍵約束檢查避免 INSERT 順序錯亂 DBOPTIONS DEFERREFCONST -- 關(guān)閉觸發(fā)器防止觸發(fā)器二次執(zhí)行 DBOPTIONS SUPPRESSTRIGGERS -- 錯誤日志 DISCARDFILE ./dirrpt/repgs1.dsc, APPEND, MEGABYTES 1000 DISCARDROLLOVER AT 6:00 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 30 MINUTES, RATE -- 遇到任何錯誤立即中止避免臟數(shù)據(jù) REPERROR (DEFAULT, ABEND) -- DDL 同步映射表和索引 DDL INCLUDE MAPPED, OBJTYPE TABLE DDL INCLUDE MAPPED, OBJTYPE INDEX DDLOPTIONS REPORT -- 允許 TRUNCATE 操作與 Extract 的 GETTRUNCATES 對應(yīng) GETTRUNCATES -- 動態(tài)解析表結(jié)構(gòu)應(yīng)對新增表 DYNAMICRESOLUTION -- 每 1000 條事務(wù)提交一次平衡性能與一致性 GROUPTRANSOPS 1000 -- 表映射test.* → test.*同名同結(jié)構(gòu) MAP test.*, TARGET test.*;參數(shù)說明ASSUMETARGETDEFS表示不使用DEFGEN工具生成表定義文件要求源庫和目標庫表結(jié)構(gòu)完全一致DBOPTIONS SUPPRESSTRIGGERS是必須項否則目標庫觸發(fā)器會被執(zhí)行兩次源端一次目標端一次GROUPTRANSOPS 1000控制事務(wù)粒度值太小如 10導(dǎo)致頻繁 COMMIT性能差值太大如 10000導(dǎo)致單次事務(wù)過大可能 OOM。3.4 進程注冊與啟動三步缺一不可所有參數(shù)文件寫完后必須在ggsci中注冊進程并綁定 Trail 文件路徑最后啟動。順序錯誤會導(dǎo)致START失敗。# 源端Windows執(zhí)行 GGSCI (WIN-SOURCE) 5 ADD EXTRACT extgsxf, TRANLOG, BEGIN NOW GGSCI (WIN-SOURCE) 6 ADD EXTTRAIL ./dirdat/gs, EXTRACT extgsxf, MEGABYTES 1024 GGSCI (WIN-SOURCE) 7 ADD EXTRACT dpgskf, EXTTRAILSOURCE ./dirdat/gs GGSCI (WIN-SOURCE) 8 ADD RMTTRAIL ./dirdat/gs, EXTRACT dpgskf, MEGABYTES 1024 # 目標端Linux執(zhí)行 GGSCI (test2) 4 ADD REPLICAT repgs1, EXTTRAIL ./dirdat/gs, CHECKPOINTTABLE goldengate.ggschkpt # 啟動按順序先 MGR再 Extract再 Datapump最后 Replicat # 源端啟動 MGR若未啟動 GGSCI (WIN-SOURCE) 9 START MGR # 源端啟動 Extract GGSCI (WIN-SOURCE) 10 START EXTRACT extgsxf # 源端啟動 Datapump GGSCI (WIN-SOURCE) 11 START EXTRACT dpgskf # 目標端啟動 Replicat GGSCI (test2) 5 START REPLICAT repgs1驗證命令I(lǐng)NFO ALL查看所有進程狀態(tài)正常應(yīng)為RUNNINGVIEW REPORT extgsxf查看 Extract 最后一頁日志確認Successfully logged into database和Writing DML to trail fileSTATS EXTRACT extgsxf查看抽取統(tǒng)計Total inserts,Total updates應(yīng)隨源庫 DML 增長。4. 數(shù)據(jù)初始化SCN 同步與全量加載避免“同步了但數(shù)據(jù)不對”同步鏈路跑起來只是第一步真正的挑戰(zhàn)在于初始數(shù)據(jù)一致性。OGG 不提供自動全量同步必須手動保證源庫和目標庫在某個 SCN 時間點數(shù)據(jù)完全一致否則增量同步會從錯誤起點開始。4.1 SCN 初始化法最精準的冷初始化推薦此方法要求源庫短暫停寫獲取精確 SCN導(dǎo)出導(dǎo)入后從該 SCN 開始同步。適用于可接受分鐘級停機的場景。-- 源庫Windows獲取當前 SCN SQL SELECT TO_CHAR(CURRENT_SCN) FROM V$DATABASE; -- 輸出類似1085057 -- 源庫導(dǎo)出expdp 必須用與 OGG 同一用戶且指定 FLASHBACK_SCN SQL EXIT C:\ expdp goldengate/GoldEng2024 DIRECTORYDATA_PUMP_DIR DUMPFILEt1_init.dmp TABLEStest.t1 FLASHBACK_SCN1085057 -- 將 dump 文件拷貝到 Linux 目標機如用 scp C:\ scp t1_init.dmp oracle10.0.100.141:/home/oracle/ -- 目標庫Linux導(dǎo)入 [oracletest2 ~]$ impdp goldengate/GoldEng2024 DIRECTORYDATA_PUMP_DIR DUMPFILEt1_init.dmp TABLE_EXISTS_ACTIONREPLACE# 目標端啟動 Replicat 時指定 SCN關(guān)鍵 GGSCI (test2) 6 START REPLICAT repgs1, AFTERCSN 1085057為什么必須AFTERCSN因為FLASHBACK_SCN1085057導(dǎo)出的數(shù)據(jù)是 SCN1085057 時刻的快照。Replicat 必須從 SCN1085057 之后的日志開始讀取否則會重復(fù)應(yīng)用 SCN≤1085057 的事務(wù)導(dǎo)致主鍵沖突或數(shù)據(jù)重復(fù)。4.2 OGG 初始化抽取法熱初始化無停機當業(yè)務(wù)無法停寫時用 OGG 自身的SOURCEISTABLE模式做初始化。它不依賴數(shù)據(jù)庫導(dǎo)出而是用 Extract 進程直接讀取表數(shù)據(jù)生成 Trail再由 Replicat 應(yīng)用。# 源端Windows創(chuàng)建初始化 Extract GGSCI (WIN-SOURCE) 12 EDIT PARAMS init_t1-- init_t1.prm EXTRACT init_t1 USERID goldengate, PASSWORD GoldEng2024 -- 目標端 MGR 地址 RMTHOST 10.0.100.141, MGRPORT 7809 -- 初始化 Trail 文件前綴 i1最大 999 個文件每個 500MB RMTFILE ./dirdat/i1, MAXFILES 999, MEGABYTES 500 -- 指定表并用 AS OF SCN 保證一致性SCN 從源庫查得 TABLE test.t1, SQLPREDICATE AS OF SCN 1085057;# 注冊并啟動初始化 Extract GGSCI (WIN-SOURCE) 13 ADD EXTRACT init_t1, SOURCEISTABLE GGSCI (WIN-SOURCE) 14 START EXTRACT init_t1 # 目標端創(chuàng)建 Special Run Replicat一次性運行 GGSCI (test2) 7 ADD REPLICAT ri1, SPECIALRUN GGSCI (test2) 8 EDIT PARAMS ri1-- ri1.prm SPECIALRUN END RUNTIME REPLICAT ri1 USERID goldengate, PASSWORD GoldEng2024 -- 讀取初始化 Trail 文件 EXTFILE ./dirdat/i1 -- 表映射 MAP test.t1, TARGET test.t1;# 啟動初始化 Replicat自動運行完退出 GGSCI (test2) 9 START REPLICAT ri1參數(shù)說明SOURCEISTABLE模式下 Extract 不讀日志而是像SELECT * FROM test.t1一樣全表掃描SQLPREDICATE AS OF SCN 1085057是 Oracle 閃回查詢語法確保讀取 SCN1085057 時刻的數(shù)據(jù)快照SPECIALRUNReplicat 是一次性進程啟動后自動讀取i1文件并應(yīng)用完成后狀態(tài)變?yōu)镾TOPPED。4.3 避坑初始化階段三大玄學(xué)問題排查現(xiàn)象原因解決START REPLICAT repgs1, AFTERCSN 1085057后狀態(tài)為ABENDED日志報Invalid SCN輸入的 SCN 在目標庫歸檔日志中不存在源庫 SCN1085057 的日志未傳到目標端執(zhí)行GGSCI VIEW REPORT repgs1查看詳細錯誤在源庫執(zhí)行SELECT NAME, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG WHERE FIRST_TIME SYSDATE-1 ORDER BY FIRST_TIME;確認該 SCN 日志已歸檔用SEND EXTRACT extgsxf, LOGSTAT查看 Extract 當前讀取位置初始化抽取init_t1運行緩慢STATS init_t1顯示Total reads: 0SQLPREDICATE語法錯誤或表test.t1在源庫不存在檢查SQLPREDICATE是否多寫了分號或引號執(zhí)行SELECT COUNT(*) FROM test.t1確認表存在且有數(shù)據(jù)在init_t1.prm中臨時加REPORTCOUNT EVERY 1 MINUTES查看進度impdp導(dǎo)入后目標表數(shù)據(jù)為空但日志顯示Completed successfullyTABLE_EXISTS_ACTIONREPLACE會先 DROP 表若表有外鍵約束DROP 失敗導(dǎo)致導(dǎo)入跳過導(dǎo)入前在目標庫執(zhí)行ALTER TABLE test.t1 DISABLE CONSTRAINT constraint_name;導(dǎo)入完成后再ENABLE或改用TABLE_EXISTS_ACTIONTRUNCATE要求表結(jié)構(gòu)完全一致5. DDL 同步深度配置不只是DDL INCLUDE還有腳本與權(quán)限陷阱OGG 的 DDL 同步常被低估但它決定了CREATE TABLE、ALTER INDEX等操作能否自動在目標庫重建。單純加DDL INCLUDE不夠必須配合數(shù)據(jù)庫腳本和權(quán)限否則 DDL 會靜默失敗。5.1 源庫 DDL 支持腳本執(zhí)行四步缺一不可OGG 12.2 的 DDL 同步依賴四個核心腳本必須按順序、以SYS用戶執(zhí)行。Windows 下路徑用反斜杠但腳本內(nèi)路徑為 Linux 風格OGG 會自動適配。-- 在源庫 sqlplus / as sysdba 中執(zhí)行Windows -- 步驟1Marker Setup標記 DDL 操作的起始點 SQL D:\ogg\marker_setup.sql -- 步驟2DDL Setup創(chuàng)建 DDL 捕獲表 SQL D:\ogg\ddl_setup.sql -- 步驟3Role Setup創(chuàng)建 GGS_GGSUSER_ROLE 角色 SQL D:\ogg\role_setup.sql -- 步驟4授權(quán)角色給 OGG 用戶 SQL GRANT GGS_GGSUSER_ROLE TO GOLDENGATE; -- 步驟5啟用 DDL 捕獲關(guān)鍵否則 DDL 不被記錄 SQL D:\ogg\ddl_enable.sql執(zhí)行后驗證查詢SELECT * FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE GGS_%;應(yīng)看到GGS_MARKER,GGS_SETUP,GGS_DDL_HIST等表查詢SELECT STATUS FROM DBA_REGISTRY WHERE COMP_NAMEOracle GoldenGate;應(yīng)返回VALID。5.2 性能優(yōu)化ddl_pin與dbmspool腳本DDL 操作頻繁時ddl_setup.sql創(chuàng)建的對象可能被 Oracle LRU 算法從共享池中擠出導(dǎo)致 DDL 解析變慢。需執(zhí)行兩個優(yōu)化腳本-- 在源庫執(zhí)行Windows -- 步驟1固定共享池對象防止被擠出 SQL ?/rdbms/admin/dbmspool.sql -- 注意? 是 Oracle 內(nèi)置變量指向 $ORACLE_HOME/rdbms/admin -- 步驟2Pin DDL 相關(guān)對象到共享池 SQL D:\ogg\ddl_pin.sql GOLDENGATE -- 參數(shù)為 OGG 用戶名必須大寫效果執(zhí)行后SELECT NAME, TYPE, SHARABLE_MEM FROM V$DB_OBJECT_CACHE WHERE NAME LIKE GGS% AND TYPEPACKAGE;應(yīng)顯示SHARABLE_MEM 0表示已固定。5.3 DDL 同步參數(shù)詳解從INCLUDE MAPPED到EXCLUDE UNMAPPEDDDL INCLUDE MAPPED是基礎(chǔ)但生產(chǎn)環(huán)境需精細控制。以下參數(shù)組合可覆蓋 95% 場景-- 在 Extract 和 Replicat 參數(shù)文件中統(tǒng)一配置 DDL INCLUDE MAPPED, OBJTYPE TABLE DDL INCLUDE MAPPED, OBJTYPE INDEX DDL INCLUDE MAPPED, OBJTYPE CONSTRAINT DDL INCLUDE MAPPED, OBJTYPE SEQUENCE -- 排除高風險 DDL如 DROP DATABASE DDL EXCLUDE UNMAPPED, OBJTYPE DATABASE -- 排除特定用戶如不希望同步 DBA 用戶的 DDL DDL EXCLUDE SCHEMA SYS, OBJTYPE TABLE -- 記錄所有 DDL 到報告調(diào)試用 DDLOPTIONS REPORT -- 自動為新建表添加補充日志避免手動 ADD TRANDATA DDLOPTIONS ADDTRANDATA邏輯說明MAPPED表示只同步MAP語句中定義的表如MAP test.*, TARGET test.*未映射的表 DDL 被忽略UNMAPPED表示同步所有未在MAP中定義的 DDL慎用DDLOPTIONS ADDTRANDATA是“后悔藥”當新表被CREATE TABLE后OGG 自動執(zhí)行ADD TRANDATA無需人工干預(yù)。5.4 避坑DDL 同步失效的五個致命點現(xiàn)象原因解決源庫執(zhí)行CREATE TABLE test.t2 (...)目標庫無反應(yīng)ggserr.log無 DDL 相關(guān)日志ddl_enable.sql未執(zhí)行或執(zhí)行后未重啟 Extract 進程執(zhí)行GGSCI INFO EXTRACT extgsxf, DETAIL查看DDL replication是否為Enabled若為Disabled執(zhí)行STOP EXTRACT extgsxf→START EXTRACT extgsxf重啟ALTER TABLE test.t1 ADD COLUMN c2 VARCHAR2(10)同步到目標庫后新列值全為 NULL源庫ADD COLUMN未指定DEFAULTOGG 將新列視為NULLABLE但目標庫表結(jié)構(gòu)未更新在目標庫本文還有配套的精品資源點擊獲取