程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL復制的概述、裝置、毛病、技能、對象(火丁分享)

MySQL復制的概述、裝置、毛病、技能、對象(火丁分享)

編輯:MySQL綜合教程

MySQL復制的概述、裝置、毛病、技能、對象(火丁分享)。本站提示廣大學習愛好者:(MySQL復制的概述、裝置、毛病、技能、對象(火丁分享))文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL復制的概述、裝置、毛病、技能、對象(火丁分享)正文


同MongoDB,Redis如許的NoSQL數據庫的復制比擬,MySQL復制顯得相當龐雜!

概述

起首主辦事器把數據變更記載到主日記,然後從辦事器經由過程I/O線程讀取主辦事器上的主日記,而且把它寫入到從辦事器的中繼日記中,接著SQL線程讀取中繼日記,而且在從辦事器上重放,從而完成MySQL復制。詳細以下圖所示:

全部進程反應到從辦事器上,對應三套日記信息,可在從辦事器上用以下敕令檢查:

mysql> SHOW SLAVE STATUS;


Master_Log_File & Read_Master_Log_Pos:下一個傳輸的主日記信息。
Relay_Master_Log_File & Exec_Master_Log_Pos:下一個履行的主日記信息。
Relay_Log_File & Relay_Log_Pos:下一個履行的中繼日記信息。
懂得這些日記信息的寄義關於處理毛病相當主要,後文會具體論述。
裝置
先在主辦事器上創立復制賬號:

mysql> GRANT REPLICATION SLAVE ON *.*
TO '<SLAVE_USER>'@'<SLAVE_HOST>'
IDENTIFIED BY '<SLAVE_PASSWORD>';

