實戰mysql雙機實時熱備份

以前數據庫備份采用的方式一般都是每天定時使用 mysqldump 到處 sql 文件,然后傳到異地備份。不過這種定時備份有個問題就是如果服務器出問題了,那么這個備份和實際的業務數據總有一段時間的差異,丟失一部分數據。對于我這樣的博客基本每天發一兩篇還好,大不了丟一些評論數據,但是像一些 whmcs 做商業業務的,那可就意味著可能丟失一部分商業數據,比如付費數據啥的,那就比較頭大了。

所以對于對數據實時性要求比較高的業務, mysql 的數據庫的雙機熱備份就顯得比較重要。我也是這兩天才摸索著搞起來,把步驟總結下,希望對有需要的同學會有作用。

準備工作
兩臺服務器。建議異地。
裝了 相同版本 的 mysql (為了避免各種不必要的麻煩,強烈建議 mysql 版本務必一致)
Iptables 確保兩臺服務器的 3306 端口都是通的。
下面為了說明方便,我把要備份的服務器稱為“主服務器 A ”,把備份服務器稱為“從服務器 B ”
強烈建議不要直接在業務服務器上操作,先拿測試服務器做好測試,確定走通流程再對業務服務器進行操作
主服務器 A 的相關設置:
第一步:停止所有業務,避免有新的數據庫寫入

比如 whmcs 和 wordpress 的維護模式

第二步:導出數據庫,以便待會導入從服務器


1
mysqldump -u用戶 -p密碼 數據庫 > backup.sql 
以下是一個事例(假設用戶是 root ,密碼是 1234 ,需要備份的數據庫是 91yun ):

mysqldump -uroot-p1234 91yun > backup.sql

如果你有多個數據庫需要備份,就按這命令依序備份。

第三步:修改主服務器 A 的 mysql 配置文件

一般情況,配置 mysql 的位置文件在 /etc/my.cnf

在 [mysqld] 標簽下增加以下內容


 
log-bin=mysql-bin 
binlog_format=mixed
server-id    = 1
 
read-only=0
binlog-do-db=91yun
auto-increment-increment=10
auto-increment-offset=1
log-bin=mysql-bin     # 一般配置文件已經自帶了,就是開啟日志
binlog_format=mixed # 一般配置文件自帶了
server-id = 1 # 這個需要特別注意下,每個服務器都需要配置不同的 ID ,這里我們把主服務器設成 1 ,后面的從服務器我們就要設置成 2 了

read-only=0
binlog-do-db=91yun   # 這里是要備份的數據庫,如果要備份多個數據庫可以重復多行 , 這里的意思就是我要備份 91yun  這個數據庫
auto-increment-increment=10 # 這個數字是假設有 10 臺服務器進行互相備份,影響一些自增長字段的自增長量
auto-increment-offset=1 # 這個 確保每個服務器不同 ,并不高于上面這個參數,影響自增長字段的自增長量


設置完后請重啟 mysql 服務,以便設置生效 service mysql restart

第四步:在主服務器 A 連上 mysql


1
mysql -u用戶 -p密碼
mysql 的連接命令為 mysql -uroot   -p1234   ( 這里假設用戶是 root ,密碼是 1234) 需要注意的是, u 和用戶, p 和密碼之間并沒有空格。


第五步:在主服務器 A 上創建用于備份的用戶

該命令需要在上步連接 mysql 后,運行于 mysql 的命令行模式


1
grant replication slave on *.* to '用戶名'@'從服務器B的IP' identified by '用戶密碼'; 
需要在把上面命令的用戶名,密碼和從服務器的 IP 換成你自己的。下面是一個例子:

grant replication slave on *.* to 'slave1'@'192.168.3.2' identified by 'IHEnZ1y6J6';

該命令的意思就是:創建一個用于備份的用戶,用戶名是 slave1 ,密碼是 IHEnZ1y6J6 ,這個用戶只允許從 192.168.3.2 這個 IP 的機子上登陸

需要注意的是, mysql 的所有命令都是以分號結尾的 ;


