MySQL主主復制詳細教程

配置說明

主數據庫1: 192.168.245.22
主數據庫2: 192.168.245.33

1、修改MySQL配置文件:

vi /etc/my.cnf
  • 主數據庫1:
server-id=1
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=1
binlog-ignore=mysql
binlog-ignore=information_schema
binlog-ignore=performance_schema
character_set_server=utf8
log-bin-trust-function-creators=1
  • 主數據庫2:
port=3305
server-id=2
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
binlog-ignore=mysql
binlog-ignore=information_schema
binlog-ignore=performance_schema
character_set_server=utf8
log-bin-trust-function-creators=1
這里對上述添加的配置做詳細說明:
  1. log_bin 啟動mysql二進制日志,如果沒有配置這個將無法遠程鏈接
  2. binlog-ignore 指定不同步的數據庫,如果有多個數據庫不需要同步可以多個分別聲明
  3. character_set_server=utf8 指定utf8為默認字符集
  4. server-id 可以為任意自然數,必須保證兩臺mysql主機不重復
  5. auto_increment_increment=2 步進值auto_imcrement。一般有n臺主MySQL就填n
  6. auto_increment_offset 設定數據庫中自動增長的起點,兩臺mysql的起點必須不同,這樣才能避免兩臺服務器同步時出現主鍵沖突
  7. replicate-do-db 要同步的數據庫,如果需要就填,指定數據庫的名稱即可,默認為所有庫,聲明了不同步就默認除了不同步數據庫意外的所有庫。這里我沒寫。
  8. log-bin-trust-function-creators=1 在默認情況下mysql會阻止主從同步的數據庫function的創建,這會導致我們在導入sql文件時如果有創建function或者使用function的語句將會報錯。

3、重啟mysql

  • 主數據庫1:
systemctl restart mysqld
  • 主數據庫2:
systemctl restart mysqld

4、授權兩個數據庫相互授權

  • 主數據庫1:新建數據庫的用戶,并進行相互授權
mysql -uroot -p //進入mysql
grant replication slave, replication client on *.* to '新用戶名'@'主數據庫2的IP' identified by '新密碼'
flush privileges; //刷新MySQL的系統權限相關表,否則會無法用賬號鏈接
  • 主數據庫2:新建數據庫的用戶,并進行相互授權
mysql -uroot -p //進入mysql
grant replication slave, replication client on *.* to '新用戶名'@'主數據庫1的IP' identified by '新密碼'
flush privileges; //刷新MySQL的系統權限相關表,否則會無法用賬號鏈接

5、分別查看兩臺主機的日志節點

show master status;

6、相互設置同步的日志節點

  • 主數據庫1
change master to 
master_host='192.168.245.33', 
master_user='主數據庫2用戶名',
master_password='主數據庫2密碼',
master_log_file='mysql-bin.000004', //對應主數據庫2的File字段
master_log_pos=2873;  //對應主數據庫2的Position字段
  • 主數據庫2
change master to 
master_host='192.168.245.22', 
master_user='主數據庫1用戶名',
master_password='主數據庫1密碼',
master_log_file='mysql-bin.000004', //對應主數據庫1的File字段
master_log_pos=2873;  //對應主數據庫1的Position字段
說明:
  • 所有的內容都是另一臺主機的內容,log_file和log_pos對于另一臺主機的日志節點。還有,必須要說明的是,每次“flush privileges”和“stop slave”后日志節點的內容會改變,所以如果不確定,每次執行此操作前必須要查看日志節點——show master status。另外,執行此操作時slave必須沒有啟動,如果之前執行了,那就先停止,指令:stop slave;

7、在兩臺主機上啟動slave服務

start slave;
  • 出現下圖所示,表示成功


可能遇到的問題

  • master and slave have equal MySQL server UUIDs
    原因是:服務器的數據庫UUID重復了,一般是虛擬機直接克隆會導致重復,數據庫UUID存在auto.cnf里
    解決:
find/ -name auto.cnf //查找auto.cnf 的位置
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak // 備份auto.cnf 
systemctl restart mysqld // 重啟mysqld,會自動生成新的auto.cnf
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。