1.問題背景
最近測試用mongoshake工具做MongoDB數據遷移,mongoshake在遷移完成提供了一個腳本comparison.py來做數據校驗,在校驗過程中發現結果比對存在一個庫數據不一致,下意識以為mongoshake存在缺陷導致遷移丟數據,理論上這種基礎功能不應該存在錯誤,多次重新遷移均出現相同的問題.
2.問題分析
通過對comparison.py腳本的分析,了解到對數據的統計有3種模式
--comparisonMode=no
表示使用統計信息比對記錄數--comparisonMode=sample
表示只統計采樣部分數據看是否一致,采樣的數據由--count參數控制--comparisonMode=all
表示分批次對比所有的文檔是否一致(非常慢)
也就是當采用comparisonMode=no和comparisonMode均不能精確的對比出數據的一致性,如果統計信息都是最新的,那基本沒問題,如果統計信息不一致,則很難保證數據校驗的正確性,必須采用comparisonMode=all的模式做校驗
3.關於MongoDB中如何精確統計記錄數的問題
在這之前一直以為MongoDB提供的count命令和Oracle,MySQL等數據庫類似,是精確的查詢集合包含多少個文檔記錄,實際上MongoDB的count操作僅僅是獲取統計信息的值,MongoDB官方文檔也有描述
如果需要精確的統計每個集合的文檔數,需要執行db.collections.countDocuments({})操作
以下是一個主從環境統計信息不一致的示例,從圖中可以看到,通過count統計的數據量和通過查看集合的stats信息查看到的是一致的,主從存在明顯的數據量不一致的情況,而通過db.collections.countDocuments({})則能精確查詢出該集合的記錄數.