程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL手冊版本 5.0.20-MySQL同步(二)

MySQL手冊版本 5.0.20-MySQL同步(二)

編輯:關於MYSQL數據庫

6.4 設置同步

以下描述了如何快速設置MySQL同步服務器。假設你打算同步全部的數據庫,並且之前沒有設置過。需要關閉master服務器以完成全部的步驟。

本章描述的過程可以用於一個slave的情況,也可以用於多個slave的情況。

這只是一個最直接設置slave的辦法,並不是只有一個。例如,已經有了master的數據快照(snapshot),master已經設置了服務器編號ID(server_id)並且啟用了二進制日志,這就無需關閉master或者阻止在master上更新數據了。詳情請看"6.9 Replication FAQ"。

想要完全掌握MySQL同步設置,最好把本章全部讀完,並且測試在"14.6.1 SQL Statements for Controlling Master Servers"和"14.6.2 SQL Statements for Controlling Slave Servers"中提到的全部語句。而且要熟悉各種同步設置選項,詳情請看"6.8 Replication Startup Options"。

注意,這個過程以及後面一些同步SQL語句需要有 SUPER 權限。MySQL 4.0.2以前,則是 PROCESS 權限。

請確認master和slave上都安裝了較近的MySQL版本,且這些版本之間要能兼容,在"6.5 Replication Compatibility Between MySQL Versions"中列出來了。請確認在最新版本中還有存在問題,否則不要報告該bug。

在master上新加一個帳戶,slave才能用它來連接。這個帳戶必須授予 REPLICATION SLAVE 權限。如果這個帳戶只用於同步(推薦這麼做),那就沒必要授予其他權限了。設定你的域是 mydomain.com,想要授權一個帳戶 repl 使用密碼 slavepass,允許它可以在域裡的任何主機連接到master上。用 GRANT 語句來創建帳戶:

MySQL> GRANT REPLICATION SLAVE ON *.*

-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

在MySQL 4.0.2以前,用 FILE 權限來代替 REPLICATION SLAVE:

MySQL> GRANT FILE ON *.*

-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

如果打算在slave上執行 LOAD TABLE FROM MASTER 或 LOAD DATA FROM MASTER 語句,那麼必須給該帳戶授予附加權限:

授予全局 SUPER 和 RELOAD 權限。

授予對想要加載的所有表上的 SELECT 權限。在master上任何沒有 SELECT 權限的表都會被 LOAD DATA FROM MASTER 略過。

如果只用到 MyISAM 表,執行 FLUSH TABLES WITH READ LOCK 語句刷新所有表並且阻止其他寫入:

MySQL> FLUSH TABLES WITH READ LOCK;

不要退出執行 FLUSH TABLES 語句的客戶端,以保持讀鎖有效(如果退出了,讀鎖就釋放了)。然後從master上取得數據快照。比較簡單的辦法就是把數據目錄打包壓縮。例如,Unix上的 tar, PowerArchiver, WinRAR, WinZip,或Windows上的類似程序。想要用 tar 來創建一個壓縮包,包括所有的數據庫,只需執行以下命令(把目錄改成你的真實路徑):

shell> tar -cvf /tmp/MySQL-snapshot.tar .

如果只想打包一個數據庫 this_db,只需執行命令:

shell> tar -cvf /tmp/MySQL-snapshot.tar ./this_db

然後把這個文件拷貝到slave的 `/tmp` 目錄下。在slave上,執行以下命令解開壓縮包(把目錄改成你的真實路徑):

shell> tar -xvf /tmp/MySQL-snapshot.tar

