1 環境準備 192.168.1.34 伺服器A(主機) 192.168.1.35 伺服器B(從機) 2 安裝mysql MySQL版本: 這裡採用Server version: 5.7.35 MySQL Community Server (GPL) 我們把安裝在“伺服器A”的資料庫稱作“主資料庫” ...
1 環境準備
192.168.1.34 伺服器A(主機)
192.168.1.35 伺服器B(從機)
2 安裝mysql
MySQL版本:
這裡採用Server version: 5.7.35 MySQL Community Server (GPL)
我們把安裝在“伺服器A”的資料庫稱作“主資料庫”、安裝在“伺服器B”的資料庫稱作“從資料庫”。
2.1 開放埠
確保伺服器A與伺服器B上的3306埠可以互訪。
3 設置主庫
進行下麵的配置前,假設你已經在兩台伺服器AB上安裝成功MySQL服務。
192.168.1.34 伺服器A(主機)
3.1 修改MySQL配置文件
編輯mysql配置文件/etc/my.cnf,添加如下的內容:
[mysqld]
log-bin=mysql-bin
server-id=1
保存修改內容並重啟MySQL服務。
3.2 創建一個用戶用於複製
所謂複製用戶,即供從資料庫使用的,從主資料庫拷貝二進位日誌信息的用戶。
用客戶端連接上MySQL服務,執行以下語句創建一個用於複製的用戶:
mysql> CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'Abc!@#123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
3.3 獲取二進位文件位置
這些信息在後面配置從資料庫時用到。
1、阻塞資料庫寫語句
mysql> FLUSH TABLES WITH READ LOCK;
2、獲取當前二進位文件的名稱和位置
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1030 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3.4 使用mysqldump創建數據快照
本指南預設使用
InnoDB
存儲引擎。
如果在啟用主從複製前,主資料庫已存在數據,那麼你就需要先把這些數據拷貝到從資料庫。下麵給出一個例子,將所有資料庫備份到一個叫做dbdump.db
的文件:
shell> mysqldump --all-databases --master-data > dbdump.db
其中--master-data
選項會自動追加 CHANGE MASTER TO
語句,該語句在從資料庫啟動複製進程時需要到。
註意:
如果你沒有使用
--master-data
選項的話,那麼你需要在一個單獨的會話中鎖定所有數據表。詳情見 Section 16.1.2.3, “Obtaining the Replication Source's Binary Log Coordinates”.
4 設置從庫
192.168.1.35 伺服器B(從機)
4.1 修改MySQL配置文件
編輯mysql配置文件/etc/my.cnf,添加如下的內容:
[mysqld]
server-id=2
skip_slave_start=ON
這裡主要解釋一下skip_slave_start
配置,ON表示資料庫啟動時不啟動從機的複製進程,需要通過手動的方式進行啟動。
保存修改內容並重啟MySQL服務。
4.2 設置從庫對應的主庫
這裡主要用到 CHANGE MASTER TO語句,其基本語法如下:
mysql> CHANGE MASTER TO
-> MASTER_HOST='source_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
我們的例子對應如下(當中的參數見上文[設置主資料庫](#3 設置主資料庫)一節):
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.34',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='Abc!@#123',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=1030;
4.3 導入全新的數據的情況
即主庫和備庫都是新建的,不存在舊庫舊表舊數據,且主庫已經啟用二進位日誌,備庫已指定主庫及當前位置。這時你想要將其它的資料庫備份下來導入到當前的主備資料庫中,你只需要在主庫中執行導入命令即可(不能再備庫執行導入語句):
shell> mysql -h '192.168.1.34' < fulldb.dump
4.4 主庫已存在數據的情況
即主庫在啟用二進位日誌前已存在數據,你在啟用從庫複製進程前需要把主庫的備份快照導入到從庫中,然後才能啟用從庫的複製進程。
1、新建主庫快照
shell> mysqldump --all-databases --master-data > dbdump.db
2、導入到從庫中
shell> mysql -h '192.168.1.35' < fulldb.dump
4.5 啟用從庫複製進程
mysql> START SLAVE;
驗證主從複製是否啟動成功
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.34
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 2096
Relay_Log_File: 192-relay-bin.000007
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
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:
......
如上,只有Slave_IO_Running
和Slave_SQL_Running
同時都是Yes
的時候表示主從複製配置成功。
5 互為主從設置
前面兩個章節講瞭如何配置主從複製,即伺服器A的資料庫作為主庫,伺服器B的資料庫作為從庫;那麼只要按照相反的步驟再設置一遍,即伺服器B的資料庫作為主庫,伺服器A的資料庫作為從庫。這樣就可以使得伺服器A的資料庫和伺服器B的資料庫互為主從了。