Mysql

我真的可以用 percona 工具包的 pt-table-sync 做什麼?

  • June 16, 2015

我一直在尋找一種工具來同步來自 2 個不同數據庫的表並找到pt-table-sync. 我閱讀了文件並感到困惑:他們主要使用引用複制環境的範例,但我認為複制的全部目的是為您處理數據同步,因此我的問題是:

問題

  1. pt-table-sync如果復製過程應該為您處理數據同步,那麼使用的意義何在?
  2. 我可以pt-table-sync在非複制環境中使用(在2+個彼此無關的主機之間,是pt-table-sync --execute host1 host2 host3給定範例的作用)嗎?
  3. 如果我必須pt-table-sync在複製的環境中使用,我可以不使用bin-logson the master(有一個例子談到解決發現的差異, 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 更有信心,請嘗試使用該--print選項並重定向到文本文件而不是該--execute選項。這將生成通常在 Master 上執行的 SQL。此後,您可以直接在該從站上執行 SQL。把它想像成一場彩排--execute

引用自:https://serverfault.com/questions/450118