1. 程式人生 > >mysql知識盤點【叄】_主從複製

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