簡(jiǎn)介
MySQL主從同步是目前使用比較廣泛的數(shù)據(jù)庫(kù)架構(gòu),技術(shù)比較成熟,配置也不復(fù)雜,特別是對(duì)于負(fù)載比較大的網(wǎng)站,主從同步能夠有效緩解數(shù)據(jù)庫(kù)讀寫(xiě)的壓力。
MySQL主從同步的機(jī)制:
MySQL同步的流程大致如下:
1、主服務(wù)器(master)將變更事件(更新、刪除、表結(jié)構(gòu)改變等等)寫(xiě)入二進(jìn)制日志(master log)。
2、從服務(wù)器(slave)的IO線程從主服務(wù)器(binlog dump線程)獲取二進(jìn)制日志,并在本地保存一份自己的二進(jìn)制日志(relay log)
3、從服務(wù)器的SQL線程讀取本地日志(relay log),并重演變更事件。
MySQL主從同步的作用:
1、可以作為一種備份機(jī)制,相當(dāng)于熱備份(在從備份,避免備份期間影響主服務(wù)器服務(wù))
2、可以用來(lái)做讀寫(xiě)分離,均衡數(shù)據(jù)庫(kù)負(fù)載(主寫(xiě)從讀)
3、當(dāng)主服務(wù)器出現(xiàn)問(wèn)題時(shí),可以切換到從服務(wù)器。
MySQL主從同步的步驟:
一、準(zhǔn)備操作:
1、主從數(shù)據(jù)庫(kù)版本一致,建議版本5.5以上
2、主從數(shù)據(jù)庫(kù)數(shù)據(jù)一致
二、主數(shù)據(jù)庫(kù)master修改:
1、修改MySQL配置:
# /etc/my.cnf
log-bin = mysql-bin
# 主數(shù)據(jù)庫(kù)端ID號(hào)
server-id = 1
log-bin=/home/mysql/logs/binlog/bin-log
max_binlog_size = 500M
binlog_cache_size = 128K
binlog-do-db = adb
binlog-ignore-db = mysql
log-slave-updates
expire_logs_day=2
binlog_format="MIXED"
上面配置中各個(gè)參數(shù)的含義和相關(guān)注意項(xiàng):
#服務(wù)器標(biāo)志號(hào),注意在配置文件中不能出現(xiàn)多個(gè)這樣的標(biāo)識(shí),如果出現(xiàn)多個(gè)的話mysql以第一個(gè)為準(zhǔn),一組主從中此標(biāo)識(shí)號(hào)不能重復(fù)。
server-id = 1
log-bin=/home/mysql/logs/binlog/bin-log #開(kāi)啟bin-log,并指定文件目錄和文件名前綴。
#每個(gè)bin-log最大大小,當(dāng)此大小等于500M時(shí)會(huì)自動(dòng)生成一個(gè)新的日志文件。一條記錄不會(huì)寫(xiě)在2個(gè)日志文件中,所以有時(shí)日志文件會(huì)超過(guò)此大小。
max_binlog_size = 500M
binlog_cache_size = 128K #日志緩存大小
binlog-do-db = adb #需要同步的數(shù)據(jù)庫(kù)名字,如果是多個(gè),就以此格式在寫(xiě)一行即可。
binlog-ignore-db = mysql #不需要同步的數(shù)據(jù)庫(kù)名字,如果是多個(gè),就以此格式在寫(xiě)一行即可。
#當(dāng)Slave從Master數(shù)據(jù)庫(kù)讀取日志時(shí)更新新寫(xiě)入日志中,如果只啟動(dòng)log-bin 而沒(méi)有啟動(dòng)log-slave-updates則Slave只記錄針對(duì)自己數(shù)據(jù)庫(kù)操作的更新。
log-slave-updates
expire_logs_day=2 #設(shè)置bin-log日志文件保存的天數(shù),此參數(shù)mysql5.0以下版本不支持。
binlog_format="MIXED" #設(shè)置bin-log日志文件格式為:MIXED,可以防止主鍵重復(fù)。
2、重啟mysql,創(chuàng)建用于同步的賬戶(hù):
# 創(chuàng)建slave帳號(hào)slave,密碼111111
mysql>grant replication slave on *.* to 'slave'@'%' identified by '111111';
# 更新數(shù)據(jù)庫(kù)權(quán)限
mysql>flush privileges;
3、查詢(xún)master的狀態(tài)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 | 196 | | |
+------------------+----------+--------------+------------------+
1 row in set
注:執(zhí)行完這個(gè)步驟后不要再操作主數(shù)據(jù)庫(kù)了,防止主數(shù)據(jù)庫(kù)狀態(tài)值變化
三、從數(shù)據(jù)庫(kù)slave修改:
1、修改MySQL配置:
# 從數(shù)據(jù)庫(kù)端ID號(hào)
server-id =2
2、執(zhí)行同步命令
# 執(zhí)行同步命令,設(shè)置主數(shù)據(jù)庫(kù)ip,同步帳號(hào)密碼,同步位置
mysql>change master to master_host='192.168.1.2',master_user='slave',master_password='111111',master_log_file='mysql-bin.000009',master_log_pos=196;
# 開(kāi)啟同步功能
mysql>start slave;
3、檢查從數(shù)據(jù)庫(kù)狀態(tài):
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.2
Master_User: slave_account
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 196
Relay_Log_File: vicky-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
...
...
注:Slave_IO_Running及Slave_SQL_Running進(jìn)程必須正常運(yùn)行,即YES狀態(tài),否則說(shuō)明同步失敗。可用這兩項(xiàng)判斷從服務(wù)器是否掛掉
到這里,主從數(shù)據(jù)庫(kù)設(shè)置工作已經(jīng)完成,自己可以新建數(shù)據(jù)庫(kù)和表,插入和修改數(shù)據(jù),測(cè)試一下是否成功
四、其他可能用到的相關(guān)參數(shù):
1、master端:
# 不同步哪些數(shù)據(jù)庫(kù)
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
# 只同步哪些數(shù)據(jù)庫(kù),除此之外,其他不同步
binlog-do-db = game
# 日志保留時(shí)間
expire_logs_days = 10
# 控制binlog的寫(xiě)入頻率。每執(zhí)行多少次事務(wù)寫(xiě)入一次
# 這個(gè)參數(shù)性能消耗很大,但可減小MySQL崩潰造成的損失
sync_binlog = 5
# 日志格式,建議mixed
# statement 保存SQL語(yǔ)句
# row 保存影響記錄數(shù)據(jù)
# mixed 前面兩種的結(jié)合
binlog_format = mixed
2、slave端:
# 停止主從同步
mysql> stop slave;
# 連接斷開(kāi)時(shí),重新連接超時(shí)時(shí)間
mysql> change master to master_connect_retry=50;
# 開(kāi)啟主從同步
mysql> start slave;
以上連接超時(shí)設(shè)置,類(lèi)似方式可用于設(shè)置主數(shù)據(jù)庫(kù)ip,同步帳號(hào)密碼,同步位置
判斷主從服務(wù)器是否正常運(yùn)行代碼:
//在從服務(wù)器中執(zhí)行以下語(yǔ)句
$sql = "show slave status";
$result = mysql_query($sql, $slave_link);
$row = mysql_fetch_assoc($result);
$Slave_IO_Running = $row['Slave_IO_Running'];
$Slave_SQL_Running = $row['Slave_SQL_Running'];
//下面兩項(xiàng)為判斷標(biāo)準(zhǔn)
if ('Yes' == $Slave_IO_Running 'Yes' == $Slave_SQL_Running) {
} else {
$content .= "從數(shù)據(jù)庫(kù)( $host )掛掉了?。?! br/>";
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
您可能感興趣的文章:- Mysql數(shù)據(jù)庫(kù)的主從同步配置
- Mysql 主從數(shù)據(jù)庫(kù)同步(centos篇)
- mysql數(shù)據(jù)庫(kù) 主從復(fù)制的配置方法
- MYSQL主從數(shù)據(jù)庫(kù)同步備份配置的方法
- 解決MySQL主從數(shù)據(jù)庫(kù)沒(méi)有同步的兩種方法