一個簡單的MySQL數據遷移示例

   因爲服務器遷移,目前一套硬件老化的MySQL主從服務器都需要替換爲新服務器,總體評估了一下,在不改變版本的情況下,採用了較新的5.6子版本。就是如下圖所示的左邊和右邊。

  如果要做這個完整的切換,其實方式和思路都有很多,我選擇了一種來做。

  首先我低估了數據的情況,以爲都是InnoDB表,於是從主庫使用--single-transaction導出表數據,直接導入。看起來沒有什麼明顯的異常,但是啓動slave,發現數據衝突。

2017-08-07 17:40:31 75211 [Warning] Slave: Duplicate entry '632107' for key 'PRIMARY' Error_code: 1062
2017-08-07 17:40:31 75211 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave S
QL thread with "SLAVE START". We stopped at log 'binlog.000019' position 934115248

 所以仔細審視數據,發現原來裏面有個數據庫裏存在大量的MYISAM表。在這種情況系,備份MYISAM表數據就很可能出現問題,因爲--single-transaction不會生效,要備份可以使用mysqlhotcopy等方式來做,我不喜歡MYISM表,而且這個人其實比較懶,不想這樣折騰,而且還對主庫造成一定的影響。所以我把目光瞄向了從庫。

   爲了保證數據一致性,我完全可以先停掉slave,在有限的時間裏導出數據,這樣對於主庫來說是透明的。

而需要注意的是使用mysqldump導出使用master-data的選項註定是有衝突的,所以我們完全可以不用master-data=2的選項,而直接根據show slave status\G的結果來得到具體的偏移量。

# mysqldump --all-databases --master-data=2 > master.sql 
mysqldump: Error: Binlogging on server not active

新的主庫,新的備庫都是按照這種方式來搭建,數據都來自舊的從庫,這樣一來,配置好服務的話,主庫會有3個binlogDump線程。

整個數據導入的過程中,可以根據processlist的數據看到處理MyISAM表還是比較耗時,我就乾等着幾個MyISAM大表的線程State從“Repair by sorting”和“Repair with keycache”切換。

這個時候我們就需要轉換一下,我們把新的從庫指向新的主庫即可,也就是實現級聯複製,要做這個工作,讓數據追平之後,保險起見還是先停掉新主庫的slave線程,讓新的從庫重新從新的主庫來應用日誌(show master status\G) 這樣一來,一切一連,一個級聯的環境就搞定了。

  後期後一些微調,也可以很自然的完成。


而正式切換的時候,其實幾乎不需要做什麼工作。新的主庫使用reset slave all即可。

  上面的這是一個很基礎的環境切換,如果能夠更深一步,把網絡層面的工作做好,其實這個切換就更加透明,完全可以做到無感知。


最後推薦 MySQL 培訓請認準mycat 官方團隊,在這裏,不僅可以學習MySQL DBA 專業知識,還能學習到 中間件和以及nosql以及與之相關的高可用解決!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章