第六步:取得主服務器 A 的 mysql 目前的狀態

該命令也是運行于 mysql 的命令行模式


1
show master status\G

請記下這個 File 和 Position 的內容!

下面開始修改從服務器 B 相關的設置
第一步:導入剛才 A 服務器到處的 Sql

這一步主要是確保兩臺服務器數據庫的初始狀態是一樣的,如果這兩個數據庫已經一樣了,那就可以略過了。

一般導入的數據庫的命令:


1
mysql -u用戶 -p密碼 數據庫 < backup.sql 
下面是一個例子(假設用戶是 root ,密碼是 1234 ,導入的數據庫是 ss100 )

mysql -uroot -p1234 ss100 < backup.sql

第二步:修改從服務器 B 的 mysql 配置

從這一步開始,就開始修改從服務器 B 的相關設置了

一樣的, mysql 的配置文件一般在 /etc/my.cnf

在 [mysqld] 標簽下,增加以下代碼:


 
log-bin=mysql-bin 
binlog_format=mixed
server-id       = 2
 
replicate-do-db=91yun
relay_log=mysqld-relay-bin 
log-slave-updates=ON 
log-bin=mysql-bin # 一般默認都有了,開啟 log
binlog_format=mixed # 一般默認也有了,格式
server-id = 2 # 需要注意這個,因為主服務器設置了 1 ,所以這里我們就設成 2

replicate-do-db=91yun # 這個是需要復制的數據庫
relay_log=mysqld-relay-bin # 這行照抄,不用改
log-slave-updates=ON

 

第三步:連接上從服務器 B 的 mysql 命令行模式


1
mysql -u用戶 -p密碼
進入 mysql 命令行模式

第四步:給從服務器 B 設置主服務器的相關信息

在命令行模式下運行下列命令:


1
CHANGE MASTER TO MASTER_HOST = '主服務器A的IP', MASTER_USER = '備份的用戶名', MASTER_PASSWORD = '用戶密碼', MASTER_LOG_FILE='主服務器的File',MASTER_LOG_POS=主服務器A的Position; 
MASTER_HOST # 主服務器 A 的 IP

MASTER_USER # 剛才在從服務器 A 上設置過的用于備份的用戶名

MASTER_PASSWORD # 剛才在服務器 A 上設置過的用戶的密碼

MASTER_LOG_FILE # 剛才主服務器 A 上最后一步讓大家記住的主服務器 A 狀態的 File

MASTER_LOG_POS # 剛才主服務器 A 上最后一步讓大家記住的主服務器 A 狀態的 Position;

以下是一個例子:

CHANGE MASTER TO MASTER_HOST = '192.168.3.1', MASTER_USER = 'slave1', MASTER_PASSWORD = 'IHEnZ1y6J6', MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=449;


第五步:啟動 slave

在 mysql 的命令行模式下輸入:


1
start slave;
 

第六步:查看從服務器是否正常運行

在 mysql 的命令行模式下,運行以下命令:


1
show slave status\G 

請務必確保 Slave_IO_Running 和 Slave_SQL_Running 的值都是 yes ,就表示成功了,如果任何一個是 NO 那就說明沒有成功。

比較常見的錯誤是防火墻的設置導致 3306 連不上。請確保 iptables 設置正確或者關閉。

第七步:測試是否同步

你現在可以通過 phpmyadmin 在服務器 A 里面隨便改個字段或者加個內容,看看從服務器 B 是否有相應的變化。

 

如果你需要 B 同時也具有寫入功能,那你就把服務器 B 作為 master 主服務器, A 作為從服務器,按上面步驟從新再來一遍。那就可以確保 A 和 B 處于互相備份狀態。


本博客所有文章如無特別注明均為原創。作者:櫻木復制或轉載請以超鏈接形式注明轉自 EFE
原文地址《實戰mysql雙機實時熱備份
分享到:更多

相關推薦

發表評論

路人甲 表情
Ctrl+Enter快速提交

網友評論(0)