1. 程式人生 > >MySQL雙機熱備份配置

MySQL雙機熱備份配置

說明 host use font 本地連接 不記錄 obi 定位 dash

雙機熱備份,即能夠把主數據庫中所有的數據同時寫到備份的數據庫中,從而實現MySQL數據庫的熱備份。

MySQL ReplicationMySQL提供的一種主從備份的機制,並且整個復制備份過程是異步進行的,其高效的性能設計,也讓復制的延時非常小。

MySQL復制功能在實際的應用場景中被廣泛的應用於保證數據系統數據的安全性和擴展設計中。

一、MySQL Replication設計原理

MySQL的復制(replication)是一個異步的復制,從一個MySQLinstance(稱為Master)復制到另一個MySQLinstance(稱為Slave)。

整個復制操作主要由三個進程完成,其中兩個進程在SlaveSql進程和IO進程),另外一個進程在MasterIO進程)上。

要實施復制,首先必須打開Master端的binarylogbin-log)功能,否則無法實現。整個復制過程就是SlaveMaster端獲取該日誌後再在自己身上完全順序的執行日誌中所記錄的各種操作。

  復制的基本過程如下:

  1、Slave上面的IO進程連接上Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)之後的日誌內容;

  2、Master接收到來自SlaveIO進程請求後,通過負責復制的IO進程根據請求信息讀取指定日誌指定位置之後的日誌信息,返回給SlaveIO進程。返回信息中除了日誌所包含的信息之外,還包括本次返回信息已經到Master端的bin-log文件的名稱以及bin-log的位置。

  3、SlaveIO進程接收到信息後,將接收到的日誌內容依次添加到Slave端的relay-log文件的最末端,並將讀取到的Master端的bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個bin-log的某個位置開始往後的日誌內容,請發給我

  4、SlaveSql進程監測到relay-log中新增加了內容後,會馬上解析relay-log的內容成為Master端真實執行時候的那些可執行的內容,並在自身執行。

二、MySQL Replication詳細配置

2.1 系統環境

  主服務器和從服務器使用的操作系統和數據庫版本都是相同的,具體信息如下所示:

2.1.1主服務器(Master)

  1、操作系統:Ubuntu16.04 64位;

  2、MySQL版本:5.7.25,for Linux(x86_64)

  3、IP:192.168.0.1

2.1.2從服務器(Slave)

  1、操作系統:Ubuntu16.04 64位;

  2、MySQL版本:5.7.25,for Linux(x86_64)

  3、IP:192.168.0.2

2.1.3 數據庫相關配置

  MySQL安裝後,在主服務器和從服務器上,創建相同的數據庫和表。

  創建數據庫:

  CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;

  此時已經創建了數據庫名為my_db的庫:

  技術分享圖片 

  在my_db庫中創建測試版: 

  create table tb_mobile( mobile VARCHAR(20), time timestamp DEFAULT now());

  此時數據庫my_db中已經創建了tb_mobile表:

  技術分享圖片

  主服務器和從服務器,數據庫和表的創建是一樣的,所以從服務器上也如上所示創建my_db數據庫和tb_mobile表。

2.2 主服務器Master配置

2.2.1 創建同步用戶

進入mysql操作界面,在主服務器上為從服務器建立一個連接賬戶,該賬戶必須授予Replication Slave權限。

首先登錄mysql,指令為:mysql –uroot –p

輸入密碼後,進入mysql操作界面,輸入grant指令:

grant replication slave on *.* to ‘replicate‘@‘192.168.0.2‘ identified by ‘123456‘;

如下圖所示:

技術分享圖片

 其中replicate為賬號,192.168.0.2表示具體slaveIP,這樣只要賬號和密碼正確,則能夠登錄到主服務器數據庫。

打開從服務器(Slave)終端 ,輸入以下命令:

  mysql –h192.168.0.2–ureplicate –p

輸入密碼後,出現如下圖所示,則表示連接成功,能夠進行雙機熱備份:

技術分享圖片

註:創建同步用戶時,出現了錯誤,具體錯誤及解決方法,見下方第三部分說明。

2.2.2 修改mysql配置文件 

  首先找到mysql配置的目錄,mysql默認安裝在/etc目錄下面,這裏默認安裝在/etc/mysql目錄。在mysql目錄下,可以看到相關的配置文件my.cnf

打開後,文件內容如下:

技術分享圖片

按照上面引用的路徑在/etc/mysql/mysql.conf.d目錄下,找到配置文件mysqld.cnf,然後修改此文件下的[mysqld]如下所示:

   [mysqld]

  server-id = 1 //唯一的id

  log_bin = /var/log/mysql/mysql-bin.log //本來就有,可以不動

  binlog_do_db = my_db //記錄日誌的數據庫,有多個庫可以繼續添加

  binlog_ignore_db = mysql //不記錄日誌的數據庫

  2.2.3 重啟mysql服務

  修改完文件,保存後,重啟一下MySQL服務,命令為:Service mysql restart

2.2.4 查看主服務器狀態

  進入mysql服務器,可以查看Master狀態,輸入以下命令:

   Show master status\G

  具體如圖所示:

技術分享圖片

