top
Loading...
6.8.復制啟動選項
6.8. 復制啟動選項

在主服務器和從服務器上,均必須使用server-id選項為每個服務器建立唯一的復制ID。你應為每個主服務器和從服務器從12321的范圍挑一個唯一的正整數。例如:server-id=3

用于主服務器上控制二進制日志的選項的相關描述見5.11.3節,“二進制日志”。

下表描述了可以用于MySQL 5.1從屬復制服務器的選項。你可以在命令行中或在選項文件中指定這些選項。

某些從服務器復制選項按特殊方式處理,當從服務器啟動時如果master.info文件存在并且包含選項值,它們將被忽略掉。下面的選項按這種方式處理:

·         --master-host

·         --master-user

·         --master-password

·         --master-port

·         --master-connect-retry

·         --master-ssl

·         --master-ssl-ca

·         --master-ssl-capath

·         --master-ssl-cert

·         --master-ssl-cipher

·         --master-ssl-key

5.1中的master.info文件格式包括對應SSL選項的值。并且,文件格式包括文件中的行號,如同第1行。如果你將舊的服務器升級到新的版本,新服務器啟動時自動將smaster.info文件升級到新的格式。然而,如果將新服務器降級到舊的版本,首次啟動舊版本的服務器之前應刪除第1行。

如果從服務器啟動時master.info文件不存在,選項采用選項文件或命令行中指定的值。首次將服務器作為從服務器啟動時,或者已經運行RESET SLAVE然后已經關閉并重啟從服務器時會發生。

如果從服務器啟動時master.info文件存在,服務器忽略那些選項。使用master.info文件中發現的值。

如果你使用與master.info文件中相對應的啟動選項的不同的值重啟從服務器,啟動選項的不同的值不會生效,因為服務器繼續使用master.info文件。要想使用啟動選項的不同的值,必須刪除master.info文件并重啟從服務器,或(最好是)在從服務器運行時使用CHANGE MASTER TO語句重新設置值。

假定在my.cnf文件中指定該選項:

[mysqld]
master-host=some_host

1次作為復制從服務器啟動服務器時,從my.cnf文件讀取并使用選項。服務器然后記錄master.info文件中的值。下次啟動服務器時,它只從服務器的master.info文件讀取主服務器主機值并忽略選項文件中的值。如果你修改my.cnf文件為some_other_host指定其它主服務器主機,更改仍然不會生效。你應使用CHANGE MASTER TO

因為服務器給已有master.info文件的優先權高于剛剛描述的啟動選項,可以選擇不使用這些值的啟動選項,而是使用CHANGE MASTER TO語句來指定。參見13.6.2.1節,“CHANGE MASTER TO語法”。

下面的例子顯示了如何更廣泛地使用啟動選項來配置從服務器:

