SharePlex安裝配置、常用功能配置文件、常見故障處理文件

你好我是李白發表於2020-01-16

SharePlex 安裝配置部分

  埠:

2100 SharePlex 預設埠。

2501 start launcher 需要開啟埠,可以使用copy 快速複製表,也可透過修改SP_OSY_PORT 引數修改copy 使用預設埠。

  安裝前資料庫操作

開啟資料庫最小附加日誌:首先檢視v$transaction 檢視有沒有大事務,儘量避免有大事務的時候執行,如果系統資源非常緊張會導致當機, RAC 情況下各個節點都需要執行

alter database add supplemental log data (primary key,unique index) columns;

查詢最小附加日誌情況:

select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL from v$database;

  源庫需要開啟歸檔。

解壓安裝

使用oracle 使用者解壓,安裝。

$ ./SharePlex-8.6.6-b64-oracle110-rh-40-amd64-m64.tpm

配置

-- 配置shareplex ,配置時如果需要自定義複製的源與目標端的ORACLE_SID ,則需要配置tnsnames.ora 別名,且/etc/oratab 中必須有對應於自定義的tnsnames 別名的ORACLE_SID

啟動

[splex@localhost ~]export SP_SYS_HOST_NAME=cluster1vip  可以使用該引數指定shareplex 啟動到指定的IP 上,可以使用netstat -an | grep <port_number>

-- 啟動  -u 可以啟動shareplex 例項到指定埠,可以複製多個庫。

控制檯

SharePlex 日常操作都在sp_ctrl 控制檯中進行,啟動命令為:/<prodir>/bin/sp_ctrl, 一般啟動之後首先進入控制檯執行sp_ctrl > stop post ,停止。

配置檔案

    Config 配置檔案為複製鏈路需要複製物件以及鏈路對映檔案。

sp_ctrl> list config

sp_ctrl> verify config

sp_ctrl> activate config <file_name>

sp_ctrl> activate config <filename> [threads -n ] [nolock] -- nolock 不鎖表,如果在一定時間內獲取鎖失敗,則繼續往下進行

activate 儘量執行兩次,確保成功,可以同時tail -f <event_log> 檢視執行情況。

config 配置樣例以及配置規則:

datasource:o.wahaha

#source tables      target tables          routing map

#splex.demo_src     splex.demo_dest        target_system@o.target_sid

--target_sid 為目標端的 sid 或別名。

Ø   splex.demo_src   -- 源庫的使用者名稱. 表名,可以使用% 萬用字元,全匹配半匹配等。priv%not(table_name) 排除表。

Ø   splex.demo_dest  -- 目標庫的使用者名稱. 表名

Ø   target_system@o.target_sid  -- 目標庫的IP hosts 檔案中對映名@ 為目標端的sid 或別名。

Ø   hr.test     hr.test    192.168.204.151:scott_tab@o.honor1 --IP 或主機名後加冒號,可以為該表複製單獨起一個佇列。

Ø   mary.cust2!key(c1,c2)     mary.cust2    proda@o.sid     -- 自定義pk

-- 可以分析config ,生成報表,分析資料庫表操作頻繁記錄等。

SharePlex 常用操作

命令

命令說明 :會將目標先truncate 掉,然後再利用expdp constraint=y 引數匯出再匯入,如果你不想truncate 目標端的原有同步資料則你需要使用另一個命令append

copy 命令可實現單表或表分割槽的同步,不適合大批次表的同步。

使用要求:

  目標端啟動launcher: sp_ctrl> start launcher              ――預設埠是2501

  同步的表出現在已啟用的配置檔案中。

  目標端的複製表所屬使用者需先建立,copy可以建立表結構,但要求表空間不變,所以建議先建好表結構再複製。

語法如下:

sp_ctrl> copy owner.tablename  [at target_host]

如果相同的物件複製到不同的主機,需加at target_host選項,源端和目標端的使用者名稱或者表名不一致的話還需加入目標端的owner.tablename 。

檢查源端的copy狀態:

sp_ctrl> copy status all

copy status <jobid>   檢視job細節

cancel <jobid>   可以取消job,一般針對長時間wait for的job

當日志積累多了不方便檢視時,可清除日誌:

源端清除日誌:sp_ctrl> clear history all

目標端清除:cd vardir/log   ;    rm sync_clt*log

repair

如果發現或懷疑源端和目標端的表資料不一致,可以透過compare命令檢視和修復。

但由於compare需要把比較的資料排序,然後逐條比較,大量資料的比較可能會導致資源的過量使用,所以不建議對大量資料的比較。

sp_ctrl> compare table owner.table to owner.table target target_host@o.targetsid [repair]

比較表分割槽:

sp_ctrl> compare table owner.table@p1 to owner.table@p1 target target_host@o.targetsid [repair]

直接修復在後面加上repair,不加repair引數則將可用於修復的SQL語句生成在日誌檔案中。

檢視比較進度:

sp_ctrl> show compare  [detail]

取消比較:

sp_ctrl> compare cancel id <id>

清除比較日誌:

sp_ctrl> remove log compare id <id>    或者 remove log compare all

可以指定compare使用其他埠,不指定則隨機選埠:

compare table owner.table@p1 to owner.table@p1 target target_host@o.targetsid [repair] port 2500

設定引數

sp_ctrl> list param all  -- 列出所有引數。

sp_ctrl> set param   -- 設定引數

sp_ctrl> list param modified  -- 檢視被修改的引數

shareplex 安裝目錄說明:

/bin 包含可執行程式的符號連線

/.app_modules 包含可執行程式

/data 預設引數檔案, 包含預設的引數設定

/doc 空目錄

/install SharePlex 安裝、license 管理等相關的指令碼

/lib SharePlex 應用到的庫檔案

/util SharePlex 工具 SQL 指令碼,監控指令碼等

清除當前複製

sp_ctrl>shutdown

$ env | grep SP_SYS_VARDIR    -- 一定要在清除之前確認清理的例項正確。

執行下條語句之前一定確認上述引數正確,防止清理掉正在使用的例項。

$ ora_cleanup splex/splex

實用引數命令

export SP_SYS_VARDIR=/splex/vardir    -- 類似ORACLE_SID ,指定splex 使用指定的佇列配置檔案等等。

export SP_SYS_HOST_NAME – 在啟動sp_cop 之前設定,指定SharePlex 啟動在指定的IP 上,在RAC 安裝時需要注意此選項。

sp_ctrl>set param SP_OPO_DISABLE_OBJECT_NUM < 源端object_ID>    -- 在目標端設定。拋棄指定表。

sp_ctrl>r 20 2    -- 執行上條命令20 次,兩秒一次。

sp_ctrl>help target

sp_ctrl>target o.orcl set metadata time:sp_time.op:sp_op    -- 可以在目標端增加列,寫入時間戳與DML 語句行為。

sp_ctrl>help target set metadata time

 

忽略大事務的操作

過大的事務複製可能會遇到問題,所以建議所有大於 1000 萬資料 DML 操作事務,分成多批次 commit ,並建議不要對相同表做並行的大事物操作。

在有的場景下可能不希望源端的某些修改複製到目標端,比如源端清除歷史資料而目標端需要保留等。

具體步驟如下:

源端,在資料庫中以 shareplex 使用者執行 util 目錄下的 create_ignore.sql ,該指令碼建立了 SHAREPLEX_IGNORE_TRANS  procedure ;只需執行一次。

在執行大的事務前先執行這個 procedure ,即可忽略對該事務 ( 從這個儲存過程至下一個 commit 之間的所有 DML 操作 ) 的複製,如:

SQL> conn test/test

SQL> exec splex.shareplex_ignore_trans;

SQL> insert into tb1 values (100, 'aaa');

SQL> commit;

修改SharePlex 的資料庫使用者密碼

SharePlex 資料庫使用者的密碼還存在於 SharePlex 引數檔案中,不能簡單的在資料庫中更改,需要執行 SharePlex 提供的指令碼進行,具體步驟如下。 對每個環境都單獨列出了詳細步驟

a.         源端stop capture 程式,觀察SharePlex 佇列中資料都已應用到目標端;

b.     shutdown 源端和目標端的SharePlex

c.         執行prod/bin 目錄下的ora_chpwd 命令來自動改變儲存在資料庫中和paramdb 檔案中的密碼。

l   生產環境:

dcdb02:/oracle$ ora_chpwd

 

This program allows you to change the password of the

SharePlex user account needed to run Oracle replication.

 

In response to prompts, a carriage return will choose the

default given in brackets.  If there is no default, a reply must be entered.

 

Please enter the SID where SharePlex is installed [ dl2] :

 empty response--try again : splex

注意:在此處不要使用本地的例項名,要輸入 TNS 別名,然後回車;

 

In order to change the password for the SharePlex user account,

we must connect to the database as SYSTEM.

 

Enter password for the SYSTEM account, which will not echo [MANAGER] :

 empty response--try again :

注意:此處輸入 oracle 資料庫 system 帳戶的口令,但應當在口令的後面加上 @TNS_ALIAS, 然後回車;

connecting--This may take a few seconds.

Enter the current username for SharePlex user :

 empty response--try again : splex

Enter new password for SharePlex user :

 

 empty response--try again :

Re-enter password for SharePlex user :

 empty response--try again :

 

注意:此處輸入 SharePlex 使用者的口令,但應當在口令的後面加上 @TNS_ALIAS, 然後回車。

