MySQL主從複製
MySQL可以通過兩種方式配置主從複製
- 通過二進制日誌(binary log)的方式;
- 通過GTID(全局事務ID)方式,不過GTID方式仍然依賴MySQL的binary log。
ps:在搭建MyCAT讀寫分離,主從切換,必須先搭建好MySQL主從複製
搭建環境說明:
主機信息 | ip地址 | 說明 |
---|---|---|
itcast-01 | 192.168.79.130 | 裝載mysql5.7x版本,用於master主服務 |
itcast-02 | 192.168.79.131 | 裝載mysql5.7x版本,用於slave從服務 |
Linux下MySQL安裝步驟說明
搭建binary log配置主從配置
binary log的核心是事件(event)。基本原理是:主服務器把所有對數據庫的操作(例如update、delete,create等)作爲一個事件,當有事件產生,就把它們寫入到對應的binary log中,每個事件都對應一個位置(可以理解這個位置就是事件的編號)。然後從服務器讀取主服務器中的日誌文件來獲取主服務產生的事件(把這些日誌保存到從服務器本地的relay-log中),從而把主服務的數據庫操作在從服務器中重複執行一次,達到數據複製的目的。
由於一切操作都是基於binary log,因此主服務器必須開啓log-bin選項,另外,主從服務器都必須分配一個唯一的server-id。
master服務配置步驟
第一步:修改my.cnf文件:
在[mysqld]段下添加:
#mysql主從複製配置
#指定需要同步的數據庫,如果需要同步所有庫就註釋
binlog-do-db=kevin
#忽略同步的數據庫
binlog-ignore-db=mysql
#啓用二進制日誌
log-bin=mysql-bin
#服務器唯一ID,一般取IP最後一段
server-id=130
第二步:重啓mysql服務
service mysqld restart
第三步:建立帳戶並授權slave,確保賬戶能在主機登錄
mysql>GRANT FILE ON . TO ‘root’@’%’ IDENTIFIED BY ‘123456’;
第四步: 授予Slave複製權,賬戶信息要在從機配置執行同步操作
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . to ‘root’@’%’ identified by ‘123456’;
刷新權限
mysql> FLUSH PRIVILEGES;
第五步:鎖表,將數據庫鎖住,僅僅允許讀,以保證數據一致性;
mysql> flush tables with read lock;
mysql> FLUSH PRIVILEGES;
#注意,鎖定後,如果自己同步對方數據,同步前一定要記得先解鎖!
解鎖: mysql> unlock tables;
第六步: 查看主節點的master複製信息,獲取日誌的名稱和位置信息
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 2071 | kevin | mysql | |
+------------------+----------+--------------+------------------+-------------------+
slave服務配置步驟
第一步:修改my.cnf文件
[mysqld]
server-id=166
第二步:配置從服務器,把主服務器的相關信息設置給從服務器
mysql>change master to master_host=‘192.168.79.130’,master_port=3306,master_user=‘root’,master_password=‘123456’,master_log_file=‘mysql-bin.000004’,master_log_pos= 2071
注意語句中間不要斷開,master_port爲mysql服務器端口號(無引號),master_user爲執行同步操作的數據庫賬戶,master-log-pos中配置的主服務器最後一步position的值,master_log_file中配置的就是主服務器最後一步file對應的值。
第三步:啓動從服務器複製功能
Mysql>start slave;
第四步:檢查從服務器複製功能狀態
mysql> show slave status 或 show slave status/G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.79.130
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 2071
Relay_Log_File: itcast-02-relay-bin.000005
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
Last_Errno: 0
Last_Error:
.....
Replicate_Ignore_Server_Ids:
Master_Server_Id: 130
Master_UUID: e11b3edf-5547-11ea-bb60-000c29abaa7c
Master_Info_File: /usr/local/mysql/data/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)
通過上面的信息,可知主從複製環境已經OK(Slave_IO_Running和Slave_SQL_Running狀態均爲YES)
同步測試:
注意:
首先要確定master服務配置my.cnf上指定同步數據庫名稱binlog-do-db=kevin;如果創建其它數據庫,則無法進行主從同步;
在master主節點上操作,創建數據庫和表
- 解鎖數據庫操作,在創建master服務時上鎖,禁止數據庫寫操作
mysql> unlock tables;
- 創建名稱爲kevin的數據庫
mysql> CREATE DATABASE kevin CHARACTER SET utf8 COLLATE utf8_general_ci;
- 切換數據庫
mysql> use kevin;
Database changed
- 創建表
mysql> create table if not exists haha (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
在slave節點上,查看數據庫信息
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db2 |
| db3 |
| kevin |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
從slave數據庫已經同步master數據庫操作,雙向都有kevin數據庫和表