Mysql
如何將幾個數據庫從 MariaDB 主伺服器轉移到另一個主伺服器
我必須將數據庫(沒有系統數據庫的所有內容)從一台複製伺服器傳輸到另一台複製伺服器。一切都在 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
警告:在生產環境中這樣做之前,請先在暫存伺服器上嘗試所有這些
試一試 !!!