Changing SharePlex parameter database . . .

SharePlex password change completed successfully.

 

l   管理環境:

dcadm:/oracle$ ora_chpwd

This program allows you to change the password of the

SharePlex user account needed to run Oracle replication.

 

In response to prompts, a carriage return will choose the

default given in brackets.  If there is no default, a reply must be entered.

 

Please enter the SID where SharePlex is installed [ adm] : adm

 empty response--try again :

 

In order to change the password for the SharePlex user account,

we must connect to the database as SYSTEM.

Enter password for the SYSTEM account, which will not echo [MANAGER] :

 empty response--try again :

注意:此處輸入 oracle 資料庫 system 帳戶的口令,不需要後面加上 @TNS_ALIAS, 然後回車;

connecting--This may take a few seconds.

Enter the current username for SharePlex user :

 empty response--try again : splex

Enter new password for SharePlex user :

 empty response--try again :

Re-enter password for SharePlex user :

 empty response--try again :

注意:此處輸入 SharePlex 使用者的口令,不需要在口令的後面加上 @TNS_ALIAS, 然後回車。

Changing SharePlex parameter database . . .

SharePlex password change completed successfully.

d.        啟動源端和目標端的SharePlex

e.          源端start capture 程式,觀察SharePlex 是否複製正常。

新增複製表

u   如果需要對新建的表進行復制,則需要遵循以下步驟:(儘量在業務少的時候進行)

1 目標系統資料庫建立相同的表,然後在 源系統的SharePlex控制檯sp_ctrl下執行copy config命令將當前配置檔案複製並生成一個新的配置檔案。例如,當前處在啟用狀態的配置檔名為filename,則建立一個檔名為 newname的配置檔案;

sp_ctrl(sysA)> copy config filename to newname

(2)透過 源系統的SharePlex控制檯sp_ctrl執行edit config 命令編輯新建的配置檔案newname

sp_ctrl(sysA)> edit config newname

3 )在檔案裡為新建的表增加一行資訊,這行資訊包括該表在源系統中的表名、該表在目標服務其中的表名和路由資訊。例如,在源和目標伺服器的APP 模式下新建了名為a 的表,則應該在檔案裡增加如下的資訊:

APP.a      APP.a      sysB@o.TargetSID

4 )儲存並退出配置檔案;

5 )停止使用者對新建表的任何操作,包括select, update insert delete 等操作;

6 )在 源系統SharePlex 控制檯sp_ctrl 下執行activate config 命令啟用修改後的新的配置檔案,在啟用的過程中原先處於啟用狀態的舊的配置檔案會自動解除啟用狀態;

sp_ctrl(sysA)> activate config newname live

7 )此時,維護工作完成,使用者可以對新建的表進行訪問和操作。

 

 

u   如果需要對已有資料的表新增到鏈路中,則需要遵循如下步驟:

 

1 )首先在目標端停止將會新增的post queue

sp_ctrl (192.168.204.110:2400)> stop post regions01  >>regions01 增表單獨新增的佇列名稱。

2 )在源端修改config ,新增複製表

sp_ctrl (11rac1:2400)> copy config old_config to new_config   >> 複製一份正在使用的 config

sp_ctrl (11rac1:2400)> edit config new_config   >> 編輯複製的 config ,新增複製表

datasource:o.source

#source tables      target tables           routing map

hr.jobs      scott.jobs         192.168.204.110:jobs01@o.tarsp

hr.regions   scott.regions      192.168.204.110:regions01@o.tarsp    >> 需要在 host 之後自定義佇列名稱

sp_ctrl (11rac1:2400)> verify config new_config    >> 驗證 config

sp_ctrl (11rac1:2400)> activate config new_config nolock   >> 啟用 config

注:在啟用配置檔案之後,目標端除新增表之外的其他複製佇列已經可以啟用。

3 expdp 利用flashback_scn 匯出源端需要新增的表資料

[oracle@11rac1 expdp]$ expdp system/111111 directory=expdp dumpfile=regions.dmp tables=hr.regions flashback_scn=5597451

4 impdp 在目標端匯入新增的表資料,並禁用表上的約束以及觸發器

[oracle@11rac1 expdp]$ impdp system/111111 directory=expdp dumpfile=regions.dmp >> 如果使用者相同,則不需要使用 remap_schema 引數

5 reconcile 佇列資料到之前選取的scn

sp_ctrl (192.168.204.110:2400)> qstatus

Queues Statistics for 192.168.204.110

  Name:  regions01 (o.source-o.tarsp) (Post queue)

    Number of messages:          9 (Age      7404 min; Size          1 mb)

    Backlog (messages):          9 (Age      7404 min)

  Name:  jobs01 (o.source-o.tarsp) (Post queue)

    Number of messages:          0 (Age         0 min; Size          1 mb)

    Backlog (messages):          0 (Age         0 min)

sp_ctrl (192.168.204.110:2400)> reconcile queue regions01 for o.source-o.tarsp scn 5597452    >> 一般 expdp 匯出的需要在 reconcile 時加 1 ,使用 RMAN 基於 scn 恢復的則不需要加 1

6 )啟動新增加的表對應的post 佇列

sp_ctrl (192.168.204.110:2400)> start post queue regions01

8 )檢視資料同步情況以及鏈路情況。

9 )可以在維護完成之後,將新增的表併入原有佇列。

刪除複製表

如果將要被刪除的表在當前處在啟用狀態的SharePlex 配置檔案中,則需要遵循以下步驟:(儘量在業務少的時候進行)

1 )透過源系統的SharePlex 控制檯sp_ctrl 執行copy config 命令將當前配置檔案複製並生成一個新的配置檔案。例如,當前處在啟用狀態的配置檔名為filename ,則建立一個檔名為newname 的配置檔案;

sp_ctrl(sysA)> copy config filename to newname

2 )透過源系統的SharePlex 控制檯sp_ctrl 下執行edit config 命令編輯配置新建的配置檔案

sp_ctrl(sysA)> edit config newname

3 )在檔案中將該含有該表的資訊行刪除。

4 )儲存並退出配置檔案;

5 )透過源系統的SharePlex 控制檯sp_ctrl 執行activate config 命令啟用修改後的新的配置檔案,在啟用的過程中原先處於啟用狀態的舊的配置檔案會自動解除啟用狀態;

sp_ctrl(sysA)> activate config newname live

6 )維護工作完成。

重新命名錶

如果被重新命名的表在當前處在啟用狀態的SharePlex 配置檔案中,則需要遵循以下步驟:(儘量在業務少的時候進行)

1 )停止使用者對該表的任何操作,包括select, update insert delete 等操作;

2 )在源系統和目標系統資料庫中上重新命名該表;

3 )透過源系統的SharePlex 控制檯sp_ctrl 執行copy config 命令將當前配置檔案複製並生成一個新的配置檔案。例如,當前處在啟用狀態的配置檔名為filename ,則建立一個檔名為newname 的配置檔案;

sp_ctrl(sysA)> copy config filename to newname

4 )透過源系統的SharePlex 控制檯sp_ctrl 執行edit config 命令編輯配置新建的配置檔案

sp_ctrl(sysA)> edit config newname

5 )在檔案裡修改被重新命名錶所在的行資訊,將該表在源系統中的表名、該表在目標服務其中的表名該為重新命名後的表名。例如,在源和目標伺服器的APP 模式下的表a 被重新命名為表b ,則該表所在的行資訊應該改為:

APP.b      APP.b      sysB@o.TargetSID

6 )儲存並退出配置檔案;

7 )透過源系統的SharePlex 控制檯sp_ctrl 執行activate config 命令啟用修改後的新的配置檔案newname ,在啟用的過程中原先處於啟用狀態的舊的配置檔案會自動解除啟用狀態;

sp_ctrl(sysA)> activate config newname live

8 )維護工作完成,使用者可以對重新命名之後的表進行訪問和操作。

新增LOB 列或者重新命名列

 

對於alter table add a LOB column操作,如果被執行該操作的表在當前處在啟用狀態的SharePlex配置檔案中,則必須遵循以下步驟保證複製環境兩套資料庫系統的一致性。(儘量在業務少的時候進行)

(1)停止使用者對該表的任何操作,包括select, update,insert和delete等操作;

(2)透過源系統的SharePlex控制檯sp_ctrl下執行copy config命令將當前配置檔案複製並生成一個新的配置檔案。例如,當前處在啟用狀態的配置檔名為filename,則建立一個檔名為 newname的配置檔案;

sp_ctrl(sysA)> copy config filename to newname

(3)透過源系統的SharePlex控制檯sp_ctrl下執行edit config 命令編輯配置新建的配置檔案;

sp_ctrl(sysA)> edit config newname

(4)在檔案中將要增加LOB欄位(或重新命名欄位)的表的資訊行刪除。

(5)儲存並退出配置檔案;

(6)透過源系統的SharePlex控制檯sp_ctrl執行activate config命令啟用修改後的新的配置檔案,在啟用的過程中原先處於啟用狀態的舊的配置檔案會自動解除啟用狀態;

sp_ctrl(sysA)> activate config newname live

(7)在源系統和目標系統資料庫中對該表增加LOB欄位(或重新命名欄位);

(8)透過源系統的SharePlex控制檯sp_ctrl執行activate config命令啟用原先的配置檔案filename,在啟用的過程中剛剛處於啟用狀態的配置檔案newname會自動解除啟用狀態;

