mysql主从库配置方法
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一.mysql主從備份(復(fù)制)的基本原理
mysql支持單向、異步復(fù)制,復(fù)制過程中一個服務(wù)器充當(dāng)主服務(wù)器,而一個或多個其它服務(wù)器充當(dāng)從服務(wù)器。mysql復(fù)制基于主服務(wù)器在二進(jìn)制日志中跟蹤所有對數(shù)據(jù)庫的更改(更新、刪除等等)。因此,要進(jìn)行復(fù)制,必須在主服務(wù)器上啟用二進(jìn)制日志。每個從服務(wù)器從主服務(wù)器接收主服務(wù)器已經(jīng)記錄到其二進(jìn)制日志的保存的更新。當(dāng)一個從服務(wù)器連接主服務(wù)器時,它通知主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置。從服務(wù)器接收從那時起發(fā)生的任何更新,并在本機(jī)上執(zhí)行相同的更新。然后封鎖并等待主服務(wù)器通知新的更新。從服務(wù)器執(zhí)行備份不會干擾主服務(wù)器,在備份過程中主服務(wù)器可以繼續(xù)處理更新。
二.mysql主從備份配置方法
在進(jìn)行mysql主從備份時,最好確保主從服務(wù)器的版本兼容。從服務(wù)器至少與主服務(wù)器版本相同或更高。
主機(jī)(master)配置:
1.修改mysql配置文件my.cnf
在[mysqld]標(biāo)簽下添加以下幾行
[plain]?view plaincopy
log-bin?#開啟二進(jìn)制日志??
server-id=id?#主服務(wù)器id號??
binlog-do-db=db_nameA?#指定對db_nameA記錄二進(jìn)制日志??
binlog-ignore-db=db_namB?#指定不對db_namB記錄二進(jìn)制日志??
注意:
log-bin,server-id是配置文件中必須添加的內(nèi)容。此時主服務(wù)器默認(rèn)對所有數(shù)據(jù)庫進(jìn)行備份。如果需要特殊指明只對某個數(shù)據(jù)庫進(jìn)行備份或不備份,則可以加入binlog-do-db和binlog-ignore-db選項(xiàng)。有關(guān)(log-bin的詳細(xì)說明見附錄1)
在測試主機(jī)上,我們實(shí)際添加入如下內(nèi)容:
[plain]?view plaincopy
log-bin??
server-id=1??
binlog-do-db=test??
2.為從服務(wù)器添加mysql賬戶并配置權(quán)限
在主服務(wù)器上,必須為從服務(wù)器創(chuàng)建一個用來連接主服務(wù)器的用戶,并設(shè)置replication slave權(quán)限。所用具體命令如下:
[sql]?view plaincopy
grant?replication?slave??
on?*.*??
to?'帳號'?@?'從服務(wù)器IP'?identified?by?'密碼';??
在測試機(jī)上,我們實(shí)際執(zhí)行:
[sql]?view plaincopy
grant?replication?slave??
on?*.*??
to?'replication'@'%'?identified?by?'sosotest';??
這時在mysql庫的user表中使用
[sql]?view plaincopy
select?*?from?user?where?user?=?'replication'?\G;??
可以看到Repl_slave_priv項(xiàng)對就的值為Y。
3.導(dǎo)出主服務(wù)器數(shù)據(jù)
導(dǎo)出主服務(wù)器數(shù)據(jù),以備之后將其導(dǎo)入從服務(wù)器,使主從服務(wù)器的初始狀態(tài)保持一致。
在測試機(jī)上,我們實(shí)際執(zhí)行:
[sql]?view plaincopy
mysqldump?test?>?test.bak??
4.記錄File 及Position 項(xiàng)的值
重啟mysql,使用show master status\G;查看主服務(wù)器狀態(tài),記錄File 及Position 項(xiàng)的值,以便之后對從服務(wù)器進(jìn)行配置。
在測試機(jī)上,我們實(shí)際執(zhí)行時看到的結(jié)果如下:
*************************** 1. row ***************************
File: simba-bin.000008
Position: 79
Binlog_Do_DB: test
Binlog_Ignore_DB:?
1 row in set (0.00 sec)
其中File為imba-bin.000008;Position為79。
至此主服務(wù)器配置完畢
從機(jī)(slave)配置:
1.修改mysql配置文件my.cnf
在[mysqld]標(biāo)簽下添加以下面一行:
[plain]?view plaincopy
server-id=id?#從機(jī)id??
實(shí)際中,我們添加:
[plain]?view plaincopy
server-id=2??
2.導(dǎo)入主機(jī)數(shù)據(jù)庫
在測試機(jī)上,我們實(shí)際執(zhí)行:
mysql test < test.bak
3.重啟mysql數(shù)據(jù)庫并設(shè)置相關(guān)參數(shù)
[sql]?view plaincopy
change?master?to??
master_host?=?'10.1.146.133',??
master_user?=?'replication',??
master_password?=?'sosotest',??
master_log_file?=?'darkstar-bin.000008',??
master_log_pos?=?79;??
slave?start;??
4.檢查數(shù)據(jù)庫查看相關(guān)參數(shù)
使用show slave status \G;查看相關(guān)參數(shù)是否正確。
在實(shí)際執(zhí)行時,我們在從機(jī)上看到的結(jié)果如下(只摘取了部分輸出):
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.146.133
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: darkstar-bin.000006
Read_Master_Log_Pos: 79
Relay_Log_File: simba-relay-bin.000003
Relay_Log_Pos: 171
Relay_Master_Log_File: darkstar-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……
對部分參數(shù)的解釋:
Slave_IO_State: Waiting for master to send event?
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上參數(shù)說聽slave正常運(yùn)行,正等待主服務(wù)器發(fā)來的消息。此時若用netstate命令可以看到從機(jī)與主機(jī)間已經(jīng)建立了一條邊接。
特別需要注意的兩個參數(shù)是:
Master_Log_File和Read_Master_Log_Pos。Master_Log_File代表主機(jī)上用于主備同步的日志文件名,Read_Master_Log_Pos代表上一次成功同步到的日志文件中的位置。
如果這兩項(xiàng)與先前在主服務(wù)器上看到的File及Position的值不相符,則無法正確進(jìn)行同步。
三.主從備份的實(shí)現(xiàn)細(xì)節(jié)
mysql使用3個線程來執(zhí)行復(fù)制功能(其中1個在主服務(wù)器上,另兩個在從服務(wù)器上)。當(dāng)發(fā)出start slave時,從服務(wù)器創(chuàng)建一個I/O線程,以連接主服務(wù)器并讓它發(fā)送記錄在其二進(jìn)制日志中的語句。主服務(wù)器創(chuàng)建一個線程將二進(jìn)制日志中的內(nèi)容發(fā)送到從服務(wù)器。該線程可以即為主服務(wù)器上show processlist輸出中的Binlog Dump線程。從服務(wù)器I/O線程讀取主服務(wù)器Binlog Dump線程發(fā)送的內(nèi)容并將該數(shù)據(jù)拷貝到從服務(wù)器數(shù)據(jù)目錄中的本地文件中,即中繼日志。第3個線程是sql線程,由從服務(wù)器創(chuàng)建,用于讀取中繼日志并執(zhí)行日志中包含的更新。在從服務(wù)器上,讀取和執(zhí)行更新語句被分成兩個獨(dú)立的任務(wù)。當(dāng)從服務(wù)器啟動時,其I/O線程可以很快地從主服務(wù)器索取所有二進(jìn)制日志內(nèi)容。
1.復(fù)制線程狀態(tài)
通過show slave status\G和show master status可以查看復(fù)制線程狀態(tài)。常見的線程狀態(tài)有:
(1)主服務(wù)器Binlog Dump線程
Has sent all binlog to slave; waiting for binlog to be updated
線程已經(jīng)從二進(jìn)制日志讀取所有主要的更新并已經(jīng)發(fā)送到了從服務(wù)器。線程現(xiàn)在正空閑,等待由主服務(wù)器上新的更新導(dǎo)致的出現(xiàn)在二進(jìn)制日志中的新事件。
(2)從服務(wù)器I/O線程狀態(tài)
Waiting for master to send event
線程已經(jīng)連接上主服務(wù)器,正等待二進(jìn)制日志事件到達(dá)。如果主服務(wù)器正空閑,會持續(xù)較長的時間。如果等待持續(xù)slave_read_timeout秒,則發(fā)生超時。此時,線程認(rèn)為連接被中斷并企圖重新連接。
(3)從服務(wù)器SQL線程狀態(tài)
Reading event from the relay log
線程已經(jīng)從中繼日志讀取一個事件,可以對事件進(jìn)行處理了。
Has read all relay log; waiting for the slave I/O thread to update it
線程已經(jīng)處理了中繼日志文件中的所有事件,現(xiàn)在正等待I/O線程將新事件寫入中繼日志。
2.復(fù)制過程中使用的傳遞和狀態(tài)文件
默認(rèn)情況,中繼日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務(wù)器主機(jī)名,nnnnnn是序列號。中繼日志與二進(jìn)制日志的格式相同,并且可以用mysqlbinlog讀取。
從服務(wù)器在data目錄中另外創(chuàng)建兩個小文件。這些狀態(tài)文件默認(rèn)名為主master.info和relay-log.info。狀態(tài)文件保存在硬盤上,從服務(wù)器關(guān)閉時不會丟失。下次從服務(wù)器啟動時,讀取這些文件以確定它已經(jīng)從主服務(wù)器讀取了多少二進(jìn)制日志,以及處理自己的中繼日志的程度。
附錄1
關(guān)于log_bin日志?
my.conf 文件中的[mysqld]標(biāo)簽下的log_bin指定日志文件,如果不提供文件名,mysql將自己產(chǎn)生缺省文件名。mysql會在文件名后面自動添加數(shù)字引,每次啟動服務(wù)時,都會重新生成一個新的二進(jìn)制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定記錄的數(shù)據(jù)庫;使用binlog-ignore-db可以指定不記錄的數(shù)據(jù)庫。注意的是:binlog-do-db和binlog-ignore-db一次只指定一個數(shù)據(jù)庫,指定多個數(shù)據(jù)庫需要多個語句。而且,MySQL會將所有的數(shù)據(jù)庫名稱改成小寫,在指定數(shù)據(jù)庫時必須全部使用小寫名字,否則不會起作用。
以后對數(shù)據(jù)庫每做的一次操作,都會在binlog中有所記錄。
轉(zhuǎn)載于:https://my.oschina.net/u/2375576/blog/528380
總結(jié)
以上是生活随笔為你收集整理的mysql主从库配置方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql Error 1142错误解决
- 下一篇: mysql事务和锁InnoDB