復(fù)制過程:
主節(jié)點(diǎn)必須啟用二進(jìn)制日志,記錄任何修改數(shù)據(jù)庫數(shù)據(jù)的事件。
從節(jié)點(diǎn)開啟一個(gè)線程(I/O Thread)把自己扮演成mysql的客戶端,通過mysql協(xié)議,請(qǐng)求主節(jié)點(diǎn)的二進(jìn)制日志文件中的事件
主節(jié)點(diǎn)啟動(dòng)一個(gè)線程(dump Thread),檢查自己二進(jìn)制日志中的事件,跟對(duì)方請(qǐng)求的位置對(duì)比,如果不帶請(qǐng)求位置參數(shù),則主節(jié)點(diǎn)就會(huì)從第一個(gè)日志文件中的第一個(gè)事件一個(gè)一個(gè)發(fā)送給從節(jié)點(diǎn)。
從節(jié)點(diǎn)接收到主節(jié)點(diǎn)發(fā)送過來的數(shù)據(jù)把它放置到中繼日志(Relay log)文件中。并記錄該次請(qǐng)求到主節(jié)點(diǎn)的具哪個(gè)二進(jìn)制日志文件的哪個(gè)位置。
從節(jié)點(diǎn)啟動(dòng)另外一個(gè)線程(sql Thread ),把replaylog中的事件讀取出來,并在本地再執(zhí)行一次。
配置步驟:
1、主服務(wù)器修改配置文件
[mysqld]
log-bin=mysql-bin #開啟二進(jìn)制日志
server-id=1 #設(shè)置server-id
2、啟動(dòng)主數(shù)據(jù)庫服務(wù)
3、創(chuàng)建用于同步的用戶賬號(hào)
mysql> CREATE USER 'copy'@'*.*.*.*' IDENTIFIED BY '******';#創(chuàng)建用戶
mysql> GRANT REPLICATION SLAVE ON *.* TO 'copy'@'*.*.*.*';#分配權(quán)限
mysql>flush privileges;? #刷新權(quán)限
4、從服務(wù)器修改配置文件:
server-id=2
5、啟動(dòng)從數(shù)據(jù)庫服務(wù)
6、在從節(jié)點(diǎn)配置訪問主節(jié)點(diǎn)的參數(shù)信息
CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='', MASTER_LOG_FILE='',MASTER_LOG_POS=;
7、啟動(dòng)復(fù)制線程
start slave;
8、查看同步狀態(tài)
show slave status\g;
注:Slave_IO及Slave_SQL進(jìn)程必須正常運(yùn)行,即YES狀態(tài),否則都是錯(cuò)誤的狀態(tài)(如:其中一個(gè)NO均屬錯(cuò)誤)。
以上操作過程,主從服務(wù)器配置完成。
主從復(fù)制架構(gòu)中應(yīng)注意的問題:
1、限制從服務(wù)器為只讀
在從服務(wù)器上設(shè)置:
read_only = ON,但是此限制對(duì)擁有SUPER權(quán)限 的用戶均無效。
阻止所有用戶:
mysq>FLUSH TABLES WITH READ LOCK;
2、主服務(wù)器設(shè)置需要同步的庫
binlog-do-db = db1
3、從庫同步出問題了,在不重啟主庫的情況下進(jìn)行主從復(fù)制恢復(fù)
首先導(dǎo)出db文件:mysqldump -uroot -p --routines --single_transaction --master-data=2 --databases db > db.sql
然后在從庫stop slave
查看導(dǎo)出db文件? head -50 db.sql |grep "CHANGE MASTER"? ? ? #-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=21212;
在從庫執(zhí)行CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='', MASTER_LOG_FILE='',MASTER_LOG_POS=;文件名及位置參照上面查詢的結(jié)果
最后start slave;