sp_ctrl(sysA)> activate config filename live

(9)維護工作完成,使用者可以對該表進行訪問和操作。

對於alter table move tablespace操作,如果被執行該操作的表在當前處在啟用狀態的SharePlex配置檔案中,則必須遵循以下步驟保證複製環境兩套資料庫系統的一致性。(儘量在業務少的時候進行)

(1)停止使用者對該表的任何操作,包括select, update,insert和delete等操作;

(2)透過 源系統的SharePlex控制檯sp_ctrl下執行copy config命令將當前配置檔案複製並生成一個新的配置檔案。例如,當前處在啟用狀態的配置檔名為filename,則建立一個檔名為 newname的配置檔案;

sp_ctrl(sysA)> copy config filename to newname

(3)透過 源系統的SharePlex控制檯sp_ctrl下執行edit config 命令編輯配置新建的配置檔案;

sp_ctrl(sysA)> edit config newname

(4)在檔案中將要轉移表空間的表的資訊行刪除。

(5)儲存並退出配置檔案;

(6)透過 源系統的SharePlex控制檯sp_ctrl執行activate config命令啟用修改後的新的配置檔案,在啟用的過程中原先處於啟用狀態的舊的配置檔案會自動解除啟用狀態;

sp_ctrl(sysA)> activate config newname live

(7)在源系統和目標系統資料庫中對移動該表到新的表空間;

(8)透過 源系統的SharePlex控制檯sp_ctrl執行activate config命令啟用原先的配置檔案filename,在啟用的過程中剛剛處於啟用狀態的配置檔案newname會自動解除啟用狀態;

sp_ctrl(sysA)> activate config filename live

(9)維護工作完成,使用者可以對該表進行訪問和操作。

一個軟體啟動多個SP 例項

1 )分配埠號

需要給每一個sp_cop 分配一個唯一的埠號

2 )建立variable-data 目錄

為每一個sp_cop 例項建立一個variable-data 目錄。

l   按照SharePlex Instanllation Guide 安裝SharePlex ,在安裝最後,你需要一個product 目錄以及一個variable-data 目錄關聯一個埠以及一個資料庫賬戶,這是你的基礎例項。

l   關閉正在執行的sp_cop 例項。

l   為每一個例項複製一個 vardir 目錄。

cp -p -r /splex/vardir/splex2100 /splex/vardir/splex2101

cp -p -r /splex/vardir/splex2100 /splex/vardir/splex2102

 

3 )定義埠號在SharePlex 環境中

a. 定義環境 variable-data 環境變數

ksh shell:

export SP_SYS_VARDIR=/ full_path_of_variable-data_directory

csh shell:

setenv SP_SYS_VARDIR / full_path_of_variable-data_directory

 

b. 定義環境變數 SP_COP_TPORT and SP_COP_UPORT

ksh shell:

export SP_COP_TPORT= port

export SP_COP_UPORT= port

csh shell:

setenv SP_COP_TPORT port

setenv SP_COP_UPORT port

 

c. 啟動 sp_cop 例項使用 -u 選項

$ /productdir/bin/sp_cop -uport&

 

d. 使用如下引數為環境變數中 variable-data 設定埠

sp_ctrl> set param SP_COP_TPORT port

sp_ctrl> set param SP_COP_UPORT port

 

e. 關閉例項

Shut down sp_cop.

 

f. variable-data 目錄中的 rim 子目錄中,刪除 shstinfo.ipc 以及 shmaddr.loc 檔案(如果之前安裝的 SharePlex 從未啟動過 sp_cop 這兩個檔案可能不存在)

 

h. 重複上述步驟為每一個例項

 

 

如果是為同一個資料庫啟動不同例項,則下面步驟可以省略。

 

4 )如果針對不同資料庫,則需要在完成上述步驟之後,為每一個資料庫執行ora_setup

a. 定義環境 variable-data 環境變數

ksh shell:

export SP_SYS_VARDIR=/ full_path_of_variable-data_directory

csh shell:

setenv SP_SYS_VARDIR / full_path_of_variable-data_directory

 

b. 定義環境變數 SP_COP_TPORT and SP_COP_UPORT

ksh shell:

export SP_COP_TPORT= port

export SP_COP_UPORT= port

csh shell:

setenv SP_COP_TPORT port

setenv SP_COP_UPORT port

 

c./ora_setup, 根據互動介面提示,為每個 sp_cop 例項配置不同資料庫設定。

 

a. 使用前提

檢視對應capture c ),export x ),post p )佇列,需要停止對應的程式,才能正常讀取佇列資訊。

b. 使用順序

[oracle@11rac1 ~]$ export SP_SYS_VARDIR=<VARDIR>

[oracle@11rac1 ~]$ qview –i

qview > qinit   

  注:

 qsetup                       - init command if sp_cop is not running

 qinit                           - init command if sp_cop is running

qview > set out

qview > set detail full

qview > open p r                     >> 開啟post 佇列,set 設定要在open 佇列之前

qview > oread 0 10000

qview > exit

d. 退出qview 之後,在執行qview 命令的目錄下可以看到qview.out 檔案,即佇列訊息詳情

2.15 新增複製使用者

u   如果需要為現有鏈路增加複製使用者,則需要遵循以下步驟:(儘量在業務少的時候進行)

1 源系統的SharePlex控制檯sp_ctrl下執行copy config命令將當前配置檔案複製並生成一個新的配置檔案。例如,當前處在啟用狀態的配置檔名為filename,則建立一個檔名為 newname的配置檔案;

sp_ctrl(sysA)> copy config filename to newname

(2)透過 源系統的SharePlex控制檯sp_ctrl執行edit config 命令編輯新建的配置檔案newname

sp_ctrl(sysA)> edit config newname

3 )在檔案裡為新建的使用者增加一行資訊。例如,新增new_user 使用者下所有表,並在目標端主機sysB 建立新佇列new_q ,則應該在檔案裡增加如下的資訊:

expand new_user.%      new_user.%      sysB:new_q@o.TargetSID

4 )儲存並退出配置檔案;

5 )在目標端預先停止新佇列new_q

sp_ctrl sysB > stop post queue new_q

6 )在 源系統SharePlex 控制檯sp_ctrl 下執行activate config 命令啟用修改後的新的配置檔案,在啟用的過程中原先處於啟用狀態的舊的配置檔案會自動解除啟用狀態;

sp_ctrl(sysA)> activate config newname nolock

7 )確認目標端新佇列狀態為stopped by user

sp_ctrl(sysB)> show

8 )源端資料庫選取scn

SQL> select min(start_time) from gv$transaction;

# 此命令查詢出來時間需要在第 6 步啟用時間之後,確保 SharePlex 捕獲資料庫所有事務,如果有事務在第 6 步啟用時間之前,則等待事務結束,再次查詢,確保該命令查詢時間在第 6 步啟用時間之後,即可使用下面命令選取 scn

SQL> select to_char(current_scn) from v$database;

9 )源端資料庫利用第8 步選取SCN 匯出資料

expdp \'\/ as sysdba\' directory=dir_name dumpfile=splex_%U.dmp parallel=4 flashback_scn=< 8 步選取 scn> cluster=no schemas=< 使用者名稱 >

10 )目標端資料庫匯入資料

impdp \'\/ as sysdba\' directory=dir_name dumpfile=splex_%U.dmp parallel=4

# 匯入時,需要在目標端建立與源端相同表空間,如果不想建表空間,則需要 impdp 匯入時使用 remap_tablespace 引數

11 )禁用目標端外來鍵、觸發器

SQL> select 'alter table "'||owner||'".'||table_name||' disable constraint "'||constraint_name||'";' from dba_constraints where constraint_type in ('R') and owner in('HR') order by status,owner;

SQL> select 'alter trigger "'||owner||'"."'||trigger_name||'" disable;' from dba_triggers where owner in('HR') order by status,owner;

12 )目標端SharePlex reconcile 佇列資料

sp_ctrl> qstatus

sp_ctrl> reconcile queue <new_q> for <o.src-o.tar> scn <scn_number>

# 上面尖括號中, new_q 為新佇列名稱, o.src-o.tar 為命令 qstatus 輸出佇列名稱後一串字元, scn_number 為匯出資料時選取的 scn

13 )目標端啟動post

sp_ctrl> start post queue <new_q>

 

SharePlex AA 複製實施

前言

  AA 複製即源端為oracle ,目標端也為oracle

  實施之前一定要備份源庫,並保證備份的可用性,並制定完備的回退方案。

  SharePlex 可以用作容災,報表分離,資料分發,資料遷移。

  使用SharePlex 進行資料遷移一般具有資料量大,源端與目標段為異構平臺,停機時間短等特點,遷移完成之後,可以再次配置目標段到源端的複製,防止試執行階段出現問題以便回切。

  使用SharePlex 進行異構容災實施步驟大致與異構遷移相同,主要區別在於最後資料遷移完成之後目標段FK job trigger 的處理。

環境準備

  源庫空間準備,中間庫準備,目標端相關軟體安裝,RAC 安裝時需要安裝在共享磁碟上,並且將SharePlex 啟動在可浮動的一個service IP 上。

  在源庫與目標庫安裝同版本的ShanrePlex ,可以不同平臺,但一定要保證版本一致。

  在源端編寫config 檔案,並在源端與目標端都停止Post 程式,然後verify analyze config ,然後再根據分析結果,修改最佳化config 檔案。

