MySQL 雙向備份

MySQL 雙向備份

也被稱爲 主主備份 ,即兩個 MySQL 服務都是 Master,其中任意一個服務又是另外一個服務的 Slave。

準備

服務器html

MySQL服務器 版本 IP地址
masterA 5.6.41 192.168.1.201
masterB 5.6.41 192.168.1.202

注:mysql

  1. 備份的 MySQL 服務器版本儘可能保持一致,不一樣的版本可能二進制日誌格式不兼容。

具體操做

注意

操做過程當中注意兩邊數據的一致!!!sql

masterA 配置

my.cnf數據庫

[mysqld]
# 服務器惟一標識
server-id=1
# 二進制日誌文件名
log-bin=mysql-bin

# 須要備份的數據庫,多個數據庫用 , 分隔
binlog-do-db=piumnl
# 須要複製的數據庫,多個數據庫用 , 分隔
replicate-do-db=piumnl
# 中繼日誌文件名
relay_log=mysqld-relay-bin
# 手動啓動同步服務,避免忽然宕機致使的數據日誌不一樣步
skip-slave-start=ON
# 互爲主從須要加入這一行
log-slave-updates=ON
# 禁用符號連接,防止安全風險,可不加
symbolic-links=0

# 可不加
# resolve - [Warning] Slave SQL: If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0
master-info-repository=table
relay-log-info-repository=table
relay-log-recovery=1

# 可不加
# 禁用 dns 解析,會使受權時使用的域名無效
skip-host-cache
skip-name-resolve

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

masterB 配置

my.cnf安全

# 再也不解釋各個配置項
[mysqld]
server-id=2
log-bin=mysql-bin

binlog-do-db=piumnl
replicate-do-db=piumnl
relay_log=mysql-relay-bin
skip-slave-start=ON
log-slave-updates=ON
symbolic-links=0

# resolve - [Warning] Slave SQL: If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0
master-info-repository=table
relay-log-info-repository=table
relay-log-recovery=1

skip-host-cache
skip-name-resolve

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

建立備份用戶

masterA & masterB 都要建立備份用戶:服務器

create user 'rep'@'%' identified by 'rep';    # 建立一個帳戶
grant replication slave on *.* to 'rep'@'%';  # 授予該帳戶對任意數據庫任意表的主從備份權限

備註:app

  1. Linux 下 MySQL 對 root@% 用戶關閉了 grant_priv 權限,因此若是是遠程登陸會出現受權失敗的狀況
  2. 此處備份用戶賬號和密碼可不一致,此處爲了簡化操做使用同樣的賬號和密碼

重啓服務器

重啓服務器ide

開啓備份

masterA測試

  1. 查看 masterB 狀態this

    show master status\G;
    # 此處須要關注 File 和 Position 值
  2. 開啓備份

    stop slave;
    # master_log_file 就是第一步操做的 File 值
    # master_log_pos 就是第一步操做的 Position 值
    change master to master_host=<master_hostname>, master_user=<rep_username>, master_port=<master_port>, master_password=<rep_password>, master_log_file='mysql-log.000003', master_log_pos=154;
    start slave;
  3. 查看結果

    show slave status\G;
    # 查看最重要的兩項,兩個都必須爲 Yes ,有一個爲 No 都要去查看錯誤日誌文件,看看什麼地方存在問題
    # Slave_IO_Running: Yes
    # Slave_SQL_Running: Yes

masterB

  1. 反向重複 masterA 的操做

測試

分別在 masterA 和 masterB 中插入數據,並查看另外一臺服務器是否及時出現預期的數據

問題

Relay Log

MySQL Slave Failed to Open the Relay Log

這應該是中繼日誌出現問題,可嘗試以下操做

stop slave;
flush logs;
start slave;

mysql_bin.index

Got fatal error 1236 from master when reading data from binary log

從主庫中拉取日誌時,發現主庫的 mysql_bin.index 文件中的第一個文件不存在。

# 進行以下操做重置
# 若是二進制日誌或中繼日誌有其餘做用,請勿進行以下操做
reset master;
reset slave;
flush logs;

<database>.<table>

使用 <database>.<table> 進行插入、更新和刪除操做,將不會進行備份( 這是巨坑 )!!!


參考文獻

  1. MySQL互爲主從及Keepalived配置vip——主從配置篇
  2. MySQL 雙機備份
  3. 【MySQL】Got fatal error 1236緣由和解決方法
  4. RESET MASTER和RESET SLAVE使用場景和說明,以及清除主從同步關係
  5. MySql 5.6關於replicate secure增強
  6. MySQL 錯誤 「could not be resolved: ..」 和引起的思考

若有錯誤或問題,歡迎提出來一塊兒交流討論

相關文章
相關標籤/搜索