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