程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL手冊版本 5.0.20-MySQL同步(四)

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

編輯:關於MYSQL數據庫

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 規則?

是:忽略並且退出。

否:執行並且退出。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved