數據庫參數檢查
1、源庫Oplog開啟檢查
| 失敗原因 | 處理建議 |
|---|---|
源數據庫Oplog未開啟。 | 請確保已經開啟Oplog,副本集默認自動開啟Oplog。
|
2、目標庫實例狀態檢查
| 失敗原因 | 處理建議 |
|---|---|
目標庫實例狀態不正常。 | 請檢查目標庫實例狀態,需保證為正常狀態。
|
3、目標庫磁盤空間檢查
| 失敗原因 | 處理建議 |
|---|---|
無法建立與源庫的連接獲取待遷移數據量規模,因此無法執行此項檢查。 | 請檢查源庫是否連接成功。 |
無法建立與目標庫的連接,因此無法執行此項檢查。 | 請檢查目標庫是否連接成功。 |
目標庫磁盤空間不足,剩余磁盤空間大小<建議值。 | 建議擴容目標庫或清理目標庫空間。 目標數據庫磁盤空間建議大小,取以下兩種中的小值:
|
4、源庫Balancer關閉檢查
| 失敗原因 | 處理建議 |
|---|---|
源庫為集群的增量任務,Balancer未關閉。 | 分片集群增量遷移任務,Balancer必須關閉。 先執行use config,切換到config庫,執行以下命令: while( sh.isBalancerRunning() ) { print("waiting..."); sleep(1000); }
|
數據庫用戶權限檢查
1、源庫用戶權限檢查
| 失敗原因 | 處理建議 |
|---|---|
連接源庫的用戶需要具備admin庫的readAnyDatabase權限、clusterMonitor權限,local庫的read權限。 |
|
連接源庫的用戶需要具備admin庫的readAnyDatabase權限、clusterMonitor權限。 |
|
連接源庫mongos的用戶需要具備admin庫的readAnyDatabase權限,config庫的read權限。 |
|
連接源庫shard的用戶需要具備admin庫的readAnyDatabase權限、clusterMonitor權限,local庫的read權限。 |
|
2、目標庫用戶權限檢查
| 失敗原因 | 處理建議 |
|---|---|
連接目標庫的用戶需要具備admin庫的dbAdminAnyDatabase權限、readWriteAnyDatabase權限、clusterMonitor權限。 |
|
連接目標庫的用戶需要具備admin庫的dbAdminAnyDatabase權限,admin庫的readWriteAnyDatabase權限、clusterManager權限。 |
|
網絡情況檢查
1、源庫連通性檢查
| 失敗原因 | 處理建議 |
|---|---|
源數據庫賬號或密碼不正確。 | 輸入正確的數據庫賬號和密碼后重新執行預檢查。 |
源數據庫所在網絡或服務器設置了防火墻。 | 查看數據庫所在的網絡防火墻是否限制了DTS的IP地址段,如果有,關閉防火墻或者將DTS的IP地址加入防火墻白名單中。 |
源數據庫遷移賬號登錄權限不足。 | 登錄源庫,為遷移賬號添加相應的遠程訪問權限。 |
網絡互通問題。 | 聯系數據庫所在機器管理人員和DTS部署機器管理人員排查問題。 |
2、目標庫連通性檢查
| 失敗原因 | 處理建議 |
|---|---|
目標數據庫賬號或密碼不正確。 | 輸入正確的數據庫賬號和密碼后重新執行預檢查。 |
| 目標數據庫所在網絡或服務器設置了防火墻。 | 查看數據庫所在的網絡防火墻是否限制了DTS的IP地址段,如果有,關閉防火墻或者將DTS的IP地址加入防火墻白名單中。 |
目標庫遷移賬號登錄權限不足。 | 登錄目標庫,為遷移賬號添加相應的遠程訪問權限。 |
網絡互通問題。 | 聯系數據庫所在機器管理人員和DTS部署機器管理人員排查問題。 |
數據庫對象檢查
1、源庫和目標庫固定集合一致性檢查
| 失敗原因 | 處理建議 |
|---|---|
用戶選擇遷移集合在目標庫已經存在,并且是固定集合。 | 為了保證數據的一致性,可以刪除目標庫已經存在的和用戶選擇遷移的同名集合,或者選擇不遷移這些沖突的集合。 |
| 源數據庫的集合是固定集合,但是目標數據庫存在和源庫固定集合名稱相同的普通集合。 | 為了保證數據的一致性,可以刪除目標庫已經存在的和源庫選擇的固定集合的同名集合,或者選擇不遷移這些沖突的固定集合。 |
2、目標庫存在與源庫同名的非空集合檢查
| 失敗原因 | 處理建議 |
|---|---|
無法建立與源庫的連接,因此無法執行此項檢查。 | 請檢查源庫是否連接成功。 |
| 無法建立與目標庫的連接,因此無法執行此項檢查。 | 請檢查目標庫是否連接成功。 |
| 目標庫存在與源庫同名的非空集合。 | 請根據實際情況判斷是否保留與源庫同名的目標庫下的同名非空集合,如果保留可能導致源庫和目標庫遷移后數據不一致。 |
3、源庫映射后的庫名、集合名檢查
| 失敗原因 | 處理建議 |
|---|---|
映射后存在不符合規范的庫名。 | 請確保源數據庫映射后的庫名不包含/\"$*<>:?.|和空格。 |
映射后存在不符合規范的集合名。 | 請確保映射后集合名中不包含$字符且不以system.開頭。 |
4、源庫集合的索引個數檢查
| 失敗原因 | 處理建議 |
|---|---|
源庫存在索引數量大于10的集合,這類集合將導致遷移速度較慢。 |
|
| 失敗原因 | 處理建議 |
|---|---|
源庫存在包含TTL索引的集合,這可能會影響遷移過程中的數據完整性,時鐘不一致導致數據不一致。 |
|
| 失敗原因 | 處理建議 |
|---|---|
| 請檢查源庫或目標庫填寫的副本集名稱是否正確。 |
7、分片集群源庫孤兒文檔檢查
| 失敗原因 | 處理建議 |
|---|---|
源庫為分片集群,孤兒文檔未被清理可能會導致遷移任務數據不一致和產生報錯問題。 | 分片集群增量遷移任務,源數據庫必須關閉Balancer并清理孤兒文檔。 步驟1:請在可以連接分片集群實例的服務器上,創建一個用于清理孤立文檔的JS腳本,腳本名稱為cleanupOrphaned.js,內容如下: function cleanupOrphaned(coll) { var nextKey = { }; var result;
while ( nextKey != null ) { result = db.adminCommand( { cleanupOrphaned: coll, startingFromKey: nextKey } );
if (result.ok != 1) print("Unable to complete at this time: failure or timeout.")
printjson(result);
nextKey = result.stoppedAtKey; } } var dbName = 'yourDbName' db = db.getSiblingDB(dbName) db.getCollectionNames().forEach(function(collName) { cleanupOrphaned(dbName + "." + collName); }); 步驟2:將yourDbName替換為待清理孤兒文檔的數據庫名,執行命令,清理Shard節點下指定的數據庫中所有集合的孤兒文檔: mongo --host ShardIP --port Primaryport --authenticationDatabase database -u username -p password cleanupOrphaned.js 其中ShardIP:Shard節點的IP地址;Primaryport:Shard節點中的Primary節點的服務端口;database:鑒權數據庫名,即數據庫賬號所屬的數據庫;username:登錄數據庫的賬號;password:登錄數據庫的密碼。 如果存在多個數據庫,您需要重復執行步驟1和2,分別為每個數據庫的每個Shard節點清理孤立文檔。 |
8、唯一索引數量檢查
| 失敗原因 | 處理建議 |
|---|---|
目標為分片集群的情況,源庫集合的唯一索引數量大于1。 | 在源庫集合有多個唯一索引的情況下,目標端為分片集群時,由于分片集群只允許單一唯一索引,在遷移過程中會選擇一個唯一索引進行遷移,請用戶確認是否刪除其他唯一索引或繼續遷移。 如果繼續遷移,DTS選擇遷移單個唯一索引,并在此唯一索引上建立分片鍵。刪除索引的參考命令為: db.集合名.dropIndex(索引名) |