Mysql二進制日誌文件(binlog)主從複製最佳實踐

實踐背景

最近加入了同窗的技術分享小組,4我的分兩組,半月進行一次技術分享,如今一塊兒搞Mysql我被分到講解Mysql日誌方面,上週已經講完了,不過他們老是以爲對於日誌這塊瞭解不透徹,以爲不過關...因而你們自覺強制在加一輪分享做爲對mysql這段時間的學習總結,結合實踐來進行分享,以前分享的日誌的分類和原理很是理論,我本身也不滿意,因而花了一天把二進制日誌的數據恢復和主從複製搞了一下,因而這篇文章產生了,紙上得來總覺淺,絕知此事要躬行,這句話忽然從我腦海中冒出來了。mysql

預先配置

我是將Mac OS本機的Mysql做爲master,虛擬機的Mysql做爲slave,首先修改master和slave的my.cnf數據庫配置文件。內容以下:我這裏配置的是同步master的test數據庫。
git

master的my.cnfgithub

[mysqld]
# 主從備份相關配置
server-id = 1                # 服務器 id 號,不要和其餘服務器重複
log-bin=mysql-bin            # 開啓二進制日誌
log_bin_index = mysql-bin.index        # 索引二進制日誌的文件名
sync_binlog = 1                # 設爲1就是把MySql每次發生的修改和事件的日誌即時同步到硬盤上
binlog_format = Row            # 複製模式 Statement, Row, mixed
skip_slave_start = 1           # 防止從服務器在崩潰後自動開啓,以給你足夠的時間修復。
max_binlog_size = 200M         # 指定二進制日誌的大小

# 須要同步的二進制數據庫名
binlog-do-db = test
# 不一樣步的二進制數據庫名,若是不設置能夠將其註釋掉
binlog-ignore-db = information_schema
binlog-ignore-db = mysql

slave的my.cnfsql

# 主從備份相關配置 - 從服務器
 server-id = 2                   # 服務器 id 號,不要和其餘服務器重複
 read_only = 1                   # 讓從服務器只讀,能夠防止有人誤從服務器插入數據,致使主從數據不一致。 
 log-bin=mysql-bin               # 開啓二進制日誌
 log_bin_index = mysql-bin.index # 索引二進制日誌的文件名
 log_slave_updates = 1
 relay_log = mysql-relay-bin     # 中繼日誌 
 relay_log_index = mysql-relay-bin.index
 skip_slave_start = 1            # 防止從服務器在崩潰後自動開啓,以給你足夠的時間修復。 
 max_binlog_size = 200M          # 指定二進制日誌的大小

 # 如下配置是爲了方便之後,從庫切換爲主庫
 # 須要同步的二進制數據庫名
 binlog-do-db = test
 # 不一樣步的二進制數據庫名,若是不設置能夠將其註釋掉
 binlog-ignore-db = information_schema
 binlog-ignore-db = mysql

實踐過程

配置文件修改完,須要將mysql服務重啓,使得配置生效;而後在master上使用root用戶建立同步帳戶並受權slave;而後查看master狀態,此時不要再進行master的操做,配置slave的跟蹤master日誌的位置;最後檢查主從備份是否成功。具體實現過程以下:數據庫

我這裏建立的用戶容許任何主機使用正確密碼登錄,也能夠指定ip地址登錄,至關於在master使用repl帳號密碼也能夠登錄進行操做。服務器

// 建立同步帳戶repl並受權
create user 'repl'@'%' identified by 'password'; 
grant all privileges on *.* to 'repl'@'%';

查看mster狀態,我進行了兩次mysql服務重啓,因此二進制日誌已經到mysql-bin.000003,咱們以後在master上操做會開始從mysql-bin.000003開始記錄。ide

show master status\G

image

配置slave跟蹤master日誌的位置,本地ip地址是192.168.1.90,slave的ip地址是192.168.92.141,配置過程不須要用到slave的ip,repl是咱們建立的同步帳戶,接下來是密碼,二進制日誌文件,和二進制日誌中查看到的positon 5616。截圖顯示Position已經達到了6467,我應該是截圖的時候搞得太慢了,數據庫內部發生了一點變化,說明即便咱們不操做數據庫,二進制日誌也會記錄數據庫的變化,固然這不影響咱們的主從複製,由於Position提早了,就更不影響了。學習

CHANGE MASTER TO
             MASTER_HOST='192.168.1.90',
             MASTER_USER='repl',
             MASTER_PASSWORD='password',
             MASTER_LOG_FILE='mysq-bin.000003',
             MASTER_LOG_POS=5616;

接下來開啓slave,檢查slave主從備份的狀態,這裏Slave_IO_State狀態是Wait for master to send event說明主從備份配置成功了,正在等待master數據庫發生變化,若是主從複製失敗,查看狀態會顯示出錯誤信息,能夠根據狀況進行調試。spa

// 開啓slave
start slave;

// 查看狀態
SHOW SLAVE STATUS\G

image

咱們接下來在test數據庫的user表添加一行數據user4:調試

image

看下從庫發生了同步,查看數據以下:image

看到從庫同步增長了一行數據,說明咱們利用二進制日誌binlog實現了主從備份成功了,最後提醒一下,個人數據庫版本都是mysql8,0+的版本,若是版本不一致配置會遇到不少麻煩,最好是統一,不統一也不符合咱們的開發規範,建立同步帳戶時,mysql8.0+版本的sql語句也不同,若是你的版本在mysql8.0如下,能夠直接參考其餘人的教程,可是大體步驟都是相同的,這篇文章着重於實現二進制日誌的主從複製,目的爲了更好的瞭解mysql日誌,本人技術有限,若有錯誤,歡迎批評指正,謝謝。

相關文章
相關標籤/搜索