資料初始化

  a. 有中間庫時,可以使用DG 搭建與源庫同平臺的中間庫環境,並配置好DG ,然後在源端啟用上一步配置好的config 檔案,開始capture 捕獲,在v$transaction 檢視中事務開始時間都晚於捕獲時間之後,查詢select to_char(current_scn) from v$database; 選取一個SCN ,然後在確保SCN 之前所有的資料都同步到中間庫之後,可以將DG 斷開。

(1)    如果是10g 之前的版本,如果資料量較大,則可以使用RMAN 在中間庫不完全恢復到選取的SCN ,然後使用exp 人為分割大表啟動多個exp 程式,啟用併發加快匯出資料速度。

(2)    10g 以後的版本使用expdp 配合FLASHBACK_SCN=<SCN_NUMBER> 將資料匯出。

  b. 沒有中間庫時,在源端先開啟捕獲,保證v$transaction 檢視中所有事務開始時間都在捕獲時間之後,然後選取scn ,使用exp/expdp 進行基於該scn 匯出,在目標端匯入。

注:目標資料庫 FK job trigger 的處理,正常的 job schedule job 必須都禁用掉,使用如下語句生成批次禁用語句,然後執行。

SQL> select 'alter table "'||owner||'".'||table_name||' disable constraint "'||constraint_name||'";' from dba_constraints where constraint_type in ('R') and owner in('HR') order by status,owner;

SQL> select 'alter trigger "'||owner||'"."'||trigger_name||'" disable;' from dba_triggers where owner in('HR') order by status,owner;

禁用目標端 job

SQL>alter system set job_processes=0 scope=both sid=’*’;

佇列資料

  在目標端,使用sp_ctrl 控制檯,reconcile 目標端post 佇列中啟用源端config 開啟capture 到選取的SCN 之間的資料,以保證開啟post 之後,SharePlex 可以將之後資料對接,保證資料一致性。

  sp_ctrl (cluster1vip:2100)>qstatus

  sp_ctrl (cluster1vip:2100)>help reconcile

  sp_ctrl (cluster1vip:2100)> reconcile queue datamove for o.wahaha-o.honor1 scn 698767

  sp_ctrl (cluster1vip:2100)>qstatus

注:資料泵匯入匯出的時候, reconcile scn 一般需要加 1 rman until scn 方式恢復的不需要加 1.

開啟目標端post

  sp_ctrl (cluster1vip:2100)>start post

  sp_ctrl (cluster1vip:2100)>qstatus

  sp_ctrl (cluster1vip:2100)>show sync

  使用sqlplus 檢視資料同步情況,同步完成之後,檢視源端與目標端資料是否一致。

目標端FK job trigger 處理

  如果使用SharePlex 做容災映象複製,目標端FK job trigger 則禁止,禁止方法參考3.3 節,直到需要切換到災備庫時啟用。

  如果使用SharePlex 做資料遷移,則需要在遷移完成之後啟用FK job trigger

SharePlex 其他複製說明

複製

u   在級聯複製中,DDL 複製只從源端到中間端,不包含中間段到目標段。

u   預設SharePlex 開啟Truncate TABLE ALTER TABLE to ADD COLUMNS or DROP COLUMNS DDL 複製。

注:預設DDL 配置受引數SP_OCT_REPLICATE_DDL 引數影響,1 ALTER TABLE 2 TRUNCATE TABLE 3 ALTER TABLE TRUNCATE TABLE ,預設為3

u   預設SharePlex AUTO_ADD 特性會自動捕獲在啟用配置檔案(前提是新建的物件在配置檔案中使用萬用字元等方式匹配)之後建立的表與索引,並自動複製到目標端,將物件加入複製列表,維護物件以後的DDL DML

注:預設AUTO_ADD SP_OCT_AUTOADD_ENABLE 引數影響,預設為1 ,即ENABLE

u   如果需要開啟TRIGGER SYNONYM GRANT 的複製,需要設定以下引數為1

DDL   command

Set   this parameter to 1

CREATE   / DROP TRIGGER

SP_OCT_REPLICATE_TRIGGER

CREATE   / DROP SYNONYM

SP_OCT_REPLICATE_SYNONYM

GRANT

SP_OCT_REPLICATE_GRANT

 

u   如果需要開啟SEQUENCE,MATERIALIZED VIEW 複製,需要設定一下引數為1

前提:1. 保證SP_OCT_AUTOADD_ENABLE 引數設定為1.

DDL   to auto-add

Parameter   to set to 1

Additional   requirements

CREATE /   DROP SEQUENCE

 SP_OCT_AUTOADD_SEQ

Set the   SP_OCT_TARGET_COMPATIBILITY parameter to at least 8.6.3

CREATE /   DROP MATERIALIZED VIEW*

SP_OCT_AUTOADD_MV

Set the SP_OCT_TARGET_COMPATIBILITY   parameter to at least 8.6.3

 

u   SharePlex 可以複製不包含在啟用的配置檔案內的物件的DDL ,但是不會複製任何資料,因為沒有啟用的配置檔案包含物件。

SP_OCT_REPLICATE_ALL_DDL 設定為1

異構複製map columns

環境:RedHat6  Oracle11.2.0.4 SharePlex9.0

注意事項:

1. 源庫的所有列必須對映給目標端的列,名稱可以不同,目標表的列數量可以多於源庫表的列數量。

2. 在配置了列對映的表中使用 ALTER TABLE 增加列是不被支援的。

樣例配置檔案:

sp_ctrl (11rac1:2300)> view config hr_20170708

datasource:o.source

#source tables      target tables           routing map

#splex.demo_src      splex.demo_dest            target_system@o.target_sid

hr.employees         hr.employees               192.168.204.112@o.target

hr.test (id,name)  hr.coltest (nu,last_name)    192.168.204.112@o.target

級聯複製

l   級聯複製情境

1. 源庫允許有超過1024 個複製路由,則可以透過傳送到中間系統,透過廣播的方式,分發給目標系統。

2. 源庫由於防火牆限制或者其他因素導致無法直接建立與目標端的連線,則可以使用級聯複製。

注:使用級聯複製,即使源庫無法連線目標端,源端也要能解析目標端的主機。

l   級聯複製要求

1.     在所有系統中建立相同SharePlex 使用者名稱使用者。

2.     在目標端禁用影響DML 操作的觸發器。

3.     排除SharePlex 使用者的DML DDL 複製,配置檔案中物件以外的表可以有DML DDL 操作,但不能影響複製佇列。

4.     如果序列在目標端是不需要的,則不要複製序列,複製序列會造成複製遲緩。因為序列用來在插入操作時產生列的鍵值,而值會複製到目標端,所以序列可以不復制。

中間系統為資料庫,有post 情況下級聯複製

l   配置注意事項:

1.     在所有系統的資料庫中,必須有相同名稱的SharePlex 的使用者。

2.     觸發器必須在在中間庫與目標庫中禁用。

3.     SharePlex 不支援從中間庫到目標庫的DDL 複製,只支援源庫到中間庫的DDl 複製,所以在中間庫需要禁用掉SP_OCT_REPLICATE_DDL SP_OCT_REPLICATE_ALL_DDL 兩個引數。

4.     需要在源庫與中間庫建立兩個配置檔案。

5.     源庫與中間庫開啟歸檔,防止在捕獲完成之前聯機重做日誌被清除。

 

l   配置樣例:

Example on source system

Datasource:o.oraA

hr.emp                hr.emp2                 hostB@o.oraB

hr.sal                  hr.sal2                   hostB@o.oraB

cust.%                cust.%                 

 

Example on intermediary system

Datasource:o.oraB

hr.emp                hr.emp2                 hostC@o.oraC

hr.sal                  hr.sal2                    hostD@o.oraD+hostE@r.mssE

cust.%                cust.%                    !cust_partitions

l   需要配置引數

如果中間庫是Oracle ,需要設定引數SP_OCT_REPLICATE_POSTER 1 ,預設為0 ,引數設定為0 時,SharePlex capture 將忽略post 程式的活動。

中間系統為pass-through

l   配置前提

1.     Oracle 資料庫下,建立Oracle 例項以及在/etc/oratab 或者windows 登錄檔中指定對應ORACLE_SID ,資料庫可以為空。

2.     不支援DDL 複製

3.     只需要在源端建立一個配置檔案即可。

                                             

高可用複製

配置雙向複製,停止備機端的export 程式。

配置Change-History 複製

l   建立Change-History 配置檔案

1)         確保系統符合SharePlex 要求以及已經按照規範安裝了SharePlex 軟體。

2)         在目標段建立與需要記錄改變歷史的源端表相同結構及表名的表,省略掉所有列上的所有約束。

注:目標記錄改變歷史表不能有主鍵約束,外來鍵約束,唯一鍵,非空,檢查約束,也不能在列上定義預設值。因為這個表記錄的是改變歷史,一行的值有可能有與其他行相同的鍵值。Post 在記錄改變歷史的目標端不能參照完整性約束。

3)         在目標端禁用觸發器trigger

4)         在目標表禁止除了SharePlex 使用者外所有使用者的DML DDL 操作。

