【MySQL主從實踐】主從備份

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

  • 知識有限,如有錯誤,歡迎指正,謝謝
  • 歡迎留言討論
  • 如侵必刪

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章