1. 程式人生 > 實用技巧 >Mysql資料庫主從配置

Mysql資料庫主從配置

Mysql主從同步

Mysql資料庫進行主從配置後,可以實現資料庫的備份、同時應用也可以實現讀寫分離,提高應用的併發量。

主從同步原理

主從原理大致有三個步驟:

  1. 在主庫上把資料更改記錄到二進位制日誌中(Binary Log)中,這些記錄稱為二進位制日誌事件。
  2. 從庫通過IO執行緒將主庫上的日誌複製到自己的中繼日誌(Relay Log)中。
  3. 從庫通過SQL執行緒讀取中繼日誌中的事件,將其重放到自己資料上。

二進位制日誌(binary log)中記錄了對MySQL資料庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、操作資料等其它額外資訊,但是它不記錄SELECT、SHOW等那些不修改資料的SQL語句。二進位制日誌(binary log)主要用於資料庫恢復和主從複製,以及審計(audit)操作。

主從配置

基本環境

  1. 兩臺伺服器安裝相同版本的mysql資料庫
  2. 可以先手動將主庫的資料複製一份到從庫中(統一初態)
  3. 應保證在配置過程中主庫的資料不會改變,可以通過加鎖實現

配置主庫

  1. 修改my.cnf檔案,在[mysqld]加入下面的內容:
# 服務的唯一編號
server-id = 1
# 開啟mysql binlog功能
log-bin = mysql-bin
# binlog記錄內容的方式,記錄被操作的每一行
binlog_format = ROW
# 減少記錄日誌的內容,只記錄受影響的列
binlog_row_image = minimal
# 指定需要複製的資料庫名為db_test
# 如果備份多個數據庫,重複設定這個選項即可
binlog-do-db = db_test

# 不需要備份的資料庫名,如果備份多個數據庫,重複設定這個選項即可(未測試)
# binlog-ignore-db=mysql2
# 這個引數要加上,否則不會給更新的記錄些到二進位制檔案裡(未測試)
# log-slave-updates=1
# 跳過錯誤,繼續執行復制操作(可選)
# slave-skip-errors=1
  1. 儲存配置檔案,重啟mysql服務
// Windows直接在服務中重啟,Linux:
service mysqld restart
  1. 建立提供給從庫,用於同步資料的賬號(是主庫的賬號)
create user 'slave'@'127.0.0.2' identified WITH mysql_native_password by 'slave';
# 賦予replication slave許可權,但在使用從庫的資料時,還是要使用有read許可權的賬號
grant replication slave on *.* to 'slave'@'127.0.0.2';

flush privileges;

網上介紹的方法大都是使用grant 許可權列表 on 資料庫 to ‘使用者名稱’@’訪問主機’ identified by ‘密碼’;這種方式,但實測會出現……near 'identified by 密碼' at line 1這個錯誤!
經分析,出錯的原因是新版的的mysql版本已經將建立賬戶和賦予許可權的方式分開了,所以應該使用上面的方法。

  1. 檢視主庫的狀態
- 加“\G”可以使展示更友好
show master status\G;

記下主庫狀態資訊中的File和Position,後面會用到

配置從庫

  1. 修改my.cnf檔案,在[mysqld]加入下面的內容:
# 服務的唯一編號
server-id = 2
# 開啟mysql binlog功能
log-bin = mysql-bin
# binlog記錄內容的方式,記錄被操作的每一行
binlog_format = ROW
# 減少記錄日誌的內容,只記錄受影響的列
binlog_row_image = minimal
# 指定需要複製的資料庫名為db_test
binlog-do-db = db_test
  1. 儲存配置檔案,重啟mysql服務
service mysqld restart
  1. 執行同步命令
# 設定主伺服器ip,同步賬號密碼,同步位置
change master to master_host='127.0.0.1',master_user='slave',master_password='slave',master_log_file='mysql-bin.000100',master_log_pos=2411;
# 開啟同步功能
start slave;

注意此處設定的是主庫對應的IP,以及主庫配置中建立的主庫賬號

  1. 檢視從庫的狀態
show slave status\G;

主要關注Slave_IO_RunningSlave_SQL_Running的狀態是否都為Yes,如果是說明從庫配置成功。

測試

  1. 在主庫中新增一行記錄,看從庫是否將該資料同步了;
  2. 在主庫建立新表,看從庫是否將新表同步了。

可能的問題

  1. 從庫未能同步主庫資料

可以通過show slave status\G;檢查Slave_IO_RunningSlave_SQL_Running的狀態是否都為Yes

如果Slave_IO_Running的狀態為Connecting,一般是從庫資料被修改導致的Postion失效導致的(當然原因也可能是因為網路不通、密碼不對):

  1. 程式可能在slave上進行了寫操作
  2. 也可能是slave機器重起後,事務回滾造成的.

所以不要手動修改從表資料,否則資料衝突會導致主從同步失敗(超過了一定的重試次數,從庫不再進行同步)。
如果Slave_IO_Running的狀態已經為Connecting了,可以通過手動同步資料庫,然後修改pos的方法解決:

  1. 停掉Slave服務:slave stop;
  2. 到主伺服器上檢視主機狀態,記錄File和Position對應的值
  3. 然後到slave伺服器上執行手動同步:change master to master_log_pos=6352;

如果發生的錯誤比較少(只有一處),也可以在從庫通過下面的方法解決(未測試):

stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;

參考:

  1. https://www.cnblogs.com/atcloud/p/10773855.html