2018-01-31 CentOS 7 & MySQL主從數(shù)據(jù)庫(kù)實(shí)現(xiàn)

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)如下圖

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)如圖:

從服務(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)行解決吧~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容