mysql的雙向備份可以實現(xiàn)一個簡單的數(shù)據(jù)庫cluster,從而提高數(shù)據(jù)的可靠性和訪問性能。 以下是用mysql5.0.51b實現(xiàn)雙向備份的一些記錄。
(1)從網(wǎng)上下載了一個非安裝的版本mysql-5.0.51b,然后在192.168.1.10機(jī)器上解壓在E:\mysql目錄下。
(2)在E:\mysql下創(chuàng)建一個my.ini文件,內(nèi)容是從該目錄下面的其他ini復(fù)制而來,然后修改里面的內(nèi)容,主要是設(shè)置路徑。因為mysql安裝在E:/mysql下,所以修改如下:
[mysqld]
basedir="E:/mysql/"
datadir="E:/mysql/Data/"
(3)修改端口
為了讓mysql以服務(wù)的形式在windows中運行,同時不和其他已安裝的mysql發(fā)生沖突,所以要修改msyql服務(wù)運行的端口,主要修改如下:
[mysqld]
port=5306
(4)安裝服務(wù)
windows鍵+R,輸入“cmd”,回車,進(jìn)入window中控制臺窗口,然后切換到E:\mysql\bin目錄下,運行mysqld-nt --install replDb,這樣服務(wù)安裝完成。
(5)設(shè)置master
設(shè)置master的目的主要讓msyql數(shù)據(jù)庫程序運行起來的時候在本地產(chǎn)生bin-log,以備slave可以從該log中讀取sql操作,從而保持和master的數(shù)據(jù)同步。主要設(shè)置如下:
[mysqld]
log-bin=mysql-bin
server-id=1
log-bin設(shè)置的是本地產(chǎn)生的bin-log文件的名字,mysql還會自動產(chǎn)生擴(kuò)展名。server-id用來標(biāo)識本數(shù)據(jù)庫服務(wù)器。只所以需要配置server-id是為了區(qū)分bin-log中那些數(shù)據(jù)的來源。這樣就可以防止在一個loop的備份環(huán)境中,數(shù)據(jù)被循環(huán)復(fù)制。比如:AàB, BàC, CàA。假如沒有這個server-id,A在從C復(fù)制數(shù)據(jù)的時候,就不知道這些數(shù)據(jù)是C產(chǎn)生的,還是B產(chǎn)生的,還是A自己產(chǎn)生的。如果是B和C產(chǎn)生的,A當(dāng)然需要復(fù)制,如果是A自己產(chǎn)生的,當(dāng)然就不需要再復(fù)制了,不然就無限循環(huán)下去了。
保存my.ini文件,這個時候運行 net start replDb。就會發(fā)現(xiàn)mysql數(shù)據(jù)庫程序運行之后,會在E:/mysql/Data/目錄下產(chǎn)生mysql-bin.xxxxxx的日志文件,以備slave訪問。
(6)創(chuàng)建slave帳戶和權(quán)限
net start replDb 就會啟動replDb。
在slave復(fù)制bin-log內(nèi)容的時候,需要相應(yīng)的帳號和訪問權(quán)限,因此如下命令:
Mysql –uroot –port=5306
由于初始沒有密碼,因此該命令直接可以訪問數(shù)據(jù)庫,如果為了安全起見,應(yīng)該設(shè)置root密碼,如下:
Grant all on *.* to ‘root’@’localhost’ identified by ‘root’;
這樣root用戶只能在本機(jī)以’root’密碼訪問。然后創(chuàng)建slave可以訪問的帳戶,運行如下語句:
Grant replication slave on *.* to ‘repl’@’192.168.1.11’ identified by ‘slavepass’;
這樣192.168.1.11這臺機(jī)器上的mysql slave就可以以repl用戶名和’slavepass’密碼來復(fù)制本機(jī)(192.168.1.10)的bin-log中的內(nèi)容了。
(7)安裝slave
在192.168.1.11機(jī)器上重復(fù)上面的(1),(2),(3),(4),(5),(6)步驟。
但是在第(5)步中server-id應(yīng)該設(shè)置成和192.168.1.10機(jī)器不同的值,如下:
[mysqld]
log-bin=mysql-bin
server-id=2
同時在第(6)步創(chuàng)建slave帳戶的時候,ip有所改變,如下:
Grant replication slave on *.* to ‘repl’@’192.168.1.10’ identified by ‘slavepass’;
(8)設(shè)置slave選項
在192.168.1.10的my.ini文件中,加入如下內(nèi)容:
[mysqld]
master-host=192.168.1.11
master-port=5306
master-user=repl
master-password=slavepass
這個設(shè)置是告訴192.168.1.10上的mysql服務(wù)器把192.168.1.11:5306作為master,以用戶名repl和密碼slavepass去訪問。同樣的在192.168.1.11上如下設(shè)置:
[mysqld]
master-host=192.168.1.10
master-port=5306
master-user=repl
master-password=slavepass
然后在192.168.1.10和192.168.1.11機(jī)器上都運行如下命令
Net stop replDb
Net start replDb
如果不出問題,兩臺機(jī)器上的mysql數(shù)據(jù)應(yīng)該就已經(jīng)處于相互備份的狀態(tài)下了。
那么如何檢驗是否連接成功呢,主要通過以下命令:
在192.168.1.10機(jī)器上運行 mysql –u root –p –port=5306,輸入密碼’root’之后,進(jìn)入mysql操作界面。
然后輸入show slave status\G 語句
會輸出如下:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master1
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 931
Relay_Log_File: slave1-relay-bin.000056
Relay_Log_Pos: 950
Relay_Master_Log_File: mysql-bin.000004
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: 931
Relay_Log_Space: 1365
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
1 row in set (0.01 sec)
注意其中的 Slave_IO_Running 和 Slave_SQL_Running,這兩個指標(biāo)如果是yes表示slave已經(jīng)在工作了,然后再看Last_Error,如果是空的表示一切正常,還有最后一個Seconds_Behind_Master,這個指標(biāo)表示slave讀的速度落后原始數(shù)據(jù)多少,正常當(dāng)然是越小越好,太大就表示slave來不及復(fù)制master的數(shù)據(jù)了。
到此,設(shè)置運行完畢,在測試的過程中,我發(fā)現(xiàn)還可以這樣安裝,比如在上面第(6)步結(jié)束之后,可以不用把slave的配置寫到文件中,而是可以在不重新啟動mysql數(shù)據(jù)庫的情況下直接通過運行語句來完成:
mysql>
CHANGE MASTER TO
->
MASTER_HOST='192.168.1.10',
->
MASTER_USER='repl'
,
->
MASTER_PASSWORD='slavepass'
,
-> MASTER_PORT=5306;
即先change master,然后運行start slave。
然后再運行show slave status\G,應(yīng)該也是OK。
有一點需要說明的是,這里安裝的時候是直接用兩個完全新的數(shù)據(jù)庫,如果在已經(jīng)有數(shù)據(jù)在數(shù)據(jù)庫中,并且該數(shù)據(jù)庫是master,這個時候想不關(guān)閉master的情況下,加入一個slave進(jìn)來的話,就需要參考mysql的replication一章中的內(nèi)容,其基本過程是這樣:
(1) 先鎖定master中的數(shù)據(jù)庫,并把數(shù)據(jù)寫到硬盤。
mysql> FLUSH TABLES WITH READ LOCK;
(2) 然后再數(shù)據(jù)鎖定的情況下,用show master status查看bin-log的位置,并記下參數(shù),并備份master中的內(nèi)容。
(3) 解鎖master數(shù)據(jù)庫。
(4) 把備份好的數(shù)據(jù)倒到slave中。
(5) 在slave數(shù)據(jù)庫中運行用change master語句,該語句需要加上master_log_file和master_log_pos參數(shù)。這兩個參數(shù)就是在(2)中記下的bin-log參數(shù)。
(6) 在slave 中運行 start slave。然后就ok了。
通過上面的闡述可以發(fā)現(xiàn),有兩種方式配置備份,一個是通過my.ini,還有一個是通過change master語句。其實當(dāng)數(shù)據(jù)庫運行的時候,如果發(fā)現(xiàn)my.ini中有master_host等參數(shù),數(shù)據(jù)庫就把這些信息寫到data目錄下的master.info文件中,然后slave啟動的時候就直接從這個master.info文件中讀取master的信息。而在slave數(shù)據(jù)庫中運行change master語句的時候,數(shù)據(jù)庫程序是把那些參數(shù)直接寫入master.info文件中。
在mysql數(shù)據(jù)庫中,處理邏輯是這樣的,當(dāng)mysql數(shù)據(jù)庫程序啟動的時候,如果它發(fā)現(xiàn)有master.info數(shù)據(jù)文件存在,那么它不會去讀my.ini中的相關(guān)配置,而是直接用master.info中的內(nèi)容。如果沒有master.info存在,它才去讀my.ini中的相關(guān)配置,并且產(chǎn)生一個master.info文件。所以如果想通過my.ini來更改已有的master信息,必須先關(guān)掉mysql數(shù)據(jù)庫,然后刪除master.info文件,然后重新啟動。