程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL主從復制的道理及設置裝備擺設辦法(比擬具體)

MySQL主從復制的道理及設置裝備擺設辦法(比擬具體)

編輯:MySQL綜合教程

MySQL主從復制的道理及設置裝備擺設辦法(比擬具體)。本站提示廣大學習愛好者:(MySQL主從復制的道理及設置裝備擺設辦法(比擬具體))文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL主從復制的道理及設置裝備擺設辦法(比擬具體)正文


1、復制的道理

MySQL 復制基於主辦事器在二進制日記中跟蹤一切對數據庫的更改(更新、刪除等等)。每一個從辦事器從主辦事器吸收主辦事器曾經記載到其二進制日記的保留的更新,以便從辦事器可以對其數據拷貝履行雷同的更新。

將主辦事器的數據拷貝到從辦事器的一個門路是應用LOAD DATA FROM MASTER語句。請留意LOAD DATA FROM MASTER今朝只在一切表應用MyISAM存儲引擎的主辦事器上任務。而且,該語句將取得全局讀鎖定。

MySQL 應用3個線程來履行復制功效,個中1個在主辦事器上,另兩個在從辦事器上。當收回START SLAVE時,從辦事器創立一個I/O線程,以銜接主辦事器並讓它發送記載在其二進制日記中的語句。
主辦事器創立一個線程將二進制日記中的內容發送到從辦事器。該線程可以辨認為主辦事器上SHOW PROCESSLIST的輸入中的Binlog Dump線程。
從辦事器I/O線程讀取主辦事器Binlog Dump線程發送的內容並將該數據拷貝到從辦事器數據目次中的當地文件中,即中繼日記。   
第3個線程是SQL線程,是從辦事器創立用於讀取中繼日記並履行日記中包括的更新。
有多個從辦事器的主辦事器創立為每一個以後銜接的從辦事器創立一個線程;每一個從辦事器有本身的I/O和SQL線程。

2、復制線程的狀況

1.復制主線程的狀況


Sending binlog event to slave
二進制日記由各類事宜構成,一個事宜平日為一個更新加一些其它信息。線程曾經從二進制日記讀取了一個事宜而且正將它發送到從辦事器。
Finished reading one binlog; switching to next binlog
線程曾經讀完二進制日記文件而且正翻開下一個要發送到從辦事器的日記文件。
Has sent all binlog to slave; waiting for binlog to be updated
線程曾經從二進制日記讀取一切重要的更新並曾經發送到了從辦事器。線程如今正余暇,期待由主辦事器上新的更新招致的湧現在二進制日記中的新事宜。
Waiting to finalize termination
線程停滯時產生的一個很簡略的狀況。

2.復制從I/O線程狀況

Connecting to master
線程正試圖銜接主辦事器。

Checking master version
樹立同主辦事器之間的銜接後立刻暫時湧現的狀況。

Registering slave on master
樹立同主辦事器之間的銜接後立刻暫時湧現的狀況。

Requesting binlog dump
樹立同主辦事器之間的銜接後立刻暫時湧現的狀況。線程向主辦事器發送一條要求,討取從要求的二進制日記文件名和地位開端的二進制日記的內容。

Waiting to reconnect after a failed binlog dump request
假如二進制日記轉儲要求掉敗(因為沒有銜接),線程進入眠眠狀況,然後按期測驗考試從新銜接。可使用–master-connect-retry選項指定重試之間的距離。

Reconnecting after a failed binlog dump request
線程正測驗考試從新銜接主辦事器。

Waiting for master to send event
線程曾經銜接上主辦事器,正期待二進制日記事宜達到。假如主辦事器正余暇,會連續較長的時光。假如期待連續slave_read_timeout秒,則產生超時。此時,線程以為銜接被中止並妄圖從新銜接。

Queueing master event to the relay log
線程曾經讀取一個事宜,正將它復制到中繼日記供SQL線程來處置。

Waiting to reconnect after a failed master event read
讀取時(因為沒有銜接)湧現毛病。線程妄圖從新銜接前將睡眠master-connect-retry秒。

Reconnecting after a failed master event read
線程正測驗考試從新銜接主辦事器。當銜接從新樹立後,狀況變成Waiting for master to send event。

Waiting for the slave SQL thread to free enough relay log space
正應用一個非零relay_log_space_limit值,中繼日記曾經增加到其組合年夜小跨越該值。I/O線程正期待直到SQL線程處置中繼日記內容並刪除部門中繼日記文件來釋放足夠的空間。

Waiting for slave mutex on exit
線程停滯時產生的一個很簡略的狀況。

3.復制從SQL線程狀況


Reading event from the relay log
線程曾經從中繼日記讀取一個事宜,可以對事宜停止處置了。

