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