#命名規范: local==> l remote==> r extract==> x data pump==> p source Trail==>st Remote Trail==>rt -------------------------- #《《源數據庫orcl》》 Extract:將重做日志信息抽取存放到本地exttrail文件中 0.開啟附加日志功能,開啟強制日志模式;強烈建議源端每個涉及復制的表上建立主鍵或者唯一鍵 SQL> alter database force logging; SQL> alter database add supplemental log data; #數據庫最小級別開啟 SQL> create tablespace ggs datafile size 200M autoextend on; SQL> create user ggs identified by ggs; SQL> grant dba to ggs; GGSCI> add trandata schema.<tablename> #表別級別開啟,給需要復制的表添加 GGSCI> info trandata schema.<tablename> #查看附加信息 相關附加日志參數: 注意: 每小時日志量評估 select trunc(completion_time),count(*)*100 size_in_MB from v$archived_log group by trunc(Completion_time); 1.安裝OGG mkdir /goldengate tar xf ogg.tar -C /goldengate #ogg.tar為軟件名 chown -R oracle:oinstall /goldengate cat>>/home/oracle/.bash_profile<<'EOF' export GG_HOME=/goldengate export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH alias ggsci='ggsci $GG_HOME/ggsci' EOF 2.創建子目錄,編輯MGR GGSCI>create subdirs GGSCI>edit param mgr 添加下面端口 port 7809 AUTORESTART ER *, RETRIES 3, WAITMINUTES 5, RESETMINUTES 60 PURGEOLDEXTRACTS /goldengate/dirdat/*,USECHECKPOINTS,MINKEEPHOURS 24 #/goldengate/dirdat/*為抽取日志存放位置 3.定義本地抽取參數文件 GGSCI(Hostname) 1>edit param lxjack extract lxjack ------------------------------------------------ -- local extract for schema -- Author: vmsysjack -- Created Date: 2020-02-10 ------------------------------------------------ SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) #和源系統一致select * from v$nls_parameters where parameters like '%NLS_CHARACTERSET%'; USERID ggs@orcl,password ggs #定義連接抽取源的用戶名和密碼以及tns,orcl為源庫的TNS名 ExtTrail dirdat/st #定義抽取重做日志信息存儲地點;將會在$GG_HOME/dirdat/下生成st開頭文件 Table schema.tablename; #定義需要抽取的“模式.表名” 注意:當密碼使用加密方式的時候,需要使用使用encryptkey default 例如: 1. 生成密文 encrypt password ggs encryptkey default 2.將第一步生成的密文應用 userid ggs,password AAAAAAAAAAAAAAAAACCCCCSGSADGSDGWOXCJKLSJL,encryptkey default 4. 創建extract進程 GGSCI(HOSTname) 1> add extract lxjack,threads 2,tranlog,begin now #RAC源需要配置 ,threads 2表示有2個節點,單節點不用加threads 2 GGSCI(Hostname) 2> add exttrail dirdat/st,extract lxjack,megabytes 100 #添加抽取源文件位置和大小 注意:當在操作系統刪除了exttrail文件后,啟動會報 PROCESS ABENDING,使用下面方法解決 (1). GGSCI>delete exttrail dirdat/st* #我這里是測試環境,只有一個文件 (2). GGSCI>add exttrail dirdat/st,extract lxjack 5. 啟動extract進程,驗證extract進程 GGSCI(Hostname) 3> start extract lxjack GGSCI(Hostname) 4> info extract lxjack # l=>local; x=>extract; GGSCI(Hostname) 5> info extract lxjack,showch GGSCI(Hostname) 5> info extract lxjack,detail 6. 驗證抽取數據 GGSCI(Hostname) 5> stats extract lxjack #再重新開啟一個終端,執行DML語句,使用stats extract lxjack查看 注意: 級聯更新帶來的問題 級聯更新的觸發器等對象存在,對於目標數據庫系統上應該關閉或者禁用掉目標 數據庫上的觸發器和級別約束;使用如下語句: SQL> alter table ... disable contraint ... SQL> alter trigger ... disable ... 或者使用下面語句:需要數據庫版本是10.2.0.5或11.2.0.2之后版本 DBOPTIONS suppresstriggers 配置DataPump: 本質上是一個Extract Group,需要參數文件,參數文件名字和這個extract group的組名一樣。 參數中需要配置SourceTrail文件在哪里,以及發送的目標系統在哪里 1.定義參數文件 GGSCI(Hostname) 1>edit param lpjack # l=>local; p=>pump extract lpjack ------------------------------------------- -- Data Pump extract for schema.tablename -- Author: vmsysjack -- Created Date: 2020-02-10 -------------------------------------------- Uerid ggs@orcl,password ggs PassThru #透傳模式,源表和目標數據庫表完全一樣,源表與目標表不一致的時候需要用NoPassThru RmtHost 目標主機ip地址,Mgrtort 目標主機mgr進程端口 #定義連接遠端主機和端口 RmtTrail dirdat/rt #定義Remote Trail文件的文件名前綴,r=>remote;表示傳遞到遠端的位置 Table schema.tablename; #傳遞的表名 2. 創建Data Pump進程 GGSCI(Host) 1> add extract lpjack,exttrailsource dirdat/st #定義DataPump進程名,以及需要抽取的源trail文件位置dirdat/st GGSCI(Host) 2> add rmttrail dirdat/rt,extract lpjack,megabytes 100 #定義增加遠程trail文件位置和遠程trail文件大小 3. 啟動Data Pump進程,驗證Data Pump進程,統計抽取進程數據 GGSCI(Host) 3> start extract lpjack GGSCI(Host) 4> info extract lpjack GGSCI(Host) 5> stats extract lpjack ##《《目標數據庫vmsys》》 0.創建目標數據庫需要的表空間和用戶 SQL> create tablespace ggt datafile size 200M autoextend on; SQL> create user ggt identified by ggt; SQL> grant dba to ggt; 1.創建全局參數文件,登錄目標數據庫,創建檢查點表 注意:檢查點表作為事務處理的一部分,可以有更好的恢復能力,有共用和專用兩種做法 共用: 所有的replicate共用一個 專用: 每個replicate獨立創建一個 GGSCI(Hostname) 1> edit param ./GLOBALS #需要執行GGSCI,在GG_HOME目錄下 GGschema ggt #指定存儲架構,此行也可以不寫 checkpointtable ggt.chkpt #存儲在ggt用戶模式下 GGSCI(Hostname) 2> dblogin userid ggt@vmsys,password ggt #vmsys為目標數據庫網絡服務名 2. 從數據庫層面檢查檢查點文件 SQL> show user; --當前還未增加檢查點文件 USER is "ggt" SQL> select table_name from user_tables; --ggt模式下沒有表 no rows selected GGSCI(Hostname) 3> add checkpointtable --增加檢查點表文件 GGSCI(Hostname) 4> info checkpointtable SQL> conn ggt/ggt #ggt為目標數據庫創建的用戶,即目標數據庫登錄GGSCI使用的用戶 SQL> desc chkpt SQL> desc chkpt_lox SQL> show user; USER is "ggt" SQL> select table_name from user_tables; TABLE_NAME ------------------------------ CHKPT_LOX CHKPT SQL> desc chkpt_lox; Name Null? Type ----------------------------------------- -------- ---------------------------- GROUP_NAME NOT NULL VARCHAR2(8) GROUP_KEY NOT NULL NUMBER(19) LOG_CMPLT_CSN NOT NULL VARCHAR2(129) LOG_CMPLT_XIDS_SEQ NOT NULL NUMBER(5) LOG_CMPLT_XIDS NOT NULL VARCHAR2(2000) SQL> desc chkpt; Name Null? Type ----------------------------------------- -------- ---------------------------- GROUP_NAME NOT NULL VARCHAR2(8) GROUP_KEY NOT NULL NUMBER(19) SEQNO NUMBER(10) RBA NOT NULL NUMBER(19) AUDIT_TS VARCHAR2(29) CREATE_TS NOT NULL DATE LAST_UPDATE_TS NOT NULL DATE CURRENT_DIR NOT NULL VARCHAR2(255) LOG_CSN VARCHAR2(129) LOG_XID VARCHAR2(129) LOG_CMPLT_CSN VARCHAR2(129) LOG_CMPLT_XIDS VARCHAR2(2000) VERSION NUMBER(3) SQL> 注意: replicate級別增加checkpointTable方式: GGSCI> add replicat rejack,exttrail /goldengate/dirdat/vmsys/rt,checkpointTable ggt,rejackcht --專有級別創建檢查點文件,每個replicat都需要創建一個,各個replicate各自使用; 通過發現這種方式不會自動生成檢查表,還是需要手工建立 create table rejack as select * chkpt where 0=1; create table rejack_lox as select * chkpt where 0=1; 開始數據加載..... ..... ..... 當源表之前有數據的時候,需要通過exp,imp(impdump,expdump)存放到目標中 ..... 配置Replicat進程 1. 定義replicat參數文件 GGSCI(Hostname) 1> edit param rejack #e=>replicat replicat rejack -------------------------------------------- -- replicat for jack.a -- author: vmsysjack -- Created Date: 2020-02-10 -------------------------------------------- SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID ggt@vmsys,password ggt #vmsys為目標表的TNS HandleCollisions #處理沖突的數據,只能在數據初始化期間使用,后續不能使用這個處理沖突 AssumeTargetDefs #源數據表與目標數據庫同步的表定義相同時候用此參數,不可以與sourcedefs參數文件同用 Map jack.*,Target jack.*; 2. 創建replicat進程 GGSCI(Hostname) 1> add replicat rejack,exttrail dirdat/rt 3. 啟動replicat進程 GGSCI(Hostname) 2> start replicat rejack 4. 查看並驗證replicat GGSCI(Hostname) 3> info replicat rejack GGSCI(Hostname) 4> stats replicat rejack =================================================================== 一. 表過濾 1. extract端: Table schema.tablename 2. replicat端: Map srcSchema.tablename,Target dstSchema.tablename 二. 列過濾: 只用抓取或者只復制指定的列,不是所有的列 1. extract端: Table schema.tablename COLS(cola,colb.....); 注意: 列過濾不可以使用passthru 2. 使用colsExcept 抓取除了列出來的列之外的所有列 Table schema.tablename colsExcept(colx); 三. 行過濾: 只復制滿足條件的行,分為兩種類型(Complex和Non-Complex) 1. Non-Complex類型:非復雜類型;只能根據行過濾,支持@present,@absent,@null 1). extract端 Table schema.tablename,where (id<100); 2). replicat端 Map schema.tablename,Target schema.tablename,where (id<100); 2. Complex類型:復雜類型,支持各種GG函數,還可以安裝操作類型過濾(filter實現) for example: 2.1) 發生在id<100記錄上的delete操作語句 Map schema.tablename,Target schema.tablename,filter (on delete,id<100); 2.2) 只捕獲id<100的記錄 Map schema.tablename,Target schema.tablename,filter (id<100); 2.3) 只捕獲更新,刪除操作,以及id<100的記錄 Table schema.tablename,filter (on delete,on update,id>100); 2.4)列Name中有zhang字樣的 Table schema.tablename,Filter (@StrFind(name,'zhang')>0) 2.5)函數計算的結果大於120000 Table schema.tablename,Filter (@compute((salary-tax)*12)>120000) 四. 數據映射,既可以在源端進行,也可以在目標端進行 #extract端配置樣例1: extract lxjack SETENV (ORACLE_SID=orcl) USERID ggs,PASSWORD ggs ExtTrail ./dirdat/sx TranLogOptions ExcludeUser(username) Table sometable; #extract端配置樣例2: extract lxjack SETENV (ORACLE_SID=orcl) USERID ggs,PASSWORD ggs ExtTrail ./dirdat/sx TranLogOptions ExcludeUser(username) Table src.serviceChange,Target tgt.serviceChareg_DIM, #源表與目標表做映射 colMap(UseDefaults,ID=ServiceChareg_id,modified_at=Timeap); #usedefaults沒有明確指出的列在兩邊都是相同的;需要映射的列需要在usedefaults后面表示出來。 #replicat端配置樣例3: replicat lrlog5 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) SETENV (ORACLE_SID=vmsys) UserId ggt,password ggt HandleCollisions SourceDefs dirdef/smsg_logs.defs #此文件需要定義文件 Map jack.smsg_logs,Target jack.smsg_logs, ColMap(UseDefaults,owner="zhangsan") #在列映射中給這個列加上一個初始值;每當源表中插入新記錄,這個新記錄復制到目標數據表后,owner字段會被自動賦值為zhangsan #replicat端映射配置樣例: 1). 當源表與目標表結構一致,在replicat參數文件中使用AssumeTargetDefs參數,代表兩端結構一致。 2). 當源表與目標表結構不一致,需要映射,映射語句: Map schema.tablename,Target schema.tablename,Colmap (UseDefaults,cola=cola); -------------------------------------------------------------------------------------------------- 需要哪一個數據庫的數據定義文件,取決於映射操作是在哪里進行的,如果在目標端(replicat)完成映射,需要在源數據庫定義文件,然后將生成的文件復制到目標數據庫上,最后在replicat參數文件中引用它; 如果在源端(extract)完成映射,就反過來。 1.創建數據定義文件: GGSCI(Hostname) 1> edit params defgen DefsFile ./dirdef/rejackt2.defs #用未來要引用這個定義文件的replicat組名字來命名 UserId ggs,Password ggs Table schema.tablename; 2.將定義文件使用工具生成定義文件: ./defgen paramfile dirtrm/defgen.prm 3.將第二步生成的defgen.prm復制到另外一台機器的$GG_HOME/dirdef文件夾中 4.修改參數 4.1)注釋文本-->>AssumeTargetDefs 增加文本-->>SourceDefs dirdef/rejackt2.defs ----------------------------- colmap(Usedefaults,owner="liulingfeng",ab=) 目標表有一列為空應該將這列寫最后 colmap(Usedefaults,ab=,owner="liulingfeng") 目標表一列為空這種寫法是錯誤的 AssumeTargetDefs 當能夠通過colmap實現和源結構一致的情況下可以使用此參數,前提要表的結構一致 定義文件用於當源表和目標表不一致的情況下.可以使用. -------------------------------------------------------------------------- 1. 設置Trail文件的刪除策略: 將下面的參數寫入到Manager進程的參數文件中 PurgeOldExtracts /ggs/dirdat/sa*, UseCheckpoints, --使用檢查點 MinKeepHours 1; --即使檢查點確認了刪除后,還保留一個小時 FrequencyMinutes 30; --清理動作的頻率為30分鍾一次 2. 數據壓縮 GG提供了數據壓縮功能,對於低帶寬的網絡是有意義的,當設置了壓縮,目標端Collector進程會自動的進行解壓縮操作,然后寫入Remote Trail文件中;數據的最大壓縮比例可以達到5:1,默認數據不壓縮。 例如: Extract lpjack PassThru RmtHost dstIP,Mgrtort 7809,Compress,CompressThreshold 2048 #compressThreshold 2048 為壓縮的最小數據塊單位大小 RmtTrail dirdat/rs Table schema.tablename; -------------------------------------------------------------------------- 1. 執行存儲過程 Map source_table,Target target_table, SQLEXEC (SPNAME spanme,PARAME (in_paraml=cola)), #SPNAME指定存儲過程名字,PARAMS參數定義的是IN參數和列的映射關系 COLMAP (Usedefaults,coln=@GETVAL(spname,out_paramn)); select name,value from v$diag_info; #獲取跟蹤診斷的相關信息 select * from v$pwfile_users; #獲取授予sysdba權限的用戶
