Mysql資料庫主從配置
Mysql主從同步
Mysql資料庫進行主從配置後,可以實現資料庫的備份、同時應用也可以實現讀寫分離,提高應用的併發量。
主從同步原理
主從原理大致有三個步驟:
- 在主庫上把資料更改記錄到二進位制日誌中(Binary Log)中,這些記錄稱為二進位制日誌事件。
- 從庫通過IO執行緒將主庫上的日誌複製到自己的中繼日誌(Relay Log)中。
- 從庫通過SQL執行緒讀取中繼日誌中的事件,將其重放到自己資料上。
二進位制日誌(binary log)中記錄了對MySQL資料庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、操作資料等其它額外資訊,但是它不記錄SELECT、SHOW等那些不修改資料的SQL語句。二進位制日誌(binary log)主要用於資料庫恢復和主從複製,以及審計(audit)操作。
主從配置
基本環境
- 兩臺伺服器安裝相同版本的mysql資料庫
- 可以先手動將主庫的資料複製一份到從庫中(統一初態)
- 應保證在配置過程中主庫的資料不會改變,可以通過加鎖實現
配置主庫
- 修改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
- 儲存配置檔案,重啟mysql服務
// Windows直接在服務中重啟,Linux:
service mysqld restart
- 建立提供給從庫,用於同步資料的賬號(是主庫的賬號)
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版本已經將建立賬戶和賦予許可權的方式分開了,所以應該使用上面的方法。
- 檢視主庫的狀態
- 加“\G”可以使展示更友好
show master status\G;
記下主庫狀態資訊中的File和Position,後面會用到
配置從庫
- 修改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
- 儲存配置檔案,重啟mysql服務
service mysqld restart
- 執行同步命令
# 設定主伺服器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,以及主庫配置中建立的主庫賬號
- 檢視從庫的狀態
show slave status\G;
主要關注Slave_IO_Running
和Slave_SQL_Running
的狀態是否都為Yes,如果是說明從庫配置成功。
測試
- 在主庫中新增一行記錄,看從庫是否將該資料同步了;
- 在主庫建立新表,看從庫是否將新表同步了。
可能的問題
- 從庫未能同步主庫資料
可以通過
show slave status\G;
檢查Slave_IO_Running
和Slave_SQL_Running
的狀態是否都為Yes
如果Slave_IO_Running的狀態為Connecting,一般是從庫資料被修改導致的Postion失效導致的(當然原因也可能是因為網路不通、密碼不對):
- 程式可能在slave上進行了寫操作
- 也可能是slave機器重起後,事務回滾造成的.
所以不要手動修改從表資料,否則資料衝突會導致主從同步失敗(超過了一定的重試次數,從庫不再進行同步)。
如果Slave_IO_Running的狀態已經為Connecting了,可以通過手動同步資料庫,然後修改pos的方法解決:
- 停掉Slave服務:
slave stop;
- 到主伺服器上檢視主機狀態,記錄File和Position對應的值
- 然後到slave伺服器上執行手動同步:
change master to master_log_pos=6352;
如果發生的錯誤比較少(只有一處),也可以在從庫通過下面的方法解決(未測試):
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;