MySQL主從實踐系列文章:
1. 環境信息
主服務器
- 阿里雲ECS 4 core 16 G
- MySQL 5.7
從服務器
- 阿里雲ECS 2 core 4 G
- MySQL 5.7
2. 環境準備
在主、從服務器均搭建 MySQL 服務器,建議版本一致(要求從服務器 MySQL 版本不低於主服務器)。
參見:【Linux】初入Ubuntu的Java開發者安裝軟件手記 MySQL 搭建部分
2.1. 數據準備
如果不是新創建的數據庫(即主服務器已有數據),那麼我們需要先將數據手動備份一份至從服務器。
(PS:在進行備份實驗的時候,好像可以定位備份的起始點,不知道可否通過這個參數來實現歷史數據的備份,尚未實驗)
2.1.1. 主服務器生成數據快照
通過 mysqldump 將數據生成 .sql 文件。
mysqldump -u userName -p databaseName>target.sql
更多命令參見:mysql數據庫從一臺服務器遷移到另一臺服務器上
2.1.2. 傳輸數據至從服務器
採用 scp 命令在服務器之間進行數據傳輸
本地文件拷貝到遠程
scp 文件名 –用戶名@計算機IP或者計算機名稱:遠程路徑
拷貝遠程文件到本地
scp –用戶名@計算機IP或者計算機名稱:文件名 本地路徑
更多命令參見:兩臺Linux系統之間傳輸文件的幾種方法
2.1.3. 從服務器加載數據
a. 登錄到 MySQL 命令行界面
shell 腳本:
mysql -u username -p password
b. 創建數據庫(和主服務器數據庫實例同名)
sql 腳本:
create database databaseName;
c. 選擇數據庫
不選擇數據庫,執行 source 命令會報錯。原因在於從 mysqldump 命令獲取到的 sql 腳本,缺少此步。
use databaseName;
d. 加載數據
採用 source 命令進行加載數據,其實就是直接執行 sql 腳本。
sql 腳本:
source target.sql
其中, target.sql 需要使用全路徑
3. 配置主服務器
3.1. 分配單獨賬號
直接創建用戶,並賦值權限即可。
登錄 MySQL,執行 sql 腳本:
GRANT REPLICATION SLAVE ON *.* to 'slaveUsername'@'%' identified by 'slavePassword';
FLUSH PRIVILEGES;
3.2. mysql.cnf 配置
進行 MySQL 配置文件配置,主要開啓 log-bin 功能、允許從服務器連接功能。
mysql.cnf
[mysqld]
# 啓用二進制日誌。此日誌僅記錄事務SQL,即存在數據更改
log-bin=mysql-bin
# 定義 服務器唯一ID。 整個 MySQL 主從架構中唯一
server-id=1
更多參數可查看 MySQL 官方文檔:MySQL 5.7參考手冊
3.3. 重啓 MySQL 服務
執行 MySQL 重啓命令即可。
shell 腳本:
/etc/init.d/mysql restart
3.4. 查看狀態(可省略)
登錄 MySQL 命令行,查看主服務器配置狀態
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 39537230 | | | |
+------------------+----------+--------------+------------------+-------------------+
4. 配置從服務器
4.1. mysql.cnf 配置
# 配置 MySQL 服務 ID, MySQL 主從架構中唯一即可
server-id=2
# 備份的數據庫實例名稱,可配置多個,採用英文半角逗號分隔
replicate-do-db=test
skip-slave-start=true
4.2. 重啓 MySQL 服務
shell 腳本:
/etc/init.d/mysql restart
4.3. 從服務器 “認主”
4.3.1. 獲取主服務器信息
到 主服務器 獲取 bin-log 信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 970 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
此步獲取數據,認主 需要使用
4.3.2. 停掉 slave 進程
停掉 從服務器中 slave 進程,如果沒有則可跳過此步。
sql 腳本:
stop slave;
4.3.4. 配置主服務器信息
在 從服務器 MySQL 命令行進行配置 主服務器 信息。
sql 腳本:
change master to
master_host='master ip',
master_user='slaveUsername',
master_password='slavePassword',
master_log_file='bin-log name',
master_log_pos=positon;
參數說明
master_host 主服務器 IP
master_user 主服務器中申請進行數據備份的用戶名稱
master_password 用戶密碼
master_log_file “4.3.1. 獲取主服務器信息” 中獲取到的 bin-log 文件名稱
master_log_pos “4.3.1. 獲取主服務器信息” 中獲取到的 Position 值
以本實驗爲例:
change master to
master_host='127.0.0.1',
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.000003',
master_log_pos=970;
4.3.5. 開啓從服務器進程
MySQL 命令行執行:
sql 腳本:
start slave;
不報錯即可,警告可忽略。目前尚未遇見報錯,也不知道會報什麼錯、報錯如何解決。 hhh ~ _ ~
4.3.6. 查看從服務器狀態
查看從服務器進程狀態
sql 腳本:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: // 屏蔽敏感信息
Master_User: // 屏蔽敏感信息
Master_Port: // 屏蔽敏感信息
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 39537230
Relay_Log_File: iZbp107uqxtgptoycocm3wZ-relay-bin.000012
Relay_Log_Pos: 39537443
Relay_Master_Log_File: mysql-bin.000005
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: 39537230
Relay_Log_Space: 39537715
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: // 屏蔽敏感信息
Master_Info_File: // 屏蔽敏感信息
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)
上文中以屏蔽敏感信息,實際情況按照自己服務器信息即可。
重點看兩個指標,下列兩個指標均爲 Yes 即爲配置成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果沒有成功,參見下邊踩坑記錄
5. 測試
在主服務器進行數據變更,查看從服務器是否完成數據更新。
5.1. 更新一條數據
右邊爲 master , 左邊爲 slave。
5.2. 刪庫重建
我進行了刪除主服務器的數據庫實例,然後重新創建同名數據庫實例,插入新數據。
測試結果
主服務器刪除數據庫實例後,從服務器隨之進行了刪除對應數據庫實例。
主服務器重新創建數據庫實例並進行數據插入操作,從數據庫實例同樣進行了數據庫實例創建及數據更新。
結果表示,主數據庫實例刪除並不會對於 MySQL 主從備份產生影響,即 bin-log 文件存在。
MySQL 數據庫對於主從備份應該是單獨處理,並不與數據庫實例生命週期掛鉤。
6. 踩坑記錄
6.1. 服務器端口
服務器端口需要打開,以 3306 爲例,在服務器配置安全組解決
6.2. 防火牆
服務器端口打開後,需要在防火牆進行開啓。以 3306 爲例。
如果服務器尚未安裝防火牆,先進行安裝。
apt 方式安裝:
sudo apt-get install firewalld
shell 腳本
#查看防火牆中端口使用情況:
sudo firewall-cmd --query-port=3306/tcp
#防火牆中添加端口
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
#關閉防火牆
sudo systemctl stop firewalld.service
#開啓防火牆
sudo systemctl start firewalld.service
6.3. MySQL 賬號
確認主服務器 MySQL 數據庫配置的用戶名、密碼是否能正常進行連接
6.4. MySQL 遠程連接
確認 主服務器 是否允許 遠程訪問,可通過配置 /etc/mysql/mysql.conf.d/mysqld.cnf 文件
bind-address = 0.0.0.0
6.5. 從服務器 認主 配置
確認 從服務器 認主 配置中,IP、用戶名、密碼、bin-log 文件名是否正確
6.6. 網絡問題
主、從服務器相互 ping
- 知識有限,如有錯誤,歡迎指正,謝謝
- 歡迎留言討論
- 如侵必刪