MySQL主從備份設置

功能需求

外網服務器,有獨立IP;內網服務器,無獨立IP;外網服務器的MYSQL數據庫實時更新,並要求同步到內網服務器中。
該需求可使用MYSQL的主從備份實現,其中外網服務器爲主服務器(Master),內網服務器爲從服務器(Slave)。

實現方式

MYSQL主從同步是在MySQL主從複製(Master-Slave Replication)基礎上實現的,通過設置在Master上的binlog,使其處於打開狀態;Slave通過一個I/O線程從Master上讀取binlog,然後傳輸到Slave的中繼日誌中,然後使用SQL線程讀取中繼日誌,並應用到自身數據庫中,從而實現主從數據同步功能。

如下圖所示:

這裏寫圖片描述

具體操作

1、主服務器(Master)配置

首先應該保證從服務器對主服務器數據庫的訪問,即開啓MySQL的遠程訪問,grant和flush以下就行了。

然後需要修改Master的數據庫配置,MySQL默認配置文件在/etc/my.cnf,打開後在[mysqld]之後加入如下條目:

log_bin = /var/log/mariadb/mariadb-bin.log
server-id = 1 
binlog_do_db = testmirror

也可以進行更詳細的設置:

max_binlog_size = 500M
binlog_cache_size = 128K
binlog-ignore-db = mysql
expire_logs_day=2
binlog_format="MIXED"

設置完後重啓MYSQL服務。

各參數意義:

參數 意義
server-id 數據庫唯一ID,一組主從中此標識號不能重複。其中1 代表主數據庫(源) 2代表輔數據庫(目的)
log_bin 開啓bin-log,並指定文件目錄和文件名前綴
binlog_do_db 需要同步的數據庫名字,可以是多個,之間用分號分割
binlog_ignore_db 不需要同步的數據庫名字
max_binlog_size 每個bin-log最大大小,當此大小等於500M時會自動生成一個新的日誌文件。一條記錄不會寫在2個日誌文件中,所以有時日誌文件會超過此大小。
binlog_cache_size 日誌緩存大小
binlog-do-db 需要同步的數據庫名字,如果是多個,就以此格式在寫一行即可。
binlog-ignore-db 不需要同步的數據庫名字,如果是多個,就以此格式在寫一行即可。
expire_logs_day 設置bin-log日誌文件保存的天數,此參數mysql5.0以下版本不支持。
binlog_format bin-log日誌文件格式,設置爲MIXED可以防止主鍵重複。

如果需要有選擇性地進行同步,可以在Master端進行(使用binlog_do_db或binlog_Ignore_DB),也可以在Slave端進行(使用下面會說到的Replicate_Ignore_DB)。

2、從服務器(Slave)配置

修改slave的配置文件,同樣在/etc/my.cnf

server-id = 2
read_only = 1
relay_log = /var/log/mariadb/relay.log

當然也可以開啓bin_log使它同時作爲其它從服務器的Master。
設置完後重啓MYSQL服務。

參數 意義
relay_log 配置中繼日誌
log-slave-updates 表示slave將複製事件寫進自己的二進制日誌,簡單地說,如果從庫同時作爲其它庫的主庫,那麼需要添加該參數,否則不需要
read_only 它防止改變數據

針對log-slave-updates參數,如果從庫也開啓了log-bin參數,此時直接往從庫寫數據,是可以記錄log-bin日誌的。但是從庫通過I0線程讀取主庫二進制日誌文件,然後通過SQL線程寫入的數據,則是不會記錄log-bin日誌的,也就是說從庫從主庫上覆制的數據無法記錄到從庫的log-bin日誌上,也無法被從庫的從庫捕捉到更新。所以從庫做爲其他從庫的主庫時需要在配置文件中添加log-slave-updates參數。

前面說了利用Master的binlog_do_dbbinlog_Ignore_DB可以實現過濾,只同步特定的數據庫,該功能也可以在Slave端實現。

參數 意義
replicate_do_db 數據庫白名單列表
replicate_ignore_db 數據庫黑名單列表
replicate_do_table 表白名單列表
replicate_ignore_table 表黑名單列表
replicate_wild_do_table 使用通配符定義表白名單列表
replicate_wild_ignore_table 使用通配符定義表黑名單列表

3、賬號權限設置

在Slave上,使用Master上的root@%帳戶登陸Master與其通信。

GRANT REPLICATION SLAVE ON . TO root@’%’ IDENTIFIED BY ‘password’;

如果使用的是非root賬號,該賬號除了在Master上真實存在外,還應該擁有REPLICATION SLAVE 和 READ屬性。

4、查看Master狀態

在Master的MySQL命令符下,查看Master狀態:

MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb_bin.000001 |      245 | testmirror         |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

這裏需要記住兩個參數,一個File,一個Position。

5、在Slave上開啓同步

MySQL從5.1.7以後開始就不支持在my.cnf中對master-host等參數進行配置,而是使用了CHANGE MASTER TO語句。

mysql> CHANGE MASTER TO MASTER_HOST='server1',
    -> MASTER_USER='user_name',
    -> MASTER_PASSWORD='p4ssword',
    -> MASTER_LOG_FILE='mariadb_bin.000001',
    -> MASTER_LOG_POS=245;

這裏最後填的兩個就是第3步看到的File和position。
然後就可以開始同步了:

mysql> START SLAVE;

可以看一看Slave的運行狀態

mysql> SHOW SLAVE STATUS\G

結果很長,主要關注以下幾個:

Slave_IO_Running=Yes
Slave_SQL_Running=Yes

……
Exec_Master_Log_Pos: 537

這幾句表示slave的I/O和SQL線程都已經開始運行。每次日誌的位置(Exec_Master_Log_Pos)增加了,意味着一些事件被獲取並執行了。如果你在master上進行修改,可以在slave上看到各種日誌文件的位置的變化,同樣,也可以看到數據庫中數據的變化。

發佈了110 篇原創文章 · 獲贊 19 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章