Has read all relay log; waiting for the slave I/O thread to update it
線程曾經處置了中繼日記文件中的一切事宜,如今正期待I/O線程將新事宜寫入中繼日記。

Waiting for slave mutex on exit
線程停滯時產生的一個很簡略的狀況。

3、復制傳遞和狀況文件

從辦事器靠中繼日記來吸收從主辦事器上傳回來的日記。並依附狀況文件來記載曾經從主辦事器吸收了哪些日記,曾經恢復了哪些日記。

中繼日記與二進制日記的格局雷同,而且可以用mysqlbinlog讀取。SQL線程履行完中繼日記中的一切事宜而且不再須要以後,立刻主動刪除它。可以采取–relay-log和–relay-log-index辦事器選項籠罩默許中繼日記和索引文件名。個中索引文件名的感化是記載今朝正在應用中繼日記。

鄙人面的前提下將創立新的中繼日記:
1.每次I/O線程啟動時創立一個新的中繼日記。
2.當日記被刷新時;例如,用FLUSH LOGS或mysqladmin flush-logs。
3.铛铛前的中繼日記文件變得太年夜時。“太年夜”寄義切實其實定辦法:
max_relay_log_size,假如max_relay_log_size > 0
max_binlog_size,假如max_relay_log_size = 0
狀況文件名默許為master.info和relay-log.info。個中IO線程更新master.info文件,SQL線程更新relay-log.info文件。
文件中的行和SHOW SLAVE STATUS顯示的列的對應關系為:
master.info文件:
行 描寫
1 文件中的行號
2 Master_Log_File
3 Read_Master_Log_Pos
4 Master_Host
5 Master_User
6 暗碼(不由SHOW SLAVE STATUS顯示)
7 Master_Port
8 Connect_Retry
9 Master_SSL_Allowed
10 Master_SSL_CA_File
11 Master_SSL_CA_Path
12 Master_SSL_Cert
13 Master_SSL_Cipher
14 Master_SSL_Key

relay-log.info文件:
行 描寫
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos

當備份從辦事器的數據時,你還應備份這兩個小文件和中繼日記文件。它們用來在恢復從辦事器的數據後持續停止復制。假如喪失了中繼日記但依然有 relay-log.info文件,你可以經由過程檢討該文件來肯定SQL線程曾經履行的主辦事器中二進制日記的水平。然後可以用 Master_Log_File和Master_LOG_POS選項履行CHANGE MASTER TO來告知從辦事重視新從該點讀取二進制日記。固然,請求二進制日記依然在主辦事器上。所以最好建議將主動刪除中繼日記的特征封閉,手工寫shell角原來避免空間滿的成績。

4、復制的設置裝備擺設步調

1.創立專門用於復制的用戶(建議如許做),從辦事器采取該帳戶上岸主辦事器:

GRANT REPLICATION SLAVE ON *.* TO 'rep'@'%' IDENTIFIED BY 'logzgh' ;


假如你籌劃從附屬辦事器主機應用LOAD TABLE FROM MASTER或LOAD DATA FROM MASTER語句,你須要授與該賬戶其它權限:

授與賬戶SUPER和RELOAD全局權限。
為一切想要裝載的表授與SELECT權限。任何該 賬戶不克不及SELECT的主辦事器上的表被LOAD DATA FROM MASTER疏忽失落。

2.將數據庫文件移到從辦事器上

情形一:若只用到MyISAM表
mysql> FLUSH TABLES WITH READ LOCK;
(刷新一切表而且阻攔其它寫入,不要加入該客戶端,以堅持讀鎖有用。若加入,讀鎖就會釋放。)
比擬簡略的方法就是把數據目次打包緊縮。

$ tar -cvf /home/mysql/snapshot.tar ./data (在master上)
$ tar -xvf /home/mysql/snapshot.tar (在slave上)

能夠不須要同步 mysql 數據庫,由於在slave上的權限表和master紛歧樣。這時候,解開緊縮包的時刻要消除它。
同時在緊縮包中也不要包括任何日記文件,和狀況文件master.info、relay-log.info。

mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000058 | 45036137 | | |
+——————+———-+————–+——————+

mysql> UNLOCK TABLES;

情形二:若用到InnoDB表

辦法一:應用InnoDB Hot Backup對象。它無需在master上要求任何鎖就可以做到快照的分歧性,而且在前面中在slave上要用到的快照中曾經記載了日記文件名和偏移地位。

辦法二:記載以後日記文件及偏移地位,在master封閉前履行:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

盡快記下顯示成果中的日記文件及偏移地位。然後,在不解鎖的情形下封閉master,確保master上的快照和記載的成果分歧。

封閉master辦事器,$ mysqladmin -u root shutdown
拷貝 InnoDB 數據文件,日記文件,和表構造界說文件(.frm文件)。

