1.創(chuàng)建3個(gè)MySQL數(shù)據(jù)庫(kù)服務(wù)
我選擇的是在三個(gè)虛擬機(jī)上共創(chuàng)建3個(gè)MySQL數(shù)據(jù)庫(kù)服務(wù),創(chuàng)建完成之后,分別創(chuàng)建用戶
注意:創(chuàng)建完用戶記得刷新權(quán)限
flush?privileges;
在 主 數(shù)據(jù)庫(kù)創(chuàng)建用戶master,密碼為123456,允許任何地方登錄,這里注意,該賬號(hào)在本地localhost是不能登錄的
grant all privileges on *.* to master@'%' identified by '123456';
在 從1 數(shù)據(jù)庫(kù)創(chuàng)建用戶slave1, 密碼為123456,允許任何地方登錄
grant all privileges on *.* to slave1@'%' identified by '123456';
在 從2 數(shù)據(jù)庫(kù)創(chuàng)建用戶slave2, 密碼為123456,允許任何地方登錄
grant all privileges on *.* to slave2@'%' identified by '123456';
這里只是學(xué)習(xí),如果需要的話可以將 '%' 改為 '主數(shù)據(jù)庫(kù)的IP地址' 更為安全
2.修改配置文件
2.1修改master上的配置文件
vim?/etc/my.cnf
修改為
log_bin=mysql_bin
server_id=132
log_slave_updates=1
binlog_do_db=synchro_test
binlog_ignore_db=mysql
log_bin=mysql_bin是固定的,表示啟用二進(jìn)制日志
server_id服務(wù)器唯一ID,一般為ip最后一段,這個(gè)server_id 一會(huì)兒會(huì)用到
log_slave_updates允許slave更新
binlog_do_db,binlog記錄的數(shù)據(jù)庫(kù)日志,這里即為,記錄synchro_test數(shù)據(jù)庫(kù)的日志
binlog_ignore_db,binlog忽略的數(shù)據(jù)庫(kù)日志
PS:我看有的教程上log_bin是log-bin,下劃線變?yōu)榱硕谈?,這里我不確認(rèn)應(yīng)該是哪個(gè),最好的方法是,看配置文件中原本默認(rèn)的是什么,就用什么
2.2修改slave1上的配置文件
vim?/etc/my.cnf
修改為
log_bin=mysql_bin
server_id=131
read_only=1
replicate_do_db=synchro_test
log_slave_updates=1
read_only,表示該數(shù)據(jù)庫(kù)只可讀
replicate_do_db,同步的數(shù)據(jù)庫(kù)
log_slave_updates,允許通過(guò)日志同步數(shù)據(jù)庫(kù)
2.3修改slave2上的配置文件
vim?/etc/my.cnf
修改為
log_bin=mysql_bin
server_id=130
read_only=1
replicate_do_db=synchro_test
log_slave_updates=1
2.4重啟三臺(tái)服務(wù)器的mysql
systemctl restart mysqld
重啟完成之后最好
systemctl status mysqld
確認(rèn)一下mysql的狀態(tài),以免因?yàn)樾薷呐渲梦募e(cuò)誤,直接導(dǎo)致mysql啟動(dòng)失敗,影響到接下來(lái)的進(jìn)程
3.確認(rèn)master狀態(tài)
在master服務(wù)器上,登錄mysql后
show master status;
查看master狀態(tài)如下圖

