1. 程式人生 > 實用技巧 >MySQL主從介紹及搭建

MySQL主從介紹及搭建

目錄

一、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

#處理方式三:正解
重新同步資料,重新做主從