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

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

編輯:關於MYSQL數據庫

MongoDBRedis這樣的NoSQL數據庫的復制相比,MySQL復制顯得相當復雜!

概述

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

MySQL復制

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_binloginnodb_flush_log_at_trx_commitinnodb_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服務再拷貝,否則拷貝文件可能無法使用。把拷貝的數據文件直接復制到從服務器的數據目錄。

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