程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL復制的概述、安裝、故障、技巧、工具(2)

MySQL復制的概述、安裝、故障、技巧、工具(2)

編輯:關於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