其中FilePosition,在從服務器(Slave)配置主從關系會用到;Binlog_Do_DB是要記錄日誌的數據庫,Binlog_Ignore_DB是不記錄日誌的數據庫,這兩個參數在mysqld.cnf中配置。

註:操作完此步驟後不再改變主服務器MySQL,防止主服務器在狀態值變化。

  2.3 從服務器Slave配置

  這裏以主從方式實現mysql雙機熱備,所以不需要在從服務器創建同步賬戶了,直接打開配置文件相關相關參數即可,同樣是修改mysqld.cnf文件。

2.3.1 修改配置文件

  打開mysqld.cnf文件,修改[mysqld]下的參數:

  [mysqld]

  server-id = 2

  log-bin=/var/log/mysql/mysql-bin.log //原有存在的,不需更改

  replicate-do-db = my_db

  replicate-ignore-db = mysql,information_schema,performance_schema

2.3.2 重啟mysql服務

  修改配置文件,保存後,重啟一下mysql服務:Service mysql restart

2.3.3用change master 語句指定同步位置

在進入mysql 操作界面後,輸入以下命令進行關聯:

change master to master_host=‘192.168.0.1‘,master_user=‘replicate‘,master_password=‘123456‘,master_log_file=‘ mysql-bin.000006 ‘,master_log_pos=1322;

輸入命令 如下:

技術分享圖片

發生錯誤,如下圖所示:

技術分享圖片

  上圖所示,提示要先停止slave服務器線程。

使用命令:stop slave 停止。

技術分享圖片

然後再輸入上面change to命令,就可以配置成功。

註:master_log_file, master_log_pos由主服務器(Master)查出的狀態值中確定。也就是剛剛叫註意的。master_log_file對應File, master_log_pos對應PositionMysql 5.x以上版本已經不支持在配置文件中指定主服務器相關選項。

最後,輸入指令:start slave,至此從服務器(Slave)配置完成。

2.3.4 查看服務器狀態

使用命令show slave status\G,具體如下:

技術分享圖片

查看下面兩項值均為Yes,即表示設置從服務器成功。

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

2.4 測試同步

在主服務器(Master192.168.0.1的數據庫my_dbtb_mobile表插入一條數據,

然後看從服務器(Slave)192.168.0.2上相應的表中是否也更新了這條數據。

  主服務器(Master192.168.0.1

技術分享圖片

從服務器(Slave)192.168.0.2

技術分享圖片

可以看到主服務器和從服務器的tb_mobile表都是空的。

接下來,在主服務器tb_mobile表中插入一條數據,如下圖所示:

主服務器(Master192.168.0.1

技術分享圖片

主服務器顯示表tb_mobile中成功插入了一條數據。

然後看從服務器(Slave)192.168.0.2:

技術分享圖片

從上圖可以看到,從服務器上的表tb_mobile中已經同步了一條與主服務器中一模一樣的數據。

至此,雙機熱備操作完成。

三、錯誤解決方法

  3.1 此次配置,在2.2.1 創建同步用戶時遇到一個問題,在輸入mysql -h192.168.0.1 -ureplicate -p時,出現錯誤,如下所示:

  技術分享圖片

  解決方法:

[mysqld]

bind_address=127.0.0.1

把這行註釋掉 #bind_address=127.0.0.1

3.2 其他可能情況

以下為網友遇到的其他解決情況。

1、網絡連接問題

遠程ping xxx.xxx.xxx.xx ,能ping通,排除此情況

[mysql@vvmvcs0 ~]$ ping xxx.xxx.xxx.xx

2、主服務器(Master)上my.cnf配置問題

排查可能由於主服務器(Master)上my.cnf裏配置了skip_networking或者bind_address,只允許本地socket連接

2.1 [mysqld]下設置skip_networking,

知識說明: 這使用MySQL只能通過本機Socket連接(socket連接也是本地連接的默認方式),放棄對TCP/IP的監聽

當然也不讓本地java程序連接MySQL(Connector/J只能通過TCP/IP來連接)。

2.2 可能使用了bind_address=127.0.0.1(當然也可以是其他ip)

[mysqld]

bind_address=127.0.0.1

請把這行註釋掉 #bind_address=127.0.0.1

3DNS解析問題

檢查是否設置了: skip_name_resolve 這個情況肯定不可能,因為我用的是ip,不是主機名。

[mysqld]

skip_name_resolve

知識說明:這個參數加上後,不支持主機名的連接方式。

4、用戶和密碼問題

其實用戶和密碼的錯誤,不會出現111的,所以排除用戶密碼問題

ERROR 1045 (28000): Access denied for user ‘root‘@‘XXXX‘ (using password: YES)

5、檢查—port問題

有可能85MySQL port不是默認3306 這樣我遠程連接時,沒有指定--port,用的是3306, 85上沒有對3306進行監聽。

netstat -nplt | grep mysql

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 11107/mysqld

測試連接: mysql -u root -p -h xxx.xxx.xxx.85 --port 3306

6、防火墻問題

檢查防火墻狀態

[root@iZ288zn7gymZ ~]# service iptables status

MySQL雙機熱備份配置