MySQL主從複製(2)——一主多從架構的搭建
MySQL主從複製的工作原理如下:
(1)Mysql服務器之間的主從複製是基於二進制日誌,主服務器使用二進制日誌來記錄數據庫的變動情況,從服務器通過讀取和執行該日誌文件來保持和主服務器的數據一致。
(2)在使用二進制日誌時,主服務器的所有操作都會被記錄下來,然後從服務器會接收到該日誌的一個副本。從服務器可以指定執行該日誌中的哪一類事件(插入數據、更新數據、刪除數據),默認會執行日誌中的所有語句。
(3)每一個從服務器會記錄關於二進制日誌的信息(文件名和已經處理過的語句),這樣意味着不同的從服務器可以分別執行同一個二進制日誌的不同部分,並且從服務器可以隨時連接或者中斷和服務器的連接。
(4)主服務器和每一個從服務器都必須配置一個唯一的server-id,每一個從服務器需要通過CHANGE MASTER TO語句來配置它要連接的主服務器的ip地址,日誌文件名稱和該日誌裏面的位置等信息。
MySQL主從複製配置的步驟如下:
一、系統環境
MySQL版本:MySQL5.7
Linux版本:CentOS7.0
主數據庫地址:192.168.1.11
從數據庫地址:192.168.1.12; 192.168.1.13
二、配置主數據庫
1、修改配置文件
找到主數據庫的配置文件my.cnf,在[mysqld]部分添加如下內容:
[root@Mysql11 ~]# vim /etc/my.cnf
[mysqld]
.........
server-id=1 ### 服務器ID
log-bin=mysql-bin ### 開啓binlog
binlog_format=mixed ### binlog模式爲mixed
### 在ROW模式下,即使我們只更新了一條記錄的其中某個字段,也會記錄每個字段變更前後的值,binlog日誌會很大。這個行爲可以通過binlog_row_image參數控制,該參數的取值如下:
### FULL(默認值):記錄列的所有修改,即使字段沒有發生變更也會記錄。
### MINIMAL:只記錄修改的列。
binlog_row_image=MINIMAL
## 在Row模式下,binlog只記錄數據的改變。使用binlog_rows_query_log_events參數也可以記錄SQL。參數的默認爲值爲FALSE,如果爲true的情況下,會通過Rows Query Event事件來記錄SQL。
binlog-rows-query-log_events=1
### 設置同步時需要忽略哪些數據庫
## 一般同步不要同步mysql庫,用戶名和密碼信息在mysql數據庫中
binlog-ignore-db=mysql
binlog-ignore-db=sys
........
配置完成後重啓mysql服務,查看binlog日誌文件信息:
[root@Mysql11 ~]# ll /var/lib/mysql/mysql-bin*
-rw-r-----. 1 mysql mysql 923 7月 3 23:19 /var/lib/mysql/mysql-bin.000001
-rw-r-----. 1 mysql mysql 266 7月 5 10:16 /var/lib/mysql/mysql-bin.index
2、創建複製用戶
每一個從服務器都需要用到一個賬戶名和密碼來連接主服務器,可以爲每一個從服務器都創建一個賬戶,也可以讓全部服務器使用同一個賬戶。該賬戶可以被【192.168.1】網段下的所有IP地址使用,且只能進行主從同步,沒有其他權限。
mysql> set global validate_password_policy=low;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_length=4;
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user,authentication_string from mysql.user;
+-------------+---------------+-------------------------------------------+
| host | user | authentication_string |
+-------------+---------------+-------------------------------------------+
| localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| % | wgx | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 192.168.1.% | repl | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)
3、導出數據庫數據
(1)導出數據庫之前,給數據庫加鎖,阻止對數據庫進行任何的寫操作。
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)
mysql> use hist;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> drop table t1;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
(2)導出主庫中的所有數據庫數據
[root@Mysql11 ~]# mysqldump -uroot -p123456 --all-databases --master-data=2 --events > /tmp/all_bak.sql
(3)把備份的主庫數據複製到從庫
[root@Mysql11 ~]# scp /tmp/all_bak.sql 192.168.1.12:/tmp/
[email protected]'s password:
all_bak.sql 100% 834KB 833.7KB/s 00:00
[root@Mysql11 ~]#
(4)解鎖,查看二進制日誌信息
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000014 | 599 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
三、配置從數據庫
1、修改配置文件
找到從數據庫的配置文件my.cnf,在[mysqld]部分添加如下內容:
[root@Mysql11 ~]# vim /etc/my.cnf
[mysqld]
.........
server-id=2 ### 服務器ID,每個服務器上配置的server-id都必須不一致
relay-log=mysql-relay-log ### 開啓relay log
........
說明:從服務器也可以根據需要配置log-bin選項。
配置完成後重啓mysql服務,查看relay log文件信息:
[root@localhost ~]# ll /var/lib/mysql/mysql-relay-log*
-rw-r-----. 1 mysql mysql 177 7月 5 11:00 /var/lib/mysql/mysql-relay-log.000001
-rw-r-----. 1 mysql mysql 25 7月 5 11:00 /var/lib/mysql/mysql-relay-log.index
2、導入主服務器上的數據
[root@localhost ~]# mysql -uroot -p123456 < /tmp/all_bak.sql
(1)查看主服務器的數據庫信息
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
6 rows in set (0.00 sec)
(2)查看從服務器的數據庫信息
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hist |
| mysql |
| performance_schema |
| sys |
| wanggx |
+--------------------+
6 rows in set (0.00 sec)
3、配置主從同步參數
在從服務器上執行如下命令:
--master_log_file和master_log_pos兩個參數的取值可以在主庫導出數據時使用show master logs命令得到
--也可以在主庫導出數據庫時添加參數【--master-data=2】得到
change master to
master_host='192.168.1.11',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000014',
master_log_pos=599;
4、開啓從庫的服務(啓動IO和SQL線程)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
5、查看主從複製的狀態
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.11
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000014
Read_Master_Log_Pos: 599
Relay_Log_File: mysql-relay-log.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000014
--############### Slave_IO_Running 和 Slave_SQL_Running 兩個都爲yes表示正常 #############
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
--#######################################################################################
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 599
Relay_Log_Space: 527
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 95cfc8eb-2d58-11ea-840b-000c296166d5
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
四、驗證結果
1、在主庫上進行數據操作
在hist數據庫中創建一張表t222並輸入數據
mysql> use hist;
Database changed
mysql> show tables;
+----------------+
| Tables_in_hist |
+----------------+
| course |
| dept |
| score |
| stu |
| t1 |
+----------------+
5 rows in set (0.00 sec)
mysql>
mysql>
mysql> create table t222(id int auto_increment primary key,name char(20),age int);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t222(name,age) values('Jack',20);
Query OK, 1 row affected (0.02 sec)
mysql> insert into t222(name,age) values('Mary',21);
Query OK, 1 row affected (0.03 sec)
mysql> insert into t222(name,age) values('Tom',18);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t222;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | Jack | 20 |
| 2 | Mary | 21 |
| 3 | Tom | 18 |
+----+------+------+
3 rows in set (0.00 sec)
2、查看從庫的數據信息
mysql> use hist;
Database changed
mysql> show tables;
+----------------+
| Tables_in_hist |
+----------------+
| course |
| dept |
| score |
| stu |
| t1 |
| t222 |
+----------------+
6 rows in set (0.00 sec)
mysql> select * from t222;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | Jack | 20 |
| 2 | Mary | 21 |
| 3 | Tom | 18 |
+----+------+------+
3 rows in set (0.00 sec)
如果要創建多個從庫,其他從庫的創建過程和第一個從庫完全相同。