情形三:可以同時用於MyISAM和InnoDB表
在master上做SQL轉儲而無需如上所述備份二進制日記。運轉mysqldump –master-data敕令,然後把成果文件轉儲到slave上。
不外,這比拷貝二進制日記慢點。

3.修正my.cnf文件
在master上my.cnf文件:(重啟失效)
[mysqld]
log_bin
server_id=1 (值是 1 到 2^32-1 之間的正整數)
在slave上my.cnf文件:
[mysqld]
server_id=2 (ID必需和master的ID分歧。如有多個slave,則每一個slave都必需有獨一的id。)

設置裝備擺設slave的擴大選項
master_host=db-master.mycompany.com
master_port=3306
master_user=rep
master_password=freitag
master_connect_retry=60 (若master宕機或許slave銜接斷開,slave會按期測驗考試銜接到master上,重試的距離由該選項來掌握,默許值是60秒。)
report_host=db-slave.mycompany.com
slave_net_timeout=3600 (slave默許會在3600秒後,若還充公到來自master的數據,則會看成收集斷開的情形來處置。)

辦事器以為master.info的優先級比設置裝備擺設文件my.cnf高,
第一次啟動slave時,master.info不存在,它從my.cnf中讀取選項值,然後把它們保留在master.info中。
下次重啟slave時,它只讀取master.info的內容,而不會讀取my.cnf中的選項值。
想要應用分歧的選項值,可以刪除master.info後重啟slave,或許應用CHANGE MASTER TO語句(推舉)重置選項值。

4.啟動從辦事器線程

mysqld_safe –user=mysql –skip-slave-start & (啟動MySQL辦事器,但不啟動slave)
設置master_log_file等參數
mysql> CHANGE MASTER TO MASTER_HOST='qa-sandbox-1′,
MASTER_USER='rep',
MASTER_PASSWORD='logzgh',
MASTER_LOG_FILE='mysql-bin.000007′,
MASTER_LOG_POS=471632;

mysql> START SLAVE;
履行這些法式後,從辦事器應銜接主辦事器,並彌補自從快照以來產生的任何更新。
假如你忘卻設置主辦事器的server-id值,從辦事器不克不及銜接主辦事器。

正文:為了包管事務InnoDB復制設置的最年夜能夠的耐受性和分歧性,
應在主辦事器的my.cnf文件中應用innodb_flush_log_at_trx_commit=1和sync-binlog=1。

mysql> show variables; (檢討能否read-only,該選項令slave除slave線程或許具有SUPER權限用戶以外的都不克不及更新數據,確保slave不會接收來自其他客戶真個更新。)
mysql> show processlist; (檢討能否slave-start)

在啟動mysql的同時啟動slave:
mysqld_safe –user=mysql –read-only & (啟動MySQL辦事器,同時啟動slave的I/O線程)

mysql> SHOW SLAVE STATUSG;

5.切換slave為master,在slave上:

mysql> STOP SLAVE;
mysql> RESET MASTER;

五.復制啟動選項

–read_only
該選項讓從辦事器只許可來自從辦事器線程或具有SUPER權限的用戶的更新。可以確保從辦事器不接收來自客戶的更新。

–replicate_do_db=db_name
告知從辦事器只做默許數據庫(由USE所選擇)為db_name的語句的復制。要指定多個數據庫,應屢次應用該選項,每一個數據庫應用一次。請留意不復制跨數據庫的語句

–replicate_do_table=db_name.tbl_name
告知從辦事器線程只做對指定表的復制。要指定多個表,應屢次應用該選項,每一個表應用一次。同–replicate-do-db比較,許可跨數據庫更新。

–replicate_ignore_db=db_name
告知從辦事器不要復制默許數據庫(由USE所選擇)為db_name的語句。要想疏忽多個數據庫,應屢次應用該選項,每一個數據庫應用一次。

–replicate-ignore-table=db_name.tbl_name
告知從辦事器線程不要復制更新指定表的任何語句(即便該語句能夠更新其它的表)。要想疏忽多個表,應屢次應用該選項,每一個表應用一次。

–replicate_wild_do_table=db_name.tbl_name
告知從辦事器線程限制復制更新的表婚配指定的數據庫和表名形式的語句。形式可以包括‘%'和‘_'通配符,與LIKE形式婚配操作符具有雷同的寄義。要指定多個表,應屢次應用該選項,每一個表應用一次。該選項可以跨數據庫停止更新。

–replicate_wild_ignore_table=db_name.tbl_name
告知從辦事器線程不要復制表婚配給出的通配符形式的語句。要想疏忽多個表,應屢次應用該選項,每一個表應用一次。該選項可以跨數據庫停止更新。

