MySQL 的復(fù)制功能是將備份的數(shù)據(jù)移動到其他服務(wù)器的功能,通過簡單的設(shè)定即可使用
成都創(chuàng)新互聯(lián)公司長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為岑溪企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè),岑溪網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
主→從(master ->slave)架構(gòu)。
主服務(wù)器上發(fā)生數(shù)據(jù)變更,變更內(nèi)容傳送到從服務(wù)器,從服務(wù)器接受主服務(wù)器的變更內(nèi)容,
將變更內(nèi)容反映到數(shù)據(jù)庫。
1. 提高查詢性能
查詢處理負載高的情況下,可以通過增加從服務(wù)器來實現(xiàn)負載均衡,提高性能
2. 實現(xiàn)高可用性
主服務(wù)器發(fā)生故障時,可以將從服務(wù)器升級為主服務(wù)器
3. 實現(xiàn)異地復(fù)制
構(gòu)建異地容災(zāi)系統(tǒng)
4. 用作備份服務(wù)器
在從服務(wù)器上進行備份,可以不影響主服務(wù)器的性能
例如可以實現(xiàn)主服務(wù)器不停機運行,將從服務(wù)器的數(shù)據(jù)庫停止以后進行備份
主服務(wù)器的所有變更點都記錄在二進制日志里面。二進制日志里記錄了與更新相關(guān)的SQL文,執(zhí)行查詢的日期時間等元數(shù)據(jù)也記錄在內(nèi)。事務(wù)提交的同時以二進制的形式進行記錄(sync_binlog=1)。
mysqlbinlog 命令可以查看日志內(nèi)容。指定啟動選項進行輸出二進制日志。
--log-bin[=file_name]
推薦將輸出路徑與數(shù)據(jù)文件路徑放在不同的硬盤上。日志文件的擴展名以連號的形式記錄
例)file_name-bin.001, file_name-bin.002, 等等。當(dāng)前正在使用的日志號碼會記錄在索引文件里面 (file_name.index)
主服務(wù)器的所有變更點都記錄在日志里面,在從服務(wù)器啟動復(fù)制功能,將二進制日志的內(nèi)容傳送到從服務(wù)器后執(zhí)行。
文件
中繼日志文件:記錄主服務(wù)器變更點的文件。
二進制日志文件:記錄從服務(wù)器變更點的文件?!?log-slave-updates有效時才會輸出)
master.info :記錄連接主服務(wù)器的必要信息、讀取日志起始位置等信息的文件。 (MySQL 5.6開始可以保存在表內(nèi))
relay-log.info :記錄中繼日志執(zhí)行位置的文件。 (MySQL 5.6開始可以保存在表內(nèi))
線程
I/O 線程:將從主服務(wù)器上接收的二進制日志作為中繼日志保存
SQL 線程:將中繼日志里面的更新內(nèi)容反映到DB里面
二進制日志的記錄方式不同
STATEMENT :文(SQL文)
ROW :行
MIXED :文和行混合
不確定的SQL文——執(zhí)行過程中結(jié)果可能會發(fā)生變化的SQL
UUID() 、UUID_SHORT()
USER()
FOUND_ROWS()
LOAD_FILE()
SYSDATE()
GET_LOCK() 、RELEASE_LOCK()
IS_FREE_LOCK() 、IS_USED_LOCK()
MASTER_POS_WAIT()
SLEEP()
VERSION()
沒有排序的LIMIT句
UDF 、非決定性的存儲過程/函數(shù)
查詢INFORMATION_SCHEMA
READ-COMMITTED/READ-UNCOMMITTED
同步方式不同
異步:將變更點異步傳送
半同步:將變更點同步傳送,向DB反映時候為異步
異步(默認(rèn))
異步傳送變更點
優(yōu)點:相比半同期方式,主服務(wù)器的更新響應(yīng)迅速
缺點:主服務(wù)器發(fā)生故障時,故障發(fā)生前的部分內(nèi)容可能沒有傳送到從服務(wù)器
適用于負載均衡
(故障發(fā)生前的數(shù)據(jù)需要保護的情況下,需要應(yīng)用程序?qū)?yīng))
半同步(MySQL 5.5開始追加的功能)
變更點同步傳送,異步將數(shù)據(jù)向DB反映
優(yōu)點:主服務(wù)器發(fā)生故障時,故障發(fā)生前的更新數(shù)據(jù)可以確保傳送到從服務(wù)器
缺點:與異步模式相比主服務(wù)器的更新響應(yīng)差
適用于高可用性的運用 (需要保護故障發(fā)生前的更新數(shù)據(jù))
是否使用GTID
不使用GTID傳統(tǒng)的復(fù)制模式
使用GTID:MySQL 5.6新追加的模式
多臺服務(wù)器組成的復(fù)制環(huán)境里可以很容易的跟蹤比較事務(wù)
事務(wù)在全局里擁有唯一的識別ID,可以記錄在二進制日志里面
使用時和傳統(tǒng)的方式有變化
復(fù)制開始時自動識別位置
故障切換時,可以自動識別最新的從服務(wù)器
很容易組成多層復(fù)制
GTID 的優(yōu)點:
可以自動識別日志文件里的位置,不需手動指定
(主服務(wù)器發(fā)生故障時,無需確認(rèn)日志的位置可以實現(xiàn)故障切換)
GTID 的缺點:
限制因素
只能使用InnoDB
不能使用“CREATE TABLE ... SELECT“
不能在事務(wù)中使用“CREATE TEMPORARY TABLE” 和 "DROP TEMPORARY TABLE"
不支持sql_slave_skip_counter
從服務(wù)器需要輸出二進制日志
無法使用復(fù)制功能的過濾功能,使用過濾功能GTID里面會出現(xiàn)從未使用過的ID
使GTID有效需要全部的服務(wù)器停止后再轉(zhuǎn)成GTID模式。
MySQL 5.7 可以每臺服務(wù)器輪番啟動設(shè)置GTID
復(fù)制功能的設(shè)定方法(不使用GTID)
1 .設(shè)定復(fù)制功能的參數(shù)
2 .在主服務(wù)器上建立復(fù)制用的用戶
3 .備份主服務(wù)器數(shù)據(jù),將其恢復(fù)到從服務(wù)器,需要記錄備份時的二進制日志名稱和位置
4 .從服務(wù)器上執(zhí)行 CHANGE MASTER TO
5 .從服務(wù)器上執(zhí)行 START SLAVE
主服務(wù)器:設(shè)置下記選項后啟動
server-id
log-bin
datadir *
從服務(wù)器:設(shè)置下記選項后啟動
server-id
datadir *
port *
socket * (Lunix 系OS)
read_only ( 推薦設(shè)置)
給用戶賦予“REPLICATION SLAVE”權(quán)限
例
CREATE USER 'repl'@'localhost' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
將主服務(wù)器的備份數(shù)據(jù)恢復(fù)到從服務(wù)器(不使用GTID)
將冷備份的數(shù)據(jù)恢復(fù)
使用mysqldump進行數(shù)據(jù)備份和恢復(fù)
備份
$ mysqldump --user=root --password=root --master-data=2 \
--socket=/usr/local/mysql/data/mysql.sock \
--hex-blob --default-character-set=utf8 --all-databases \
--single-transaction > mysql_bkup_dump.sql
※需要記錄備份的日志文件名稱和位置
補充:mysqldump的選項
--master-data=2
將備份時的文件名和位置作為注釋記錄在備份文件里
--hex-blob
將二進制類型(BINARY、VARBINARY、BLOG) 和BIT類型的數(shù)據(jù)以16進制輸出
--default-character-set
設(shè)置mysqldump的默認(rèn)字符
通常情況下與系統(tǒng)變量default-character-set設(shè)置一致
--all-databases
備份全部的數(shù)據(jù)庫
--lock-all-tables
將所有的表加鎖后進行備份
--single-transaction
利用InnoDB支持的事務(wù)處理,對InnoDB的表進行一致性備份
注意事項:使用mysqldump備份
為了保證數(shù)據(jù)的完整性,備份中不執(zhí)行DDL(※)
ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE
引用手冊里關(guān)于”--single-transaction”的說明
「While a --single-transaction dump is in process, to ensure a valid dump file (correct table contents and binary log coordinates), no other connection should use the following statements: ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE.
4 .從服務(wù)器上執(zhí)行 CHANGE MASTER TO
5 .從服務(wù)器上執(zhí)行 START SLAVE (不使用GTID)
執(zhí)行CHANGE MASTER TO
執(zhí)行START SLAVE
例
CHANGE MASTER TO MASTER_HOST=‘localhost',
-> MASTER_USER=‘repl',
-> MASTER_PASSWORD=‘repl',
-> MASTER_LOG_FILE='bin.000001',
-> MASTER_LOG_POS=1790;
START SLAVE;
復(fù)制功能的設(shè)定方法(使用GTID)
1 .設(shè)定復(fù)制功能的參數(shù)
2 .在主服務(wù)器上建立復(fù)制用戶
3 .將主服務(wù)器的數(shù)據(jù)備份后恢復(fù)到從服務(wù)器,無需使用日志的名稱和位置
4 .從服務(wù)器執(zhí)行 CHANGE MASTER TO
5 .從服務(wù)器執(zhí)行 START SLAVE
1 .設(shè)置復(fù)制功能的參數(shù)(使用GTID)
主服務(wù)器:設(shè)置以下選項后啟動
server-id
log-bin
datadir *
gtid-mode=on
enforce-gtid-consistency=on
log-slave-updates
從服務(wù)器:設(shè)置以下選項后啟動
server-id
log-bin
datadir *
port *
socket * ( 使用Lunix)
read_only ( 推薦設(shè)置)
gtid-mode=on
enforce-gtid-consistency=on
log-slave-updates
賦予用戶“REPLICATION SLAVE”權(quán)限
例
CREATE USER ‘repl'@'localhost' IDENTIFIED BY ‘repl';
GRANT REPLICATION SLAVE ON *.* TO ‘repl'@'localhost';
3 .將主服務(wù)器的數(shù)據(jù)備份后恢復(fù)到從服務(wù)器(使用GTID)
冷備份后恢復(fù)數(shù)據(jù)
刪除Datadir下面的auto.cnf
( 目的為主從服務(wù)器的server-uuid一致(※))
使用mysqldump進行備份和恢復(fù)
備份例
$ mysqldump --user=root --password=root –master-data=2 \
--socket=/usr/local/mysql/data/mysql.sock \
--hex-blob --default-character-set=utf8 --all-databases \
--single-transaction --triggers --routines --events > mysql_bkup_dump.sql
4 .從服務(wù)器執(zhí)行 CHANGE MASTER TO
5 .從服務(wù)器執(zhí)行 START SLAVE (使用GTID)
例
CHANGE MASTER TO MASTER_HOST=‘localhost',
-> MASTER_USER=‘repl',
-> MASTER_PASSWORD=‘repl',
-> MASTER_AUTO_POSITION=1;
START SLAVE;
管理日志
使用SHOW MASTER STATUS 確認(rèn)現(xiàn)在的日志名稱和位置
使用SHOW MASTER LOGS 列出全部的日志文件名
使用FLUSH [BINARY] LOGS 命令或者MySQL服務(wù)器再啟動的時候日志輪換
使用PURGE MASTER 刪除特定時點的日志
使用RESET MASTER 刪除全部的日志
管理復(fù)制功能的命令(從服務(wù)器)
START SLAVE [SLAVE_TYPE] 啟動從服務(wù)器
STOP SLAVE [SLAVE_TYPE] 停止從服務(wù)器
SHOW SLAVE STATUS 確認(rèn)從服務(wù)器的狀態(tài)
確認(rèn)I/O線程傳送二進制日志的位置
確認(rèn)SQL線程執(zhí)行的relay日志位置
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
STAT SLAVE; 忽略下一個事務(wù)
發(fā)生錯誤時,確認(rèn)狀態(tài)以后需要將特定的事務(wù)忽略的情況下使用
GTID 模式下該方法不適用
其他注意事項
MySQL 復(fù)制自身不具備的功能
高可用時候的故障切換功能
=>MySQL 5.6的MySQL Utilities提供自動故障切換的腳本
讀寫分離、負載均衡的控制功能
=>Connector/J(Java)或mysqlnd_ms(PHP)等可以控制
一次不要執(zhí)行大量的更新處理
防止從服務(wù)器的延遲
主服務(wù)器事務(wù)提交后,將變更的內(nèi)容傳送到從服務(wù)器,如果事務(wù)執(zhí)行時間過長的話,反映到從服務(wù)器會產(chǎn)生延遲
通過SHOW SLAVE STATUS的結(jié)果,來監(jiān)視下面內(nèi)容
I/O 線程、SQL線程是否正常活動?
I/O 線程 : Slave_IO_Running
SQL 線程 : Slave_SQL_Running
復(fù)制是否有延遲?
復(fù)制是否有延遲 : Seconds_Behind_Master
二進制日志和中繼日志的執(zhí)行位置等
二進制日志的傳送狀況 : Master_Log_File、Read_Master_Log_Pos
中繼日志的執(zhí)行狀況 : Relay_Master_Log_File、Exec_Master_Log_Pos
確認(rèn)網(wǎng)絡(luò)延時需要在主服務(wù)器上執(zhí)行SHOW MASTER STATUS 來確認(rèn)。(比較SHOW SLAVE STATUS 的Master_Log_File、Read_Master_Log_Pos)
監(jiān)視慢查詢?nèi)罩?/p>
確認(rèn)延遲原因和查詢執(zhí)行時間長的原因
主從服務(wù)器的磁盤剩余空間
從服務(wù)器的磁盤空間減少的話無法刪除中繼日志,復(fù)制功能會停止
主從服務(wù)器的資源使用狀況
(CPU 、內(nèi)存、I/O量,網(wǎng)絡(luò)流量)
優(yōu)點
MySQL 的標(biāo)準(zhǔn)功能不需要使用共享磁盤、軟件等等,成本低廉
可以實現(xiàn)高可用性和查詢處理的負載均衡
缺點
故障切換需要使用其他方法實現(xiàn),運用的時候考慮事項較多
發(fā)生故障時候,使用什么樣的方法進行切換?
發(fā)生故障切換的時候,應(yīng)用程序的連接需要切換
(MySQL 5.5 之前) 沒有崩潰安全機制,從服務(wù)器發(fā)生故障時,需要重新安裝從服務(wù)器。
當(dāng)前文章:MySQL的復(fù)制功能
網(wǎng)頁URL:http://www.rwnh.cn/article48/gshdep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、ChatGPT、App設(shè)計、響應(yīng)式網(wǎng)站、網(wǎng)頁設(shè)計公司、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)