日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
MySQL復(fù)制的概述、安裝、故障、技巧、工具

同MongoDB,Redis這樣的NoSQL數(shù)據(jù)庫的復(fù)制相比,MySQL復(fù)制顯得相當復(fù)雜!接下來就是詳細的介紹,相信下文中的內(nèi)容對大家掌握MySQL數(shù)據(jù)庫的復(fù)制是非常有幫助的。

創(chuàng)新互聯(lián)專業(yè)提供成都主機托管四川主機托管成都服務(wù)器托管四川服務(wù)器托管,支持按月付款!我們的承諾:貴族品質(zhì)、平民價格,機房位于中國電信/網(wǎng)通/移動機房,簡陽服務(wù)器托管服務(wù)有保障!

概述

首先主服務(wù)器把數(shù)據(jù)變化記錄到主日志,然后從服務(wù)器通過I/O線程讀取主服務(wù)器上的主日志,并且把它寫入到從服務(wù)器的中繼日志中,接著SQL線程讀取中繼日志,并且在從服務(wù)器上重放,從而實現(xiàn)MySQL復(fù)制。具體如下圖所示:

MySQL復(fù)制

整個過程反映到從服務(wù)器上,對應(yīng)三套日志信息,可在從服務(wù)器上用如下命令查看:

mysql> SHOW SLAVE STATUS;

Master_Log_File & Read_Master_Log_Pos:下一個傳輸?shù)闹魅罩拘畔ⅰ?/p>

Relay_Master_Log_File & Exec_Master_Log_Pos:下一個執(zhí)行的主日志信息。

Relay_Log_File & Relay_Log_Pos:下一個執(zhí)行的中繼日志信息。

理解這些日志信息的含義對于解決故障至關(guān)重要,后文會詳細闡述。

安裝

先在主服務(wù)器上創(chuàng)建復(fù)制賬號:

mysql> GRANT REPLICATION SLAVE ON *.*

TO ''@''

IDENTIFIED BY '';

注:出于安全性和靈活性的考慮,不要把root等具有SUPER權(quán)限用戶作為復(fù)制賬號。

然后設(shè)置主服務(wù)器配置文件(缺?。?etc/my.cnf):

[mysqld]

server_id = 100

log_bin = mysql-bin

log_bin_index = mysql-bin.index

sync_binlog = 1

innodb_flush_log_at_trx_commit = 1

innodb_support_xa = 1

注:一定要保證主從服務(wù)器各自的server_id唯一,避免沖突。

注:如果沒有指定log_bin的話,缺省會使用主機名作為名字,如此一來一旦主機名發(fā)生改變,就會出問題,所以推薦指定log_bin(從服務(wù)器的relay_log存在一樣的問題)。

注:sync_binlog,innodb_flush_log_at_trx_commit,innodb_support_xa三個選項都是出于安全目的設(shè)置的,不是復(fù)制的必須選項。

接著設(shè)置從服務(wù)器配置文件(缺?。?etc/my.cnf):

[mysqld]

server_id = 200

log_bin = mysql-bin

log_bin_index = mysql-bin.index

relay_log = mysql-relay-bin

relay_log_index = mysql-relay-bin.index

read_only = 1

skip_slave_start = 1

log_slave_updates = 1

注:如果用戶有SUPER權(quán)限,則read_only無效。

注:有了skip_slave_start,除非使用START SLAVE命令,否則從服務(wù)器不會開始復(fù)制。

注:設(shè)置log_slave_updates,讓從服務(wù)器記錄日志,有助于在必要時把從切換成主。

下面最重要的步驟是如何克隆一份主服務(wù)器的數(shù)據(jù):

如果數(shù)據(jù)庫使用的是MyISAM表類型的話,可按如下方式操作:

shell> mysqldump --all-databases --master-data=1 > data.sql

注:master-data選項缺省會打開lock-all-tables,并寫入CHANGE MASTER TO語句。

如果數(shù)據(jù)庫使用的是InnoDB表類型的話,則應(yīng)該使用single-transcation:

shell> mysqldump --all-databases --single-transaction --master-data=1 > data.sql

有了數(shù)據(jù)文件,傳輸?shù)綇姆?wù)器上并導(dǎo)入:

shell> mysql < data.sql

如果數(shù)據(jù)量很大的話,mysqldump會非常慢,此時直接拷貝數(shù)據(jù)文件能節(jié)省不少時間:

在拷貝之前要先鎖定數(shù)據(jù),然后再獲得相關(guān)的日志信息(FILE & POSITION):

mysql> FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS;

接下來拷貝數(shù)據(jù)文件時,如果是MyISAM表類型的話,直接拷貝即可;如果是InnoDB表類型的話,一定要先停止MySQL服務(wù)再拷貝,否則拷貝文件可能無法使用。把拷貝的數(shù)據(jù)文件直接復(fù)制到從服務(wù)器的數(shù)據(jù)目錄。

#p#

最后還需要再指定一下日志信息:

mysql> CHANGE MASTER TO

MASTER_HOST='',

MASTER_USER='',

MASTER_PASSWORD='',

MASTER_LOG_FILE='',

MASTER_LOG_POS=;

注:不要在my.cnf配置文件里設(shè)置MASTER_USER和MASTER_PASSWORD,因為最終生效的是CHANGE MASTER TO生成的master.info文件里的信息。

在主服務(wù)器上直接拷貝數(shù)據(jù)文件雖然很快,但需要鎖表或者停止服務(wù),這會影響線上服務(wù)。如果先前已經(jīng)有了從服務(wù)器,那么可以用舊的從服務(wù)器做母本來克隆新的從服務(wù)器:

