首先需要的環(huán)境:我在本地安裝了兩個(gè)MySQL,分別是5.7和5.5的版本:安裝結(jié)束后如下:
創(chuàng)新互聯(lián)公司是專業(yè)的洛陽網(wǎng)站建設(shè)公司,洛陽接單;提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行洛陽網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
1、復(fù)制原理:
原理:
在MySQL中有一種叫做bin的二進(jìn)制日志,這個(gè)日志文件里面記錄了關(guān)于此數(shù)據(jù)庫的所有修改的sql語句(包括insert,update,delete,grant等等)。而主從復(fù)制就是利用這個(gè)二進(jìn)制bin日志,在主庫上創(chuàng)建一個(gè)用戶,從數(shù)據(jù)庫通過此用戶去讀取bin日志,然后再在從數(shù)據(jù)庫上再執(zhí)行一次。
2、主數(shù)據(jù)庫配置文件修改:
我在改配置文件過程中碰到的一個(gè)問題就是:我的主數(shù)據(jù)庫選擇5.7版本,但是并沒有my.ini這個(gè)文件,只有my-default.ini.如果你是安裝在C盤,你還可能發(fā)現(xiàn)一個(gè)路徑:C:\programData\mysql\my.ini,改這個(gè)就好了。
還有其他幾個(gè)值可以配置:
binlog-do-db=su #要同步的數(shù)據(jù)庫名稱,多個(gè)寫多行,如果沒配置,則所有都同步;
binlog_format=mixed #日志混合
3、主數(shù)據(jù)庫啟動(dòng)過程:
cmd以管理員方式運(yùn)行,然后輸入命令:net start MySQL57(安裝時(shí)自己取的名字),如下:
4、連接主數(shù)據(jù)庫:
啟動(dòng)成功后,連接數(shù)據(jù)庫命令:mysql -u root -p,如下:
這個(gè)命令如果環(huán)境變量沒有配置的話,這個(gè)命令是沒法用的。
5、為從數(shù)據(jù)庫創(chuàng)建用戶:
先可以看一下二進(jìn)制日志文件的狀態(tài),命令為:show global variables like '%log_bin%';(注意后面有分號(hào)),結(jié)果如下:
為從服務(wù)器創(chuàng)建用戶,即授權(quán)給從數(shù)據(jù)庫,命令為:grant replication slave on . to 'myslave'@'%' identified by '123456';
%表示除了本地可以訪問,還可以遠(yuǎn)程訪問,localhost則只能本地訪問。
replication slave表示只授予slave的權(quán)限,也可以加select,insert等等。
授權(quán)以后查看主數(shù)據(jù)庫狀態(tài),如下:
記錄下 File及 Position 的值,在后面進(jìn)行從服務(wù)器操作的時(shí)候需要用到。
6、從數(shù)據(jù)庫配置:
也可以加其他的:
relay_log = mysql-relay-bin // 中繼日志
log_slave_updates = 1 // slave將復(fù)制事件寫進(jìn)自己的二進(jìn)制日志
7、從數(shù)據(jù)庫執(zhí)行過程:
首先啟動(dòng)從數(shù)據(jù)庫,然后執(zhí)行同步SQL語句,如下:
然后啟動(dòng)Slave同步進(jìn)程,主從同步檢查,如下:
當(dāng)這兩個(gè)值都為YES的時(shí)候,表示狀態(tài)正常。
現(xiàn)在出現(xiàn)的狀態(tài)為不正常的,提示的原因如下:
說是server-id相同,但是我配置的分別為1和2。則解決辦法可以試試以下:
a、MySQL的一個(gè)配置文件auto.cnf里面記錄了mysql服務(wù)器的uuid,server_uuid:服務(wù)器身份ID。在第一次啟動(dòng)Mysql時(shí),會(huì)自動(dòng)生成一個(gè)server_uuid并寫入到數(shù)據(jù)目錄下auto.cnf文件里,改一下這個(gè)值試試看。
b、找一找是不是存在其他的my.ini文件,找到后刪除;
c、通過命令來設(shè)置server-id=2:
mysql> set global server_id=2; #此處的數(shù)值和my.cnf里設(shè)置的一樣就行
mysql> slave start;
修改成功后進(jìn)行測(cè)試:
然后從數(shù)據(jù)庫的這張表會(huì)自動(dòng)加入這條數(shù)據(jù),這樣就算完成了數(shù)據(jù)庫的主從復(fù)制了。
最后來介紹一下MySQL主從復(fù)制的過程:
a、主節(jié)點(diǎn)啟用這個(gè)bin二進(jìn)制日志(log-bin);
b、從節(jié)點(diǎn)開啟一個(gè)線程(I/O Thread),連接主節(jié)點(diǎn)上的用戶,讀取這個(gè)日志文件中的事件;
c、主節(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);
d、從節(jié)點(diǎn)接收到主節(jié)點(diǎn)發(fā)送過來的數(shù)據(jù)把它放置到中繼日志(Relay log)文件中。并記錄該次請(qǐng)求到主節(jié)點(diǎn)的具哪個(gè)二進(jìn)制日志文件的哪個(gè)位置;
e、從節(jié)點(diǎn)啟動(dòng)另外一個(gè)線程(sql Thread ),把replaylog中的事件讀取出來,并在本地再執(zhí)行一次。
解釋:
I/O Thread:從Master請(qǐng)求二進(jìn)制日志事件,并保存于中繼日志中;
Sql Thread:從中繼日志中讀取日志事件,在本地完成重放;
Dump Thread:為每個(gè)Slave的I/O Thread啟動(dòng)一個(gè)dump線程,用于向從節(jié)點(diǎn)發(fā)送二進(jìn)制事件;
注意:如果從節(jié)點(diǎn)需要作為其他節(jié)點(diǎn)的主節(jié)點(diǎn)時(shí),需要開啟二進(jìn)制日志文件的(log-bin)。這種情況叫做級(jí)聯(lián)復(fù)制。如果只是作為從節(jié)點(diǎn),則不需要?jiǎng)?chuàng)建二進(jìn)制文件。