我真的可以用 percona 工具包的 pt-table-sync 做什麼?
我一直在尋找一種工具來同步來自 2 個不同數據庫的表並找到
pt-table-sync
. 我閱讀了文件並感到困惑:他們主要使用引用複制環境的範例,但我認為複制的全部目的是為您處理數據同步,因此我的問題是:問題
pt-table-sync
如果復製過程應該為您處理數據同步,那麼使用的意義何在?- 我可以
pt-table-sync
在非複制環境中使用(在2+個彼此無關的主機之間,是pt-table-sync --execute host1 host2 host3
給定範例的作用)嗎?- 如果我必須
pt-table-sync
在複製的環境中使用,我可以不使用bin-logs
on themaster
(有一個例子談到解決發現的差異,pt-table-checksum
所以想知道是否bin-logs
絕對必要)?
回答問題 1
MySQL Replication 存在兩個主要問題
MySQL 複製是非同步的。這可能會引入複製延遲。這表現為主設備和從設備之間通過從 I/O 執行緒的通信問題。這可以從邏輯上和數字上看出
Seconds_Behind_Master
。
Data Drift
. 這是一種間歇性的情況,主從只是由於 MySQL 複製領域之外的因素而失去同步。例如,請注意一種更好地同步複製的方法:使用選項sync-binlog
. 當您設置sync-binlog
為 1 時,mysqld 將為您在二進制日誌中記錄的每個條目執行目前二進制日誌的刷新。這可以荒謬地減慢大師的速度。預設sync-binlog
為 0。
- 這裡有一個問題:使用
sync-binlog=0
,誰負責將二進制日誌刷新到磁碟?- 答案(請坐下):作業系統!!!
- 有了這個答案,它把 Slave 置於一個可怕的劣勢,因為它的 I/O 執行緒受 Master 作業系統的支配。當 Master 的 OS 開始將二進制日誌更改刷新到磁碟並且 Slave 的 I/O 執行緒可以檢測到下一個傳入的 SQL 語句時,該語句通過 I/O 執行緒傳送到 Slave。
- Percona 有一個很好的關於處理數據漂移的 PDF
回答問題 2
這裡的直接答案是否定的,因為
pt-table-sync
它旨在通過--sync-to-master
選項來檢測 Slave 的 I/O 執行緒。回答問題 3
這裡的直接答案是否定的,因為 MySQL Replication 需要知道
- Master上目前的二進制日誌是什麼?(這是
Master_Log_File
來自SHOW SLAVE STATUS\G
)- Slave 從 Master 的目前二進制日誌中讀取的最新位置是什麼?(這是
Read_Master_Log_Pos
來自SHOW SLAVE STATUS\G
)如果你只是想讓你的二進制日誌不礙事,你可以做兩件事之一
選項 1:在 Master 上,設置
expire-logs-days
為 3 以保留最近 3 天的二進制日誌
- 添加
expire-logs-days=3
在/etc/my.cnf- 無需重新啟動:只需執行
SET GLOBAL expire_logs_days = 3;
選項 2:
SHOW SLAVE STATUS\G
在從站上執行。取 的值Relay_Master_Log_File
。並使用它來清除 Master 上的二進制日誌以更新該日誌文件。
- 假設你
SHOW SLAVE STATUS\G
在 Slave 上執行- 你得到這個
Relay_Master_Log_File: mysql-bin.000035
- 在 Master 上執行:
PURGE BINARY LOGS TO 'mysql-bin.000035';
建議
如果您想對 pt-table-sync 更有信心,請嘗試使用該
--execute
選項。這將生成通常在 Master 上執行的 SQL。此後,您可以直接在該從站上執行 SQL。把它想像成一場彩排--execute
。