MySQL?Server?層四個(gè)日志詳解
一、MySQL Server層日志簡(jiǎn)介
一個(gè)mysql client發(fā)起一個(gè)連接請(qǐng)求,處理請(qǐng)求的過(guò)程如下圖所示:
MySQL日志是在MySQL server上生成的,不管更改哪個(gè)存儲(chǔ)引擎,這些日志都是需要有的,包括:
- 錯(cuò)誤日志:記錄mysqld服務(wù)運(yùn)行過(guò)程中出現(xiàn)的cordump、error、exception等
- 查詢?nèi)罩荆河涗浛蛻舳怂械腟QL。由于上線項(xiàng)目的SQL太多了,開(kāi)啟查詢?nèi)罩綢O太多導(dǎo)致MySQL效率低下,我們一般都不會(huì)開(kāi)啟,只有調(diào)試時(shí)才開(kāi)啟
- 二進(jìn)制日志:記錄數(shù)據(jù)的更改(insert、update、delete、alter …),非常重要,可用于數(shù)據(jù)恢復(fù),主從復(fù)制。主從復(fù)制技術(shù)依賴于log_bin,主庫(kù)所有的更改操作都記錄在log_bin里,從庫(kù)從binlog讀取主庫(kù)所有的操作,自己再執(zhí)行一遍。
- 慢查詢?nèi)罩荆河涗浟艘恍﹫?zhí)行時(shí)間超過(guò)指定值的SQL語(yǔ)句,可供開(kāi)發(fā)人員分析耗時(shí)SQL,從而針對(duì)性優(yōu)化
查看日志相關(guān)變量
二、配置文件參數(shù)
my.cnf
通過(guò)set方法只能影響當(dāng)前session,如果想要配置永久有效,需要在配置文件上進(jìn)行設(shè)置,然后重啟MySQL服務(wù),就可以永久生效
linux下重啟mysqld服務(wù)的命令:sudo service mysqld restart
我們查看一下配置文件/etc/mysql/my.cnf
- 給出
log-error
的路徑就是開(kāi)啟了log-error
,如果不自定義log-error
的路徑,默認(rèn)在data_dir
- 在開(kāi)啟
log-bin=mysql-bin
的同時(shí)還要加上server-id=1
(表示當(dāng)前MySQL Server的身份),否則sudo service mysqld restart無(wú)法重啟服務(wù) - 設(shè)置過(guò)期的時(shí)間
expire_log_days
,因?yàn)榭傆幸惶齑疟P(pán)會(huì)被這個(gè)日志占滿,導(dǎo)致服務(wù)器不可運(yùn)行,超過(guò)設(shè)置時(shí)間后日志文件會(huì)被刪除
三、錯(cuò)誤日志
錯(cuò)誤日志是 MySQL 中最重要的日志之一,它記錄了當(dāng) mysqld 啟動(dòng)和停止,以及服務(wù)器在運(yùn)行過(guò)程中發(fā)生任何嚴(yán)重錯(cuò)誤(cordump,error,exception…)時(shí)的相關(guān)信息。當(dāng)數(shù)據(jù)庫(kù)出現(xiàn)故障導(dǎo)致無(wú)法正常使用時(shí),可以首先查看此日志
mysqld 使用的錯(cuò)誤日志名為 host_name.err(host_name 為主機(jī)名) ,并默認(rèn)在參數(shù)data_dir(數(shù)據(jù)目錄)指定的目錄中寫(xiě)入日志文件
四、查詢?nèi)罩?/h2>
查詢?nèi)罩居涗浟薱lient發(fā)送的所有SQL語(yǔ)句
由于上線項(xiàng)目sql特別多,開(kāi)啟查詢?nèi)罩綢O太多導(dǎo)致MySQL效率低,我們一般都不會(huì)開(kāi)啟,只有在調(diào)試時(shí)才開(kāi)啟,比如通過(guò)查看sql發(fā)現(xiàn)熱點(diǎn)數(shù)據(jù)從而可以進(jìn)行緩存
show global variables like '%genera%';
五、二進(jìn)制日志
不是明文,不能直接查看,需要通過(guò)mysqlbinlog工具(mysql原生自帶)解析binlog日志文件
二進(jìn)制日志(BINLOG)記錄了所有的 DDL(數(shù)據(jù)定義語(yǔ)言)語(yǔ)句和 DML(數(shù)據(jù)操縱語(yǔ)言) 語(yǔ)句,但是不包括數(shù)據(jù)查詢語(yǔ)句(不記錄select操作,記錄的是數(shù)據(jù)庫(kù)的更改操作)
語(yǔ)句以“事件”的形式保存,它描述了數(shù)據(jù)的更改過(guò)程。二進(jìn)制日志對(duì)于災(zāi)難時(shí)的數(shù)據(jù)恢復(fù)起著極其重要的作用。
兩個(gè)重要的應(yīng)用場(chǎng)景:主從復(fù)制、數(shù)據(jù)恢復(fù)
主從復(fù)制:主庫(kù)所有的更新操作(update、delete、insert、alter …)都記錄在binlog中,從庫(kù)讀主庫(kù)的binlog,把binlog的所有操作在從庫(kù)上在進(jìn)行一遍
查看當(dāng)前的binlog:
show binary logs; -- show master logs;
binlog默認(rèn)在MySQL的data_dir下
1. 演示binlog記錄更改
我們先刷新一下,生成一個(gè)新的binlog
切換數(shù)據(jù)庫(kù)
更改一下數(shù)據(jù)
再次查看binlog
我們發(fā)現(xiàn)日志的filesize和剛才的不一樣了,肯定記錄我們剛才的數(shù)據(jù)更改操作
如果我們直接cat日志查看,會(huì)發(fā)現(xiàn)不是明文,無(wú)法直接查看
我們需要通過(guò)mysqlbinlog進(jìn)行查看,如下:
mysqlbinlog --no-defaults --database=school --base64-output=decode-rows -v --start-datetime='2022-03-01 00:00:00' --stop-datetime='2022-03-31 00:00:00' mysql-bin.000001 | more
database:指定查看某個(gè)庫(kù)的更改base64-output:binlog解碼方式start-datetime & stop-datetime:指定查看某個(gè)時(shí)間段內(nèi)的更改,不寫(xiě)則查看所有的更改mysql-bin.000001:查看的二進(jìn)制日志文件
我們查看一下binlog
@1、@2、@3、@4:表示數(shù)據(jù)庫(kù)表的4個(gè)字段server id:表示我們?cè)?code>my.cnf中設(shè)置的id,用于標(biāo)識(shí)當(dāng)前MySQL的身份at 565、at679:指的是當(dāng)前事件在binlog記錄的位置,數(shù)據(jù)恢復(fù)的時(shí)候使用
2. 演示binlog數(shù)據(jù)恢復(fù)
現(xiàn)在創(chuàng)建數(shù)據(jù)庫(kù)mytest,并創(chuàng)建表,添加數(shù)據(jù)
假如現(xiàn)在有人把庫(kù)刪除了:
這時(shí)mytest庫(kù)的所有表和數(shù)據(jù)都沒(méi)有了,然而這些操作都會(huì)記錄在二進(jìn)制日志binlog里面
理論上來(lái)說(shuō),可以從binlog把丟失的數(shù)據(jù)恢復(fù)出來(lái)。由于恢復(fù)過(guò)程也是對(duì)數(shù)據(jù)的修改,所以恢復(fù)過(guò)程產(chǎn)生的日志也要記錄在binlog中,這就需要我們指定binlog恢復(fù)區(qū)間
我們現(xiàn)在知道,我們建庫(kù)、建表、插入數(shù)據(jù)的操作都記錄在mysql-bin.00003文件中
我們現(xiàn)在刷新一下,生成一個(gè)新的binlog,這就可以讓我們接下來(lái)數(shù)據(jù)恢復(fù)的操作被記錄在mysql-bin.00004文件中,而不會(huì)在追加到mysql-bin.00003
我們先查看mysql-bin.00003,找需要恢復(fù)的區(qū)間
從mysql-bin.000003中拿出區(qū)間內(nèi)所有的操作,通過(guò)管道放到MySQL shell上執(zhí)行
查看一下當(dāng)前的庫(kù)
再查看一下表和數(shù)據(jù)
到這里,數(shù)據(jù)已經(jīng)全部恢復(fù)了
我們不僅可以通過(guò)binlog記錄的位置,得到需要恢復(fù)的區(qū)間,也可以通過(guò)binlog記錄的時(shí)間得到需要恢復(fù)的區(qū)間
參數(shù)為:start-datetime、stop-datetime
由于binlog有一個(gè)過(guò)期時(shí)間,過(guò)期的日志數(shù)據(jù)都會(huì)進(jìn)行備份,沒(méi)有過(guò)期的數(shù)據(jù)可以直接通過(guò)binlog恢復(fù),如果需要恢復(fù)過(guò)期的數(shù)據(jù),通過(guò)以下命令即可:
mysql> source ~/data.sql
$cat ~/data.sql | mysql -u root -p
六、慢查詢?nèi)罩?/h2>
MySQL可以設(shè)置慢查詢?nèi)罩?,?dāng)SQL執(zhí)行的時(shí)間超過(guò)我們?cè)O(shè)定的時(shí)間,那么這些SQL就會(huì)被記錄在慢查詢?nèi)罩井?dāng)中
我們通過(guò)查看日志,用explain分析這些SQL的執(zhí)行計(jì)劃,來(lái)判定為什么效率低下,是沒(méi)有使用到索引?還是索引本身創(chuàng)建的有問(wèn)題?或者是索引使用到了,但是由于表的數(shù)據(jù)量太大,花費(fèi)的時(shí)間就是很長(zhǎng),那么此時(shí)我們可以把表分成n個(gè)小表,比如訂單表按年份分成多個(gè)小表等
慢查詢?nèi)罩鞠嚓P(guān)的參數(shù)如下所示:
慢查詢?nèi)罩居涗浟税袌?zhí)行時(shí)間超過(guò)參數(shù) long_query_time(單位:秒)所設(shè)置值的 SQL語(yǔ)句的日志,在MySQL上用命令可以查看,如下:
這個(gè)值是可以修改的:
現(xiàn)在修改成執(zhí)行時(shí)間超過(guò)1秒的SQL都會(huì)被記錄在慢查詢?nèi)罩井?dāng)中!可以設(shè)置為0.01秒,表示10毫秒
慢查詢?nèi)罩?,默認(rèn)名稱是host_name-slow.log,存放在MySQL的data_dir下,內(nèi)容格式顯示大致如下:
show profiles命令可有查看sql詳細(xì)的運(yùn)行時(shí)間,全局變量的名字是:profiling
首先需要:set profiling=on
到此這篇關(guān)于MySQL Server 層四個(gè)日志的文章就介紹到這了,更多相關(guān)MySQL Server層日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Windows環(huán)境下安裝MySQL 的教程圖解
這篇文章主要介紹了在Windows環(huán)境下安裝MySQL 的教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07解說(shuō)mysql之binlog日志以及利用binlog日志恢復(fù)數(shù)據(jù)的方法
下面小編就為大家?guī)?lái)一篇解說(shuō)mysql之binlog日志以及利用binlog日志恢復(fù)數(shù)據(jù)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03如何在Windows中運(yùn)行多個(gè)MySQL實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于如何在Windows中運(yùn)行多個(gè)MySQL實(shí)例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Mysql| 使用通配符進(jìn)行模糊查詢?cè)斀?like,%,_)
這篇文章主要介紹了Mysql| 使用通配符進(jìn)行模糊查詢?cè)斀?like,%,_),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08MySQL數(shù)據(jù)庫(kù)配置信息查看與修改方法詳解
我們通常把在項(xiàng)目中使用的常量收集在一個(gè)文件,這個(gè)文件就是配置文件,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)配置信息查看與修改的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06