6.8 同步啟動選項
不管是master還是slave,都要設定 server-id 選項來確定使它們都有各自唯一的同步ID。必須選擇 1 到 2^32-1 之間的正整數。例如: server-id=3。
關於master伺服器上可用於控制二進位日誌記錄的選項詳細描述請看"5.9.4 The Binary Log"。
下表描述了slave同步可用的選項,可以在命令列或者設定檔中設定它們。
一些slave同步選項以特定的方式來處理,在slave啟動時,如果存在 `master.info` 檔案並且包含這些選項,那麼slave將略過它們。這些選項如下:
--master-host
--master-user
--master-password
--master-port
--master-connect-retry
從MySQL 4.1.1開始,一下選項也按照上述方式特殊處理:
--master-ssl
--master-ssl-ca
--master-ssl-capath
--master-ssl-cert
--master-ssl-cipher
--master-ssl-key
在MySQL 4.1.1中, `master.info` 檔案的格式改變了以包含相應的SSL選項。另外,MySQL 4.1.1檔案格式還包括了在第一行中的檔案總行數。如果從舊版本升級到4.1.1,那麼伺服器啟動時會自動升級 `master.info` 為新的格式。不過,如果是從4.1.1降級到舊版本,就需要在系統第一次啟動時手工刪除檔案的第一行。注意,這種情況下,被降級的伺服器就不能再使用SSL選項串連到master了。
slave啟動時如果不存在 `master.info` 檔案,它就使用在命令列或者設定檔中指定的參數值來啟動。這在每次第一次啟動slave伺服器時都是這樣,或者執行 RESET SLAVE 語句關閉且重啟slave之後。
slave啟動時如果存在 `master.info` 檔案,那麼它就略過這些選項,而是直接讀取 `master.info` 檔案中的值。
如果重啟salve時使用的選項值和 `master.info` 中的不一樣,那麼這個新的值不會生效,因為slave伺服器還是照樣唯讀取 `master.info` 檔案。想要使用不同的選項值,可以在刪除 `master.info` 後重啟slave或者使用 CHANGE MASTER TO 語句(推薦)重設選項值。
假定在 `my.cnf` 設定了以下選項值:
[mysqld]
master-host=some_host
第一次啟動slave的時候,它從 `my.cnf` 中讀取選項值,然後再把它們儲存在 `master.info` 中。下次重啟slave時,它就唯讀取 `master.info` 的內容而略過 `my.cnf` 中的選項值了。企圖修改 `my.cnf` 來改變同步選項是不可行的,不過可以通過執行 CHANGE MASTER TO 語句來實現:
由於伺服器認為 `master.info` 的優先順序比設定檔高,因此建議根本不要在啟動時附加同步選項,而只用 CHANGE MASTER TO 語句。詳情請看"14.6.2.1 CHANGE MASTER TO Syntax"。
下例顯示了一些配置slave的擴充選項:
[mysqld]
server-id=2
master-host=db-master.mycompany.com
master-port=3306
master-user=pertinax
master-password=freitag
master-connect-retry=60
report-host=db-slave.mycompany.com
下列所述啟動選項都是用來控制同步的:它們中的大部分都可以在運行時用 CHANGE MASTER TO 語句來改變。其他的,例如 --replicate-*,只能在salve啟動時指定。我們打算在將來解決這個問題。
--log-slave-updates
通常,slave從master接收更新操作後並沒有再把它們記錄在二進位日誌中。這個選項告訴slave的SQL線程要把這些更新操作記錄在二進位日誌中。想要這個選項起作用,需要同時啟用 --log-bin 選項才能啟用二進位日誌。在使用同步鏈機制時,就需要使用 --log-slave-updates 選項。例如,可能需要設定如下同步關係:
A -> B -> C
在這裡,A當作B的master,B當作C的master。B同時是slave又是master,在A和B上都需要啟用 --log-bin 選項,並且在B上還需要啟用 --log-slave-updates 選項。
--log-warnings
讓slave在執行同步時記錄更多的錯誤記錄檔。例如,它會通知你在網路/串連失敗後重連成功,並且通知了每個slave線程如何啟動的。這個選項在MySQL 4.0.19和4.1.12之後預設啟用了;用 --skip-log-warnings 就可以禁用它。從MySQL 4.0.21和MySQL 4.1.3開始,除非這個選項的值大於1,否則放棄的串連不再記錄在錯誤記錄檔中。這個選項不只是用於限制同步,它產生的警告跨越了大部分操作。
--master-connect-retry=seconds
在master當機或者網路連接中斷後,slave在重新串連到master之前休眠的秒數。如果在 `master.info` 檔案中存在,就優先使用它。如果沒有設定,預設是60。
--master-host=host
master伺服器的主機名稱或者ip地址。如果沒有設定它,slave線程無法啟動。如果存在的話,`master.info` 檔案中選項值優先被讀取。
--master-info-file=file_name
slave記錄master資訊的檔案名稱。預設名字是 `master.info`,放在資料檔案目錄下。
--master-password=password
用於被授權串連到master上運行同步的帳戶密碼。如果存在的話,`master.info` 檔案中選項值優先被讀取。如果沒有設定,就當作是空密碼。
--master-port=port_number
master上監聽的TCP/IP連接埠號碼。如果存在的話,`master.info` 檔案中選項值優先被讀取。如果沒有設定,就當作先行編譯的設定。如果沒有修改 configure 選項參數,那麼就是3306。
--master-ssl,--master-ssl-ca=file_name,--master-ssl-capath=directory_name,
--master-ssl-cert=file_name,--master-ssl-cipher=cipher_list,--master-ssl-key=file_name
用於設定用SSL安全連線到master的選項。它們的意義對應於"5.6.7.5 SSL Command-Line Options"中提到的 --ssl, --ssl-ca, --ssl-capath, --ssl-cert, --ssl-cipher, --ssl-key 選項。如果存在的話,`master.info` 檔案中選項值優先被讀取。這些選項是從MySQL 4.1.1之後開始可以用的。
--master-user=username
用於被授權串連到master上運行同步的帳戶。這個帳戶必須有 REPLICATION SLAVE 許可權(在MySQL 4.0.2以前,則是 FILE 許可權)。如果存在的話,`master.info` 檔案中選項值優先被讀取。如果沒有設定,就當作是 test。
--max-relay-log-size=#
中繼日誌自動輪轉(rotate)的大小。詳情請看"5.2.3 Server System Variables"。這個選項是從MySQL 4.0.14之後才可以用的。
--read-only
這個選項令slave除了slave線程或者擁有 SUPER 許可權使用者之外的都不能更新資料。這能確保slave不會接受來自其他用戶端的更新。這個選項是從MySQL 4.0.14開始有的。
--relay-log=file_name
中繼日誌的名字。預設名字是 host_name-relay-bin.nnn,host_name 是slave伺服器的主機名稱,nnn 是指中繼日誌的順序號。可以用這個選項建立不依賴主機名稱的中繼日誌,或者在中繼日誌越來越大(不想降低 max_relay_log_size 的值)且需要將它們放在非資料檔案目錄下,或者想使用磁碟間的負載平衡來提高速度等情況。
--relay-log-index=file_name
中繼日誌索引檔案的位置及檔案名稱。它的預設值是 host_name-relay-bin.index,host_name 是slave伺服器主機名稱。
--relay-log-info-file=file_name
slave上記錄中繼日誌資訊的檔案名稱。預設是資料檔案目錄下的`relay-log.info`。
--relay-log-purge={0|1}
在不需要中繼日誌時禁用或啟用自動清除。預設值是1(啟用)。這是一個全域變數,可以用 SET GLOBAL relay_log_purge 來動態更改。這個選項從MySQL 4.1.1開始可以用。
--relay-log-space-limit=#
用於加大slave上中繼日誌的總大小(如果值為0表示"無限")。這在slave主機只有有限的空間時很有用。當達到這個限制後,I/O線程直到SQL線程刪除一些無用的中繼日誌後才會繼續從master讀取二進位日誌事件。注意,這個限制不是絕對的:在刪除中繼日誌之前,SQL線程可能還需要更多的二進位日誌事件。這種情況下,I/O線程會超越這個限制,直到SQL線程刪除一些中繼日誌,因為如果不這麼做的話就會導致死結(在MySQL 4.0.13之前就是這樣)。不要設定 --relay-log-space-limit 的值小於2倍 --max-relay-log-size (如果 --max-relay-log-size 的值為0,則是 --max-binlog-size ) 的值。在這種情況下,由於已經超過 --relay-log-space-limit 了,I/O線程需要等待更多的剩餘空間,但是SQL線程沒有可以刪除的中繼日誌來滿足I/O線程的需求。這就會強制I/O線程暫時忽略 --relay-log-space-limit 限制。
--replicate-do-db=db_name
告訴slave只同步那些預設資料庫是 db_name (也就是用 USE 選中的)的語句。想要指定更多的資料庫,只需多次使用該選項,每次指定一個資料庫。注意,類似 UPDATE some_db.some_table SET foo='bar' 這樣的跨庫動作陳述式以及沒有選中資料庫的操作都不會被同步。如果必須使用跨庫操作,要確保使用MySQL 3.23.28或更高,並且使用 --replicate-wild-do-table=db_name.% 選項。請仔細閱讀最後面的注意事項。
下面是一個不能按照預期工作的例子:如果啟動slave時使用 --replicate-do-db=sales 選項,並且在master上執行下列語句,那麼這個 UPDATE 語句不會被同步:
USE prices;
UPDATE sales.january SET amount=amount+1000;
如果需要同步跨庫操作,只需使用 --replicate-wild-do-table=db_name.% 選項。這個"只檢查預設資料庫"特性的主要原因是因為想要單從一個語句中判斷是否要被同步比較困難(例如,使用多表 DELETE 或者 UPDATE,這就跨庫了)。不過想要檢查是否是預設資料庫卻很快。
--replicate-do-table=db_name.tbl_name
告訴slave只同步那些指定的資料表。想要指定更多的資料表,只需多次使用該選項,每次指定一個資料表。這個選項支援跨庫更新,和 --replicate-do-db 選項相反。請仔細閱讀最後面的注意事項。
--replicate-ignore-db=db_name
告訴slave不要同步那些預設資料庫是 db_name (也就是用 USE 選中的)的語句。想要指定更多的資料庫,只需多次使用該選項,每次指定一個資料庫。如果有跨庫操作且希望這些操作要被同步就不要使用該選項。請仔細閱讀最後面的注意事項。
下面是一個不能按照預期工作的例子:如果啟動slave時使用 --replicate-ignore-db=sales 選項,並且在master上執行下列語句,那麼這個 UPDATE 語句不會被同步:
USE prices;
UPDATE sales.january SET amount=amount+1000;
想要讓跨庫操作能正常同步,只需使用 --replicate-wild-ignore-table=db_name.% 選項。
--replicate-ignore-table=db_name.tbl_name
告訴slave不要同步指定資料表的任何更新語句(甚至用同一個語句更新的其他表)。想要指定更多的資料表,只需多次使用該選項,每次指定一個資料表。這個選項支援跨庫更新,和 --replicate-ignore-db 選項相反。請仔細閱讀最後面的注意事項。
--replicate-wild-do-table=db_name.tbl_name
限制slave只同步那些匹配指定模式的資料表。模式中可以包含萬用字元 `%` 和 `_`,它們的含義和 LIKE 模式一樣。想要指定更多的資料表,只需多次使用該選項,每次指定一個資料表。請仔細閱讀最後面的注意事項。
例如: --replicate-wild-do-table=foo%.bar% 會同步所有以 foo 開頭的資料庫下的以 bar 開頭的資料表上的更新操作。
如果匹配模式是 %,則匹配所有的表名,且應用到資料庫級語句(CREATE DATABASE, DROP DATABASE,和 ALTER DATABASE)。例如,使用 --replicate-wild-do-table=foo%.% 選項的話,所有匹配 foo% 模式的資料庫級操作都會被同步。
如果想要在資料庫/表模式中包含原義萬用字元,需要用反斜線來轉義它們。例如,想要同步 my_own%db 資料庫下的所有表,但是不想同步 my1ownAABCdb 資料庫下的表,就需要逸出字元 `_`: --replicate-wild-do-table=my\_own\%db。如果是在命令列中使用這個選項,就可能需要兩個反斜線來轉義,這依賴於命令列解譯器。例如,在 bash shell下,就需要輸入: --replicate-wild-do-table=my\\_own\\%db。
--replicate-wild-ignore-table=db_name.tbl_name
限制slave不同步那些匹配指定模式的資料表。想要指定更多的資料表,只需多次使用該選項,每次指定一個資料表。請仔細閱讀最後面的注意事項。
例如,--replicate-wild-ignore-table=foo%.bar% 就不會同步所有以 foo 開頭的資料庫下的以 bar 開頭的資料表上的更新操作。
想要瞭解匹配模式如何工作的,請查看 --replicate-wild-ignore-table 選項的具體描述。模式中包含原義萬用字元的規則和 --replicate-wild-ignore-table 選項一樣。
--replicate-rewrite-db=from_name->to_name
告訴slave把在master上的預設資料庫 from_name (只有用 USE 選中的)轉換成 to_name 。只有涉及到資料表的語句(不包括類似 CREATE DATABASE, DROP DATABASE,和 ALTER DATABASE)才會被同步,並且只針對master上預設資料庫為 from_name 的情況。這個選項不支援跨庫操作。注意,資料庫名字轉換先於 --replicate-* 規則之前測試。如果是在命令列中使用這個選項,需要把 `>' 字元用引號引用起來。例如:
shell> mysqld --replicate-rewrite-db="olddb->newdb"
--replicate-same-server-id
該選項用於slave之上。通常使用它的預設值0,用於避免無限同步迴圈。如果設定為1,那麼slave就不會忽略那些跟它有同樣伺服器編號的更新日誌了;通常它只用於比較罕見的配置中。如果啟用 --log-slave-updates 選項,則不能設定為1。注意,從MySQL 4.1開始,slave的I/O線程預設不把包含slave的伺服器編號的二進位日誌寫到中繼日誌中(相對4.0這能節省磁碟使用)。因此想要在4.1中使用 --replicate-same-server-id 選項,在slave讀取自己的更新事件讓SQL線程來執行之前要確保啟動slave時使用該選項。
--report-host=host
在salve註冊時要報告的master主機名稱或IP地址。在master上執行 SHOW SLAVE HOSTS 語句時就會顯示出來了。如果不想slave註冊到master就無需設定這個選項。注意,這在slave串連到master之後,只根據這個配置master還不能直接從TCP/IP通訊端中讀取slave的IP地址。因為存在 NAT 或者其他路由機制,這個IP資訊還不足以在master或者其他主機上串連到slave上。這個選項是從MySQL 4.0.0開始可以用的。
--report-port=port_number
串連到slave的TCP/IP連接埠,在slave註冊到master時用的到。除非slave在非預設連接埠上監聽或者從master或其他用戶端上到串連到slave使用的是特定的隧道,否則無需設定這個值。如果不確定,就不要設定它。這個選項是從MySQL 4.0.0開始可以用的。
--skip-slave-start
告訴slave伺服器在啟動時不要運行slave線程。只需使用 START SLAVE 語句來啟動slave線程。
--slave_compressed_protocol={0|1}
如果它設定為1,並且maste/slave都支援的話,就採用壓縮協議傳輸資料。
--slave-load-tmpdir=file_name
slave建立臨時檔案的目錄。這個選項值預設地和系統變數 tmpdir 的值一樣。slave的SQL線程同步 LOAD DATA INFILE 語句時,它從中繼日誌中提取出要被載入的檔案放到臨時檔案中,然後把它們載入到slave中。如果在master上載入的檔案很大,那麼slave上的臨時檔案也會很大。因此建議在slave上指定這個選項時把它放在剩餘空間比較多的檔案系統上。這是,最好也指定 --relay-log 到那個檔案系統中,因為中繼日誌可能也會很大。--slave-load-tmpdir 必須指向基於磁碟的檔案系統,而不能是基於記憶體的檔案系統:slave可能會在機器重啟後同步 LOAD DATA INFILE 語句時需要用到這個臨時檔案。這個目錄同樣不能在會被作業系統的啟動進程清除的目錄下。
--slave-net-timeout=seconds
salve放棄讀之後等待多少秒再次從master讀取更多的資料,考慮到了串連斷開,嘗試重連的情況。第一次重試會在逾時後立刻執行。重試的時間間隔由選項 --master-connect-retry 控制。
--slave-skip-errors= [err_code1,err_code2,... | all]
通常,發生錯誤時同步就會停止,以提供手工解決資料不一致的情況。這個選項告訴slave的SQL線程當執行語句時返回的錯誤碼在該列表中時繼續運行。
除非真正的理解了為什麼會產生相應的錯誤後,否則不要設定這個選項。如果同步設定以及用戶端程式都沒有bug,並且也不是MySQL自身的bug的話,那麼就不會出現讓同步停止的錯誤了。不加區分地使用這個選項,會導致slave無可救藥地背離master的同步,並且你也不知道這是為什麼。
可以在從slave的錯誤記錄檔並且在slave上執行 SHOW SLAVE STATUS 語句的結果中就能看到錯誤碼了。伺服器錯誤代碼詳情請看"22 Error Handling in MySQL"。
你也可以(最好不要)使用非常不推薦使用的值 all,它能忽略所有的錯誤資訊,不管什麼情況都繼續保持同步。不消說,如果使用這個選項值,就不可能期待有資料的完整性了。這種情況下,就不能抱怨slave的資料無論在哪個地方都和master不接近了。已經警告過你了。例如:
--slave-skip-errors=1062,1053
--slave-skip-errors=all
--replicate-* 模式根據以下規則來決定一個語句是要執行還是被忽略:
是否有 --replicate-do-db 或 --replicate-ignore-db 規則?
是:測試 --binlog-do-db 和 --binlog-ignore-db 選項(詳情請看"5.9.4 The Binary Log")。測試結果?
忽略:忽略並且退出。
執行:不立刻執行,延遲判斷,到下一步。
否:到下一步。
是否有 --replicate-*-table 規則?
否:執行並且退出。
是:走到下一步。只有要被更新的表才和這個規則作比較(INSERT INTO sales SELECT * FROM prices:中只有 sales 和規則比較)。如果有好幾個表一起被更新(多表語句),第一個匹配的表(匹配 `do` 或 `ignore`)勝出。也就是說,只有第一個表和規則作比較。然後,如果還沒有產生任何決定,就比較第二個表,以此類推。
是否有 --replicate-do-table 規則?
是:這個表是否匹配這些規則?
是:執行並且退出。
否:走到下一步。
否:走到下一步。
是否有 --replicate-ignore-table 規則?
是:這個表是否匹配這些規則?
是:忽略並且退出。
否:走到下一步。
否:走到下一步。
是否有 --replicate-wild-do-table 規則?
是:這個表是否匹配這些規則?
是:執行並且退出。
否:走到下一步。
否:走到下一步。
是否有 --replicate-wild-ignore-table 規則?
是:這個表是否匹配這些規則?
是:忽略並且退出。
否:走到下一步。
否:走到下一步。
沒有匹配 --replicate-*-table 規則。是否有其他表匹配這些規則?
是:迴圈尋找匹配。
否:已經測試所有要被更新的表且找不到任何匹配規則。是否有 --replicate-do-table 或 --replicate-wild-do-table 規則?
是:忽略並且退出。
否:執行並且退出。
引用:
http://database.ccidnet.com/art/1105/20060815/807451_1.html