如果數(shù)據(jù)庫(kù)是新建不久,操作不多就進(jìn)行同步,F(xiàn)ile和Position都會(huì)比較小,隨著對(duì)數(shù)據(jù)庫(kù)的操作越來(lái)越多,F(xiàn)ile和Position會(huì)越來(lái)越大
File和Position一會(huì)兒會(huì)使用到,這兩個(gè)是確定slave中從master上復(fù)制日志文件開(kāi)始的地方
注:執(zhí)行完此步驟后,在完成整個(gè)主從配置前,不要再操作主服務(wù)器mysql,防止主服務(wù)器狀態(tài)值變化
4.配置從服務(wù)器slave
登錄slave1的mysql
change master to master_host='192.168.47.132',master_user='master',master_password='123456',master_log_file='mysql_bin.000002',master_log_pos=459;
不要換行,最后的master_log_pos不用加單引號(hào) ' ?'
master_host,是你的master主服務(wù)器的IP地址
master_user,是你當(dāng)時(shí)在master主服務(wù)器上授權(quán)的用戶名
master_password,就是該用戶的密碼了
master_log_file,是上面master狀態(tài)中的File字段
master_log_pos,是Position字段
5.啟動(dòng)從服務(wù)器的復(fù)制功能,并檢查狀態(tài)
start slave;
?show slave status\G;
從服務(wù)器復(fù)制功能狀態(tài)如圖:

圖中為正常的情況
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
這兩個(gè)都為Yes才表示從服務(wù)器復(fù)制功能是正常運(yùn)行的
可以看到剛才配置的信息,IP,master服務(wù)器的用戶名及密碼,端口,日志文件,日志文件位置等等...
連接的端口號(hào)也是和其他的字段一樣進(jìn)行配置的
如果你到這里都是正常的話,就可以先試著在master服務(wù)器的mysql中新建數(shù)據(jù)庫(kù)及表等操作,進(jìn)行主從數(shù)據(jù)庫(kù)同步的測(cè)試
6.可能遇到的一部分問(wèn)題
Slave_IO_Running和Slave_SQL_Runnin中任何一個(gè)為No或Connecting,就是出現(xiàn)錯(cuò)誤了
這里只是列舉幾個(gè)常遇到的問(wèn)題,更多的問(wèn)題可以通過(guò)?show slave status\G;?中的
Last_IO_Errno ? ? ? ?//IO錯(cuò)誤編號(hào),這個(gè)一般指連接錯(cuò)誤
Last_IO_Error ? ? ? ?//IO錯(cuò)誤信息
Last_SQL_Errno ? ?//數(shù)據(jù)庫(kù)內(nèi)部的錯(cuò)誤編號(hào),創(chuàng)建數(shù)據(jù)庫(kù)失敗,同步數(shù)據(jù)失敗等等
Last_SQL_Error ? ?//數(shù)據(jù)內(nèi)部錯(cuò)誤的信息
這四個(gè)字段的信息在網(wǎng)上查找相關(guān)的資料,解決問(wèn)題
IO_Errno:1597:在master上未對(duì)master用戶授權(quán),即master對(duì)數(shù)據(jù)的操作權(quán)限不夠
IO_Errno:1236:連接成功但是無(wú)法從主服務(wù)器成功獲取sql日志文件,這個(gè)問(wèn)題的可能性比較多,如果是第一次配置這個(gè)就遇到這個(gè)問(wèn)題,一般是master_log_file或master_log_pos后面的內(nèi)容打錯(cuò)了,我當(dāng)時(shí)就是多打個(gè)空格......
更多這個(gè)1236的問(wèn)題可以在https://yq.aliyun.com/articles/27685中找到更多原因
SQL_Errno:1007:這個(gè)我的確遇到了,無(wú)法創(chuàng)建數(shù)據(jù)庫(kù),根據(jù)SQL_Error中的錯(cuò)誤信息可以知道,我的是因?yàn)樵谥鱩aster服務(wù)器中創(chuàng)建的數(shù)據(jù)庫(kù)test在slave中已經(jīng)存在了,所以報(bào)這個(gè)錯(cuò)誤,我的解決方案是,先將slave中的test數(shù)據(jù)庫(kù)刪除。
在mysql中停止slave服務(wù)
stop slave;
將之前的change master to的內(nèi)容再次輸入,然后再次啟動(dòng)slave服務(wù)
start slave;
這個(gè)問(wèn)題就解決了
PS:如果你還遇到其他的問(wèn)題,就按照上面4個(gè)字段的提示信息,進(jìn)行解決吧~