十三、MySQL主從複製
阿新 • • 發佈:2020-11-05
一、mysql主從複製
1.主庫配置server_id
2.主庫開啟binlog
3.授權主從使用者
4.主庫檢視binlog資訊
2.主從複製從庫的操作
1.配置server_id,與主庫不同
2.先同步主庫資料
3.配置主從
change master to
master_host=172.16.1.51,
master_user=rep,
master_password=123,
master_port=3306,
master_log_file=mysql-bin.000001,
master_log_pos=120;
4.開啟主從
3.主從複製圖解
4.文字描述
1.主庫配置server_id和binlog
2.主庫授權主從使用者
3.主庫檢視binlog資訊
4.從庫配置server_id,只要跟主庫不同就可以(只做主從的情況下)
5.從庫執行change master to語句
6.從庫開啟IO和sql執行緒(start slave)
7.從庫的IO執行緒會去連線主庫的dump執行緒,問問是否有比從庫中master.info記錄的更新的位置點
8.主庫dump執行緒被詢問,dump執行緒會去查詢binlog
9.dump執行緒會將查到的新資料從binlog中截取出來交給從庫的IO執行緒
10.IO執行緒拿到新的binlog資料,會將內容儲存到TCP/IP快取中
11.TCP/IP快取會返回給IO執行緒一個ACK
12.IO執行緒會更新master.info,將新的位置點更新到檔案中,然後繼續去主庫獲取資料
13.SQL執行緒會去讀取relay-log.info中的位置點,去對比relay-log的資料,如果有比relay-log.info中的位置點新的資料,則取出並執行,如果沒有則不執行
14.SQL執行緒執行完操作,會將新的位置點更新到relay-log.info中
5.主從複製涉及到的檔案
1)主庫
1.主庫的binlog:記錄的是資料庫的操作
2.dump執行緒:對比binlog,取出新binlog中的資料,並將資料給到IO執行緒
2)從庫
1.IO執行緒:連線主庫,接收主傳送過來的新binlog資料
2.sql執行緒:執行relay-log中主庫傳過來的新資料
3.relay-log(中繼日誌):儲存所有主庫傳過來的新資料
4.master.info:記錄上一次請求到主庫返回的binlog資訊,下一才從該位置點讀取對比資料
5.relay-log.info:記錄上一次sql執行緒執行到relay-log中的位置點,下一次從該位置點執行
二、主從複製的搭建
1.主庫操作
1)配置主庫
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=mysql-bin
2)授權一個主從使用者
mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123';
#grant replication slave 是一個全域性授權,不能指定單個庫授權,如果想同步單個庫使用過濾複製
3)檢視主庫的binlog資訊
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 326 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.從庫操作
1)配置從庫
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
2)配置主從複製
change master to
master_host='172.16.1.51',
master_user='rep',
master_password='123',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=326;
3)開啟IO執行緒和sql執行緒
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
4)檢視主從狀態
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.51
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 326
Relay_Log_File: db02-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
三、主從複製故障
1.IO執行緒故障
#Slave_IO_Running: No 或者 Connecting
1.檢測網路
[root@db02 ~]# ping 172.16.1.51
2.檢測埠
[root@db02 ~]# telnet 172.16.1.51 3306
3.防火牆是否開啟
4.主從的使用者名稱或者密碼錯誤
#測試使用主從使用者的使用者名稱和密碼連線主庫
[root@db02 ~]# mysql -urep -p123 -h172.16.1.51
5.反向解析
[root@db01 ~]# mysql -uroot -p123 -h172.16.1.51
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'db01' (using password: YES)
#解決
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
skip_name_resolve
2.sql執行緒故障
#Slave_SQL_Running: No 或者 Connecting
1.主庫有的資料,從庫沒有
2.從庫有的資料,主庫沒有
3.主庫資料與從庫不一致
1)解決辦法一:(不認)
1.停止主從複製
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
2.跳過一個錯誤
mysql> set GLOBAL sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)
3.開啟主從
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2)解決辦法二:
1.停止主從複製
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
2.清空主從複製的資訊
mysql> reset slave all;
Query OK, 0 rows affected (0.00 sec)
3.同步主庫所有資料
4.重新配置主從複製
3.在資料庫執行過程中新增從庫
1.準備從庫
2.主庫匯出資料
#打點備份不註釋
[root@db01 ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=1 --single-transaction > /tmp/full.sql
#打點備份註釋
[root@db01 ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction > /tmp/full2.sql
3.將資料推送至從庫
[root@db01 ~]# scp /tmp/full.sql 172.16.1.52:/tmp
[root@db01 ~]# scp /tmp/full2.sql 172.16.1.53:/tmp
4.模擬執行的主庫資料寫入
mysql> use master;
mysql> insert test values(2),(3);
mysql> insert test values(8),(9);
5.從庫匯入資料
[root@db02 ~]# mysql < /tmp/full.sql
[root@db03 ~]# mysql < /tmp/full2.sql
6.檢視主從的位置點
[root@db01 ~]# less /tmp/full.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=520;
[root@db01 ~]# less /tmp/full2.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=520;
7.從庫配置主從複製
change master to
master_host='172.16.1.51',
master_user='rep',
master_password='123',
master_port=3306,
master_log_file='mysql-bin.000008',
master_log_pos=120;