5)         在源端,使用如下語法建立config 檔案。

  Datasource:o.SID 是源端Oracle 例項的ORACLE_SID

  Src_owner.table 是一個完整合法的源端物件(owner.object )或者使用萬用字元指定的物件。

  !cdc: 指定目標端表為change-history

  tgt.owner.table 是一個在目標段完整合法的change-history 表或者使用萬用字元指定的表。

  host 是指目標系統

  c.SID 指定目標端的Oracle 例項

6)         (可選步驟)在目標端執行product_dir/util/add_change_tracking_columns.sql 指令碼,新增預設名稱的列定義。Post 可以自動填入預設定義的列而不需要任何額外的配置,你也可以自定義指令碼去匹配自己的要求。

注:

ü   上述指令碼只新增預設名稱的列。如果新增可選擇的列或者改變列的名稱,使用target 命令新增自定義的列名稱到Post 配置。檢視target 命令預設以及可選的列定義,可以參考SharePlex Reference Guide

ü   在一個change-history 配置中,配置檔案中捕捉到的新增新表DDL 將自動新增預設change-history 列。

其他的change-history 配置選項

這部分內容描述如何自定義配置SharePlex 記錄改變歷史。

a) 使用自定義列明記錄改變歷史

在目標端可以使用target 命令自定義任何目標定義的列,target 詳細用法可以參考SharePlex Reference Guide

b) 源端每一行改變都在目標端記錄前映象

可以透過在目標端設定SP_OPO_TRACK_PREIMAGE 引數為U 來在記錄改變歷史時記錄改變的值同時新增一行記錄前映象值。這個引數將會使Post 在源端表每行發生改變時在目標端記錄改變歷史表中插入兩行:一行是改變後的映象另一行為改變前的映象。前映象由改變後的值與改變數構成,除非源端啟用了SP_OCT_USE_SUPP_KEYS 引數。

當前映象值被設定為保留,則預設列名為SHAREPLEX_SOURCE_OPERATION 的列值將會有兩條記錄:1. 更新前的值 2. 更新後的值

注:保留前映象的行不包含任何型別為 log 的欄位,因為 redo log 不會記錄 log 的前映象。

可以取消設定 SP_OPO_TRACK_PREIMAGE 引數,然後透過使用 target 命令 set cdc preimage 選項將全域性設定改為表級別。

c) 在記錄歷史表中包含操作行的所有列值

在目標端記錄改變歷史的表中記錄源端修改的行的所有列的值,而不僅僅包含修改的列值,需要進行如下操作:

ü   開啟源端表基於所有列的最小附加日誌。

示例語句:ALTER TABLE EMP ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

ü   在源端設定引數SP_OCT_USE_SUPP_KEYS 1.

ü   在源端設定引數SP_OCT_INCLUDE_UNCHANGED_COL 1.

注:當同時啟用 SP_OCT_USE_SUPP_KEYS SP_OPO_TRACK_PREIMAGE 引數時,前映象行將包含改變前行所有列值。

d) 在記錄改變歷史的複製中遮蔽掉操作型別

在目標端遮蔽掉源端DML 操作型別,設定SP_OPO_TRACK_OPERATIONS 引數為合適的值,使用斜槓/ 分開多個值。例如,維護改變歷史表只記錄insert update ,改變引數值為I/U 。預設值為I/U/D ,將記錄所有的DML 操作。

e) 設定規則與過濾器

可以透過使用target 命令的set rule 選項去設定應用條件控制改變是否應用到目標記錄改變歷史表中。例如,你可以指定一個加入第一列與第三列改變了,然後應用操作並且丟棄在其他行上的任何改變,可以參考SharePlex Reference Guide

f) 包含提交操作

預設的,提交記錄不包含在記錄改變歷史表中。可以透過配置Post 去插入每一次提交記錄,設定SP_OPO_TRACK_COMMITS 引數為1.

Kafka 複製

概述

SharePlex Post 程式可以連線並寫入到Kafka broker 中。資料被以XML 記錄幷包含資料定義、操作型別以及被修改的列值寫入。資料被以在源端發生的操作的連續系列寫入,這些資料可以被以連續的順序傳送到目標資料庫或者被外部程式消費。

傳送到Kafka 說明

u   SharePlex Post 程式扮演一個Kafka producer 角色。一個SharePlex Post 程式只能寫一個broker 的預設partition 0 的單一topic 。想支援多個topics 或者多個broker ,需要使用命名Post 佇列的方式配置多個SharePlex Post 程式。

u   SharePlex Post 程式不會建立topics ,必須在Kafka 平臺建立topic

u   出於考慮效能的原因,Post 在傳送到Kafka broker 之前將訊息集合到一批。最佳化引數可用來控制批訊息的大小。這可以用來平衡效能與延遲。

注: SharePlex Kafka 平臺支援的平臺,資料型別以及操作型別可以參考 SharePlex Release Notes 文件。

源端SharePlex 配置

當複製資料到Kafka 平臺時,使用一下步驟配置源端資料庫以及SharePlex

開啟supplemental logging

在源端系統oracle 資料庫中,啟用PK/UK 最小附加日誌。SharePlex 必須有Oracle 鍵資訊在目標端建立合適鍵。

SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(PRIMARY KEY,UNIQUE) COLUMNS;

設定SP_OCT_USE_SUPP_KEYS 引數

在源端系統,設定SP_OCT_USE_SUPP_KEYS 引數為1, 。這個引數指導SharePlex 使用Oracle 最小附加日誌列作為關鍵鍵值列當update 或者delete 一行資料時。當資料庫supplemental logging 以及該引數都被設定之後,這保證了SharePlex 可以總是構建鍵以及SharePlex 鍵匹配Oracle 的鍵。

注:可以透過檢視 Reference Guide 官方文件檢視更多關於 SP_OCT_USE_SUPP_KEYS 引數的資訊。

配置複製

在源端,建立SharePlex 配置檔案指定Capture 的路由資訊。配置檔案的變化,需要根據定製的複製策略,以下顯示為路由資料到Kafka 的語法要求。

 

 


說明:

u   SID 為源端Oracle 資料庫ORACLE_SID

u   Src_owner.table 為源端表的擁有者以及表名

:tgt_owner.table 為可選項以及指定目標端表的擁有者以及名字。Use if either component is different from that of the source table. 允許!kafka :tgt_owner.table 之間沒有空格。正確的關鍵字以及雙引號中是大小寫敏感,”MySchema”.”MyTable”

u   host 是目標系統的名字。

 

 

 


目標端SharePlex 配置

以下部分介紹配置SharePlex Post 程式連線Kafka ,你必須有一個正在執行的Kafka broker

配置Post Kafka

1 )建立Kafka topic

2 )啟動sp_cop (不要啟用源端配置檔案)

3 )執行sp_ctrl

4 )使用target 命令配置posting Kafka broker topic 。示例如下:

sp_ctrl> target x.kafka set kafka broker =localhost:9092

sp_ctrl> target x.kafka set kafka topic =shareplex

See View and change Kafka settings for command explanations and options.

檢視並且修改Kafka 設定

檢視當前輸出到Kafka 的設定,使用如下命令。

sp_ctrl>target x.kafka show

修改設定,使用如下命令。

sp_ctrl>target x.kafka [queue queuename] set kafka property=value

說明:

u   佇列queuename post 佇列的名字,如果需要多個post 程式,使用此選項

u   下表中有屬性以及取值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


設定恢復選項

如果Kafka 程式突然意外中止,或者機器意外中止,行變化有可能會在kafka topic 中寫兩次。消費者必須透過檢測以及丟棄重複來管理這種情況。

在一個事務中對每一個行操作的記錄都有相同的事務ID 並且通常使用sequence ID 標記。這個屬性在XML 輸出關鍵詞txn 元素下分別使用關鍵詞id 與關鍵詞msgldx

事務ID 是事務提交時間的SCN sequence ID 是在事務中行變化的index 。在重寫Kafka topic 的恢復情境中必須保證這兩個值相同。

如果想要,可以使用target 命令配置Post 使每一個行改變記錄包含附加的metadata 資訊。

target x.kafka [ queue queuename] set metadata property[, property]

 

 

 

 


Example

target x.kafka set metadata time, userid, trans, size

To reset the metadata

target x.kafka [ queue queuename] reset metadata

To view the metadata

target x.kafka [ queue queuename] show metadata

 

.日常監控

啟動/ 關閉SharePlex

啟動SharePlex

oracle 使用者登入

$ sp_cop &

$ ps -ef |grep sp_           檢查程式執行情況

關閉SharePlex

$ sp_ctrl 

sp_ctrl> shutdown

 

登入控制檯

SharePlex 的日常維護主要透過登入控制檯執行

使用oracle 使用者登入。

$ sp_ctrl

主要監控專案

A.     檢查複製程式狀態,應該為running 狀態

sp_ctrl> show

B.     檢查佇列狀態,正常業務壓力下各佇列中Backlog 數目不應過大,0 表示該佇列中無資料積累。如果積累過多則需要關注(比如百萬以上)。

sp_ctrl> qstatus

C.     (只在源端)檢查Capture 程式詳細狀態,可以看到每個例項的當前Oracle Redo log 號(對應”Oracle Log” )和SharePlex 正在處理的Oracle Redo log 號(對應”Redo Log” )。如果發現”Redo Log” 滯後”Oracle Log” ,則需要關注。

sp_ctrl (yxzb:2200)> show capture detail

