開(kāi)門(mén)見(jiàn)山,首先,主服務(wù)器的mysql版本不能高于從服務(wù)器的版本 ,可以是一樣的,其次端口號(hào)必須統(tǒng)一。
好了,現(xiàn)在開(kāi)始配置雙機(jī)熱備(隨后將會(huì)提到循環(huán)備份以及互備)我使用的版本為redhat5.4兩臺(tái)ip為192.168.1.10、192.168.0.11,備份數(shù)據(jù)庫(kù)為test。
熱備中數(shù)據(jù)庫(kù)分類:master主數(shù)據(jù)庫(kù)、slave從數(shù)據(jù)庫(kù)
一、兩臺(tái)mysql均可以在本地登錄,并設(shè)定好密碼,打開(kāi)防火墻3306端口否則,無(wú)法進(jìn)行通訊。
- vi /etc/sysconfig/iptables
- #在里面添加3306端口
- -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
- :wq
二、在主數(shù)據(jù)庫(kù)中添加用于備份的賬號(hào)
- mysql> GRANT REPLICATION SLAVE ON *.* #注意 這里是星號(hào)
- -> TO "backupUser"@"IP" IDENTIFIED BY "password";
backupUser填寫(xiě)建立的用戶名,IP為從服務(wù)器IP,password就不用說(shuō)了吧~
三、修改主服務(wù)器的my.cnf在配置文件中添加
- server-id=1 #數(shù)據(jù)庫(kù)id,默認(rèn)1
- log-bin=log-bin #日志文件的名稱,這里可以制定日志到別的目錄 如果沒(méi)有設(shè)置則默認(rèn)主機(jī)名的一個(gè)日志名稱
- binlog-do-db=db_name #記錄日志的數(shù)據(jù)庫(kù) ,可選
- binlog-ignore-db=mysql #不記錄日志的數(shù)據(jù)庫(kù) 可選
log-bin是mysql產(chǎn)生的二進(jìn)制日志,熱備份就是讀取二進(jìn)制日志使數(shù)據(jù)得到時(shí)時(shí)同步,建議在binlog-ignore中添加mysql這個(gè)庫(kù),因?yàn)樵谖覝y(cè)試中這個(gè)庫(kù)也被同步過(guò)來(lái)了,所以...你懂得
四、重啟服務(wù)器載入新配置文件
進(jìn)入數(shù)據(jù)庫(kù)
- mysql -uroot -p
- password:
鎖定數(shù)據(jù)庫(kù)
- mysql> FLUSH TABLES WITH READ LOCK;
備份所需要的數(shù)據(jù)表
- mysqldump -uroot -ppassword test > /home/backup/mysql/test.sql
- #如果有多個(gè)就備份多個(gè)
鎖定數(shù)據(jù)庫(kù)是為了準(zhǔn)備記錄二進(jìn)制日志的記錄點(diǎn),否則會(huì)在從機(jī)配置的時(shí)候不能正常讀取二進(jìn)制日志
查看在鎖定數(shù)據(jù)庫(kù)時(shí)二進(jìn)制日志的記錄點(diǎn)
- mysql> show master status;
- +----------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +----------------+----------+--------------+------------------+
- | bin_log.000001 | 805 | | |
- +----------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
用筆記錄二進(jìn)制日志名稱、以及pos點(diǎn) bin-log.000001、805
解鎖數(shù)據(jù)表
下載備份sql然后上傳到從機(jī)上去
五、首先修改從機(jī)mysql配置文件
- vi /etc/my.cnf
- #添加代碼
- server-id=2 //設(shè)置數(shù)據(jù)庫(kù)id,可以隨便設(shè)置。但不能重復(fù)
master-host=192.168.1.10 //主服務(wù)器的IP地址或者域名
- master-port=3306 //主數(shù)據(jù)庫(kù)的端口號(hào)
- master-user=backup //同步數(shù)據(jù)庫(kù)的用戶
- master-password=********* //同步數(shù)據(jù)庫(kù)的密碼
- master-connect-retry=60 //如果從服務(wù)器發(fā)現(xiàn)主服務(wù)器斷掉,重新連接的時(shí)間差
- master-retry-count = 999 //嘗試連接次數(shù)
replicate-do-db=database //表示同步的數(shù)據(jù)庫(kù)如多個(gè),請(qǐng)重復(fù)添加
binlog-ignore-db=mysql //不同步mysql數(shù)據(jù)庫(kù)
設(shè)定好上述參數(shù)后重啟從機(jī)mysql
六、進(jìn)入從機(jī)mysql、停止slave(slave開(kāi)機(jī)自動(dòng)啟動(dòng))
更新master信息(之前配置文件中是基礎(chǔ)數(shù)據(jù),此處是詳細(xì)配置包括后期更改master信息也可以在mysql>中進(jìn)行更新,但是端口變更要修改配置文件)
- mysql> change master to #進(jìn)入修改master -> master_host='192.168.1.10', #定義master地址
- -> master_user='backup', #定義備份時(shí)使用的用戶
- -> master_password=’password‘, #定義備份用戶的密碼
- -> master_log_file='bin_log.000001', #指定從機(jī)數(shù)據(jù)在master中的二進(jìn)制日志名稱 -> master_log_pos=805; #指定從機(jī)數(shù)據(jù)在master中的二進(jìn)制日志記錄點(diǎn)
Query OK, 0 rows affected (0.01 sec) 更新完成,啟動(dòng)slave
查看slave的運(yùn)行狀態(tài)
- mysql> show slave status\G;
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.38.7
- Master_User: backup
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: bin_log.000001
- Read_Master_Log_Pos: 53229
- Relay_Log_File: localhost-relay-bin.000002
- Relay_Log_Pos: 52665
- Relay_Master_Log_File: bin_log.000001
- Slave_IO_Running: Yes 可以看到此處兩個(gè)yes代表主從已經(jīng)開(kāi)始運(yùn)行
- Slave_SQL_Running: Yes 可以做個(gè)數(shù)據(jù)測(cè)試了
- 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: 53229
- Relay_Log_Space: 52824
- 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
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- 1 row in set (0.00 sec)
IO和SQL均為yes則表示連同,那么可以去測(cè)試了,到此雙機(jī)熱備結(jié)束。
下面簡(jiǎn)單介紹雙機(jī)互備與循環(huán)備份的原理
Mysql雙機(jī)互備(在完成以上的基礎(chǔ)不要做數(shù)據(jù)庫(kù)進(jìn)行操作,不要對(duì)主進(jìn)行讀寫(xiě))
原理講解:如果slave端按照上面配置文件中進(jìn)行添加那么,默認(rèn)不開(kāi)啟二進(jìn)制日志(bin-log)那么他將不產(chǎn)生二進(jìn)制日志,也就是說(shuō)slave會(huì)一直讀取master的二進(jìn)制日志來(lái)更新自己。那么我們就要讓slave自己也產(chǎn)生二進(jìn)制日志。
在slave端的my.cnf添加“bin-log = ”,添加完以后我們可以重啟從機(jī)然后用
mysql> show master status; #查看slave端自己的master日志
然后再master的上面,進(jìn)行master change to這個(gè)操作,信息都是填slave上的信息,master_log_pos是剛才查看的。
另外,如果在生產(chǎn)機(jī)中做雙機(jī)互備,需要進(jìn)行鎖表,并提前做好備份,以防止數(shù)據(jù)的丟失。
在生產(chǎn)機(jī)當(dāng)中,分兩種情況
1:已經(jīng)有了主從模式的情況,就需要先對(duì)主進(jìn)行鎖表,然后再修改slave的my.cof(添加日志功能),查看slave端的日志pos點(diǎn)(show master status;),然后再主上面做master change to 的操作 ,然后重啟mysql即可
2:沒(méi)有做主從模式的情況,第一步是先做主從,但是主的表在看完日志pos后不要解鎖,一直鎖著,直到從做好,然后在做從到主,最后在解鎖。
適用于A↔B A→B→C(此方法還需要自己測(cè)試,然后應(yīng)用到生產(chǎn)機(jī))
如有問(wèn)題請(qǐng)留言 |