支持的數據庫版本
| 源數據庫 | 目標數據庫 |
|---|---|
| 12c, 19c, 21c | TeleDB |
支持的遷移對象及SQL
遷移對象
結構遷移支持表結構遷移(包含索引、外鍵、約束)、視圖、同義詞、序列、觸發器、函數、存儲過程、類型、物化視圖、程序包。
增量數據遷移支持同步的SQL操作
- DML:
INSERT、UPDATE、DELETE
- DDL:
增量同步暫不支持DDL同步。
支持的遷移類型
| Oracle | TeleDB-X |
|---|---|
| 數值類型 | 數值類型 |
| NUMBER(p,s) s!=0 | numeric/decimal |
| NUMBER(p,s) s==0,1 <= p <= 4 | int2 |
| NUMBER(p,s) s==0,5 <= p <= 9 | int4 |
| NUMBER(p,s) s==0,10 <= p <= 19 | int8 |
| FLOAT | real/float4 |
| BINARY_FLOAT | real/float4 |
| REAL | real/float4 |
| BINARY_DOUBLE | double precision/float8 |
| 時間類型 | |
| DATE | timestamp |
| TIMESTAMP | timestamp |
| TIMESTAMP WITH TIME ZONE | timestamptz |
| TIMESTAMP WITH LOCAL TIME ZONE | timestamptz |
| 字符類型 | |
| CHAR | char/bpchar |
| NCHAR | char/bpchar |
| VARCHAR | varchar |
| VARCHAR2 | varchar |
| NVARCHAR2 | varchar |
| ROWID | varchar |
| BLOB | bytea |
| RAW | bytea |
| LONG_RAW | bytea |
| CLOB | text |
| NCLOB | text |
| LONG | text |
| 時間間隔類型 | |
| INTERVAL YEAR TO MONTH | interval |
| INTERVAL DAY TO SECOND | interval |
| 以下類型未考慮支持 | |
| BFILE、ROWID、UROWID、XMLTYPE 、SDO_GEOMETRY |
操作須知
-
增量階段不支持字段含有INVISIBLE特性的表,如果待遷移對象存在這種表,增量階段會報錯。
-
三個TIMESTAMP類型的范圍如果超過pg支持的范圍,全量和增量階段可能會報錯。
-
不支持同步源庫中的臨時表。
-
不支持同步源庫中有虛擬列的表。
-
不支持選擇源數據庫的空庫進行同步。
-
同步過程中,禁止對Oracle源庫做resetlogs操作,否則會導致數據無法同步且任務無法恢復。
-
同步過程中,不支持LOB類型的rollback操作,否則會導致同步任務失敗。
-
庫表名映射默認為全部轉小寫,例如映射為abc與映射為ABC,同步到目標庫后均為abc。
-
全量同步過程中,DTS會向目標庫TeleDBX寫入大量數據,會導致wal日志量急劇增長,TeleDBX的磁盤有被寫滿的風險。可以通過在全量同步前關閉TeleDBX的日志備份功能,減少wal日志的生產,同步完成后再將其打開的方式進行規避。
-
增量階段不支持同步含有LOB字段且沒有主鍵的表。
-
Oracle歸檔日志文件大小必須大于單條數據最大值,避免單條數據日志跨文件(超過2個日志文件)導致的增量數據解析異常。
-
Oracle中表結構長度(所有列長字節數之和,char、varchar2等類型字節長度和編碼有關)超過65535時,可能導致同步失敗。
-
當Oracle字符集是WE8MSWIN1252時,CLOB列同步到目標庫可能出現亂碼,建議先修改源庫字符集為AL32UTF8再同步數據。
-
如有中文、日文等特殊字符,業務連接Oracle數據庫使用的編碼需和Oracle數據庫服務端編碼一致,否則目標庫可能會出現亂碼。
-
庫名、表名不支持的字符有:非ASCII字符、“. ”、 “>”、 “<”、 “\”、 “`”、 “|”、 “,”、 “? ”、 “! ”、 “"”和 “'”。
-
如果待遷移對象中含有分區表,結構遷移階段分區表信息將會被丟棄。
-
不支持bfile,xml、sdo_geometry、urowid、interval(精度大于6位)和自定義類型。
-
不支持使用Oracle 物理備庫進行遷移/同步。
-
RAC模式的Oracle不支持使用scanIP,只能連接其中一個節點進行同步。
-
對于TIMESTAMP WITH TIME ZONE類型,根據目標庫時區做轉換后不得大于“9999-12-31 23:59:59.999999”。
-
如果表中只有LOB字段,可能出現數據不一致性情況。
-
如果Oracle中使用LOB類型各自的empty函數寫入數據時,通過JDBC查詢出來的值是空字符串,寫入到目標庫后是空字符串還是NULL取決于目標庫對空字符串值的處理。
-
不支持默認值含有表達式的函數的表的同步。
-
源庫支持to_date和sys_guid函數做默認值。將其他函數作為default值時,需要目標庫也有相同功能的函數。對于目標庫不存在對應函數的情況,可能會出現以下結果:
- 默認值函數可能會被置空。
- 創建表失敗,導致對象對比不一致或者任務失敗。
-
暫不支持DDL同步。
-
同步過程中,不允許刪除連接源和目標數據庫的用戶的用戶名、密碼、權限,或修改目標數據庫的端口號。
-
大事務有可能同步失敗。
-
包含大字段的行有可能同步失敗。
-
確保Oracle的歸檔日志空間大小足夠。
-
源庫為Oracle 12c及以上時,增量階段要保證所有存在的容器數據庫均處于打開狀態。
-
源庫為Oracle 12c及以上時,不支持同步application root和application PDB.
-
如果有增量遷移,增量階段不能使用sys/system等oracle內部的系統用戶作為DTS用戶,也不能使用PDB用戶,必須使用公共容器中創建的用戶。
-
如果有增量遷移,則只支持庫名和表名映射,不支持列名映射。
-
若要做增量同步,且同步對象包含外鍵、觸發器或事件觸發器,則目標數據庫的session_replication_role參數必須設置為replica,同步結束后,此參數需改為origin。
-
結構遷移無主鍵表時,默認遷移到目標端的分片鍵為當前表結構的第一個字段。
-
無主鍵表在全量遷移和增量遷移階段,如果當前源表的第一個字段(也就是作為分片鍵的字段)存在null值時,將會遷移失敗,原因是TeleDBX分片鍵的鍵值不能為NULL。
準備工作
- 創建源庫DTS用戶
- oracle 12c及以上且開啟了CDB模式
如果僅作測試用可直接賦予最高權限,用SYS用戶登錄Oracle,如下創建DTS遷移用戶:
-- 要求該用戶必須是CDB下的用戶,且授權的權限必須在所有容器內都具備
CREATE USER C##DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS CONTAINER=ALL;
GRANT DBA TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.OBJ$ TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.COL$ TO C##DTS CONTAINER=ALL;
如果需要授予數據遷移用戶的精準權限,用SYS用戶登錄Oracle,如下創建DTS遷移用戶:
-- 要求該用戶必須是CDB下的用戶,且授權的權限必須在所有容器內都具備
CREATE USER C##DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS CONTAINER=ALL;
GRANT CREATE SESSION TO C##DTS CONTAINER=ALL;
GRANT SET CONTAINER TO C##DTS CONTAINER=ALL;
GRANT FLASHBACK ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT INSET ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT UPDATE ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT DELETE ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT CREATE ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT DROP ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT COMMENT ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT LOCK ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT CREATE SEQUENCE TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY SEQUENCE TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY TRANSACTION TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY DICTIONARY TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.OBJ$ TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.COL$ TO C##DTS CONTAINER=ALL;
GRANT SELECT_CATALOG_ROLE TO C##DTS CONTAINER=ALL;
GRANT EXECUTE_CATALOG_ROLE TO C##DTS CONTAINER=ALL;
GRANT LOGMINING TO C##DTS CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR TO C##DTS CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR_D TO C##DTS CONTAINER=ALL;
- oracle 12c關閉CDB模式
如果僅作測試用可直接賦予最高權限,用SYS用戶登錄Oracle,如下創建DTS遷移用戶:
CREATE USER DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
GRANT DBA TO DTS;
GRANT SELECT ON SYS.OBJ$ TO DTS;
GRANT SELECT ON SYS.COL$ TO DTS;
如果需要授予數據遷移用戶的精準權限,用SYS用戶登錄Oracle,如下創建DTS遷移用戶:
-- 要求該用戶必須是CDB下的用戶,且授權的權限必須在所有容器內都具備
CREATE USER DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
GRANT CREATE SESSION TO DTS;
GRANT SET CONTAINER TO DTS;
GRANT FLASHBACK ANY TABLE TO DTS;
GRANT SELECT ANY TABLE TO DTS;
GRANT INSET ANY TABLE TO DTS;
GRANT UPDATE ANY TABLE TO DTS;
GRANT DELETE ANY TABLE TO DTS;
GRANT CREATE ANY TABLE TO DTS;
GRANT DROP ANY TABLE TO DTS;
GRANT COMMENT ANY TABLE TO DTS;
GRANT LOCK ANY TABLE TO DTS;
GRANT CREATE SEQUENCE TO DTS;
GRANT SELECT ANY SEQUENCE TO DTS;
GRANT SELECT ANY TRANSACTION TO DTS;
GRANT SELECT ANY DICTIONARY TO DTS;
GRANT SELECT ON SYS.OBJ$ TO DTS;
GRANT SELECT ON SYS.COL$ TO DTS;
GRANT SELECT_CATALOG_ROLE TO DTS;
GRANT EXECUTE_CATALOG_ROLE TO DTS;
GRANT LOGMINING TO DTS;
GRANT EXECUTE ON DBMS_LOGMNR TO DTS;
GRANT EXECUTE ON DBMS_LOGMNR_D TO DTS;
- 創建目標庫DTS用戶
如果僅作測試,可直接使用TeleDB最高權限的用戶root。
如果需要使用精準權限的用戶,用root用戶登錄TeleDB,如下創建DTS遷移用戶:
CREATE USER dts WITH ENCRYPTED PASSWORD '<占位符>';
GRANT CREATE, TEMPORARY, CONNECT ON DATABASE <待遷移的數據庫名稱> TO dts;
如果要做增量遷移且遷移的表包含外鍵,那么除了上述權限外,還要保證該用戶具有在會話級別執行SET session_replication_role = 'replica'的權限。可登錄TeleDB控制臺,將該參數設置并重啟。
- 如果有增量遷移,需按照如下方法開啟Oracle的歸檔日志
- 非RAC模式:
SELECT name,log_mode from V$DATABASE;
如果沒有開啟,使用sqlplus且用SYS用戶以sysdba方式登錄后,依次執行以下命令:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
- RAC模式:
在RAC ORACLE 的某一個節點的 shell 中,關閉、啟動、掛載某一個數據庫:
srvctl stop database -d <數據庫名字>
srvctl start database -d <數據庫名字> -o mount
使用DBA 權限賬號登陸該數據庫,并開啟歸檔日志:
alter database archivelog;
在RAC ORACLE 的某一個節點的 shell 中, 重啟數據庫:
srvctl stop database -d <數據庫名>
srvctl start database -d <數據庫名>
- 如果有增量遷移,需開啟Oracle的詳細補充日志
使用以下命令,確認supplemental logging 是否開啟:
SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM V$DATABASE;
如果三列存在NO,那么先開啟補充最小日志-supplemental_log_data_min:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
開啟全補充日志,增加ALL、主鍵、Unique Index:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(ALL, PRIMARY KEY, UNIQUE) COLUMNS;
- 確保所有容器處于打開狀態
如果有增量遷移,且CDB模式開啟,且有多個容器數據庫,則要保證這寫可插拔的容器數據庫處于打開狀態,不然無法啟動增量遷移。
-- 注意必須用SYS用戶執行
SELECT con_id, name, open_mode, restricted FROM v$pdbs;
以上查詢結果中,除了SEED容器外,OPEN_MODE字段的值必須為READ WRITE。
- 確認遷移對象中是否存在無主鍵表
如果勾選增量遷移,遷移對象中不能包含無主鍵表:
-- 替換 YOUR_SCHEMA_NAME 為你的模式名
SELECT t.table_name
FROM all_tables t
LEFT JOIN all_constraints c
ON t.owner = c.owner
AND t.table_name = c.table_name
AND c.constraint_type = 'P'WHERE t.owner = '
使用以上查詢語句可以篩選出某個schema下的所有無主鍵表,將這些表排除于增量遷移之外。
- 確認歸檔日志保留時間
如果勾選增量遷移,為了避免增量遷移過程中由于一些故障導致同步中斷的情況,需要至少保留3-7天的歸檔日志來確保處理這些情況的窗口期。否則,可能導致無法將同步從故障中恢復。
RMAN> SHOW RETENTION POLICY;
- 確認待遷移對象中是否包含觸發器
如果將觸發器作為結構的一部分,在DTS的調度邏輯上,觸發器會先于全量遷移被遷移到TeleDB。這樣可能會影響到全量遷移,導致數據不一致。
建議將觸發器放到全量遷移之后,再新建一個遷移任務進行遷移。
- 數據及業務信息統計
如果為非測試任務,需要在遷移之前統計業務以及遷移信息,方便進行遷移任務規劃。
- 資源信息:
- 源庫規格信息,例如4C8G + 500G + SSD
- 目標庫磁盤信息,例如4C8G + 500G + SSD
- 網絡情況,例:為測試環境純內網傳輸,無復雜的網絡拓補結構
- 數據信息:
- 總數據量,例如30GB
- 總庫表數量,例:40個庫,8000張表,2000個視圖,5個觸發器
- 每日新增數據量級,例如:一天的歸檔日志新增大概100GB
- 是否所有表都有主鍵,建議遷移前完善主鍵,提高性能,方便運維。如果存在無主鍵的表,則增量階段源端對應表的增、刪、改操作不會同步至目標端,可能導致數據不一致,請謹慎評估。
- 業務類:
- 數據遷移是否可停業務,例:能/不能
- 增量遷移情況,例:開啟增量遷移,持續時間5天
- 可停業務時間長度,例:服務停機時間預計48小時
- 業務中是否存在百萬級別的大事務,例:存在,涉及對表CLOUD.LOGS進行大事務操作,存在一個存儲過程用不帶where條件的delete語句定期清理該表。
操作步驟
-
訂購DTS數據遷移實例。
-
進入實例配置頁面。DTS實例創建成功后,進入【數據遷移】實例列表頁面,上一步驟購買成功的實例在實例列表中顯示狀態為“待配置”,進入實例配置頁面進行配置:
-
配置源庫及目標庫信息。
- 進入實例配置第一個步驟的【配置源庫及目標庫信息】頁面,填入源庫與目標庫的相關配置信息,包括數據庫類型、IP地址端口、數據庫賬號、數據庫密碼等信息。
- 完成上述信息的填寫后,單擊源數據庫和目標數據庫的測試連接按鈕進行數據庫連接測試,檢查數據庫能否正常連接。
注意ORACLE如果要進行增量同步,不能使用SYS/SYSTEM系統用戶。
-
配置遷移對象及高級配置。
源庫和目標庫連通性測試成功后,點下一步按鈕,進入實例配置第二個步驟的【配置遷移對象及高級配置】頁面,在“源庫對象”中選擇要遷移的源庫對象,選中后單擊“>”按鈕,將待遷移對象移動到“已選擇對象”中。
-
預檢查和啟動遷移。
完成遷移對象和高級配置后,單擊“下一步預檢查”,進入實例配置第三個步驟的【預檢查】頁面。預檢查會檢查如下列表信息,并給出檢查結果,用戶可以依據檢查結果進行下一步操作。
檢查內容 檢查點 檢查源庫連通性 源庫網絡能夠連通 檢查目標庫連通性 目標庫網絡能夠連通 檢查源庫用戶權限 若不包含增量,檢查提供的源庫賬號是否具有以下權限: CREATE SESSION;CATALOG_ROLE、ANY DICTIONARY、待遷移表的select權限若包含增量,還需要檢查以下權限:SET CONTAINER,FLASHBACK ANY TABLE,SELECT ANY TABLE,SELECT_CATALOG_ROLE,EXECUTE_CATALOG_ROLE,SELECT ANY TRANSACTION,LOGMINING,CREATE TABLE,LOCK ANY TABLE,CREATE SEQUENCE,EXECUTE ON DBMS_LOGMNR,EXECUTE ON DBMS_LOGMNR_D,SELECT ANY DICTIONARY,SELECT ON SYS.OBJ?,SELECT ON SYS.COL,CREATE ANY TABLE,COMMENT ANY TABLE,DROP ANY TABLE 檢查目標庫用戶權限 檢查提供的目標庫賬號是否具有登錄信息database下創建schema的權限。 檢查目標庫PostgreSql版本 目標庫的PostgreSql版本是否不低于9.2 檢查待遷移表是否存在主鍵 檢查待遷移表是否都存在主鍵,只有全量遷移時,如果發現存在沒有主鍵的表,將提出警告(無主鍵的表可能會導致數據不一致);勾選了增量遷移,如果發現存在沒有主鍵的表,預檢查將不通過(增量遷移功能依賴主鍵) 檢查待遷移表約束完整性 檢查待遷移表依賴的表對象是否包含在待遷移對象中,若存在依賴的對象未被選擇,檢查不通過 檢查源庫最大連接數 檢查源庫最大連接數是否不小于300,若最大連接數小于300,給出告警 檢查目標庫最大連接數 檢查目標庫最大連接數是否不小于300,若最大連接數小于300,給出告警 檢查同名對象存在性 檢查目標庫中是否存在和待遷移庫同名的庫(映射后),若存在,檢查該庫下面是否存在同名的表(映射后)。如果有,將提出警告。 檢查源數據庫Oracle的表字段的數據類型能否都遷移到目標庫 待遷移表中不能存在Oracle的獨有的字段類型,ROWID、UROWID、XMLTYPE、BFILE、SDO_GEOMETRY等類型 檢查源庫對象是否僅大小寫不同 遷移對象中是否包含僅大小寫不同的對象時,預檢查不通過 檢查待遷移庫名合法性 若待遷移庫名中包含非法字符,檢查不通過 檢查待遷移表名合法性 若待遷移表名中包含非法字符,檢查不通過 檢查源庫字符集是否為支持的字符集 源庫字符集支持以下字符集:ZHS16GBK,AL32UTF8,UTF8,US7ASCII,WE8MSWIN1252若源庫字符集不屬于以上字符集,預檢查將不通過 檢查當前登錄賬號是否個人賬號 勾選增量時,檢查源庫的遷移用戶是否為個人賬號,若賬號為系統用戶,檢查不通過 檢查源庫是否開啟歸檔日志 勾選增量時,檢查源庫是否開啟歸檔日志,若未開啟,檢查不通過 檢查源庫是否開啟補充日志 勾選增量時,檢查源庫是否開啟補充日志,若未開啟,檢查不通過 如果預檢查通過,可單擊【預檢查】頁面底部的“啟動遷移”按鈕,開始遷移任務。或者直接單擊”數據遷移“列表,返回數據遷移主界面,任務將顯示為”未啟動“狀態。
勾選任務,單擊 開始任務 ,任務將變為 運行中 ,直到全量遷移完成,或者進入增量遷移狀態。


