本文說的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了,此時,任何對主庫的修改,都能准實時地從備庫裡查詢出來。