mysql知識盤點【叄】_主從複製
系列文章:
本文內容部分整理自《高效能mysql》,連結如下:
兩種複製方式
mysql支援兩種複製方式:基於語句的複製和基於行的複製。
基於語句的複製(邏輯複製)在mysql 3.23版本就已存在,基於行的版本在5.1版本引入。
兩種方式都是通過在主庫記錄二進位制日誌,在備庫重放日誌的方式來實現非同步的資料複製。但是區別在於,基於語句複製時,日誌中記錄的是sql語句;基於行復制時,日誌中記錄的是變化了的資料。
複製的流程圖如下:
複製三個步驟:
1.主庫把資料更改記錄到二進位制日誌(binarylog)中;
2.備庫將主庫上的日誌複製到自己的中繼日誌(relay log)中;
3.備庫讀取中繼日誌中的事件,將其重放到備庫資料之上;
而在複製的過程中,會有一定的延遲,原因在於主庫更新資料是多執行緒操作,而從庫更新資料是單執行緒。從庫使用單執行緒更新是要考慮語句順序問題。
語句複製和行復制相對比,各自特點如下:
基於語句複製:主庫記錄造成資料修改的語句,在從庫上再執行一遍。好處實現簡單,缺點必須序列實現。
基於行復制:將實際資料(變化了的資料)放在二進位制日誌中,好處是可以正確地複製每一行,缺點是當進行全表操作時複製代價大,時間點恢復也實現複雜。
配置主從
1.配置主庫my.cnf檔案
log_bin = mysql-bin
server_id = 10
2.配置授權賬號及檢視主庫狀態
grant replication slave on *.* to [email protected] identified by '123456' ;
show master status;
3.配置從庫my.cnf
log_bin = mysql-bin
server_id = 12
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
4.從庫連線主庫
change master to master_host='server1', master_user = 'slave'; master_password = '123456', master_log_file = 'mysql_bin.000001', master_log_pos = 0;
5.檢視複製狀態
show slave status/G
正常狀態為
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6.開始複製
start slave;
主從不同步解決思路
1.先檢視主庫
show processlist; -- 檢視下程序是否Sleep太多。發現很正常。
show master status; -- 也正常。
+-------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-------------------------------+
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |
+-------------------+----------+--------------+-------------------------------+
1 row in set (0.00 sec)
2.檢視從庫
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No -- 說明有錯誤
3.跳過錯誤
stop slave;
#表示跳過一步錯誤,後面的數字可變
set global sql_slave_skip_counter =1;
start slave;
show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes