Mysql

如何將幾個數據庫從 MariaDB 主伺服器轉移到另一個主伺服器

  • September 27, 2016

我必須將數據庫(沒有系統數據庫的所有內容)從一台複製伺服器傳輸到另一台複製伺服器。一切都在 MariaDB (10.0.20) 上,我需要以最少的停機時間來完成它。在源伺服器上,我有主伺服器 (serverA1)、從伺服器 (serverA2)、從伺服器 (serverA3) 複製。在目標伺服器上,我有同樣的情況——主伺服器(ServerB1)、從伺服器(ServerB2)、從伺服器(ServerB3)。現在我必須將數據庫從伺服器 A 移動到伺服器 B,停機時間最短且不破壞複製。伺服器 A 和 B 有不同的數據庫。將來伺服器 A 將離線。

您唯一能做的就是:ServerB 必須成為 ServerA 的從屬設備

讓我們假設以下

  • ServerA1 的 IP 為 10.20.30.40
  • ServerA1 有數據庫 db1, db2, db3
  • ServerB1 有數據庫 db4, db5, db6
  • ServerA2 是 ServerA1 的從站
  • ServerA3 是 ServerA1 的從站
  • ServerB2 是 ServerB1 的從站
  • ServerB3 是 ServerB1 的從站

這是步驟

步驟 01

確保 ServerA 和 ServerB 及其從屬伺服器具有唯一的 server_id 值

步驟 02

選項 #1:從 ServerA1 轉儲

MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT schema_name FROM information_schema.schemata"
SQL="${SQL} WHERE schema_name NOT IN "
SQL="${SQL} ('information_schema','performance_schema','mysql','test','sys')"
DBLIST=`mysql ${MYSQL_CONN} -ANe"${SQL} 2>/dev/null"`
MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers --master-data=2"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} -B ${DBLIST} | gzip > DataFromServerA.sql.gz

選項 #2:從 ServerA1 的從站轉儲

MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT schema_name FROM information_schema.schemata"
SQL="${SQL} WHERE schema_name NOT IN "
SQL="${SQL} ('information_schema','performance_schema','mysql','test','sys')"
DBLIST=`mysql ${MYSQL_CONN} -ANe"${SQL} 2>/dev/null"`
MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers --dump-slave=2"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} -B ${DBLIST} | gzip > DataFromServerA.sql.gz

注意:在選項 #2 中,您使用–dump-slave。這告訴從屬伺服器將其主伺服器的二進制日誌文件/pos 發佈到 mysqldump 的輸出而不是它自己的輸出。

STEP 03 : 獲取複製日誌文件和日誌位置

less DataFromServerA.sql.gz | head -23 | tail -2

這將CHANGE MASTER TO與 Master 的日誌文件和位置相呼應

為了這個例子,假設輸出是

-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.001236', MASTER_LOG_POS=102938;

STEP 04 : 將 Dump 傳輸到 ServerB1

步驟 05 : 將轉儲載入到 ServerB1

MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
gzip -d < DataFromServerA.sql.gz | mysql ${MYSQL_CONN}

步驟 06:為切換創建複製使用者

在 ServerA1 上,執行

GRANT REPLICATION SLAVE,REPLICATION CLIENT
ON *.* TO 'cutover'@'%'
IDENTIFIED BY 'cutover';

步驟 07

在 ServerB1 上,執行

CHANGE MASTER TO
master_host='10.20.30.40',
master_port=3306,
master_user='cutover',
master_password='cutover',
master_log_file='bin-log.001236',
master_log_pos=102938;
START SLAVE;
SLAVE SLAVE STATUS\G

注意:請確保沒有防火牆問題

步驟 08:等待複製趕上

繼續在 ServerB1 上執行SLAVE SLAVE STATUS\G直到Seconds_Behind_Master為 0

步驟 09:停止對 ServerA1 的寫入

禁用所有寫入 ServerA1 的應用程序後,在 ServerA 上執行它

SET GLOBAL read_only = 1;
FLUSH TABLES;
FLUSH LOGS;

第 10 步:將所有應用程序指向 ServerB1

第 11 步:從 ServerA1 禁用 MySQL 複製

在 ServerB1 上,執行

STOP SLAVE;
RESET SLAVE ALL;

第 12 步:停用 ServerA1、ServerA2、ServerA3

警告:在生產環境中這樣做之前,請先在暫存伺服器上嘗試所有這些

試一試 !!!

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