本文說的mysql主備是指單向、非同步資料複製。可以是一個主、多個備。這樣做的好處顯而易見:有利於健壯性、速度和系統管理。備用資料庫可以做為唯讀查詢和備份的機器,減輕主用資料庫的負擔。
實施前提:
主用資料庫的配置裡至少有:
[mysqld]
log-bin=mysql-bin
server-id=1
建議主備的資料庫版本一致。
我所知道的最簡單的實施方式(不需要停主庫,甚至不需要長時間地禁止主庫寫入):
主庫操作:
在主庫裡建一個複製用的使用者:
grant replication slave on *.* TO 'replication'@'備庫地址' identified by 'replication';
匯出主庫的資料,並記下當然記錄檔和位移:
mysqldump --master-data=2 --single-transaction -uroot -p --all-databases >dumpfile
這裡是把資料以SQL的形式匯出,並記下匯出瞬間的記錄檔和位移(得益於--master-data=2參數),出來的dumpfile的前面會有一行類似以下的注釋資訊,就是檔案名稱和位移值了:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=1061553673;
對於這步,網路上一般採用的方法為:
FLUSH TABLES WITH READ LOCK;--先把主庫設定成唯讀,然後匯出SQL或者直接複製資料檔案
SHOW MASTER STATUS; --記下記錄檔和位移
UNLOCK TABLES; --恢複主庫寫入
這樣,至少在複製資料的那段時間,主庫是不可提供服務的。
備庫操作:
複製主庫的/etc/my.cnf和dumpfile。
把主庫配置裡的 server-id 改成2(或者3、4,多個備庫儲存互不相同),再加上
relay-log = slave-relay.log
relay-log-index = slave-relay-log.index
匯入資料:
mysql <dumpfile
進入mysql命令列執行:
SLAVE STOP;
CHANGE MASTER TO
MASTER_HOST='主庫地址',
MASTER_PORT=3306,
MASTER_USER='replication',
MASTER_PASSWORD='密碼',
MASTER_LOG_FILE='mysql-bin.000011',
MASTER_LOG_POS=1061553673;
SLAVE START;
然後,就搞定了,可以在備庫執行
SHOW PROCESSLIST;
查看同步的狀態,如果此命令的輸出裡有兩個“system user”的進程,並且Command都是“Connect”的話,就差不多OK了,此時,任何對主庫的修改,都能准即時地從備庫裡查詢出來。