mysql日志——記錄著mysql數(shù)據(jù)庫(kù)運(yùn)行期間的操作和信息
日志作用
(1)當(dāng)數(shù)據(jù)庫(kù)遭到意外損害,可以通過(guò)日志文件來(lái)查詢(xún)出錯(cuò)原因
(2)利用日志文件進(jìn)行數(shù)據(jù)恢復(fù)
日志分類(lèi)
(1)二進(jìn)制日志:以二進(jìn)制文件的形式記錄了數(shù)據(jù)庫(kù)中的操作,但是不記錄查詢(xún)語(yǔ)句
(2)錯(cuò)誤日志:記錄Mysql服務(wù)器的啟動(dòng)、關(guān)閉和運(yùn)行錯(cuò)誤等信息
(3)慢查詢(xún)?nèi)罩?記錄執(zhí)行時(shí)間超過(guò)指定時(shí)間的操作
(4)通用查詢(xún)?nèi)罩?記錄用戶(hù)的所有操作,包括啟動(dòng)和關(guān)閉MySQL服務(wù)、更新語(yǔ)句、查詢(xún)語(yǔ)句等
日志設(shè)置
(1)除了二進(jìn)制日志,其他都是文本文件
(2)日志文件通常存儲(chǔ)在Mysql數(shù)據(jù)目錄下
(3)默認(rèn)只啟動(dòng)了錯(cuò)誤日志功能,其他需要手工啟動(dòng)
(4)但啟動(dòng)日志功能會(huì)降低Mysql的執(zhí)行速度,因?yàn)橐粭l操作寫(xiě)進(jìn)日志中是要花時(shí)間的
二進(jìn)制日志
(1) 以二進(jìn)制文件的形式記錄了數(shù)據(jù)庫(kù)中的操作,但是不記錄查詢(xún)語(yǔ)句
(2) 也叫變更日志(update log),主要用于記錄數(shù)據(jù)庫(kù)的變化
(3) 啟動(dòng)與設(shè)置二進(jìn)制日志:在Mysql的配置文件中,log-bin=DIR/filename
DIR是存放二進(jìn)制日志的目錄;
每啟動(dòng)一次Mysql,該目錄下就會(huì)生成一個(gè)filename.00000x的文件;
目錄下還有一個(gè)filename.index的文件,用于存儲(chǔ)所有二進(jìn)制文件清單;
如果我們沒(méi)有設(shè)置DIR和filename,則默認(rèn)在數(shù)據(jù)目錄下以hostname-bin.00000x命名
# cat /etc/my.cnf|egrep "log-bin"
log-bin = /data/mysqldb/binlog/mysql-bin
# ls /data/mysqldb/binlog/
mysql-bin.000001 mysql-bin.000003 mysql-bin.000005 mysql-bin.000007 mysql-bin.index
mysql-bin.000002 mysql-bin.000004 mysql-bin.000006 mysql-bin.000008
(4)臨時(shí)停止與啟動(dòng)二進(jìn)制日志
-> set sql_log_bin=0; 停止-> set sql_log_bin=1; 啟動(dòng)
(5)注意:二進(jìn)制日志文件與數(shù)據(jù)庫(kù)數(shù)據(jù)文件最好不要放在同一塊硬盤(pán)上,如果存放數(shù)據(jù)文件的硬盤(pán)壞了,可以用另一塊硬盤(pán)的二進(jìn)制日志來(lái)恢復(fù)數(shù)據(jù)
(6)查看二進(jìn)制日志:
# mysqlbinlog mysql-bin.000001
(7)刪除二進(jìn)制日志:
//刪除所有->reset master;//刪除00004之前的所有->purge master logs to'mysql-bin.000004';//刪除指定日期時(shí)間之前的所有->purge master logs to'2016-08-10 15:00:00';
(8)使用二進(jìn)制日志還原數(shù)據(jù)庫(kù)
# mysqlbinlog mysql-bin.000001 | mysql -u root -p
# mysqlbinlog mysql-bin.000002 |mysql -u root -p
這條命令可以理解為:使用mysqlbinlog讀取二進(jìn)制日志文件然后使用mysql命令還原到數(shù)據(jù)庫(kù)中
注意還原時(shí)必須是編號(hào)小的先還原
(9)使用二進(jìn)制日志文件的pos號(hào)|時(shí)間點(diǎn)恢復(fù)
//先執(zhí)行3條操作-> create database 2test-> create database alvin-> drop database 2test//查看二進(jìn)制日志,觀察每一個(gè)命令的起始/結(jié)束pos號(hào),和起始/結(jié)束時(shí)間# mysqlbinlog mysql-bin.000001# at 120#160813 15:13:53serverid 706end_log_pos 217CRC32 0x781f816eQuery? ? thread_id=21exec_time=0 error_code=0SET TIMESTAMP=1471072433/*!*/;
SET @@session.pseudo_thread_id=21/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;SET @@session.lc_time_names=0/*!*/;SET @@session.collation_database=DEFAULT/*!*/;create database 2test/*!*/;# at 217#160813 15:14:11serverid 706end_log_pos 314 CRC32 0x0fde9820Query? ? thread_id=21exec_time=0error_code=0SET TIMESTAMP=1471072451/*!*/;create database alvin/*!*/;//想回到什么哪條命令時(shí)的狀態(tài),可以指定起始/結(jié)束pos號(hào)恢復(fù)# mysqlbinlog --start-position="120" --stop-position="217" mysql-bin.000001 |mysql -u root -p
//日志也會(huì)記錄下這條恢復(fù)語(yǔ)句,我們可以看到這條命令的時(shí)間和原來(lái)那條一模一樣
# mysqlbinlog mysql-bin.000001# at 401#160813 15:13:53server id 706 end_log_pos 498 CRC32 0x3a899ca5 Query? ? thread_id=21? ? exec_time=619? ? error_code=0SET TIMESTAMP=1471072433/*!*/;create database 2test/*!*/;
//同理也可以用時(shí)間點(diǎn)來(lái)恢復(fù)
# mysqlbinlog –start-datetime=”2016-08-13 15:13:53” –stop-datetime=”2016-08-13 15:14:11” mysql-bin.000001 | mysql –uroot –p
錯(cuò)誤日志
(1)主要用于記錄Mysql服務(wù)的開(kāi)啟、關(guān)閉和錯(cuò)誤信息,若服務(wù)啟動(dòng)不成功第一件事應(yīng)該就是去看這個(gè)錯(cuò)誤日志
(2)錯(cuò)誤日志是默認(rèn)開(kāi)啟的,且錯(cuò)誤日志無(wú)法被關(guān)閉
(3)設(shè)置錯(cuò)誤日志:在配置文件中,log-error=DIR/filename
# cat /etc/my.cnf |egrep "log-error"
log-error = /data/mysqldb/log/mysql-error.log
# ls /data/mysqldb/log
mysql-error.log
(4)刪除錯(cuò)誤日志
mysqladmin -u root -p flush-logs
# ls
mysql-error.log mysql-slow_query.log
通用查詢(xún)?nèi)罩?/b>
(1)用來(lái)記錄用戶(hù)的所有操作:啟動(dòng)和關(guān)閉mysql、更新語(yǔ)句、查詢(xún)語(yǔ)句
(2)啟用和設(shè)置通用查詢(xún)?nèi)罩?配置文件中,log=DIR/filename
(3)刪除通用查詢(xún)?nèi)罩?
# mysqladmin -u root -p flush-logs
或# echo >access.log
慢查詢(xún)?nèi)罩?/b>
(1)記錄執(zhí)行時(shí)間超過(guò)指定時(shí)間的執(zhí)行語(yǔ)句
(2)啟動(dòng)和設(shè)置慢查詢(xún)?nèi)罩?在配置文件中
log-slow-queries=DIR/filename
long_query_time=n//設(shè)置時(shí)間為n秒,默認(rèn)為10s
(3)刪除慢查詢(xún)?nèi)罩?
# mysqladmin -u root -p flush-logs
MySQL日志類(lèi)型
在/etc/my.cnf中[mysqld]下面添加log=/var/lib/mysql/Dragonwake.log重啟后
正確的配置方法,在/etc/my.cnf中[mysqld]下面添加下如內(nèi)容
general_log_file=/var/lib/mysql/Dragonwake.log
生成的查詢(xún)?nèi)罩疚募?b>Dragonwake.log
#tail -f /var/lib/mysql/Dragonwake.log
c?慢查詢(xún)?nèi)罩荆⊿low Query Log)
#?執(zhí)行超過(guò)1秒的sql會(huì)被log下來(lái)
#?將查詢(xún)執(zhí)行時(shí)間較慢的語(yǔ)句進(jìn)行記錄
log-slow-queries=/var/lib/mysql/Dragonwake-slow.log
重啟mysql服務(wù)后,出現(xiàn)如下錯(cuò)誤,
#?執(zhí)行超過(guò)1秒的sql會(huì)被log下來(lái)
slow-query-log-file=/var/lib/mysql/Dragonwake-slow.log
輸出慢查詢(xún)?nèi)罩?b>Dragonwake-slow.log
日志配置:用--log-update[=file_name]選項(xiàng)(不建議使用)
log-update=/var/lib/mysql/Dragonwake-update.log
e?二進(jìn)制日志(Binary Log & Binary Log Index)
日志設(shè)置:用--log-bin[=file_name]選項(xiàng)
log-bin=/var/lib/mysql/Dragonwake-bin.log
#tail -f /var/lib/mysql/Dragonwake-bin.000001
mysql> show variables like'log_%';