MySQL是現在普遍使用的數據庫,但是如果宕機了必然會造成數據丟失。為了保證MySQL數據庫的可靠性,就要會一些提高可靠性的技術。MySQL主從復制可以做到實時熱備數據。本文介紹MySQL主從復制原理及其配置過程。
術語:主從復制——master slave replication(M-S模式)。
用途
- 備份
- 讀寫分離
- 高可用和故障切換(需要做HA)
- MySQL升級測試
原理
實際上,它的原理思路很簡單。MySQL 中有一種日志叫做 bin 日志(二進制日志),這個日志會記錄下所有修改了數據庫的SQL語句。主從復制的原理其實就是"從"服務器向"主"服務器請求這個日志文件,"主"服務器會把這個 bin 日志復制到"從"服務器上執行一遍,這樣"從"服務器上的數據就和"主"服務器上的數據相同了。
流程圖:
圖解:
- 主服務器必須啟用二進制日志(log-bin),記錄任何修改了數據庫數據的事件;
- 從服務器開啟一個線程(I/O Thread)把自己扮演成 MySQL 的客戶端,通過 MySQL 協議,請求主服務器的二進制日志文件中的事件;
- 主服務器啟動一個線程(Dump Thread),檢查自己二進制日志中的事件,跟對方請求的位置對比,如果不帶請求位置參數,則主服務器就會從第一個日志文件中的第一個事件一個一個發送給從服務器;
- 從服務器接收到主服務器發送過來的數據把它放置到中繼日志(relay log)文件中。並記錄該次請求到主服務器的具體哪一個二進制日志文件內部的哪一個位置(主服務器中的二進制文件會有多個,其名結尾以6位數遞增);
- 從服務器啟動另外一個線程(SQL Thread ),把 relay log 中的事件讀取出來,並在本地再執行一次。
配置過程
主服務器(Master)
- 啟用二進制日志 log-bin;
- 設置一個全局唯一的 server_id;
- 提前准備好一個有復制權限(replication slave,replication client)的用戶。
從服務器(Slave)
- 啟動中繼日志 relay-log;
- 設置一個全局唯一的 server_id;
- 使用主服務器提供的有復制權限的用戶連接至 Master;
- 啟動復制線程。
配置演示
測試環境
主服務器:192.168.43.75
從服務器:192.168.43.111
mysql版本:mysql-8.0
系統:主 Windows10,從 Windows7
主服務器配置
1.配置 my.ini (文件中搜索)
自MySQL8.0后,my.ini 並不在MySQL的安裝目錄下,而是在隱藏目錄C:\ProgramData\MySQL\MySQL Server 8.0下。
log-bin=master-log-bin server-id=1 innodb-file-per-table=ON
2.重啟服務,並進入MySQL
查看主服務器狀態信息:
注:這里的文件名和位置值會在后面的配置中用到。
3.給復制用戶授權
grant replication slave, replication client on *.* to repl_user@192.168.43.111;
或者對現有的超級用戶修改可訪問主機IP:
update user set host='%' where user='root'; # '%' 代表所有局域IP
一定要刷新權限:
flush privileges;
主服務器配置完成。
從服務器配置
1.配置 my.ini(文件中搜索)
log-bin=slave-log-bin relay_log=relay-log relay_log_index=relay-log.index
server-id=2 innodb_file_per_table=ON
值得注意的是,配置中的屬性名有些是"-",有些是"_"。
2.重啟並進入MySQL服務(略)
3.用主服務器提供的復制用戶連接主服務器
change master to master_host='192.168.43.75',master_port=3306,master_user='repl_user',master_password='123456',master_log_file='master-log-bin.000005',master_log_pos=155; # 這里的 master 日志文件和位置必須與主服務器當前狀態一致!
4.啟動復制線程
此時會啟動 IO Thread 和 SQL Thread 這兩個線程。
(停止復制線程:stop slave)
查看從服務器狀態信息:
MySQL主從配置到此完成。
測試
在主服務器上新建一個數據庫test:
在從服務器上查看:
測試通過,完美。
常見問題處理
當我們配置好MySQL主從同步時,原本是可以實現主從同步的,但是重啟機器后就發現無法同步了。
MySQL Replication 中 slave 機器上有兩個關鍵的線程,死一個都不行,一個是 Slave_IO_Running,一個是 Slave_SQL_Running。一個負責與主機的 IO 通信,一個負責自己的 slave mysql 語句執行。
1)如果是Slave_SQL_Running:No,如圖。
解決辦法:
> stop slave; > set global sql_slave_skip_counter=1; > start slave;
2)如果是Slave_IO_Running:No,如圖。
解決辦法:
查看主服務器狀態:
查看從服務器狀態:
找到問題所在:Master_Log_File沒有對應。
> stop slave; > change master to master_log_file='mysql-bin.000026',master_log_pos=0; > slave start; > show slave status\G;
得解。
至此,轉載請注明出處。