注:出於平安性和靈巧性的斟酌,不要把root等具有SUPER權限用戶作為復制賬號。然後設置主辦事器設置裝備擺設文件(缺省:/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

注:必定要包管主從辦事器各自的server_id獨一,防止抵觸。

注:假如沒有指定log_bin的話,缺省會應用主機名作為名字,如斯一來一旦主機名產生轉變,就會出成績,所以推舉指定log_bin(從辦事器的relay_log存在一樣的成績)。

注:sync_binlog,innodb_flush_log_at_trx_commit,innodb_support_xa三個選項都是出於平安目標設置的,不是復制的必需選項。

接著設置從辦事器設置裝備擺設文件(缺省:/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權限,則read_only有效。

注:有了skip_slave_start,除非應用START SLAVE敕令,不然從辦事器不會開端復制。

注:設置log_slave_updates,讓從辦事器記載日記,有助於在需要時把從切換成主。

上面最主要的步調是若何克隆一份主辦事器的數據:

假如數據庫應用的是MyISAM表類型的話,可按以下方法操作:

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

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

假如數據庫應用的是InnoDB表類型的話,則應當應用single-transcation:

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

有了數據文件,傳輸到從辦事器上並導入:

shell> mysql < data.sql

假如數據量很年夜的話,mysqldump會異常慢,此時直接拷貝數據文件能節儉很多時光:
在拷貝之前要先鎖定命據,然後再取得相干的日記信息(FILE & POSITION):

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

接上去拷貝數據文件時,假如是MyISAM表類型的話,直接拷貝便可;假如是InnoDB表類型的話,必定要先停滯MySQL辦事再拷貝,不然拷貝文件能夠沒法應用。把拷貝的數據文件直接復制到從辦事器的數據目次。
最初還須要再指定一下日記信息:

mysql> CHANGE MASTER TO
MASTER_HOST='<MASTER_HOST>',
MASTER_USER='<SLAVE_USER>',
MASTER_PASSWORD='<SLAVE_PASSWORD>',
MASTER_LOG_FILE='<FILE>',
MASTER_LOG_POS=<POSITION>;



注:不要在my.cnf設置裝備擺設文件裡設置MASTER_USER和MASTER_PASSWORD,由於終究失效的是CHANGE MASTER TO生成的master.info文件裡的信息。

在主辦事器上直接拷貝數據文件固然很快,但須要鎖表或許停滯辦事,這會影響線上辦事。假如先前曾經有了從辦事器,那末可以用舊的從辦事器做母原來克隆新的從辦事器:

先在舊的從辦事器上查詢日記信息:

mysql> SHOW SLAVE STATUS;



我們須要的是個中的Relay_Master_Log_File & Exec_Master_Log_Pos。

然後在舊的從辦事器上依照後面的辦法獲得數據,並在新的從辦事器上復原。

接著在新的從辦事器上設置日記信息:

mysql> CHANGE MASTER TO
MASTER_HOST='<MASTER_HOST>',
MASTER_USER='<SLAVE_USER>',
MASTER_PASSWORD='<SLAVE_PASSWORD>',
MASTER_LOG_FILE='<Relay_Master_Log_File>',
MASTER_LOG_POS=<Exec_Master_Log_Pos>;


不論用誰人辦法,最初記得在從辦事器上啟動復制,並檢討任務能否正常:

mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;

假如IO線程和SQL線程都顯示Yes,便可以感激天主了:

Slave_IO_Running 對應:Master_Log_File & Read_Master_Log_Pos

Slave_SQL_Running 對應:Relay_Master_Log_File & Exec_Master_Log_Pos

假如顯示No,則解釋後面某些設置裝備擺設步調失足,或許對應的日記文件有成績。

毛病

成績:主從復制不止何以停滯了,我該怎樣辦?

謎底:復制毛病多半是由於日記毛病惹起的,所以起首要弄清晰是主日記毛病照樣中繼日記毛病,從毛病信息裡普通就可以斷定,假如不克不及可使用相似上面的mysqlbinlog敕令:

shell> mysqlbinlog <MASTER_BINLOG_FILE> > /dev/null
shell> mysqlbinlog <SLAVE_BINLOG_FILE> > /dev/null

假如沒有毛病,則不會有任何輸入,反之假如有毛病,則會顯示出來。
假如是主日記毛病,則須要在從辦事器應用SET GLOBAL sql_slave_skip_counter,以下:

mysql> SET GLOBAL sql_slave_skip_counter = 1;
mysql> START SLAVE;


注:假如有多個毛病,能夠須要履行屢次(提示:主從辦事器數據能夠是以紛歧致)。
假如是中繼日記毛病,只需在從辦事器應用SHOW SLAVE STATUS成果中的日記信息從新CHANGE MASTER TO便可,體系會擯棄以後的中繼日記,從新下載:

mysql> CHANGE MASTER TO
MASTER_LOG_FILE='<Relay_Master_Log_File>',
MASTER_LOG_POS=<Exec_Master_Log_Pos>;
mysql> START SLAVE;


至於為何應用的是Relay_Master_Log_File & Exec_Master_Log_Pos,拜見概述。
成績:主辦事器宕機了,若何把從辦事器晉升會主辦事器?
謎底:在一主多從的情況總,需選擇數據最新的從辦事器做新的主辦事器。以下圖所示:

晉升從辦事器為主辦事器

在一主(Server1)兩從(Server2,、Server3)的情況中,Server1宕機後,比及Server1和Server2把宕機前同步到的日記都履行完,比擬Master_Log_File和Read_Master_Log_Pos便可以斷定出誰快誰慢,由於Server2從 Server1同步的數據(1582)比Server3從Server1同步的數據(1493)新,所以應當晉升Server2為新的主辦事器,那末 Server3在CHANGE MASTER TO到Server2的時刻應當應用甚麼樣的參數呢?1582-1493=89,而Server2的最初的二進制日記地位是8167,所以謎底是 8167-89=8078。

技能

主從辦事器中的表可使用分歧的表類型。好比主辦事器可使用InnoDB表類型,供給事務,行鎖等高等特征,從辦事器可使用MyISAM表類型,內存消費少,易備份等長處。還有一個例子,一台主辦事器假如同時帶許多個從辦事器的話,必將會影響其機能,此時可以拿出一台辦事器作為從辦事器署理,應用BLACKHOLE表類型,只記載日記,不寫數據,由它帶多台從辦事器,從而晉升機能。

主從辦事器中的表可使用分歧的鍵類型。好比主辦事器用InnoDB,鍵用VARCHAR的話節儉空間,從辦事器應用MyISAM,鍵用CHAR進步速度,由於MyISAM有靜態表一說。

主從辦事器中的表可使用分歧的索引。主辦事器重要用來敷衍寫操作,所以除主鍵和獨一索引等包管數據關系的索引普通都可以不加,從辦事器普通用來敷衍讀操作,所以可以針對查詢特點設置索引,再進一步,分歧的從辦事器可以針對分歧的查詢設置分歧的索引。

對象

有一些優良的對象可讓你的復制任務獲得事半功倍的後果,具體內容請參考各自文檔:

Multi-Master Replication Manager for MySQL

Percona XtraBackup

Maatkit

Tungsten-replicator

另外,Google Project Hosting裡還有許多風趣的項目,可用mysql+replication標簽搜刮。

解釋:本文參考了上面列出的書本中相干的內容:

High Performance MySQL: Optimization, Backups, Replication, and More

MySQL High Availability: Tools for Building Robust Data Centers

(起源:火丁筆記)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved