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

日期:2006-09-23  作者:喜騰小二  來源:PHPChina


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_HOST60
MASTER_USER16
MASTER_PASSWORD32
MASTER_LOG_FILE255

啓動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都可以用這一份快照來做。

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计