[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-*選項,只能在從服務器啟動時進行設置。我們計劃將修復該問題。

·         --logs-slave-updates

通常情況,從服務器從主服務器接收到的更新不記入它的二進制日志。該選項告訴從服務器將其SQL線程執行的更新記入到從服務器自己的二進制日志。為了使該選項生效,還必須用--logs-bin選項啟動從服務器以啟用二進制日志。如果想要應用鏈式復制服務器,應使用--logs-slave-updates。例如,可能你想要這樣設置:

A -> B -> C

也就是說,A為從服務器B的主服務器,B為從服務器C的主服務器。為了能工作,B必須既為主服務器又為從服務器。你必須用--logs-bin啟動AB以啟用二進制日志,并且用--logs-slave-updates選項啟動B

·         --logs-warnings

讓從服務器向錯誤日志輸出更詳細的關于其執行操作的消息。例如,通知你網絡/連接失敗后已經成功重新連接,并通知你每個從服務器線程如何啟動。該選項默認啟用;要想禁用它,使用--skip-logs-warnings。放棄的連接不記入錯誤日志,除非該值大于1

請注意該選項的效果不限于復制。可以對服務器的部分動作產生警告。

·         --master-connect-retry=seconds

在主服務器宕機或連接丟失的情況下,從服務器線程重新嘗試連接主服務器之前睡眠的秒數。如果主服務器.info文件中的值可以讀取則優先使用。如果未設置, 默認值為60

·         --master-host=host

主復制服務器的主機名或IP地址。如果沒有給出該選項,從服務器線程不啟動。如果主服務器.info文件中的值可以讀取則優先使用。

·         --master-info-file=file_name

從服務器用于記錄主服務器的相關信息使用的文件名。默認名為數據目錄中的mysql.info

·         --master-password=password

連接主服務器時從服務器線程用于鑒定的賬戶的密碼。如果主服務器.info文件中的值可以讀取則優先使用。如果未設置,假定 密碼為空。

·         --master-port=port_number

主服務器正幀聽的TCP/IP端口號。如果主服務器.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設置與主服務器的安全復制連接。它們的含義與5.8.7.6節,“SSL命令行選項”中描述的相應ssl--ssl-ca--ssl-capath--ssl-cert--ssl-cipher--ssl-key選項相同。如果主服務器.info文件中的值可以讀取則優先使用。

·         --master-user=username

連接主服務器時從服務器線程用于鑒定的賬戶的用戶名。該賬戶必須具有REPLICATION SLAVE權限。如果主服務器.info文件中的值可以讀取則優先使用。如果未設置主服務器用戶,假定使用用戶test

·         --max-relay-logs-size=size

自動循環中繼日志。參見5.3.3節,“服務器系統變量”。

·         --read-only

該選項讓從服務器只允許來自從服務器線程或具有SUPER權限的用戶的更新。可以確保從服務器不接受來自客戶的更新。

·         --relay-log=file_name

中繼日志名。默認名為host_name-relay-bin.nnnnnn,其中host_name是從服務器主機的名,nnnnnn表示中繼日志在編號序列中創建。如果中繼日志太大(并且你不想降低max_relay_log_size),需要將它們放到數據目錄之外的其它地方,或者如果想要通過硬盤之間的負載均衡提高速度,可以指定選項創建與主機名無關的中繼日志名。

·         --relay-log-index=file_name

中繼日志索引文件使用的位置和名稱。默認名為host_name-relay-bin.index,其中host_name為從服務器名。

·         --relay-log-info-file=file_name

從服務器用于記錄中繼日志相關信息的文件名。默認名為數據目錄中的relay-log.info

·         --relay-log-purge={0|1}

禁用或啟用不再需要中繼日志時是否自動清空它們。默認值為1(啟用)。這是一個全局變量,可以用SET GLOBAL Relay_log_purge動態更改。

·         --relay-log-space-limit=size

限制所有中繼日志在從服務器上所占用空間的上限(0值表示“無限制)。從服務器主機硬盤空間有限時很有用。達到限制后,I/O線程停止從主服務器讀取二進制日志中的事件,直到SQL線程被閉鎖并且刪除了部分未使用的中繼日志。請注意該限制并不是絕對的:有可能SQL線程刪除中繼日志前需要更多的事件。在這種情況下,I/O線程將超過限制,直到SQL線程可以刪除部分中繼日志。(不這樣做將會造成死鎖)--relay-log-space-limit的值不能小于--max-relay-logs-size(或如果--max-relay-logs-size0,選--max-binlog-size)的值的兩倍。在這種情況下,有可能I/O線程等待釋放空間,因為超過了--relay-log-space-limit,但SQL線程沒有要清空的中繼日志,不能滿足I/O線程的需求。強制I/O線程臨時忽視--relay-log-space-limit

·         --replicate-do-db=db_name

告訴從服務器限制默認數據庫(USE所選擇)db_name的語句的復制。要指定多個數據庫,應多次使用該選項,每個數據庫使用一次。請注意不復制跨數據庫的語句,例如當已經選擇了其它數據庫或沒有數據庫時執行UPDATE some_db.some_table SET foo='bar'。如果需要跨數據庫進行更新,使用--replicate-wild-do-table=db_name.%。請讀取該選項列表后面的注意事項。

一個不能按照期望工作的例子:如果用--replicate-do-db=sales啟動從服務器,并且在主服務器上執行下面的語句,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

告訴從服務器線程限制對指定表的復制。要指定多個表,應多次使用該選項,每個表使用一次。同--replicate-do-db對比,允許跨數據庫更新。請讀取該選項列表后面的注意事項。

·         --replicate-ignore-db=db_name

告訴從服務器不要復制默認數據庫(USE所選擇)db_name的語句。要想忽略多個數據庫,應多次使用該選項,每個數據庫使用一次。如果正進行跨數據庫更新并且不想復制這些更新,不應使用該選項。請讀取該選項后面的注意事項。

一個不能按照期望工作的例如:如果用--replicate-ignore-db=sales啟動從服務器,并且在主服務器上執行下面的語句,UPDATE語句不會復制:

·                USE prices;
·                UPDATE sales.january SET amount=amount+1000;

如果需要跨數據庫更新,應使用--replicate-wild-ignore-table=db_name.%

·         --replicate-ignore-table=db_name.tbl_name

告訴從服務器線程不要復制更新指定表的任何語句(即使該語句可能更新其它的表)。要想忽略多個表,應多次使用該選項,每個表使用一次。同--replicate-ignore-db對比,該選項可以跨數據庫進行更新。請讀取該選項后面的注意事項。

·         --replicate-wild-do-table=db_name.tbl_name

告訴從服務器線程限制復制更新的表匹配指定的數據庫和表名模式的語句。模式可以包含‘%’和‘_’通配符,與LIKE模式匹配操作符具有相同的含義。要指定多個表,應多次使用該選項,每個表使用一次。該選項可以跨數據庫進行更新。請讀取該選項后面的注意事項。

例如:--replicate-wild-do-table=foo%.bar%只復制數據庫名以foo開始和表名以bar開始的表的更新。

如果表名模式為%,可匹配任何表名,選項也適合數據庫級語句(CREATE DATABASEDROP DATABASEALTER DATABASE)。例如,如果使用--replicate-wild-do-table=foo%.%,如果數據庫名匹配模式foo%,則復制數據庫級語句。

要想在數據庫或表名模式中包括通配符,用反斜線對它們進行轉義。例如,要復制名為my_own%db的數據庫的所有表,但不復制my1ownAABCdb數據庫的表,應這樣轉義‘_’和‘%’字符:--replicate-wild-do-table=my\_own\%db。如果在命令行中使用選項,可能需要雙反斜線或將選項值引起來,取決于命令解釋符。例如,用bash外殼則需要輸入--replicate-wild-do-table=my\_own\%db

·         --replicate-wild-ignore-table=db_name.tbl_name

告訴從服務器線程不要復制表匹配給出的通配符模式的語句。要想忽略多個表,應多次使用該選項,每個表使用一次。該選項可以跨數據庫進行更新。請讀取該選項后面的注意事項。

例如:--replicate-wild-ignore-table=foo%.bar%不復制數據庫名以foo開始和表名以bar開始的表的更新。

關于匹配如何工作的信息,參見--replicate-wild-do-table選項的描述。在選項值中包括通配符的規則與--replicate-wild-ignore-table相同。

·         --replicate-rewrite-db=from_name->to_name

告訴從服務器如果默認數據庫(USE所選擇)為主服務器上的from_name,則翻譯為to_name。只影響含有表的語句(不是類似CREATE DATABASEDROP DATABASEALTER DATABASE的語句),并且只有from_name為主服務器上的默認數據庫時。該選項不可以跨數據庫進行更新。請注意在測試--replicate-*規則之前翻譯數據庫名。

如果在命令行中使用該選項, ‘>’字符專用于命令解釋符,應將選項值引起來。例如:

shell> mysqld --replicate-rewrite-db="olddb->newdb"

·         --replicate-same-server-id

將用于從服務器上。通常可以默認設置為0以防止循環復制中的無限循環。如果設置為1,該從服務器不跳過有自己的服務器id的事件;通常只在有很少配置的情況下有用。如果使用--logs-slave-updates不能設置為1。請注意默認情況下如果有從服務器的id,服務器I/O線程不將二進制日志事件寫入中繼日志(該優化可以幫助節省硬盤的使用)。因此如果想要使用--replicate-same-server-id,讓從服務器讀取自己的SQL線程執行的事件前,一定要用該選項啟動。

·         --report-host=slave_name

從服務器注冊過程中報告給主服務器的主機名或IP地址。該值出現在主服務器上SHOW SLAVE HOSTS的輸出中。如果不想讓從服務器自己在主服務器上注冊,則不設置該值。請注意從服務器連接后,主服務器僅僅從TCP/IP套接字讀取從服務器的IP號是不夠的。由于 NAT和其它路由問題,IP可能不合法,不能從主服務器或其它主機連接從服務器。

·         --report-port=slave_port

連接從服務器的TCP/IP端口號,從服務器注冊過程中報告給主服務器。只有從服務器幀聽非默認端口或如果有一個特殊隧道供主服務器或其它客戶連接從服務器時才設置它。如果你不確定,不設置該選項。

·         --skip-slave-start

告訴從服務器當服務器啟動時不啟動從服務器線程。使用START SLAVE語句在以后啟動線程。

·         --slave_compressed_protocol={0|1}

如果該選項設置為 1,如果從服務器和主服務器均支持,使用壓縮從服務器/主服務器協議。

·         --slave-load-tmpdir=file_name

從服務器創建臨時文件的目錄名。該選項默認等于tmpdir系統變量的值。當從服務器SQL線程復制LOAD DATA INFILE語句時,從中繼日志將待裝載的文件提取到臨時文件,然后將這些文件裝入到表中。如果裝載到主服務器上的文件很大,從服務器上的臨時文件也很大。因此,建議使用該選項告訴從服務器將臨時文件放到文件系統中有大量可用空間的目錄下。在這種情況下,也可以使用--relay-log選項將中繼日志放到該文件系統中,因為中繼日志也很大。--slave-load-tmpdir應指向基于硬盤的文件系統,而非基于內存的文件系統:從服務器需要用臨時文件在機器重啟時用于復制LOAD DATA INFILE。系統啟動過程中操作系統也不能清除該目錄。

·         --slave-net-timeout=seconds

放棄讀之前從主服務器等候更多數據的秒數,考慮到連接中斷和嘗試重新連接。超時后立即開始第1次重試。由--master-connect-retry選項控制重試之間的間隔。

·         --slave-skip-errors=[err_code1,err_code2,... | all]

通常情況,當出現錯誤時復制停止,這樣給你一個機會手動解決數據中的不一致性問題。該選項告訴從服務器SQL線程當語句返回任何選項值中所列的錯誤時繼續復制。

如果你不能完全理解為什么發生錯誤,則不要使用該選項。如果復制設置和客戶程序中沒有bug,并且MySQL自身也沒有bug,應不會發生停止復制的錯誤。濫用該選項會使從服務器與主服務器不能保存同步,并且你找不到原因。

對于錯誤代碼,你應使用從服務器錯誤日志中錯誤消息提供的編號和SHOW SLAVE STATUS的輸出。服務器錯誤代碼列于附錄B:錯誤代碼和消息

你也可以(但不應)使用不推薦的all值忽略所有錯誤消息,不考慮所發生的錯誤。無需而言,如果使用該值,我們不能保證數據的完整性。在這種情況下,如果從服務器的數據與主服務器上的不相近請不要抱怨(或編寫bug報告)已經警告你了

例如:

--slave-skip-errors=1062,1053
--slave-skip-errors=all

從服務器按下面評估--replicate-*規則,確定是否執行或忽視語句:

1.    是否有--replicate-do-db--replicate-ignore-db規則?

·         :測試--binlog-do-db--binlog-ignore-db(參見5.11.3節,“二進制日志”)。測試結果是什么?

o        忽視語句:忽視并退出。

o        許可語句:不立即執行語句。推遲決策;繼續下一步。

·         沒有:繼續下一步。

2.    我們目前正執行保存的程序或函數嗎?

·         :執行查詢并退出。

·         :繼續下一步。

3.    是否有--replicate-*-table規則?

·         沒有:執行查詢并退出。

·         :繼續下一步并開始按所示順序評估表規則(首先是非通配規則,然后是通配規則)。只有待更新的表根據這些規則進行比較(INSERT INTO sales SELECT * FROM prices:只有sales根據這些規則進行比較)。如果要更新幾個表(多表語句),第1個匹配的表(匹配“do”或“ignore)獲贏。也就是說,根據這些規則比較第1個表。然后,如果不能進行決策,根據這些規則比較第2個表等等。

4.    是否有--replicate-do-table規則?

·         :表匹配嗎?

o        :執行查詢并退出。

o        :繼續下一步。

·         沒有:繼續下一步。

5.    是否有--replicate-ignore-table規則?

·         :表匹配嗎?

o        :忽視查詢并退出。

o        :繼續下一步。

·         沒有:繼續下一步。

6.    是否有--replicate-wild-do-table規則?

·         :表匹配嗎?

o        :執行查詢并退出。

o        :繼續下一步。

·         沒有:繼續下一步。

7.    是否有--replicate-wild-ignore-table規則?

·         :表匹配嗎?

o        :忽視查詢并退出。

o        :繼續下一步。

·         沒有:繼續下一步。

8.    沒有匹配的--replicate-*-table規則。要根據這些規則測試其它表嗎?

·         :執行循環。

·         :我們現在已經測試了所有待更新的表,結果不能匹配任何規則。是否有--replicate-do-table--replicate-wild-do-table規則?

o        :有“do”規則但不匹配。忽視查詢并退出。

o        沒有:執行查詢并退出。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/replication.html
北斗有巢氏 有巢氏北斗