一般使用MySQL的時(shí)候,如果數(shù)據(jù)量不大,我們都使用一臺(tái)MySQL服務(wù)器,備份的時(shí)候使用mysqldump工具就可以了,但是隨著業(yè)務(wù)不斷發(fā)展,問題出現(xiàn)了: 武漢百度推廣公司
首先:數(shù)據(jù)量往往直線上升,單獨(dú)一臺(tái)數(shù)據(jù)庫服務(wù)器開始出現(xiàn)性能的瓶頸,數(shù)據(jù)訪問越來越慢。
其次:備份也變得困難了,因?yàn)閙ysqldump是導(dǎo)出一份文本文件,而數(shù)據(jù)量特別大的時(shí)候,這樣的備份往往需要很長時(shí)間,可能有人會(huì)說,我們可以直接通過拷貝數(shù)據(jù)文件來備份數(shù)據(jù)庫,這樣很方便,快捷,不錯(cuò),這樣是比mysqldump方便快捷,但是,直接拷貝數(shù)據(jù)文件備份的方式要求我們必須先關(guān)閉mysql服務(wù),然后再拷貝數(shù)據(jù)文件,否則,你拷貝的文件很可能是壞的。而實(shí)際運(yùn)行的mysql服務(wù)往往要求在任何時(shí)候都不可以停止服務(wù),所以這樣的備份方式在此情況下不可行。
如果你遇到了類似上面的問題,你就可以使用建立MySQL主從服務(wù)器的方式來解決,下面先來看看主從服務(wù)器的設(shè)置:
前提:MySQL主從服務(wù)器最好使用相同的軟件版本,以避免不不可預(yù)期的故障。
首先設(shè)置MySQL主服務(wù)器:
在主服務(wù)器上為從服務(wù)器建立一個(gè)用戶:
grant replication slave on *.* to ‘用戶名‘@’主機(jī)’ identified by ‘密碼’;
編輯主服務(wù)器的配置文件:/etc/my.cnf的mysqld處
server-id = 1
log-bin
binlog-do-db=需要備份的數(shù)據(jù)庫名,如果備份多個(gè)數(shù)據(jù)庫,重復(fù)設(shè)置這個(gè)選項(xiàng)即可
binlog-ignore-db=不需要備份的數(shù)據(jù)庫苦命,如果備份多個(gè)數(shù)據(jù)庫,重復(fù)設(shè)置這個(gè)選項(xiàng)即可
編輯從服務(wù)器的配置文件:/etc/my.cnf
server-id=2
master-host=主機(jī)
master-user=用戶名
master-password=密碼
master-port=端口
replicate-do-db=需要備份的數(shù)據(jù)庫名,如果備份多個(gè)數(shù)據(jù)庫,重復(fù)設(shè)置這個(gè)選項(xiàng)即可
記得先手動(dòng)同步一下主從服務(wù)器中要備份的數(shù)據(jù)庫,然后重啟主,從服務(wù)器。
要驗(yàn)證主從設(shè)置是否已經(jīng)成功,可以登錄從服務(wù)器輸入如下命令:
mysql> show slave status\G
會(huì)得到類似下面的列表:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果這兩個(gè)選項(xiàng)不全是Yes,那就說明你前面某個(gè)步驟配置錯(cuò)了。
如果你的設(shè)置是正確的,嘗試在主服務(wù)器上插入若干條記錄,然后你再轉(zhuǎn)到從服務(wù)器,會(huì)發(fā)現(xiàn)相應(yīng)的新記錄已經(jīng)自動(dòng)同步過來了。
如果你的主從服務(wù)器已經(jīng)配置好了,那么你在應(yīng)用程序中,只要保證所有的insert/delete/update操作是在主服務(wù)器上進(jìn)行的,那么相應(yīng)的數(shù)據(jù)變化會(huì)自動(dòng)同步到從服務(wù)器上,這樣,我們就可以把select操作分擔(dān)到多臺(tái)從數(shù)據(jù)庫上,從而降低服務(wù)器的載荷。
如果你想使用復(fù)制數(shù)據(jù)文件的方式來備份數(shù)據(jù)庫,只要在從服務(wù)器上的mysql命令行先鍵入slave stop;然后復(fù)制數(shù)據(jù)庫文件,復(fù)制好了,再 在mysql命令行鍵入slave start;啟動(dòng)從服務(wù)器,這樣就即備份了數(shù)據(jù)有保證了數(shù)據(jù)完整性,而且整個(gè)過程中主服務(wù)器的mysql無需停止。
———————————————————————————–
提示:如果修改了主服務(wù)器的配置,記得刪除從服務(wù)器上的master.info文件。否則從服務(wù)器使用的還是老配置,可能會(huì)導(dǎo)致錯(cuò)誤。
———————————————————————————–
注意:關(guān)于要復(fù)制多個(gè)數(shù)據(jù)庫時(shí),binlog-do-db和replicate-do-db選項(xiàng)的設(shè)置,網(wǎng)上很多人說是用半角逗號(hào)分隔,經(jīng)過測(cè)試,這樣的說法是錯(cuò)誤的,MySQL官方文檔也明確指出,如果要備份多個(gè)數(shù)據(jù)庫,只要重復(fù)設(shè)置相應(yīng)選項(xiàng)就可以了。
比如:
binlog-do-db=a
binlog-do-db=b
replicate-do-db=a
replicate-do-db=b
———————————————————————————–
補(bǔ)充:從服務(wù)器上my.cnf中的master-*的設(shè)置僅在第一次生效,后保存在master.info文件里。
———————————————————————————–
在從服務(wù)器上使用show slave status
Slave_IO_Running,為No,則說明IO_THREAD沒有啟動(dòng),請(qǐng)執(zhí)行slave start [IO_THREAD]
Slave_SQL_Running為No則復(fù)制出錯(cuò),查看Last_error字段排除錯(cuò)誤后執(zhí)行slave start [SQL_THREAD]
查看Slave_IO_State字段
空 //復(fù)制沒有啟動(dòng)
Connecting to master//沒有連接上master
Waiting for master to send event//已經(jīng)連上
———————————————————————————–
可以使用LOAD DATA FROM MASTER語句來建立slave。但有約束條件:
數(shù)據(jù)表要全部是MyISAM表,必須有SUPER權(quán)限,master的復(fù)制用戶必須具備RELOAD和SUPER權(quán)限。
在master端執(zhí)行RESET MASTER清除已有的日志變更,
此時(shí)slave端會(huì)因?yàn)檎也坏絤aster日志無法啟動(dòng)IO_THREAD,請(qǐng)清空data目錄下
relay-log.info,hosname-relay-bin*等文件重新啟動(dòng)mysql
中繼日志文件默認(rèn)的文件為hostname-relay-bin.nnn和hostname-relay-bin.index。可用從服務(wù)器的–
relay-log和–relay-log-index選項(xiàng)修改。在從服務(wù)器中還有一個(gè)relay-log.info中繼信息文件,可用
–relay-log-info-file啟動(dòng)選項(xiàng)修改文件名。
雙機(jī)互備則是兩個(gè)mysql同時(shí)配置為master及slave
———————————————————————————–
主服務(wù)器上的相關(guān)命令: 武漢百度公司
show master status
show slave hosts
show {master|binary} logs
show binlog events
purge {master|binary} logs to ‘log_name’
purge {master|binary} logs before ‘date’
reset master(老版本flush master)
set sql_log_bin={0|1}
———————————————————————————–
從服務(wù)器上的相關(guān)命令:
slave start
slave stop
SLAVE STOP IO_THREAD //此線程把master段的日志寫到本地
SLAVE start IO_THREAD
SLAVE STOP SQL_THREAD //此線程把寫到本地的日志應(yīng)用于數(shù)據(jù)庫
SLAVE start SQL_THREAD
reset slave
SET GLOBAL SQL_SLAVE_SKIP_COUNTER
load data from master
show slave status(SUPER,REPLICATION CLIENT)
CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= //動(dòng)態(tài)改變master信息
PURGE MASTER [before 'date'] 刪除master端已同步過的日志
———————————————————————————–
–read-only
該選項(xiàng)讓從服務(wù)器只允許來自從服務(wù)器線程或具有SUPER權(quán)限的用戶的更新??梢源_保從服務(wù)器不接受來自客戶的更新。