MySQL同步(二) 設定同步

來源:互聯網
上載者:User
 

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上指定的參數值就是Null 字元串('') 和 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都可以用這一份快照來做。



引用:
http://database.ccidnet.com/art/1105/20060811/792867_1.html
http://database.ccidnet.com/art/1105/20060811/792867_2.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.