這里簡單描述了如何為你當前的MySQL服務器設置完整的復制。假設你想要復制主服務器上的所有數據庫,并且還沒有配置的復制。你需要關閉主服務器來完成下面所列的步驟。
下面的程序針對設置一個從服務器,你可以用來設置多個從服務器。
雖然該方法是設置從服務器的最直接的途徑,它并不是唯一的一個。例如,如果你有一個主服務器的數據快照,并且主服務器已經設置了服務器ID,啟用了二進制日志,不需要關閉主服務器或停止對它的更新也可以設置從服務器。詳情請參見6.9節,“復制FAQ”。
如果想要管理MySQL復制設置,我們建議你通讀本章,并嘗試13.6.1節,“用于控制主服務器的SQL語句”和13.6.2節,“用于控制從服務器的SQL語句”中的所有語句。還應熟悉6.8節,“復制啟動選項”中描述的復制啟動選項。
注釋:該程序和后面章節所示的復制SQL語句需要SUPER權限。
1. 確保在服務器和從服務器上安裝的MySQL版本與6.5節,“不同MySQL版本之間的復制兼容性”所示的表兼容。理想情況,應在主服務器和從服務器上使用最近版本的MySQL。
請先證實問題不是出現在最新的MySQL版本中再通報bug。
2. 在主服務器上為服務器設置一個連接賬戶。該賬戶必須授予REPLICATION SLAVE權限。如果賬戶僅用于復制(推薦這樣做),則不需要再授予任何其它權限。(關于設置用戶 賬戶和權限的信息,參見5.8節,“MySQL用戶賬戶管理”)。
假定你的域為mydomain.com,想要創建用戶名為repl的一個賬戶,從服務器可以使用該賬戶從你的域內的任何主機使用密碼slavepass來訪問主服務器。要創建該 賬戶,可使用GRANT語句:
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
如果你計劃從從屬服務器主機使用LOAD TABLE FROM MASTER或LOAD DATA FROM MASTER語句,你需要授予該賬戶其它權限:
· 授予賬戶SUPER和RELOAD全局權限。
· 為所有想要裝載的表授予SELECT權限。任何該 賬戶不能SELECT的主服務器上的表被LOAD DATA FROM MASTER忽略掉。
3. 執行FLUSH TABLES WITH READ LOCK語句清空所有表和塊寫入語句:
4. mysql> FLUSH TABLES WITH READ LOCK;
對于InnoDB表,請注意:FLUSH TABLES WITH READ LOCK還鎖定COMMIT操作。當獲得全局讀鎖定后,可以開始InnoDB表的文件系統快照。快照不能保證內部(在InnoDB存儲引擎內部)一致性(因為InnoDB緩存沒有刷新),但并不需要關心該問題,因為InnoDB可以在啟動時解決該問題并給出一致的結果。這說明InnoDB在啟動快照時可以進行崩潰恢復,而不會破壞。然而,當保證一致的InnoDB表快照時,還沒有途徑來停止MySQL服務器。
讓客戶程序保持運行,發出FLUSH TABLES語句讓讀鎖定保持有效。(如果退出客戶程序,鎖被釋放)。然后對主服務器上的數據進行快照。
創建快照最簡單的途徑是使用歸檔程序對主服務器上的數據目錄中的數據庫進行二進制備份。例如,在Unix中使用tar,或者在Windows中使用PowerArchiver、WinRAR、WinZip或者類似的軟件。要使用tar來創建包括所有數據庫的歸檔文件,進入主服務器的數據目錄,然后執行命令:
shell> tar -cvf /tmp/mysql-snapshot.tar .
如果你想讓歸檔只包括this_db數據庫,應使用命令:
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
然后將歸檔文件復制到從服務器主機的/tmp目錄。在該機器上,進入從服務器的數據目錄,并使用下述命令解壓縮歸檔文件:
shell> tar -xvf /tmp/mysql-snapshot.tar
如果從服務器的用戶賬戶與主服務器的不同,你可能不想復制mysql數據庫。在這種情況下,應從歸檔中排除該數據庫。你也不需要在歸檔中包括任何日志文件或者master.info或relay-log.info文件。
當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時,讀取主服務器上當前的二進制日志名和偏移量值:
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。記錄該值。以后設置從服務器時需要使用這些值。它們表示復制坐標,從服務器應從該點開始從主服務器上進行新的更新。
取得快照并記錄日志名和偏移量后,可以在主服務器上重新啟用寫活動:
mysql> UNLOCK TABLES;
如果你正使用InnoDB表,理想情況應使用InnoDB Hot Backup工具,使用該工具可以獲得一致的快照而不需要在主服務器上進行鎖定,并且可以對應從服務器上使用的快照來記錄日志名和偏移量。Hot Backup是一個附加的非免費(商業)工具,沒有包含在標準 MySQL分發中。詳細信息參見http://www.innodb.com/manual.php的InnoDB Hot Backup主頁。
不使用Hot Backup工具,最快捷的途徑是使用InnoDB表的二進制快照來關閉主服務器并復制InnoDB數據文件、日志文件和表定義文件(.frm文件)。要記錄當前的日志文件名和偏移量,關閉服務器之前應發出下面的語句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
然后記錄前面所示的SHOW MASTER STATUS的輸出中顯示的日志名和偏移量。記錄日志名和偏移量后,不解鎖表關閉服務器以確保 服務器關閉時的快照與當前的日志文件和偏移量相對應:
shell> mysqladmin -u root shutdown
適合MyISAM和InnoDB表的另一個方法是對主服務器上的SQL進行轉儲而不是對前面討論的二進制復制進行轉儲。為了實現,可以在主服務器上使用mysqldump --master-data,以后將SQL轉儲文件裝入從服務器。但是,這樣比二進制復制要慢一些。
如果主服務器運行時沒有啟用--logs-bin,SHOW MASTER STATUS或mysqldump --master-data顯示的日志名和位置值為空。在這種情況下,當以后指定從服務器的日志文件和位置時需要使用的值為空字符串('')和4.
5. 確保主服務器主機上my.cnf文件的[mysqld]部分包括一個log-bin選項。該部分還應有一個server-id=Master_id選項,其中master_id必須為1到232–1之間的一個正整數值。例如:
6. [mysqld]
7. log-bin=mysql-bin
8. server-id=1
如果沒有提供那些選項,應添加它們并重啟服務器。
9. 停止用于從服務器的服務器并在其my.cnf文件中添加下面的行:
10. [mysqld]
11. server-id=slave_id
slave_id值同Master_id值一樣,必須為1到232–1之間的一個正整數值。并且,從服務器的ID必須與主服務器的ID不相同。例如:
[mysqld]
server-id=2
如果設置多個從服務器,每個從服務器必須有一個唯一的server-id值,必須與主服務器的以及其它從服務器的不相同。可以認為server-id值類似于IP地址:這些ID值能唯一識別復制服務器群集中的每個服務器實例。
如果不指定一個server-id值,如果沒有定義master-host,則將它設置為1;否則設置為2。請注意如果server-id太長,主服務器 拒絕所有來自從服務器的連接,并且從服務器拒絕連接到主服務器。這樣,省略server-id只適合用二進制日志備份。
12.如果對主服務器的數據進行二進制備份,啟動從服務器之前將它復制到從服務器的數據目錄中。確保對這些文件和目錄的權限正確。服務器 MySQL運行的用戶必須能夠讀寫文件,如同在主服務器上一樣。
如果使用mysqldum備份,先啟動從服務器(看下一步)。
13.啟動從服務器。如果前面已經復制了,用--skip-slave-start選項啟動從服務器,以便它不立即嘗試連接主服務器。你也可能想要用--logs-warnings選項啟動從服務器(默認設置啟用),以便在錯誤日志中顯示更多的問題相關的信息(例如,網絡或連接問題)。放棄的連接將記入錯誤日志,除非其值大于1。
14.如果使用mysqldump備份主服務器的數據,將轉儲文件裝載到從服務器:
15. shell> mysql -u root -p < dump_file.sql
16. 在從服務器上執行下面的語句,用你的系統的實際值替換選項值:
17. mysql> CHANGE MASTER TO
18. -> MASTER_HOST='master_host_name',
19. -> MASTER_USER='replication_user_name',
20. -> MASTER_PASSWORD='replication_password',
21. -> MASTER_LOG_FILE='recorded_log_file_name',
22. -> MASTER_LOG_POS=recorded_log_position;
下面的表顯示了字符串選項的最大長度:
Master_Host |
60 |
Master_USER |
16 |
Master_PASSWORD |
32 |
Master_Log_File |
255 |
23.啟動從服務器線程:
24. mysql> START SLAVE;
執行這些程序后,從服務器應連接主服務器,并補充自從快照以來發生的任何更新。
如果你忘記設置主服務器的server-id值,從服務器不能連接主服務器。
如果你忘記設置從服務器的server-id值,在從服務器的錯誤日志中會出現下面的錯誤:
Warning: You should set server-id to a non-0 value if master_host is set;
we will force server id to 2, but this MySQL server will not act as a slave.
如果由于其它原因不能復制,從服務器的錯誤日志中也會出現錯誤消息。
從服務器復制時,會在其數據目錄中發現文件dmaster.info和relay-log.info。從服務器使用這兩個文件跟蹤已經處理了多少主服務器的二進制日志。不要移除或編輯這些文件,除非你確切知你正在做什么并完全理解其意義。即使這樣,最好是使用CHANGE MASTER TO語句。
注釋:master.info的內容會覆蓋命令行或in my.cnf中指定的部分選項。詳情參見6.8節,“復制啟動選項”。
有了一個快照,你可以用它根據剛剛描述的從服務器部分來設置其它從服務器。你不需要主服務器的另一個快照;每個從服務器可以使用相同的快照。
注釋:為了保證事務InnoDB復制設置的最大可能的耐受性和一致性,應在主服務器的my.cnf文件中使用innodb_flush_log_at_trx_commit=1和sync-binlog=1。