先在舊的從服務(wù)器上查詢?nèi)罩拘畔ⅲ?/p>

mysql> SHOW SLAVE STATUS;

我們需要的是其中的Relay_Master_Log_File & Exec_Master_Log_Pos。

然后在舊的從服務(wù)器上按照前面的方法得到數(shù)據(jù),并在新的從服務(wù)器上還原。

接著在新的從服務(wù)器上設(shè)置日志信息:

mysql> CHANGE MASTER TO

MASTER_HOST='',

MASTER_USER='',

MASTER_PASSWORD='',

MASTER_LOG_FILE='',

MASTER_LOG_POS=;

不管用那個方法,最后記得在從服務(wù)器上啟動復(fù)制,并檢查工作是否正常:

mysql> START SLAVE;

mysql> SHOW SLAVE STATUS;

如果IO線程和SQL線程都顯示Yes,就可以感謝上帝了:

Slave_IO_Running 對應(yīng):Master_Log_File & Read_Master_Log_Pos

Slave_SQL_Running 對應(yīng):Relay_Master_Log_File & Exec_Master_Log_Pos

如果顯示No,則說明前面某些配置步驟出錯,或者對應(yīng)的日志文件有問題。

故障

問題:主從復(fù)制不止何故停止了,我該怎么辦?

答案:復(fù)制錯誤多半是因為日志錯誤引起的,所以首先要搞清楚是主日志錯誤還是中繼日志錯誤,從錯誤信息里一般就能判斷,如果不能可以使用類似下面的mysqlbinlog命令:

shell> mysqlbinlog > /dev/null

shell> mysqlbinlog > /dev/null

如果沒有錯誤,則不會有任何輸出,反之如果有錯誤,則會顯示出來。

如果是主日志錯誤,則需要在從服務(wù)器使用SET GLOBAL sql_slave_skip_counter,如下:

mysql> SET GLOBAL sql_slave_skip_counter = 1;

mysql> START SLAVE;

注:如果有多個錯誤,可能需要執(zhí)行多次(提醒:主從服務(wù)器數(shù)據(jù)可能因此不一致)。

如果是中繼日志錯誤,只要在從服務(wù)器使用SHOW SLAVE STATUS結(jié)果中的日志信息重新CHANGE MASTER TO即可,系統(tǒng)會拋棄當前的中繼日志,重新下載:

mysql> CHANGE MASTER TO

MASTER_LOG_FILE='',

MASTER_LOG_POS=;

mysql> START SLAVE;

至于為什么使用的是Relay_Master_Log_File & Exec_Master_Log_Pos,參見概述。

問題:主服務(wù)器宕機了,如何把從服務(wù)器提升會主服務(wù)器?

答案:在一主多從的環(huán)境總,需選擇數(shù)據(jù)最新的從服務(wù)器做新的主服務(wù)器。如下圖所示:

提升從服務(wù)器為主服務(wù)器

在一主(Server1)兩從(Server2,、Server3)的環(huán)境中,Server1宕機后,等到Server1和Server2把宕機前同步到的日志都執(zhí)行完,比較Master_Log_File和Read_Master_Log_Pos就可以判斷出誰快誰慢,因為Server2從 Server1同步的數(shù)據(jù)(1582)比Server3從Server1同步的數(shù)據(jù)(1493)新,所以應(yīng)該提升Server2為新的主服務(wù)器,那么 Server3在CHANGE MASTER TO到Server2的時候應(yīng)該使用什么樣的參數(shù)呢?1582-1493=89,而Server2的最后的二進制日志位置是8167,所以答案是 8167-89=8078。

技巧

主從服務(wù)器中的表可以使用不同的表類型。比如主服務(wù)器可以使用InnoDB表類型,提供事務(wù),行鎖等高級特性,從服務(wù)器可以使用MyISAM表類型,內(nèi)存消耗少,易備份等優(yōu)點。還有一個例子,一臺主服務(wù)器如果同時帶很多個從服務(wù)器的話,勢必會影響其性能,此時可以拿出一臺服務(wù)器作為從服務(wù)器代理,使用BLACKHOLE表類型,只記錄日志,不寫數(shù)據(jù),由它帶多臺從服務(wù)器,從而提升性能。

主從服務(wù)器中的表可以使用不同的鍵類型。比如主服務(wù)器用InnoDB,鍵用VARCHAR的話節(jié)省空間,從服務(wù)器使用MyISAM,鍵用CHAR提高速度,因為MyISAM有靜態(tài)表一說。

主從服務(wù)器中的表可以使用不同的索引。主服務(wù)器主要用來應(yīng)付寫操作,所以除了主鍵和唯一索引等保證數(shù)據(jù)關(guān)系的索引一般都可以不加,從服務(wù)器一般用來應(yīng)付讀操作,所以可以針對查詢特征設(shè)置索引,再進一步,不同的從服務(wù)器可以針對不同的查詢設(shè)置不同的索引。

工具

有一些優(yōu)秀的工具可以讓你的復(fù)制工作得到事半功倍的效果,詳細內(nèi)容請參考各自文檔:

Multi-Master Replication Manager for MySQL

Percona XtraBackup

Maatkit

Tungsten-replicator

關(guān)于MySQL復(fù)制的概述、安裝、故障、技巧、工具的內(nèi)容就為大家講解到這里,希望對大家學習MySQL數(shù)據(jù)庫有所幫助,本文僅供大家參考。


本文標題:MySQL復(fù)制的概述、安裝、故障、技巧、工具
文章路徑:http://www.dlmjj.cn/article/djjdeog.html