您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“MySQL主從復(fù)制詳細(xì)介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MySQL主從復(fù)制詳細(xì)介紹”吧!
隨著應(yīng)用業(yè)務(wù)數(shù)據(jù)不斷的增大,應(yīng)用的響應(yīng)速度不斷下降,在檢測過程中我們不難發(fā)現(xiàn)大多數(shù)的請求都是查詢操作。
此時(shí),我們可以將數(shù)據(jù)庫擴(kuò)展成主從復(fù)制模式,將讀操作和寫操作分離開來,多臺(tái)數(shù)據(jù)庫分?jǐn)傉埱?,從而減少單庫的訪問壓力,進(jìn)而應(yīng)用得到優(yōu)化。整理了一份328頁MySQLPDF文檔
本次測試使用兩個(gè)虛擬機(jī):ip:192.168.2.21(主) ip:192.168.2.22(從)
同步操作通過 3 個(gè)線程實(shí)現(xiàn),其基本步驟如下:
主服務(wù)器將數(shù)據(jù)的更新記錄到二進(jìn)制日志中(記錄被稱作二進(jìn)制日志事件)-- 主庫線程; 從庫將主庫的二進(jìn)制日志復(fù)制到本地的中繼日志(relay log)-- 從庫 I/O 線程; 從庫讀取中繼日志中的事件,將其重放到數(shù)據(jù)中 -- 從庫 SQL 線程。
為了安全起見,準(zhǔn)備創(chuàng)建一個(gè)新用戶用于從庫連接主庫。
# 創(chuàng)建用戶 create user 'repl'@'%' identified by 'repl'; # 授權(quán),只授予復(fù)制和客戶端訪問權(quán)限 grant replication slave,replication client on *.* to 'repl'@'%' identified by 'repl';
1)vim /etc/my.cnf 在[mysqld]下添加:
log-bin = mysql-bin log-bin-index = mysql-bin.index binlog_format = mixed server-id = 21 sync-binlog = 1 character-set-server = utf8
2)保存文件并重啟主庫:
service mysqld restart
配置說明:
log-bin:設(shè)置二進(jìn)制日志文件的基本名; log-bin-index:設(shè)置二進(jìn)制日志索引文件名; binlog_format:控制二進(jìn)制日志格式,進(jìn)而控制了復(fù)制類型,三個(gè)可選值 -STATEMENT:語句復(fù)制 -ROW:行復(fù)制 -MIXED:混和復(fù)制,默認(rèn)選項(xiàng) server-id:服務(wù)器設(shè)置唯一ID,默認(rèn)為1,推薦取IP最后部分; sync-binlog:默認(rèn)為0,為保證不會(huì)丟失數(shù)據(jù),需設(shè)置為1,用于強(qiáng)制每次提交事務(wù)時(shí),同步二進(jìn)制日志到磁盤上。
若主從數(shù)據(jù)庫都是剛剛裝好且數(shù)據(jù)都是一致的,直接執(zhí)行 show master status 查看日志坐標(biāo)。
若主庫可以停機(jī),則直接拷貝所有數(shù)據(jù)庫文件。
若主庫是在線生產(chǎn)庫,可采用 mysqldump 備份數(shù)據(jù),因?yàn)樗鼘?duì)所有存儲(chǔ)引擎均可使用。
1)為了獲取一個(gè)一致性的快照,需對(duì)所有表設(shè)置讀鎖:
flush tables with read lock;
2)獲取二進(jìn)制日志的坐標(biāo):
show master status;
返回結(jié)果:
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
3)備份數(shù)據(jù):
# 針對(duì)事務(wù)性引擎 mysqldump -uroot -ptiger --all-database -e --single-transaction --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql # 針對(duì) MyISAM 引擎,或多引擎混合的數(shù)據(jù)庫 mysqldump -uroot --all-database -e -l --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql 1 row in set (0.00 sec)
4)恢復(fù)主庫的寫操作:
unlock tables;
1)vim /etc/my.cnf 在[mysqld]下添加:
log-bin = mysql-bin binlog_format = mixed log-slave-updates = 0 server-id = 22 relay-log = mysql-relay-bin relay-log-index = mysql-relay-bin.index read-only = 1 slave_net_timeout = 10
2)保存文件并重啟從庫:
service mysqld restart
配置說明:
log-slave-updates:控制 slave 上的更新是否寫入二進(jìn)制日志,默認(rèn)為0;若 slave 只作為從服務(wù)器,則不必啟用;若 slave 作為其他服務(wù)器的 master,則需啟用,啟用時(shí)需和 log-bin、binlog-format 一起使用,這樣 slave 從主庫讀取日志并重做,然后記錄到自己的二進(jìn)制日志中; relay-log:設(shè)置中繼日志文件基本名; relay-log-index:設(shè)置中繼日志索引文件名; read-only:設(shè)置 slave 為只讀,但具有super權(quán)限的用戶仍然可寫; slave_net_timeout:設(shè)置網(wǎng)絡(luò)超時(shí)時(shí)間,即多長時(shí)間測試一下主從是否連接,默認(rèn)為3600秒,即1小時(shí),這個(gè)值在生產(chǎn)環(huán)境過大,我們將其修改為10秒,即若主從中斷10秒,則觸發(fā)重新連接動(dòng)作。
如果 3.3 步驟中沒進(jìn)行備份,忽略此步驟。
mysql -uroot -p < /data/all_db.sql
根據(jù) 3.3 步驟獲取的坐標(biāo),統(tǒng)一到從庫中:
change master to master_host='192.168.2.21', master_user='repl', master_password='repl', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=120;
注意:此處使用的是新創(chuàng)建的賬戶。
1)啟動(dòng)從庫 slave 線程:
start slave;
2)查看從服務(wù)器復(fù)制功能狀態(tài):
show slave status\G;
返回結(jié)果:
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.21 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 120 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 120
此處只張貼部分返回結(jié)果。
結(jié)果說明:
Slave_IO_Running:此進(jìn)程負(fù)責(zé) slave 從 master 上讀取 binlog 日志,并寫入 slave 上的中繼日志。 Slave_SQL_Running:此進(jìn)程負(fù)責(zé)讀取并執(zhí)行中繼日志中的 binlog 日志。
這兩個(gè)進(jìn)程的狀態(tài)需全部為 YES,只要有一個(gè)為 NO,則復(fù)制就會(huì)停止。
當(dāng) Relay_Master_Log_File = Master_Log_File 且 Read_Master_Log_Pos = Exec_Master_Log_Pos 時(shí),則表明 slave 和 master 處于完全同步的狀態(tài)。
使用一個(gè)簡單的例子:
在主庫創(chuàng)建名為 mysql_test 的數(shù)據(jù)庫,如果同步成功,那么在從庫中也能查詢出名為 mysql_test 數(shù)據(jù)庫。
到此,相信大家對(duì)“MySQL主從復(fù)制詳細(xì)介紹”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。