Mysql

以最少的停機時間乾淨地將 300 GB mysql 數據庫從一台伺服器遷移到另一台伺服器

  • October 15, 2018

我有一個 300 GB 的 mysql 數據庫,我想將其遷移到另一台伺服器,以便在兩者之間設置 Master-Master 複製,我的主要目標是盡可能減少停機時間。

我的數據庫只有一個大約 30GB 的表,其中全天候進行插入。所有其他表都是歷史表(靜態)。

1)在這種情況下,最好的方法是什麼?

  • 獲取整個數據庫的 mysqldump 並將轉儲傳輸到其他伺服器並將其導入新伺服器將完成我想要實現的工作,但需要大量的停機時間(可能超過 14 小時),這是不允許的。
  • 或者我可以在不停止 mysql 的情況下為靜態表進行單獨的表轉儲並將其導入新伺服器,在這一切結束之後,為單個活動表停機,這樣就不會發生新的插入,並且我的兩個數據庫都將同步? 首先有可能做這樣的事情嗎?如果可能的話,在設置主-主複製時可能會出現什麼問題?
  • 或者有沒有其他方法可以減少停機時間?

此解決方案可以使用 mysqldump 完成,但有一點風險

為了這個例子,假設你有以下內容:

  • 數據庫名稱是mydb
  • 源數據庫伺服器的私有 IP 是10.20.30.40
  • 目標數據庫伺服器的私有 IP 是10.20.30.50
  • 使用者root在源數據庫伺服器和目標數據庫伺服器上
  • 密碼whatever在源數據庫伺服器和目標數據庫伺服器上
  • 兩台伺服器上的二進制日誌都被命名為mysql-bin

這是你的步驟

STEP 01 : 創建複製使用者

在 Live Master 上,執行以下命令

CREATE USER repluser@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repluser@'%';

步驟 02:設置複製

在目標數據庫伺服器上,執行以下命令:

如果您在源伺服器和目標伺服器上啟用了 GTID,請執行以下操作:

CHANGE MASTER TO
master_host='10.20.30.40',
master_port=3306,
master_user='repluser',
master_password='replpass',
master_auto_position=1;

如果您沒有在源伺服器和目標伺服器上啟用 GTID,請執行以下操作:

CHANGE MASTER TO
master_host='10.20.30.40',
master_port=3306,
master_user='repluser',
master_password='replpass',
master_log_file='mysql-bin.000001',
master_log_pos=4;

STEP 03 : 創建一個腳本來執行實時mysqldump和載入

創建一個名為live_dump_and_load.sh

將以下幾行放入其中

MYSQL_USER=root
MYSQL_PASS=whatever
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
DB_TO_DUMP=mydb
MYSQLDUMP_OPTIONS="--routines --triggers"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --master-data=1"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --single_transaction"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} -B ${DB_TO_DUMP}"

date > live_dump_and_load.runlog
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} | mysql -h10.20.30.50 ${MYSQL_CONN}
date >> live_dump_and_load.runlog

STEP 04 : 執行shell腳本

chmod +x live_dump_and_load.sh
nohup ./live_dump_and_load.sh &

STEP 05 : 監控執行日誌

watch cat live_dump_and_load.runlog

步驟 06:開始複製

當轉儲載入到目標伺服器上時,轉到目標伺服器並執行

START SLAVE;

試一試 !!!

大約一周前我做了類似的事情,我同意MarCPlusPlus,xtrabackup 是要走的路。

但是,我對他的程序進行了一些調整。

-當備份完成時(或之前)停止所有對原始主機的寫入。

這取決於原始數據庫中每秒發生多少事務。就我而言,我在一個帶有 GTID 的innodb數據庫上,我在 260GB 的表上有大約 5k 個事務/秒。備份結束時的鎖定時間約為 30 秒。使用我的 CPU 擁有的 3 個備用核心,所有客戶端都恢復得非常快。客戶沒有註意到任何事情。

將數據從一台主機複製到另一台主機是一件大事。這需要時間,並且在啟動新機器後,您將有很長時間讓新機器趕上主人。

為了加快追趕使用slave_parallel_workers

slave_parallel_type             = LOGICAL_CLOCK

slave_parallel_workers          = 4

在您的新主機 MySQL 配置文件中

就我而言,複製在半天之內就比 master 落後了 10 個小時。

引用自:https://dba.stackexchange.com/questions/183887