1. 日志
1.1 錯(cuò)誤日志
錯(cuò)誤日志是 MySQL 中最重要的日志之一,它記錄了當(dāng) mysqld 啟動(dòng)和停止時(shí),以及服務(wù)器在運(yùn)行過程中發(fā)生任何嚴(yán)重錯(cuò)誤時(shí)的相關(guān)信息。當(dāng)數(shù)據(jù)庫(kù)出現(xiàn)任何故障導(dǎo)致無法正常使用時(shí),建議首先查看此日志。
該日志是默認(rèn)開啟的,默認(rèn)存放目錄 /var/log/,默認(rèn)的日志文件名為 mysqld.log 。查看日志位置:
#先登錄mysql
mysql -uroot -p1234
#通過此系統(tǒng)變量查看日志文件的位置
show variables like '%log_error%';
#通過tail指令查看文件尾部的50行日志
tail -n 50 /var/log/mysqld.log
1.2 二進(jìn)制日志
1.2.1 介紹
二進(jìn)制日志(BINLOG)記錄了所有的 DDL(數(shù)據(jù)定義語言:創(chuàng)建數(shù)據(jù)庫(kù)…)語句和 DML(數(shù)據(jù)操縱語言:增刪改)語句,但不包括數(shù)據(jù)查詢(SELECT、SHOW)語句。
作用:
- ①. 災(zāi)難時(shí)的數(shù)據(jù)恢復(fù);
- 因?yàn)槎M(jìn)制日志中記錄了數(shù)據(jù)庫(kù)、表、以及數(shù)據(jù)的變更。只需要把這里面的語句再次執(zhí)行就可以恢復(fù)數(shù)據(jù)了。
- ②. MySQL的主從復(fù)制。在MySQL8版本中
- 主從復(fù)制底層原理就是基于二進(jìn)制日志的,具體查看下一章。
mysql8.0版本默認(rèn)二進(jìn)制日志是開啟著的,涉及到的參數(shù)如下:
#先登錄mysql
mysql -uroot -p1234
#通過此系統(tǒng)變量來查看二進(jìn)制日志相關(guān)的參數(shù)配置
show variables like '%log_bin%';
參數(shù)說明:
-
log_bin:on代表二進(jìn)制日志是開著的。
-
log_bin_basename:最終生成的二進(jìn)制日志文件就在
/var/lib/mysql
目錄下,文件名叫做binlog,但是日志文件有可能有很多,binlog只是它的前綴。- 當(dāng)前數(shù)據(jù)庫(kù)服務(wù)器的binlog日志的基礎(chǔ)名稱(前綴),具體的binlog文件名需要再該basename的基礎(chǔ)上加上編號(hào)(編號(hào)從000001開始往上自增)。
- 第一個(gè)日志文件寫滿了或者日志的格式變更了之后,它會(huì)再次開啟一個(gè)新的文件來寫日志。
-
log_bin_index:binlog的索引文件,里面記錄了當(dāng)前服務(wù)器關(guān)聯(lián)的binlog文件有哪些。
測(cè)試:
進(jìn)入到/var/lib/mysql目錄查看二進(jìn)制文件到底有沒有·
#不登錄mysql執(zhí)行
cd /var/lib/mysql
#可以看到二進(jìn)制日志文件和索引文件
ll
#查看索引文件:里面就記錄了當(dāng)前mysql數(shù)據(jù)庫(kù)關(guān)聯(lián)的日志文件有哪些
cat binlog.index
1.2.2 格式
MySQL服務(wù)器中提供了多種格式來記錄二進(jìn)制日志,具體格式及特點(diǎn)如下:
日志格式 | 含義 |
---|---|
STATEMENT | 基于SQL語句的日志記錄,記錄的是SQL語句,對(duì)數(shù)據(jù)進(jìn)行修改的SQL都會(huì)記錄在日志文件中。 |
ROW | 基于行的日志記錄,記錄的是每一行的數(shù)據(jù)變更。(默認(rèn)) |
MIXED | 混合了STATEMENT和ROW兩種格式,默認(rèn)采用STATEMENT,在某些特殊情況下會(huì)自動(dòng)切換為ROW進(jìn)行記錄。 |
舉例:如果我們執(zhí)行了一條update語句,這條update語句影響的行數(shù)是5行
- STATEMENT:記錄的就是這條update語句
- ROW :它記錄的是update語句所影響的這五行,每一行的數(shù)據(jù)內(nèi)容在變更之前怎么樣,在變更之后是什么樣。
#先登錄mysql
mysql -uroot -p1234
#通過此系統(tǒng)變量,查看當(dāng)前mysql的版本中默認(rèn)的日志格式是那個(gè)
show variables like '%binlog_format%';
如果我們需要配置二進(jìn)制日志的格式,只需要在 /etc/my.cnf 中配置 binlog_format 參數(shù)即可。
vim /etc/my.cnf
#在這個(gè)文件中添加一行內(nèi)容
binlog_format=STATEMENT
#重新啟動(dòng)mysql服務(wù)
systemctl restart mysqld.service
cd /var/lib/mysql
#可以看到此時(shí)重新生成了一個(gè)日志文件binlog.000005,原先是1~4。
#因?yàn)樗亩M(jìn)制日志格式改了,他不會(huì)再往原來的二進(jìn)制日志文件寫入了,而是寫到一個(gè)新的日志文件中。
ll
再次查看此系統(tǒng)變量,發(fā)現(xiàn)日志格式已經(jīng)修改為STATEMENT
#先登錄mysql
mysql -uroot -p1234
#通過此系統(tǒng)變量,查看當(dāng)前mysql的版本中默認(rèn)的日志格式是哪個(gè)
show variables like '%binlog_format%';
1.2.3 查看
由于日志是以二進(jìn)制方式存儲(chǔ)的,不能直接讀取,需要通過二進(jìn)制日志查詢工具 mysqlbinlog 來查看,具體語法:
#logfilename:二進(jìn)制文件名
mysqlbinlog [ 參數(shù)選項(xiàng) ] logfilename
參數(shù)選項(xiàng):
-d 指定數(shù)據(jù)庫(kù)名稱,只列出指定的數(shù)據(jù)庫(kù)相關(guān)操作。
-o 忽略掉日志中的前n行命令。
-v 將行事件(數(shù)據(jù)變更)重構(gòu)為SQL語句
-vv 將行事件(數(shù)據(jù)變更)重構(gòu)為SQL語句,并輸出注釋信息
測(cè)試:接下來呢我們就來設(shè)置一下這兩種日志格式,來看一下它們之間的區(qū)別是什么樣子的。
情況1:當(dāng)前的日志格式是row
第一步:以db01數(shù)據(jù)庫(kù)下的stu表為例進(jìn)行演示。
客戶端1:就是登錄進(jìn)mysql執(zhí)行的命令
mysql -uroot -p1234
#當(dāng)前的日志格式是row
show variables like '%binlog_format%';
use db01;
#查看db01數(shù)據(jù)庫(kù)下面有哪些表
show tables;
#查看stu表下面有哪些數(shù)據(jù)
select * from stu;
第二步:執(zhí)行更新語句
客戶端1:
update stu set age = age +1 where id =1;
第三步:查看二進(jìn)制日志表記錄的是什么內(nèi)容
客戶端2:就是沒有登錄進(jìn)mysql執(zhí)行的命令
cd /var/lib/mysql
ll
#因?yàn)槎M(jìn)制日志是第一個(gè)日志文件寫滿了之后會(huì)開啟一個(gè)新的日志文件,所以只需要看最后一個(gè)日志文件即可。
#二進(jìn)制文件不能直接查看使用cat顯示的是亂碼,需要通過mysqlbinlog 指令來查看
#日志里面是以行的格式顯示的,所以看不到sql語句,我們還需要使用-v把它重構(gòu)為sql語句才能看到
#效果:在日志的最后部分可以看到數(shù)據(jù)執(zhí)行前后的變化
mysqlbinlog -v binlog.000004;
可以看出日志格式是row,記錄的是記錄的是每一行的數(shù)據(jù)變更,在變更之前怎么樣,在變更之后是什么樣。
情況2:當(dāng)前的日志格式是STATEMENT
第一步:修改日志格式為STATEMENT,只需要在 /etc/my.cnf 中配置 binlog_format 參數(shù)即可
vim /etc/my.cnf
#在這個(gè)文件中添加一行內(nèi)容
binlog_format=STATEMENT
#重新啟動(dòng)mysql服務(wù)
systemctl restart mysqld.service
cd /var/lib/mysql
#可以看到此時(shí)重新生成了一個(gè)日志文件binlog.000005,原先是1~4。
#因?yàn)樗亩M(jìn)制日志格式改了,他不會(huì)再往原來的二進(jìn)制日志文件寫入了,而是寫到一個(gè)新的日志文件中。
ll
第二步:再次執(zhí)行之前的更新語句
mysql -uroot -p1234
use db01;
update stu set age = age +1 where id =1;
第三步:再次查看這個(gè)新生成的二進(jìn)制日志表的內(nèi)容
#進(jìn)入到二進(jìn)制日志文件存放的位置
cd /var/lib/mysql
#可以看到此目錄下有這個(gè)日志文件
ll
#查看此二進(jìn)制日志文件
#不需要加-v,因?yàn)槭荢TATEMENT它本身記錄的就是sql語句
#效果:可以看到此時(shí)記錄的就是sql語句而不是每一行的數(shù)據(jù)變化
mysqlbinlog binlog.000005;
1.2.4 刪除
對(duì)于比較繁忙的業(yè)務(wù)系統(tǒng),每天生成的binlog數(shù)據(jù)巨大,如果長(zhǎng)時(shí)間不清除,將會(huì)占用大量磁盤空間。可以通過以下幾種方式清理日志:
指令 | 含義 |
---|---|
reset master |
刪除全部 binlog 日志,刪除之后,日志編號(hào),將從 binlog.000001重新開始 |
purge master logs to 'binlog.*****' |
刪除 ***** 編號(hào)之前的所有日志 |
purge master logs before 'yyyy-mm-dd hh24:mi:ss' |
刪除日志為 “yyyy-mm-dd hh24:mi:ss” 時(shí)間點(diǎn)之前產(chǎn)生的所有日志 |
也可以在mysql的配置文件中配置二進(jìn)制日志的過期時(shí)間,設(shè)置了之后,二進(jìn)制日志過期會(huì)自動(dòng)刪除。
mysql -uroot -p1234
#查看系統(tǒng)變量,在mysql命令行中執(zhí)行
#單位是秒,默認(rèn)過期時(shí)間為30天,到期之后會(huì)自動(dòng)刪除
show variables like '%binlog_expire_logs_seconds%';
測(cè)試:
客戶端1:
mysql -uroot -p1234
#刪除000002之前的日志文件,不包含000002
purge master logs to 'binlog.000002';
客戶端2:
cd /var/lib/mysql
#可以看到二進(jìn)制日志文件和索引文件
ll
1.3 查詢?nèi)罩?/h3>
查詢?nèi)罩局杏涗浟丝蛻舳说?strong>所有操作語句,而二進(jìn)制日志不包含查詢數(shù)據(jù)的SQL語句。默認(rèn)情況下, 查詢?nèi)罩臼?strong>未開啟的。
mysql -uroot -p1234
#檢查參數(shù)查看開關(guān)是否開啟
#可以看到默認(rèn)是關(guān)閉的以及日志文件所處位置和文件名
show variables like '%general%';
如果需要開啟查詢?nèi)罩?,可以修改MySQL的配置文件 /etc/my.cnf 文件,添加如下內(nèi)容:
vim /etc/my.cnf
#該選項(xiàng)用來開啟查詢?nèi)罩?, 可選值 : 0 或者 1 ; 0 代表關(guān)閉, 1 代表開啟
general_log=1
#設(shè)置日志的文件名 , 如果沒有指定, 默認(rèn)的文件名為 host_name.log
general_log_file=mysql_query.log
#重啟mysql服務(wù)
systemctl restart mysqld.service
#查看這個(gè)目錄下是否會(huì)生成此日志文件
cd /var/lib/mysql/
ll
開啟了查詢?nèi)罩局螅贛ySQL的數(shù)據(jù)存放目錄,也就是 /var/lib/mysql/ 目錄下就會(huì)出現(xiàn)mysql_query.log 文件。之后所有的客戶端的增刪改查操作都會(huì)記錄在該日志文件之中,長(zhǎng)時(shí)間運(yùn)行后,該日志文件將會(huì)非常大。所以用不上此日志文件,我們可以把它關(guān)上。
測(cè)試:
客戶端1:
mysql -uroot -p1234
use db01;
#執(zhí)行查詢操作(前提是已經(jīng)登錄)
select * from stu;
#執(zhí)行更新操作
update stu set age=100 where id=7;
客戶端2:
cd /var/lib/mysql/
#前提是已經(jīng)進(jìn)入到了這個(gè)目錄,并且目錄下有這個(gè)文件(上面已經(jīng)配置過了)
#實(shí)時(shí)刷新此日志文件尾部的內(nèi)容(tail查看文件尾部,-f表示實(shí)時(shí)刷新)
tail -f mysql_query.log
可以看到所有的DDL和DML操作都會(huì)在日志表當(dāng)中記錄。
1.4 慢查詢?nèi)罩?/h3>
慢查詢?nèi)罩居涗浟怂袌?zhí)行時(shí)間超過參數(shù) long_query_time 設(shè)置值并且掃描記錄數(shù)不小于min_examined_row_limit 的所有的SQL語句的日志,默認(rèn)未開啟。long_query_time 默認(rèn)為10 秒,最小為 0, 精度可以到微秒。
解釋:
- 慢查詢?nèi)罩居涗浟藞?zhí)行效率比較低,執(zhí)行速度比較慢的sql語句。
- 之前在索引的sql性能分析中講解過。
如果需要開啟慢查詢?nèi)罩荆枰贛ySQL的配置文件 /etc/my.cnf 中配置如下參數(shù):
#慢查詢?nèi)罩荆?代表開啟
slow_query_log=1
#執(zhí)行時(shí)間參數(shù):表示執(zhí)行時(shí)間超過2秒就是慢查詢?nèi)罩?,此時(shí)慢查詢?nèi)罩疚募蜁?huì)記錄這條sql.
long_query_time=2
默認(rèn)情況下,不會(huì)記錄管理語句,也不會(huì)記錄不使用索引進(jìn)行查找的查詢??梢允褂胠og_slow_admin_statements和 更改此行為 log_queries_not_using_indexes,如下所述。
解釋:
- 通過在
vim /etc/my.cnf
配置文件中配置這2個(gè)參數(shù),可以改變它的默認(rèn)行為。 - 如果添加了log_slow_admin_statements =1:表示當(dāng)我們執(zhí)行比較慢的管理語句的時(shí)候,也會(huì)記錄在慢查詢?nèi)罩井?dāng)中。
- 如果添加了log_queries_not_using_indexes = 1:表示如果某一條sql語句,它沒有使用索引而造成執(zhí)行效率比較慢的話,也會(huì)記錄在慢查詢?nèi)罩井?dāng)中。
- 通過慢查詢?nèi)罩揪涂梢远ㄎ怀瞿切﹕ql執(zhí)行效率低,從而對(duì)這類的sql進(jìn)行優(yōu)化。
#記錄執(zhí)行較慢的管理語句
log_slow_admin_statements =1
#記錄執(zhí)行較慢的未使用索引的語句
log_queries_not_using_indexes = 1
上述所有的參數(shù)配置完成之后,都需要重新啟動(dòng)MySQL服務(wù)器才可以生效。
測(cè)試:
客戶端1:
mysql -uroot -p1234
#db01數(shù)據(jù)庫(kù)下有tb_sku表,存放了1000萬條記錄
#電腦太卡,所以我沒有創(chuàng)建tb_sku表,這里不在演示,只顯示最終結(jié)果
use db01;
#不會(huì)記錄
select * from tb_user limit 0,10; -- 這條SQL執(zhí)行效率比較高, 執(zhí)行耗時(shí) 0.01sec
#前面學(xué)習(xí)過SQL優(yōu)化,分頁(yè)查詢?cè)较蚝笮试降停藭r(shí)超過2秒,會(huì)記錄在慢查詢?nèi)罩局?/span>
select * from tb_user limit 1000000,10; -- 由于tb_sku表中, 預(yù)先存入了1000w的記錄, count一次,耗時(shí)4.71sec(秒)
客戶端2:
#配置慢查詢?nèi)罩?/span>
vim /etc/my.cnf
#配置的內(nèi)容
slow_query_log=1
long_query_time=2
# 重啟Mysql服務(wù)器
systemctl restart mysqld
# 進(jìn)入到此目錄,發(fā)現(xiàn)會(huì)有一個(gè)后綴是-slow.log的日志文件
cd /var/lib/mysql/
ll
#實(shí)時(shí)刷新文件尾部的位置發(fā)現(xiàn):
#記錄了什么時(shí)間哪一個(gè)用戶在哪一個(gè)主機(jī)上執(zhí)行了什么樣的sql語句
tail -f mysql8-slow.log
2.主從復(fù)制
2.1 概述
主從復(fù)制是指將主數(shù)據(jù)庫(kù)的 DDL 和 DML 操作通過二進(jìn)制日志傳到從庫(kù)服務(wù)器中,然后在從庫(kù)上對(duì)這些日志重新執(zhí)行(也叫重做),從而使得從庫(kù)和主庫(kù)的數(shù)據(jù)保持同步。
MySQL支持一臺(tái)主庫(kù)同時(shí)向多臺(tái)從庫(kù)進(jìn)行復(fù)制, 從庫(kù)同時(shí)也可以作為其他從服務(wù)器的主庫(kù),實(shí)現(xiàn)鏈狀復(fù)制。
MySQL 復(fù)制的優(yōu)點(diǎn)主要包含以下三個(gè)方面:
- 主庫(kù)出現(xiàn)問題,可以快速切換到從庫(kù)提供服務(wù)。
- 實(shí)現(xiàn)讀寫分離,降低主庫(kù)的訪問壓力。
- 增刪改操作主庫(kù),查詢操作從庫(kù)。
- 可以在從庫(kù)中執(zhí)行備份,以避免備份期間影響主庫(kù)服務(wù)。
- 數(shù)據(jù)備份的時(shí)候加上全局鎖以防止備份的數(shù)據(jù)不完整,此時(shí)數(shù)據(jù)庫(kù)處于只讀狀態(tài),其它的客戶端只能查詢不能做增刪改。
- 有了主從復(fù)制后,可以在從庫(kù)當(dāng)中進(jìn)行備份只需要鎖從庫(kù)就行,主庫(kù)仍然可以進(jìn)行增刪改等操作。從庫(kù)加了全局鎖后仍然可以查詢,只不過在數(shù)據(jù)備份期間可能存在一定的數(shù)據(jù)延遲,因?yàn)樵趥浞萜陂g從庫(kù)是不能夠執(zhí)行從主庫(kù)同步過來的二進(jìn)制日志的。
- 解決:可以使用single-transaction參數(shù)代替加全局鎖的方式進(jìn)行備份,來保證數(shù)據(jù)的一致性備份------詳情查看全局鎖。
2.2 原理
MySQL主從復(fù)制的核心就是 二進(jìn)制日志,具體的過程如下:
從上圖來看,復(fù)制分成三步:
-
Master 主庫(kù)在事務(wù)提交時(shí),會(huì)把數(shù)據(jù)變更記錄在二進(jìn)制日志文件 Binlog 中。
-
從庫(kù)讀取主庫(kù)的二進(jìn)制日志文件 Binlog ,寫入到從庫(kù)的
中繼日志 Relay Log
。- 從庫(kù)中的IOthread線程:發(fā)起一個(gè)請(qǐng)求連接主數(shù)據(jù)庫(kù),然后讀取主數(shù)據(jù)庫(kù)中的 Binlog日志,讀取完并返回從庫(kù)之后,此線程會(huì)把Binlog日志寫入到從庫(kù)自身的一份日志(中繼日志 Relay Log)中。
-
slave從庫(kù)重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)。
- 從庫(kù)中的SQLthread線程:讀取中繼日志當(dāng)中的數(shù)據(jù),然后把中繼日志當(dāng)中所記錄的數(shù)據(jù)變化在反映到自身數(shù)據(jù)庫(kù)的數(shù)據(jù)變化,從而保證主從數(shù)據(jù)的一致。
舉例:主庫(kù)執(zhí)行insert語句之后寫入到二進(jìn)制日志中,然后被IOthread線程讀取過來之后寫入到中繼日志,那么SQLthread線程讀取中繼日志就會(huì)讀取到這條insert語句,那么接下來在從庫(kù)當(dāng)中再去執(zhí)行這條insert,此時(shí)就保證了主從數(shù)據(jù)的一致。
2.3 搭建
2.3.1 環(huán)境準(zhǔn)備
準(zhǔn)備好兩臺(tái)服務(wù)器之后,在上述的兩臺(tái)服務(wù)器中分別安裝好MySQL,并完成基礎(chǔ)的初始化準(zhǔn)備(安裝、 密碼配置等操作)工作(注意要關(guān)閉防火墻
)。 其中:
-
192.168.10.200
作為主服務(wù)器master- 主機(jī)名:master
-
192.168.10.201
作為從服務(wù)器slave- 主機(jī)名:slave
- 主機(jī)名:slave
注意事項(xiàng)
:
- 首先配置的ip地址要和虛擬機(jī)配置的域名解析要在同一個(gè)網(wǎng)段,只有最后一個(gè)可以不同。
- 如果重啟虛擬機(jī)后不顯示ens33網(wǎng)卡,需要重啟網(wǎng)絡(luò)服務(wù),當(dāng)然啟動(dòng)服務(wù)時(shí)有可能會(huì)報(bào)錯(cuò),需要關(guān)閉NetworkManger 服務(wù)。
-
ifconfig異常情況不顯示ens33:
-
ifconfig正常情況顯示ens33:
-
#重啟網(wǎng)絡(luò)服務(wù),可能會(huì)報(bào)錯(cuò)
service network restart
#如果報(bào)錯(cuò):可能是和 NetworkManager 服務(wù)有沖突
#NetworkManager 是一個(gè)為系統(tǒng)提供檢測(cè)和配置功能以便自動(dòng)連接到網(wǎng)絡(luò)的程序。包含一個(gè)守護(hù)程序、一個(gè)命令行界面(nmcli)和一個(gè)基于 curses 的界面(nmtui)。
#解決:直接關(guān)閉 NetworkManger 服務(wù)就好了,并且禁止開機(jī)啟動(dòng),之后在重啟網(wǎng)絡(luò)服務(wù)
#關(guān)閉NetworkManger 服務(wù)
service NetworkManager stop
#禁止開機(jī)啟動(dòng)
chkconfig NetworkManager off
#此時(shí)再次啟動(dòng)網(wǎng)絡(luò)服務(wù)就會(huì)成功了
service network restart
最后查看2臺(tái)mysql服務(wù)器的運(yùn)行狀態(tài):
systemctl status mysqld
2.3.2 主庫(kù)配置
1.修改配置文件 vim /etc/my.cnf
#mysql 服務(wù)ID,保證整個(gè)集群環(huán)境中唯一,取值范圍:1 – 232-1,默認(rèn)為1
server-id=1
#是否只讀,1 代表只讀, 0 代表讀寫
read-only=0
#以下2個(gè)不需要配置,表示創(chuàng)建的所有數(shù)據(jù)庫(kù)都需要進(jìn)行同步
#忽略的數(shù)據(jù), 指不需要同步的數(shù)據(jù)庫(kù)
#binlog-ignore-db=mysql
#指定同步的數(shù)據(jù)庫(kù)
#binlog-do-db=db01
2.重啟MySQL服務(wù)器
#如果沒有報(bào)錯(cuò)代表配置文件中的配置成功
systemctl restart mysqld
3.登錄mysql
,創(chuàng)建遠(yuǎn)程連接的賬號(hào),并授予主從復(fù)制權(quán)限
解釋
- ‘itcast’@‘%’:其中
itcast
是用戶名,@'%代表這個(gè)用戶可以在任意主機(jī)上來訪問當(dāng)前服務(wù)器 - 密碼是:
Root@123456
#需要先登錄mysql
mysql -uroot -p1234
#創(chuàng)建itcast用戶,并設(shè)置密碼,該用戶可在任意主機(jī)連接該MySQL服務(wù)
#作用:在從庫(kù)當(dāng)中連接主庫(kù)時(shí)的賬號(hào)和密碼。
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
#為 'itcast'@'%' 用戶分配主從復(fù)制權(quán)限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
4.通過指令,查看二進(jìn)制日志坐標(biāo)
show master status ;
字段含義說明:
- file : 從哪個(gè)日志文件開始推送日志文件(寫到那個(gè)日志文件了)
- position : 從哪個(gè)位置開始推送日志
- binlog_ignore_db : 指定不需要同步的數(shù)據(jù)庫(kù)
主庫(kù)配置完后就不要在執(zhí)行DML增刪改以及DDL語句了。
2.3.3 從庫(kù)配置
1.修改配置文件 vim /etc/my.cnf
#mysql 服務(wù)ID,保證整個(gè)集群環(huán)境中唯一,取值范圍:1 – 2^32-1,和主庫(kù)不一樣即可
server-id=2
#是否只讀,1 代表只讀, 0 代表讀寫
#從庫(kù)只需要做查詢操作不需要做修改操作,所以設(shè)置為1也可以。
#這個(gè)選項(xiàng)僅僅代表是普通用戶只讀,如果這個(gè)用戶具有超級(jí)管理員super的權(quán)限,那么他也是可以進(jìn)行讀寫的。
read-only=1
#如果想要禁用超級(jí)管理員的讀寫功能,讓它也變?yōu)橹挥凶x的功能,可以設(shè)置以下參數(shù)
super-read-only=1
2.重新啟動(dòng)MySQL服務(wù)
systemctl restart mysqld
3.登錄mysql
,設(shè)置主庫(kù)配置
現(xiàn)在主庫(kù)和從庫(kù)是沒有關(guān)系的,并沒有產(chǎn)生關(guān)聯(lián),所以接下來還要在從庫(kù)中去設(shè)置主庫(kù)的相關(guān)配置。
- SOURCE_HOST=‘192.168.200.200’:原主機(jī)地址是多少,也就是主庫(kù)的ip
- SOURCE_USER=‘itcast’:連接這個(gè)ip地址對(duì)應(yīng)的mysql,那么我的用戶名是多少
- SOURCE_PASSWORD=‘Root@123456’:密碼是多少
- SOURCE_LOG_FILE=‘binlog.000004’:從哪個(gè)二進(jìn)制日志文件開始同步
- SOURCE_LOG_POS=663:表示從這份日志文件中的哪個(gè)位置開始同步。
mysql -uroot -p1234
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.10.200', SOURCE_USER='itcast',SOURCE_PASSWORD='Root@123456', SOURCE_LOG_FILE='binlog.000012',SOURCE_LOG_POS=663;
上述是8.0.23中的語法。如果mysql是 8.0.23 之前的版本,執(zhí)行如下SQL:
CHANGE MASTER TO MASTER_HOST='192.168.10.201', MASTER_USER='itcast',MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000012',MASTER_LOG_POS=663;
2個(gè)版本的區(qū)別是參數(shù)名不同:當(dāng)前使用的8.0.26版本兼容之前的語法,所以執(zhí)行那一條都可以
參數(shù)名 | 含義 | 8.0.23之前 |
---|---|---|
SOURCE_HOST | 主庫(kù)IP地址 | MASTER_HOST |
SOURCE_USER | 連接主庫(kù)的用戶名 | MASTER_USER |
SOURCE_PASSWORD | 連接主庫(kù)的密碼 | MASTER_PASSWORD |
SOURCE_LOG_FILE | binlog日志文件名 | MASTER_LOG_FILE |
SOURCE_LOG_POS | binlog日志文件位置 | MASTER_LOG_POS |
4.開啟同步操作
start replica ; #8.0.22之后
start slave ; #8.0.22之前
5.查看主從同步狀態(tài)
show replica status ; #8.0.22之后
#表中的數(shù)據(jù)比較大展示出來的效果比較混亂,可以加上\G把每一列數(shù)據(jù)轉(zhuǎn)化為每一行顯示。
show replica status\G;
show slave status ; #8.0.22之前
效果:只需要以下2個(gè)選項(xiàng)為yes就代表主從復(fù)制正常,IO-Running代表那一組io線程運(yùn)行是否正常,SQL-Running代表那一組sql線程運(yùn)行是否正常。
錯(cuò)誤情況:如果是克隆的虛擬機(jī),mysql的uuid值是一樣的,必須修改從庫(kù)虛擬機(jī)的mysql服務(wù)器uuid的值,和主庫(kù)不能一樣
解決:
#不需要登錄mysql
#修改此文件中的uuid值,隨便修改一個(gè)字符
vim /var/lib/mysql/auto.cnf
#重啟mysql服務(wù)
systemctl restart mysqld
再次查詢主從同步狀態(tài),此時(shí)都為yes(注意在從庫(kù)執(zhí)行)
#登錄進(jìn)mysql后執(zhí)行,可以開啟多個(gè)會(huì)話窗口這樣就不需要多次登陸了
show replica status\G;
2.3.4 測(cè)試
先查詢此時(shí)的數(shù)據(jù)庫(kù)狀態(tài):
show databases;
1.在主庫(kù) 192.168.10.200 上創(chuàng)建數(shù)據(jù)庫(kù)、表,并插入數(shù)據(jù)
create database db02;
use db02;
create table tb_user(
id int(11) primary key not null auto_increment,
name varchar(50) not null,
sex varchar(1)
)engine=innodb default charset=utf8mb4;
insert into tb_user(id,name,sex) values(null,'Tom', '1'),(null,'Trigger','0'),(null,'Dawn','1');
2.在從庫(kù) 192.168.10.201 中查詢數(shù)據(jù),驗(yàn)證主從是否同步
show datables;
use db02;
show tables;
select * from tb_user;
注意:文章來源:http://www.zghlxwxcb.cn/news/detail-765816.html
- 我們剛才所演示的這種主從復(fù)制,它是從二進(jìn)制日志的當(dāng)前位置往后進(jìn)行主從復(fù)制的,如果我們要把之前的數(shù)據(jù)也需要同步到從庫(kù),那么這個(gè)時(shí)候我們可以先把主庫(kù)的數(shù)據(jù)導(dǎo)出到一個(gè)sql腳本當(dāng)中,然后在從庫(kù)當(dāng)中把sql腳本執(zhí)行,先保證主庫(kù)和從庫(kù)的初始數(shù)據(jù)是一致的,然后再?gòu)漠?dāng)前位置往后再進(jìn)行同步。
2.4 總結(jié)
文章來源地址http://www.zghlxwxcb.cn/news/detail-765816.html
到了這里,關(guān)于MySql運(yùn)維篇---008:日志:錯(cuò)誤日志、二進(jìn)制日志、查詢?nèi)罩?、慢查詢?nèi)罩荆鲝膹?fù)制:概述 虛擬機(jī)更改ip注意事項(xiàng)、原理、搭建步驟的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!