Mysql

從頭開始重建 mysql slave

  • May 21, 2015

我有一個主/從 mysql 設置。今晚我和主人發生了一些問題。我需要重新創建所有數據庫,因為它們已損壞。

現在我停止了我的 mysql slave,但想重新啟動它並從頭開始重建所有內容。有沒有辦法做到這一點?不鎖定主人…

我也認為應該重置binlog文件。所以一切又乾淨了。

有任何想法嗎?

如果您在主伺服器上使用 innodb 引擎 - 只需將 mysqldump 與–skip-lock-tables–single-transaction–master-data=2開關一起使用。

如果您的從站僅在邏輯上損壞 - 嘗試使用 lock=0 選項的 pt-table-sync

以下是如何使用 Linux LVM 快照從主伺服器重建 MySQL 從伺服器的分步說明。當您無法承受太多停機時間將二進製文件複製到從站時,這是理想的方法。還有其他方法可以做到這一點,但我總是質疑奴隸的一致性。我從從伺服器獲取備份,所以我絕對需要確保我的快照始終保持一致。

將 innodb 最大臟頁百分比設置為零。這將強制 MySQL 將所有頁面寫入磁碟,這將顯著加快重啟速度。

set global innodb_max_dirty_pages_pct = 0;

要監控臟頁的數量,請執行命令

mysqladmin ext -i10 | grep dirty

一旦數量停止減少,您就可以繼續。接下來重置master以清除舊的bin日誌/中繼日誌:

RESET MASTER;

執行 lvdisplay 獲取 LV Path

lvdisplay

輸出將如下所示

--- Logical volume ---
LV Path                /dev/vg_mysql/lv_data
LV Name                lv_data
VG Name                vg_mysql

使用命令關閉主數據庫

service mysql stop

接下來拍攝快照,mysql_snapshot 將是新的邏輯卷名。如果二進制日誌放置在作業系統驅動器上,則也需要進行快照。

lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data

使用命令再次啟動master

service mysql start

將臟頁設置恢復為預設值

set global innodb_max_dirty_pages_pct = 75;

再次執行 lvdisplay 以確保快照存在且可見

lvdisplay

輸出:

--- Logical volume ---
LV Path                /dev/vg_mysql/mysql_snapshot
LV Name                mysql_snapshot
VG Name                vg_mysql

掛載快照

mkdir /mnt/mysql_snapshot
mount /dev/vg_mysql/mysql_snapshot /mnt/mysql_snapshot

如果你有一個現有的 MySQL slave 正在執行,你需要停止它

service mysql stop

接下來你需要清除 MySQL 數據文件夾

cd /var/lib/mysql
rm -fr *

回到大師。現在將快照同步到 MySQL 從站

rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/

rsync 完成後,您可以解除安裝並刪除快照

umount /mnt/mysql_snapshot
lvremove -f /dev/vg_mysql/mysql_snapshot

如果舊的複制使用者不存在或密碼未知,則在主伺服器上創建複製使用者

GRANT REPLICATION SLAVE on *.* to 'replication'@'[SLAVE IP]' identified by 'YourPass';

驗證 /var/lib/mysql 數據文件是否歸 mysql 使用者所有,如果是,則可以省略以下命令:

chown -R mysql:mysql /var/lib/mysql

接下來記錄binlog位置

ls -laF | grep mysql-bin

你會看到類似的東西

..
-rw-rw----     1 mysql mysql  1073750329 Aug 28 03:33 mysql-bin.000017
-rw-rw----     1 mysql mysql  1073741932 Aug 28 08:32 mysql-bin.000018
-rw-rw----     1 mysql mysql   963333441 Aug 28 15:37 mysql-bin.000019
-rw-rw----     1 mysql mysql    65657162 Aug 28 16:44 mysql-bin.000020

這裡主日誌文件是序列中最高的文件號,bin 日誌位置是文件大小。記錄這些值:

master_log_file=mysql-bin.000020
master_log_post=65657162

接下來啟動slave MySQL

service mysql start

通過執行以下命令在從站上執行更改主命令:

CHANGE MASTER TO 
master_host="10.0.0.12", 
master_user="replication", 
master_password="YourPass", 
master_log_file="mysql-bin.000020", 
master_log_pos=65657162; 

最後啟動slave

SLAVE START;

檢查從屬狀態:

SHOW SLAVE STATUS\G

確保 Slave IO 正在執行並且沒有連接錯誤。祝你好運!

我的完整部落格文章可在以下位置找到更多資訊:

http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html

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