可能不需要同步 MySQL 數據庫,因為在slave上的權限表和master不一樣。這時,解開壓縮包的時候要排除它。同時在壓縮包中也不要包含任何日志文件,或者 `master.info' 或 `relay-log.info` 文件。當在master上的 FLUSH TABLES WITH READ LOCK 語句還生效時,在master上讀取當前二進制文件的文件名及偏移位置:

MySQL > SHOW MASTER STATUS;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| mysql-bin.003 | 73 | test | manual,MySQL |

+---------------+----------+--------------+------------------+

File 字段顯示了二進制日志文件名,Position 字段顯示了日志偏移位置。在這個例子中,日志文件是 MySQL-bin.003,偏移位置是 73。記下這些值,在後面設置slave的時候就需要用到它們了。它們表示了slave要從master的哪個偏移位置開始處理更新操作。取得快照和記錄下日志名及偏移位置後,就可以讓master釋放讀鎖了:

MySQL> UNLOCK TABLES;

如果用到 InnoDB 表,那麼最好使用 InnoDB Hot Backup 工具。它無需在master上請求任何鎖就能做到快照的一致性,並且在後面中在slave上要用到的快照中已經記錄了日志文件名以及偏移位置。InnoDB Hot Backup 是費免費(商業的)的附加工具,它沒有包含在MySQL發布包中。訪問 InnoDB Hot Backup 的主頁 http://www.innodb.com/manual.PHP 查看更多詳細信息。除去 InnoDB Hot Backup 的另一個最快的辦法就是關閉master服務器,拷貝 InnoDB 數據文件,日志文件,以及表結構定義文件(`.frm` 文件)。想要記錄當前日志文件及偏移位置,需要在master關閉前執行如下可語句:

MySQL> FLUSH TABLES WITH READ LOCK;

MySQL> SHOW MASTER STATUS;

盡快記下 SHOW MASTER STATUS 顯示結果中的日志文件及偏移位置。然後,在不解鎖的情況下關閉master,確保master上的快照和記錄的結果一致:

shell> MySQLadmin -u root shutdown

還有一個方法可以同時用於 MyISAM 和 InnoDB 表,這就是在master上作SQL轉儲而無需如上所述備份二進制日志。在master上運行 MySQLdump --master-data 命令,然後把結果文件轉儲到slave上。不過,這比拷貝二進制日志慢點。如果master在以前沒有啟用 --log-bin 選項,那麼執行 SHOW MASTER STATUS 語句的結果中的文件名及偏移位置值為空了,那麼後面在slave上指定的參數值就是空字符串('') 和 4了。

確認master上的 `my.cnf` 文件 [MySQLd] 區間有 log-bin 選項。這個區間還必須有 server-id=master_id 選項,的值必須是 1 到 2^32-1 之間的正整數。例如:

[MySQLd]

log-bin

server-id=1

如果這些配置選項不存在,那麼就加上並且重啟master。

關閉要做slave的服務器,在 `my.cnf` 文件中增加如下選項:

[MySQLd]

server-id=slave_id

slave_id 的值和 master_id 類似,是 1 到 2^32-1 之間的正整數。另外,這個ID必須不能和master的ID一樣。例如:

[MySQLd]

server-id=2

如果有多個slave,那麼每個slave都必須要有一個唯一的 server-id,它的值不能和master以及其其他slave的值一樣。可以把 server-id 想象成為IP地址:這些ID標識了整個同步組合中的每個服務器。如果沒有指定 server-id 的值,如果也沒定義 master-host,那麼它的值就為1,否則為2。注意,如果沒有設定 server-id,那麼master就會拒絕所有的slave連接,同時slave也會拒絕連接到master上。因此,省略配置 server-id 只對備份二進制日志有利。

如果已經備份了master上的數據(直接打包壓縮的方式),那麼在slave啟動之前把它們拷貝過去。要確保文件的權限屬主等設置沒問題。MySQL運行的用戶必須對這些文件有讀寫權限,就跟在master上一樣。如果是用 MySQLdump 備份的,那麼可以直接啟動salve(直接跳到下一步)。

啟動slave,如果它之前已經運行同步了,那麼在啟動slave的時候使用 --skip-slave-start 選項使之不會立刻去連接master。最好也使用 --log-warnings 選項(從 MySQL 4.0.19 和 4.1.2 開始就是默認啟用了)來啟動slave,以知道發生問題時的更詳細的信息(例如,網絡或者連接問題)。從開始MySQL 4.0.21 和 4.1.3,異常中止的連接不再記錄到錯誤日志中,除非 --log-warnings 選項的值大於1。

如果在master上用 MySQLdump 備份數據的話,把文件導入slave中:

shell> MySQL -u root -p < dump_file.sql

在slave上執行如下語句,把各個選項的值替換成真實值:

MySQL> CHANGE MASTER TO

-> MASTER_HOST='master_host_name',

-> MASTER_USER='replication_user_name',

-> MASTER_PASSWORD='replication_passWord',

-> MASTER_LOG_FILE='recorded_log_file_name',

-> MASTER_LOG_POS=recorded_log_position;

下表列出了各個選項字符串的最大長度:

MASTER_HOST 60 MASTER_USER 16 MASTER_PASSWord 32 MASTER_LOG_FILE 255

啟動slave線程:

MySQL> START SLAVE;

做完上述過程後,slave應該會連接到master上並且捕獲所有從取得快照後的更新操作。

如果忘了設置master的 server-id 值,那麼slave就不能連接到master上。

如果忘了設置master的 server-id 值,那麼在錯誤日志中就會記錄如下內容:

Warning: You should set server-id to a non-0 value if master_host is set;

we force server id to 2, but this MySQL Server will not act as a slave.

如果因為其他原因不能同步的話,錯誤信息也會記錄在slave的日志上。

一旦slave開始同步了,就能在數據文件目錄下找到2個文件 `master.info` 和`relay-log.info`。slave利用這2個文件來跟蹤處理了多少master的二進制日志。

不要刪除或者修改這2個文件,除非知道怎麼改。盡管如此,我們更推薦用 CHANGE MASTER TO 語句來做。

注意:`master.info` 中的內容覆蓋了部分命令行中指定的或 `my.cnf` 的選項。詳情請看"6.8 Replication Startup Options"。

只要有了master的數據快照,就可以按照上述幾個步驟配置其它slave了。無需再次取得master的數據快照,每個slave都可以用這一份快照來做。

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