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