某次在OGG環境source端重建table,重建後發現資料沒有sync到目的端,原來問題是出在supplemental log上;紀錄正確的流程,以一般table轉成partition table為例,大致步驟如下:
建立新table,名稱與舊table不同
sync資料到新table
add trandata in 新table
重啟extract process
交換新舊table name
進入ggsci,登入DB
GGSCI (andylab) > dblogin userid ogg password ogg
檢查舊TABLE TRANDATA狀態
GGSCI (andylab) > info trandata ANDY.OGG_TABLE
Logging of supplemental redo log data is enabled for table ANDY.OGG_TABLE.
Columns supplementally logged for table ANDY.OGG_TABLE: ID.
建立新TABLE,假設是partition table,細節省略
CREATE TABLE ANDY.OGG_TABLE_T
(
ID VARCHAR2(20 BYTE) NOT NULL,
MONTH VARCHAR2(2 BYTE),
DES VARCHAR2(40 BYTE)
)
TABLESPACE USERS
PARTITION BY RANGE (MONTH)
(PARTITION JAN VALUES LESS THAN ('02'))...
CREATE INDEX ANDY.OGG_TABLE_T_PK ON ANDY.OGG_TABLE_T...
ALTER TABLE ANDY.OGG_TABLE_T ADD (CONSTRAINT PK_ID PRIMARY KEY(ID)
USING INDEX ANDY.OGG_TABLE_T_PK ENABLE VALIDATE);
GRANT DELETE, INSERT, SELECT, UPDATE ON ANDY.OGG_TABLE_T TO USERB;
進行新舊TABLE的資料同步,這裡使用oracle提供的DBMS_REDEFINITION包
先檢查舊TABLE是否支援redefinition作業
EXEC DBMS_REDEFINITION.can_redef_table('ANDY', 'OGG_TABLE');
開始redefinition,這時候會把新table變成material view並同步資料
BEGIN
DBMS_REDEFINITION.start_redef_table(
uname => 'ANDY',
orig_table => 'OGG_TABLE',
int_table => 'OGG_TABLE_T');
END;
/
如果同步作業比較久,中途舊TABLE已有資料異動,可再SYNC差異
BEGIN
dbms_redefinition.sync_interim_table(
uname => 'ANDY',
orig_table => 'OGG_TABLE',
int_table => 'OGG_TABLE_T');
END;
/
在GGSCI為新TABLE增加supplemental data
GGSCI (andylab) > add trandata ANDY.OGG_TABLE_T
到此已準備好新舊TABLE且確保不再有資料異動,RENAME前必須先把OGG EXTRACT 程序重啟,否則先前在新TABLE加的supplemental log會無作用
GGSCI (andylab) > stop XANDY
GGSCI (andylab) > start XANDY
switch新舊TABLE名稱
BEGIN
dbms_redefinition.finish_redef_table(
uname => 'ANDY',
orig_table => 'OGG_TABLE',
int_table => 'OGG_TABLE_T');
END;
/
到此完成TABLE轉換,執行後續作業,譬如RENAME INDEX 、CONSTRAINT NAME,檢查等…。
如果目標TABLE沒有資料,可剩略步驟2與5,重點是supplemental log與知道重啟extract process的時機。
分享此文:
按一下即可分享至 X(在新視窗中開啟)
X
按一下以分享至 Facebook(在新視窗中開啟)
喜歡 正在載入...