Host: yxzb

                                      Operations

Source     Status            Captured             Since

---------- --------------- ---------- ------------------

o.splex    Running           28687899         19-Jun-09 01:10:59

   Log reader threads:

Thread  Instance      Host    Oracle Log  Redo Log  Log Offset   Kbytes Read

   ------  ------------  ------------  ----------  --------  ------------  ------------

    1  dl1      dcdb01   22338   22338   218919904     118315716

    2  dl2      dcdb02   11378   11377   87642560      40060727

sp_ctrl>  /

重複執行該命令,”Log Offset” 的值應該是增長的。

管理歸檔檔案時需注意,SharePlex 已經處理完的(Redo Log - 1 )歸檔可以刪除。

D.    (只在目標端)檢查POST 佇列詳細狀態,可以檢視處理到什麼時間的資料了。如果發現“Transactions posted" 小於10 ,或者處理的很慢了,則需要關注。

sp_ctrl>  show post detail

sp_ctrl>  /

重複執行該命令,”Operations Posted” 的值應該是增長的。

E.     (只在目標端)檢視不一致物件,如果發現不一致物件,可根據日誌中的資訊確認發生不一致的資料,找到產生原因。最後要針對該表進行同步(一般採用copy 方式)。

sp_ctrl> show sync

F.     檢視status 庫,關注error 資訊

sp_ctrl> show statusdb

G.    問題解決後,可清除日誌

sp_ctrl> clear status all

H.    檢視佇列剩餘空間(以下目錄根據實際環境檢視)

生產庫:/databackup

管理庫:/databackup

I.      檢視資料庫歸檔空間剩餘

生產庫:/arch01   &    /arch02

檢視日誌

很多錯誤需要詳細的日誌資訊幫助解決問題。

sp_ctrl> show log reverse

vardir log 目錄下包含各程式的日誌檔案,最主要的是event_log 檔案。show log 命令只是顯示了event_log 檔案的部分內容。

如果event_log 中的資訊不足以幫助解決問題,還需要去log 目錄下查詢具體程式的日誌。

 

生產庫日誌目錄(根據自己實際目錄檢視):

/databackup/splex/vardir/log

管理庫日誌目錄:

/databackup/splex/vardir/log

.一些效能診斷方案

針對capture too slow

Cpature trace   資訊收集按計劃執行:
1.
每個小時在源端執行一次,直至跑批業務結束,至少要覆蓋業務高峰期。
sp_ctrl>trace capture

2. 每小時在源端執行,收集更詳細的資訊
sp_ctrl> set param SP_OCT_UTILIZATION_TIMERS 1
let it run for 15 mins, then turn off
sp_ctrl> reset param SP_OCT_UTILIZATION_TIMERS
 
3.
收集更詳細的資訊:
sp_ctrl> stop capture
sp_ctrl> set param SP_OCT_UTILIZATION_TIMERS 2
sp_ctrl> start capture
let it run for 15 mins, then turn off
sp_ctrl> reset param SP_OCT_UTILIZATION_TIMERS
sp_ctrl> stop capture
sp_ctrl> start capture
 
所有生成的 *.csv 檔案都需要收集。

 

SharePlex 一些問題的解決方案

l   show log event 檢視event 日誌,show statusdb 檢視資料庫配置狀態。

l   post 檢測到錯誤時,會記錄100 sql 語句以及不同步的資料,可以在修復問題之後,使用該sql 語句在條件設定的不苛刻情況下修復不同步的資料,

l   程式日誌,當程式出現問題,SharePlex 不僅僅在event 日誌中記錄,也會在相應程式日誌中記錄。

忽略一些SP 可以修復的報錯

注意:

1. 一些錯誤即使寫入oramsglist post 也不會忽略這些錯誤。

2. 忽略會造成一些隱藏的資料不同步情況,如果使用者無法容忍post 產生間隙或者可以接受一些資料不同步,可以使用忽略,可以忽略的錯誤一般都是透過repair copy 這些SharePlex 內建命令可以解決或者資料重複的錯誤,可以在vardir log 目錄下檢視SID_errlog.sql 檢視詳細的忽略掉的錯誤情況。

l   忽略post 中的DML 錯誤操作步驟:

a)      在目標庫, 進入SharePlex vardir 目錄下的data 子目錄。

b)      找到oramsglist 檔案。

c)      如果複製沒有啟用,使用文字編輯器開啟該檔案,如果複製啟用狀態,則複製一份檔案副本,然後使用文字編輯器開啟副本。

d)      在檔案的開始增加錯誤編號。

[oracle@11rac2 data]$ vim oramsglist

942

e)      在檔案的末尾,新增每一個Oracle 或者SharePlex 錯誤號碼,一個錯誤一行。

f)       儲存並關閉檔案。

g)      如果post 還在執行,則停止post

h)      如果你編輯了一個oramsglist 檔案的映象,則儲存映象檔名為原始的oramsglist

i)       修改SharePlex 引數SP_OPO_CONT_ON_ERR 1.

j)       啟動post

附表: SP_OPO_CONT_ON_ERR 設定為 1 可以忽略的錯誤列表。

Ø   unique key violation

Ø   operation interrupted

Ø   no data found

Ø   no such table

Ø   invalid number

Ø   non-numeric in date

Ø   invalid rowid

Ø   invalid hex number

Ø   cannot update not-null to null

Ø   Year must be between -4713 and +9999

Ø   check constraint violated

Ø   packet writer failure*

Ø   sequence not found

Ø   Oracle internal error

複製到Kafka 不顯示

問題描述

a. 表結構

SQL> desc CONTACT_CLSLIST
 Name                                   Null?         Type
 ----------------------------------------- -------- ----------------------------
 CUST_ID                             NOT NULL  NUMBER(10)
 CONTACT_SEQ                     NOT NULL  NUMBER(4)
 CONTACT_CLASS_SEQ          NOT NULL  NUMBER(4)
 CONTACT_CLASS_CODE        NOT NULL  CHAR(1)
 CONTACT_NO                       NOT NULL  VARCHAR2(680)
 CONTACT_EXT                                      VARCHAR2(16)
b. 源端插入以及目標段消費

  正常插入

SQL> insert into contact_clslist values(666669,5,6,'d','zhang','san');
1 row created.
SQL> commit;
目標端情況,可以看到此時所有列值都有:

{"meta":{"time":"2017-11-28T12:10:03","userid":84,"op":"ins","scn":"14594373997256","rowid":"AAAU5pAAJAAERkBAAo","trans":"21.2.107520","seq":1,"size":1,"table":"CL_CUST2.CONTACT_CLSLIST","idx":"1/1","posttime":"2017-08-11T11:05:47"},"data":{"CUST_ID":"666669","CONTACT_SEQ":"5","CONTACT_CLASS_SEQ":"6","CONTACT_CLASS_CODE":"d","CONTACT_NO":"zhang","CONTACT_EXT":"san"}}

  可以為空列插入null 值時

SQL> insert into contact_clslist values(666670,6,7,'e','zhang',null); 
1 row created.
SQL> commit;

目標端情況,可以看到插入的null 值列已經沒有了:
{"meta":{"time":"2017-11-28T12:11:40","userid":84,"op":"ins","scn":"14594373998179","rowid":"AAAU5pAAJAAERkBAAq","trans":"22.7.31700","seq":1,"size":1,"table":"CL_CUST2.CONTACT_CLSLIST","idx":"1/1","posttime":"2017-08-11T11:07:24"},"data":{"CUST_ID":"666670","CONTACT_SEQ":"6","CONTACT_CLASS_SEQ":"7","CONTACT_CLASS_CODE":"e","CONTACT_NO":"zhang"}}

  可以為空列插入空值時

SQL> insert into contact_clslist values(666671,7,8,'f','wang','');
1 row created.
SQL> commit;

檢視目標端情況,可以看到此時為空列也沒有了:
{"meta":{"time":"2017-11-28T12:12:47","userid":84,"op":"ins","scn":"14594373998813","rowid":"AAAU5pAAJAAERkBAAu","trans":"3.26.157364","seq":1,"size":1,"table":"CL_CUST2.CONTACT_CLSLIST","idx":"1/1","posttime":"2017-08-11T11:08:31"},"data":{"CUST_ID":"666671","CONTACT_SEQ":"7","CONTACT_CLASS_SEQ":"8","CONTACT_CLASS_CODE":"f","CONTACT_NO":"wang"}}

因為針對插入時,如果值少於列值,針對未明確賦值的列oracle 會自動填入null 值,所以第三種現象也是null 值不顯示的問題。

解決方案

在源端設定SP_OCT_INSERT_INCLUDE_NULLS為1然後重啟capture程式,插入語句將包含null值。

sp_ctrl> set param SP_OCT_INSERT_INCLUDE_NULLS 1

sp_ctrl> stop capture

sp_ctrl> start capture

    關於此問題可參考:

複製中Post 不處理問題

複製環境

環境

源端

目標端

Oracle 版本

11.2.0.4 RAC

11.2.0.4 RAC

SharePlex 版本

8.6.4

8.6.4

作業系統

AIX 6100

RHEL 5.8

問題描述

鏈路搭建完畢之後,對鏈路進行選取SCN ,使用expdp 進行資料初始化,資料初始化完成之後,在目標端reconcile 佇列資料,啟動post 之後,post 一致呈現下圖的狀態。

 

 

 

 

 