–replicate_rewrite_db=from_name->to_name
告知從辦事器假如默許數據庫(由USE所選擇)為主辦事器上的from_name,則翻譯為to_name。只影響含有表的語句

–report_host=slave_name
從辦事器注冊進程中申報給主辦事器的主機名或IP地址。該值湧現在主辦事器上SHOW SLAVE HOSTS的輸入中。假如不想讓從辦事器本身在主辦事器上注冊,則不設置該值。

–report_port=slave_port
銜接從辦事器的TCP/IP端標語,從辦事器注冊進程中申報給主辦事器。

–skip_slave_start
告知從辦事器當辦事器啟動時不啟動從辦事器線程。應用START SLAVE語句在今後啟動線程。

–slave_skip_errors=[err_code1,err_code2,… | all]
平日情形,當湧現毛病時復制停滯,如許給你一個機遇手動處理數據中的紛歧致性成績。該選項告知從辦事器SQL線程當語句前往任何選項值中所列的毛病時持續復制。
例如:
–slave-skip-errors=1062,1053
–slave-skip-errors=all

6、一直機設置裝備擺設復制的辦法

辦法一:

假如你在某時光點做過主辦事器備份而且記載了響應快照的二進制日記名和偏移量(經由過程SHOW MASTER STATUS敕令的輸入),采取上面的步調:

1. 確保從辦事器分派了一個獨一的辦事器ID號。
2. 將備份文件拷到從辦事器上。
3. 在從辦事器上履行上面的語句,為每一個選項填入恰當的值:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='master_user_name',
-> MASTER_PASSWORD='master_pass',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;

4.在從辦事器上履行START SLAVE語句。

假如你沒有備份主辦事器,這裡是一個創立備份的疾速法式。一切步調都應當在主辦事器主機上履行。

1. 收回該語句:
mysql> FLUSH TABLES WITH READ LOCK;
2. 依然加鎖時,履行該敕令(或它的變體):
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
並拷到從辦事器上。
3. 收回該語句而且確保記載了今後用到的輸入:
mysql>SHOW MASTER STATUS;
4. 釋放鎖:
mysql> UNLOCK TABLES;

辦法二:

一個可選擇的辦法是,轉儲主辦事器的SQL來取代後面步調中的二進制復制。要如許做,你可以在主辦事器上應用mysqldump –master-data,今後裝載SQL轉儲到到你的從辦事器。但是,這比停止二進制復制速度慢。

7、其他

1.不克不及從應用新二進制日記格局的主辦事器向應用舊二進制日記格局的從辦事器復制。

2.進級從辦事器時,應先封閉從辦事器,進級到響應5.1.x版本,然後重啟從辦事器偏重新開端復制。5.1版本的從辦事器可以或許讀取進級前寫入的舊的中繼日記並履行日記中包括的語句。進級後從辦事器創立的中繼日記為5.1格局。

3.必需在主辦事器和從辦事器上老是應用雷同的全局字符集和校訂規矩(–default-character-set、–default- collation)。不然,會在從辦事器上碰到復制鍵值毛病,由於在主辦事器的字符集中被以為是獨一的鍵值在從辦事器的字符集中能夠不是獨一的。

4.Q:從辦事器須要一直銜接到主辦事器嗎?
A:不,不須要。從辦事器可以宕機或斷開銜接幾個小時乃至幾天,從新銜接後取得更新信息。

5.Q:我如何曉得從辦事器與主辦事器的最新比擬? 換句話說,我如何曉得從辦事器復制的最初一個查詢的日期?
A:你可以檢查SHOW SLAVE STATUS語句的Seconds_Behind_Master列的成果。

6. Q:我如何強迫主辦事器壅塞更新直到從辦事器同步?
A:應用上面的步調:
1. 在主辦事器上,履行這些語句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
記載SHOW語句的輸入的日記名和偏移量。這些是復制坐標。

2.在從辦事器上,收回上面的語句,個中Master_POS_WAIT()函數的參量是後面步調中的獲得的復制坐標值:
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);
SELECT語句壅塞直到從辦事器到達指定的日記文件和偏移量。此時,從辦事器與主辦事器同步,語句前往。

3.在主辦事器上,收回上面的語句許可主辦事重視新開端處置更新:
mysql> UNLOCK TABLES;

7.Q:如何經由過程復制來進步體系的機能?
A:你應將一個辦事器設置為主辦事器而且將一切寫指向該辦事器。然後依據預算設置裝備擺設盡量多的從辦事器和棧空間,而且在主辦事器和從辦事器之間分發讀取操作。你也能夠用–skip-innodb、–skip-bdb、–low-priority-updates和–delay-key- write=ALL選項啟動從辦事器,以便在從辦事器端進步速度。在這類情形下,為了進步速度,從辦事器應用非事務MyISAM表來取代InnoDB和 BDB表。

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