MySQL主從復(fù)制一般情況下我們會設(shè)置需要同步的數(shù)據(jù)庫,使用參數(shù)配置選項,binlog-do-db,可以在master上指定需要同步的數(shù)據(jù)庫,replicate-do-db在從數(shù)據(jù)看上指定需要同步的數(shù)據(jù)庫,一般只設(shè)定master上的binlog-do-db即可,不需要兩個同時設(shè)定,以防萬一,在slave也可以加上replicate-ignore-db.
我們遇到的問題是,在master上面新增了一個數(shù)據(jù)庫,這個時候如何把新加的這個數(shù)據(jù)庫添加到MySQL的主從復(fù)制鏈里?即不重新復(fù)制整個庫的情況下,重新設(shè)置主從復(fù)制.
首先,我們大概羅列一下主從復(fù)制的基本步驟,MySQL主從首先需要在各自服務(wù)器配置好.
1.復(fù)制數(shù)據(jù)庫,代碼如下:
mysqldump --master-data --single-transaction -R --databases [db_name] | gzip -9 - | pv > all-db-with-master-data.sql.gz
注意:innodb用 –single-transaction,myisam 需要用 –lock-all-tables.
2. 復(fù)制,導(dǎo)入數(shù)據(jù),代碼如下:
pv < all-db-with-master-data.sql.gz | zcat | mysql
3. 啟動slave數(shù)據(jù)庫。
slave start注意:切換到主的語句已經(jīng)在導(dǎo)出的sql語句里面了,注意查看,change master to master_log_file=’(binlog name in relay_master_log_file)’, master_log_pos=(exec_master_log_pos number)。
那么,在現(xiàn)有的主從復(fù)制結(jié)構(gòu)中,如何增加一個新的數(shù)據(jù)庫進去?比如我們要增加一個數(shù)據(jù)庫在master服務(wù)器上,比如,名為newdb的數(shù)據(jù)庫.
具體操作如下:
1. 從服務(wù)上,停掉slave數(shù)據(jù)庫,代碼如下:
stop slave;
2. 主服務(wù)器上,導(dǎo)出新數(shù)據(jù)庫,代碼如下:
mysqldump --master-data --single-transaction -R --databases newdb > newdb.sql
3. 主服務(wù)器上,修改my.cnf文件,添加新庫到binlog-do-db參數(shù),重啟mysql.
4. 在導(dǎo)出的newdb.sql里面查找當前的日志文件以及位置(change master to …)然后讓slave服務(wù)器執(zhí)行到這個位置,代碼如下:
start slave until MASTER_LOG_FILE="mysql-bin.000001", MASTER_LOG_POS=1222220;//Vevb.com
其中MASTER_LOG_FILE,以及MASTER_LOG_POS在導(dǎo)出的數(shù)據(jù)庫newdb.sql頂部位置查找.
4. 導(dǎo)入新庫到從服務(wù)器上,代碼如下:
mysql < newdb.sql5. start slave
其中比較重要的是在主服務(wù)器上導(dǎo)出新庫時的日志位置,position A,這個點很重要,以這個點做為分界線,導(dǎo)入新庫.
這種方法也同樣適用于某個數(shù)據(jù)庫或者某個數(shù)據(jù)表不同步的情況,比如主從數(shù)據(jù)庫有一個表由于某些原因數(shù)據(jù)不一致,那么上面的方法只需要去掉重啟數(shù)據(jù)庫一步,其他的操作基本一致.
新聞熱點
疑難解答
圖片精選