解決方案

(1)  sp_ctrl>stop post

(2)  sp_ctrl>show

確認post已經處於stopped by user狀態

(3) 使用sqlplus登入SharePlex使用者(如果你有多個SharePlex埠,確定你登入的是正確的使用者)

(4)  truncate table <shareplex_user>.shareplex_trans

(5)  sp_ctrl> start post

複製中跳過複製物件問題

問題描述

oracle oracle 複製環境中,當源端建立一些比較大的臨時表時,如果複製鏈路中配置了萬用字元,將這些並不需要的臨時表加入到了複製物件中,需要在目標端post 佇列中去掉這些物件時,此時源端已經將這些物件刪除,無法查詢object_id ,並使用引數SP_OPO_DISABLE_OBJECT_NUM 跳過。

解決方案

On target

$ export SP_SYS_VARDIR=<vardir>

$ ./sp_ctrl

sp_ctrl> qstatus     >> 檢視佇列名稱

sp_ctrl> exit

$ qview –i

qview> qinit

qview> open p r      >> 如果有多個佇列,則根據提示選擇自己的佇列

qview> set detail full

qview >set out

qview > oread 0 100000      >> 輸出佇列訊息的十萬行

qview> exit

然後檢視當前目錄輸出的qview.out 檔案,開啟並查詢需要跳過的物件表名,找到obj_id

$ ./sp_ctrl

sp_ctrl> set param SP_OPO_DISABLE_OBJECT_NUM <obj_id>

sp_ctrl> qstatus

可以檢視是否已經跳過臨時物件。

複製中POST 異常退出日誌未記錄報錯

問題描述

Post will not open more than 290 cursors

SR:4154302

2017 11 16

AA 複製鏈路中,之前由於post 程式報找不到object_id ,然後在佇列中找到,object_id 對應的表,確認表之後,在目標端設定SP_OPO_DISABLE_OBJECT_NUM 引數,跳過了TDS 使用者下的Q0 Q1 Q2 Q3 表,昨天客戶需要將這四張表重新加入到佇列中,具體做法如下:

1. 目標端停止post

2. 在源端編輯配置檔案,在原佇列spdx 中使用not ,排除掉Q0~Q3 這四張表,並在config 檔案中增加一行,複製TDS Q0~Q3 這四張表佇列名字取名spdx05 verify config activate config

3. 目標端reset param SP_OPO_DISABLE_OBJECT_NUM ,並將除spdx05 外的其他佇列啟動。

4. 在源端基於SCN 匯出並在目標端匯入四張表資料時,發現目標端spdx 佇列post 程式due to error ,檢視日誌,日誌中並未記錄post 報錯原因,event_log 記錄如下:

Info 2017-11-15 17:25:55.711464 20118 2902460992 Poster exited with code=1, pid = 5822 (posting from spdx, queue spdx, to spdxtar)

Notice 2017-11-15 17:27:15.492659 3280 2928380048 User command: splex start post queue spdx (from eb-tardb01-vip)

Info 2017-11-15 17:27:15.493487 7635 2902460992 Poster launched, pid = 7635 (posting from spdx, queue spdx, to spdxtar)

Notice 2017-11-15 17:27:16.580345 7635 2916102000 Poster: SQL Cache disabled. (posting from spdx, queue spdx, to spdxtar) [module opo]

Info 2017-11-15 17:27:37.587999 20118 2902460992 Poster exited with code=1, pid = 7635 (posting from spdx, queue spdx, to spdxtar)

post 程式日誌如下:

opo 2017-11-15 17:27:18.739051 7635 2916102000 src host/sid/queue=spclecsource:spdx:spdx

opo 2017-11-15 17:27:18.814391 7635 2916102000 call KillOpstModule(Post-10001-spdx-spdx)

opo 2017-11-15 17:27:18.823908 7635 2916102000 Post will not open more than 290 cursors per session (OPEN_CURSORS - 10)

opo 2017-11-15 17:27:18.823930 7635 2916102000 Max data segment: hard limit=NONE

opo 2017-11-15 17:27:18.823935 7635 2916102000 Max data segment: soft limit=NONE

opo 2017-11-15 17:27:18.823940 7635 2916102000 Max file descriptor: hard limit=1024

opo 2017-11-15 17:27:18.823945 7635 2916102000 Max file descriptor: soft limit=1024

opo 2017-11-15 17:27:18.835679 7635 2916102000 Oracle version 112 - Enterprise Edition #cpu = 24Sol

問題原因

作業系統使用非oracle 使用者安裝配置SharePlex ,但是並未在/etc/security/limits.conf 檔案中配置該使用者資源使用限制,所以該使用者使用預設開啟檔案數1024

在分割佇列時,啟動新的queue ,在目標端有新的post 程式,開啟檔案數進一步上升超過1024 ,導致程式異常退出,但是event_log 日誌中並未記錄相關報錯資訊。

問題解決

From post log, it seems open files is set to 1024.  There are many sessions for post, you may need to increase open file descriptors.

 

Please do following to shutdown sp_cop

 

sp_ctrl> shutdown

 

ulimit -n 8192

ulimit -aS

it should show 8192 for open file descriptors

 

then start SharePlex

 

./sp_cop &

 

./sp_ctrl> start post

 

Please let me know if this resolves issue. If this still does not resolve the issue please set post debug and send me the *opo*.log file.

 

sp_ctrl> set param SP_OPO_DEBUG_FLAG 0x1f0001ff

sp_ctrl> start post

 

Once post is stopped, then turn off debug

sp_ctrl> reset param SP_OPO_DEBUG_FLAG

誤操作ora_setup

問題描述

使用錯誤的vardir 進行了ora_setup ,更新了/vardir/data/connections.yaml 連線資料庫使用者,下次啟動SharePlex 時,SharePlex 源端read 程式將無法正常工作。

問題原因

有多個vardir ,但是未指定SP_SYS_VARDIR 變數值,或者使用export SP_SYS_VARDIR 設定變數值由於某些原因,變數並未生效導致執行ora_setup 指令碼時,誤將正在工作的鏈路的SharePlex user 更換,導致鏈路下次啟動將出現問題,丟失資料。

問題解決

    這個問題有兩種解決辦法,但是都會造成丟失資料的問題,所以一定要申請停機時間並且在資料庫不處理批作業的時候,保持源端資料靜止一段時間,進行如下步驟,需要的停機時間一個小時即可。

(1)    qview 中使用reset

這個方案不會將更新錯的SharePlex User 更換回來,但是會解決掉SharePlex 重啟將不復制的問題。

On the Source machine

1. shutdown shareplex
qview -i
qview> qsetup
qview> reset x
qview >exit

On the Target machine


1. shutdown shareplex
2. qview -i
qview>qsetup port#
qview >reset p
qview >exit
If you have multiple post queues, reset the post queues that got corrupted.

3. sqlplus splex/splex
truncate shareplex_trans
4. restart shareplex

(2)    ora_setup 更換使用者

這個方案可以將使用者更換回來,即設定正確的SP_SYS_VARDIR 變數,然後執行ora_cleansp ,再重新ora_setup 將使用者更換回來,然後重新啟用配置檔案。

 

Change Data Capture ORA-00957

鏈路環境

 

環境

OS 版本

Oracle 版本

SharePlex 版本

備註

源端

RHEL

11.2.0.4

8.6.4.66


目標端

RHEL

11.2.0.4

8.6.4.66


 

問題描述

Info 2017-12-12 10:03:01.848729 45518 4121626464 Poster launched, pid = 45518 (posting from spsxamis, queue amis, to spamisspx)

Notice 2017-12-12 10:03:05.575921 45518 4056024832 s:4 Poster: ORA-00957: duplicate column name (posting from spsxamis, queue amis, to spamisspx) [module osp]

Error 2017-12-12 10:03:05.576356 45518 4056024832 s:4 Poster: que/seq = 4/ 52512916960 seqno/offset = 24501/399051096 Unexpected Oracle error: ORA-00957: duplicate column name (object name: "SXAMIS"."T03_POLICYPERDAY") (posting from spsxamis, queue amis, to spamisspx) [module opo]

Notice 2017-12-12 10:03:05.832031 45518 4056024832 s:4 Poster: No locks found (posting from spsxamis, queue amis, to spamisspx) [module osp]

Info 2017-12-12 10:03:05.840860 60482 4121626464 Poster exited with code=1, pid = 45518 (posting from spsxamis, queue amis, to spamisspx)

 

問題原因

SPO-10270 may address the duplicate column issue as well. 

The bug is related to rollback as well and in this case the customer is getting duplicate column on a rollback transaction.

The fix is to make sure the main thread doesn't use the global message in the SQLclass, it is reserved for the SQL thread. This caused unpredictable behavior especially if there is a rollback. In some cases, you may get ORA-1008 as well.

CR111353 is addressing the missing key issue for CDC in after update image.

The root cause for this incident is Shareplex version 8.6.4.66 ran into multi-bugs(CR111353-SPO-10270), which were already fixed in the later version.

 

解決方案

1 SP_OPO_DEBUG_FLAG

目標端:

sp_ctrl > set param sp_opo_debug_flag queue spfocusts07 ox1f0021ff

透過反覆設定上述引數,可以緩解發生這個問題,鏈路可以正常處理之後,reset 該引數,觀察鏈路,如果報錯,則繼續設定該引數,再次reset ,觀察。

