MySQL主從介紹及搭建
阿新 • • 發佈:2020-07-23
目錄
一、mysql主從
1.主庫操作
1.主庫配置server_id
2.主庫開啟binlog
3.主庫授權從庫連線的使用者
4.檢視binlog資訊
5.匯出所有資料
2.從庫操作
1.從庫配置server_id(跟主庫不一致)
2.確認主庫授權的使用者可以連線主庫
3.同步主庫資料
4.配置主庫資訊(change master to)
5.開啟slave
3.主從複製原理
1)圖解
2)文字描述
1.主庫配置server_id和開啟binlog 2.主庫授權從庫連線的使用者 3.主庫檢視binlog資訊,與伺服器資訊 4.從庫配置跟主庫不一致server_id 5.配置主從,通過change master to高速從庫主庫的資訊:ip、使用者、密碼、埠、binlog位置點、binlog名字 6.從庫開啟IO執行緒和sql執行緒 7.從庫連線主庫以後,IO執行緒會向主庫的dump執行緒發起詢問,詢問是否有新資料 8.dump執行緒被詢問,去查詢新資料,並將新資料返回給IO執行緒 9.IO執行緒拿到資料先寫入TCP快取 10.TCP快取將資料寫入中繼日誌(相當於從的binlog檔案),並返回給IO執行緒一個ACK 11.IO執行緒收到ACK會記錄當前位置點到master.info 12.sql執行緒會讀取relay-log,執行從主庫獲取的sql語句 13.執行完以後將執行到的位置點,記錄到relay-log.info
4.主從中涉及到的檔案或者執行緒
1)主庫
1.binlog:主庫執行的sql語句
2.dump執行緒:對比binlog是否更新,獲取新的binlog
2)從庫
1.IO執行緒:連線主庫,詢問新資料,獲取新資料
2.SQL執行緒:執行從主庫哪來的sql語句
3.relay-log:中繼日誌,記錄從主庫拿過來的binlog
4.master.info:記錄主庫binlog資訊,會隨著同步進行更新
5.relay-log.info:記錄sql執行緒執行到了那裡,下次從哪裡開始執行
三、主從複製的搭建
1.主庫操作
1)配置
[root@db03 ~]# vim /etc/my.cnf [mysqld] server_id=1 log_bin=/service/mysql/data/mysql-bin [root@db03 ~]# /etc/init.d/mysqld start
2)授權一個使用者
mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123';
Query OK, 0 rows affected (0.03 sec)
3)檢視binlog資訊
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 326 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
4)匯出所有資料
[root@db03 data]# mysqldump -uroot -p -A --master-data=2 --single-transaction > /tmp/full.sql
[root@db03 data]# scp /tmp/full.sql 172.16.1.52:/tmp/
2.從庫操作
1)配置
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
[root@db02 ~]# /etc/init.d/mysqld start
2)驗證主庫使用者
[root@db02 ~]# mysql -urep -p -h172.16.1.53
3)同步資料
[root@db02 ~]# mysql -uroot -p123 < /tmp/full.sql
4)配置主從
change master to
master_host='172.16.1.51',
master_user='rep',
master_password='123',
master_log_file='mysql-bin.000001',
master_log_pos=787368;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
5)開啟執行緒
mysql> start slave;
Query OK, 0 rows affected (0.04 sec)
6)檢視主從
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.主從資料庫出錯
1)IO執行緒出錯
mysql> show slave status\G
Slave_IO_Running: No
Slave_SQL_Running: Yes
mysql> show slave status\G
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
#排查思路
1.網路
[root@db02 ~]# ping 172.16.1.53
2.埠
[root@db02 ~]# telnet 172.16.1.53 3306
3.防火牆
4.主從授權的使用者錯誤
5.反向解析
skip-name-resolve
6.UUID或server_id相同
2)SQL執行緒出錯
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
#原因:
1.主庫有的資料,從庫沒有
2.從庫有的資料,主庫沒有
#處理方式一:自欺欺人
1.臨時停止同步
mysql> stop slave;
2.將同步指標向下移動一個(可重複操作)
mysql> set global sql_slave_skip_counter=1;
3.開啟同步
mysql> start slave;
#處理方式二:掩耳盜鈴
1.編輯配置檔案
[root@db01 ~]# vim /etc/my.cnf
#在[mysqld]標籤下新增以下引數
slave-skip-errors=1032,1062,1007
#處理方式三:正解
重新同步資料,重新做主從