MySQL復制的概述、裝置、毛病、技能、對象(火丁分享)。本站提示廣大學習愛好者:(MySQL復制的概述、裝置、毛病、技能、對象(火丁分享))文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL復制的概述、裝置、毛病、技能、對象(火丁分享)正文
注:必定要包管主從辦事器各自的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
(起源:火丁筆記)