經驗證,上述方法是有效的,可以解決報錯。

 

2 )以下補丁未驗證是否解決ORA-00957 問題

由於在補丁傳送過來之前,透過方法1 ,鏈路已經恢復正常,所以並未驗證以下補丁是否徹底解決ORA-00957 問題。

需要對8.6.4.66 打以下補丁。

 

ONEOFF LOCATION:

System:  ftpamer.quest.com

user/password: shareplex_support/quest2017

/Download/CaseID/4170689

File:    sp_opst_mt-SPO-10144b-CR111353-SPO-10270

Cksum:    65576619 5884202 sp_opst_mt-SPO-10144b-CR111353-SPO-10270

 

BUILT FOR:

SPO:     8.6.4.66

OS:      Linux x86_64

Oracle:  11g

 

This oneoff includes the fix CR111353 and SPO-10270 for the duplicate column issue and it also includes a previous fix for a post core dump issue related to rollback SPO-10144.

 

Please stop post and go to prod dir/.app-modules and replace sp_opst_mt with the oneoff and rename it then start post.

 

 

 

 

引數不起作用

SP_OPO_DISABLE_OBJECT_NUM 引數說明:這個引數阻止 POST 處理基於源端表的 object_id 物件相關的 DDL DML 。這是一個立即生效引數。當佇列由於某一張或者多張表資料不一致導致鏈路中斷,你希望跳過 post 佇列中這張或者這幾張表,使鏈路先正常複製其他表,可以使用該引數。你也可以同時在源端 config 檔案中,使用 not 萬用字元, not 掉這一張或者幾張表,隨後可以透過另起佇列,單獨重新初始化這幾張表資料,完成表修復。

問題描述

在電商鏈路 spfocusts07 佇列中,有一張 "TMS_SX"."OB_CLEANING_CUST_LIST_TMP" 表,由於表非常大,且未有合適索引,導致目標端post處理資料非常緩慢,經與電商溝通,此表已不需要再進行復制,所以決定透過設定 SP_OPO_DISABLE_OBJECT_NUM 引數來遮蔽掉 post 處理佇列中含有該物件的 DDL DML 訊息,但是透過在源端資料庫中查詢之後, object_id 18876 ,設定 SP_OPO_DISABLE_OBJECT_NUM 引數為 18876 之後,發現 post 並未跳過該表,還繼續處理該表資料。

問題原因

該表應該是被重建過,導致 object_id post 佇列中 object_id 不一致,導致設定的 SP_OPO_DISABLE_OBJECT_NUM 引數並非是真實佇列中的 object_id

解決方案

透過檢視post 日誌,有記錄 "TMS_SX"."OB_CLEANING_CUST_LIST_TMP" 的object_id為178873,透過使用qview命令檢視post佇列,確認該物件在佇列訊息中的object_id確實為178873,qview使用如下:

[oracle@11rac1 ~]$ export SP_SYS_VARDIR=<VARDIR>

[oracle@11rac1 ~] ./sp_ctrl

sp_ctrl > stop post queue focusts07   >> 在使用 qview 開啟佇列時,需要停止對應佇列的 post ,防止 open 佇列時報錯 queue is already open.

 [oracle@11rac1 ~]$ qview –i

qview > qinit   

  注:

 qsetup                       - init command if sp_cop is not running

 qinit                           - init command if sp_cop is running

qview > set out

qview > set detail full

qview > open p r                    

qview > oread 0 10000

qview > exit

d. 退出qview 之後,在執行qview 命令的目錄下可以看到qview.out 檔案,即佇列訊息詳情,在輸出檔案中搜尋 "TMS_SX"."OB_CLEANING_CUST_LIST_TMP" 表,找到對應的object_id。

最後設定引數SP_OPO_DISABLE_OBJECT_NUM 為正確的object_id 178873 ,佇列正常跳過該表。

刪除大回滾事務

問題描述

oracle-oracle 複製中,SharePlex 在事務開始時即開始捕獲,源端回滾,目標端同步回滾,所以當源端有特別大的事務回滾時,目標端將耗費大量的系統資源回滾可能造成SharePlex 鏈路進度非常緩慢,所以如果遇到大事務回滾重複處理資料時,我們可以人為干預,刪除大事務回滾。

操作步驟

1 show post sessions detail queue 佇列名,記錄Session Number

 

例:

sp_ctrl (spclectarget:10001)> show post sessions detail queue spdx

 

Session Session Pending Operations Number of RB Ops SID/Serial Thread ID

Number Status Messages Done Transactions Skipped

------- -------- -------- ---------- ------------ ------- ---------- ---------

3 Active 1999 7088076 0 0 1619/16715 2

4 Waiting 0 12 0 0 500/34749 3

 

需要記錄的Session Number號為3

 

2 abort service post queue 佇列名,將佇列post 程式停下來

 

例:

sp_ctrl (spclectarget:10001)> abort service post queue spdx

 

sp_ctrl (spclectarget:10001)> status

 

Brief Status for spclectarget

Process State PID Running Since

--------------- ------------------------------ -------- --------------------

Cop Running 32354 19-Sep-16 19:39:38

Import Running 1767 19-Sep-16 19:43:00

Post Aborting 10165 30-Nov-16 09:53:07

Post Running 17063 04-Nov-16 20:39:32

Post Running 17061 04-Nov-16 20:39:32

Post Running 17058 04-Nov-16 20:39:32

Post Running 17057 04-Nov-16 20:39:32

Cmd & Ctrl Running 14669 22-Nov-16 12:47:53

Cmd & Ctrl Running 20465 25-Nov-16 11:27:17

Cmd & Ctrl Running 3234 30-Nov-16 10:41:37

There are no active configuration files

 

sp_ctrl (spclectarget:10001)> show

 

Process Source Target State PID

---------- ------------------------------------ ------------ -------------------- ------

Import spclecsource eb-tardb01-v Running 1767

Post o.spdx-spdx o.spdxtar Stopped by user

Post o.spdx-spdx01 o.spdxtar Running 17063

Post o.spdx-spdx02 o.spdxtar Running 17061

Post o.spdx-spdx03 o.spdxtar Running 17058

Post o.spdx-spdx04 o.spdxtar Running 17057

 

3 )透過qview 查詢大回滾事務號

 

例:

[splex@eb-tardb01 ~]$ qview -i

qview> qinit

qview> open p r // 開啟佇列

Queue spdx+P+o.spdx-o.spdxtar (y/n) <n>? y // 確認佇列名

Current queue spdx+P+o.spdx-o.spdxtar user +PP+spdx+sp_opst_mt+o.spdx-o.spdxtar

qview> oseek 3 0 // 查詢會話號對應的事務號,格式為oseek Session_Number號 0

 

Read until next COMMIT from subqueue 3

 

Total messages read: 16397926

Nulled operations: 1

Commits/transactions: 1

Forward data operations: 8198956

Insert 0

Update 2500186

Delete 5698770

Other data 0

Backward data operations: 8198956

Insert 5698770

Update 2500186

Delete 0

Other data 0

 

Sque 3, mtime 11/23/16 03:33:10, qseq 197615070998, 11/23/16 03:20:55, 225229/2682332, ROLLBACK COMMIT, //0wAAAD0AAHUcPAAA , SCN 15689630758, forward = 0

 

4 )從佇列中刪除大回滾事務會話

 

例:

qview> rrls 3 197615070998 // 刪除大事務會話,格式為rrls Session_Number號 qseq號

qview> exit

 

5 )到目標端資料庫中檢視大回滾事務,並確認其是否在回滾,可將其刪除,也可等待其回滾完畢

 

select ADDR,USED_UBLK from gv$transaction;

 

ADDR USED_UBLK

---------------- ----------

0000000CF3936E48 43

0000000CF393A098 161948

0000000C962A6E28 3

0000000CA3DD0900 37

0000000CF39FF3D8 1

0000000CF3A659D8 1

 

6 rows selected.

 

SQL> /

 

ADDR USED_UBLK

---------------- ----------

0000000CA3D37000 3

0000000CF3935A28 2

0000000CF3936E48 43

0000000CF393A098 155290

0000000C962A6E28 3

0000000CA3DD0900 37

0000000CA3E013C0 1

0000000CF39FF3D8 1

0000000CA3E37910 1

0000000CA3E65180

丟失歸檔鏈路恢復post 不動

問題描述

源端由於丟失歸檔導致鏈路異常,當恢復出需要的歸檔檔案之後,啟動鏈路,發現目標端post 程式處理到一定數量的資料之後卡住不動,此時日誌程式狀態均正常,只有post 程式operations posted 一直保持不變。

問題原因

其實該狀態與丟失歸檔並沒有直接關係,造成該狀態的主要原因為有事務在進行回滾,所以造成operations posted 一直保持不變,且total backlog 一直在增加,日誌中大量報如下圖錯誤:

 


程式日誌中報如下錯誤:

   


解決方案

可以透過以下命令檢視post session 狀態,確認是否在處理回滾的事務。

sp_ctrl > show post session detail queue {queue name}

檢視session 狀態,如果數量一直在處理,等待回滾處理完,鏈路自動恢復正常。


SharePlex安裝配置、常用功能配置文件、常見故障處理文件

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31439444/viewspace-2673704/,如需轉載,請註明出處,否則將追究法律責任。

相關文章