以下操作演示都是基于mysql5.6.36版本:
工作中經(jīng)常遇到這樣的問(wèn)題:mysql數(shù)據(jù)訪問(wèn)能量很大,想要從sql方面優(yōu)化。研發(fā)經(jīng)常會(huì)問(wèn)到能看到哪些SQL執(zhí)行比較頻繁嗎?回道:不能哦,只能看到當(dāng)前正在運(yùn)行的SQL和慢日志里記錄的SQL。因?yàn)闉榱诵阅芸紤],一般general log不會(huì)開啟。slow log可以定位一些有性能問(wèn)題的sql,而general log會(huì)記錄所有的SQL。然而有時(shí)候生產(chǎn)上的mysql出現(xiàn)性能問(wèn)題,短時(shí)間開啟general log,來(lái)獲取sql執(zhí)行的情況,對(duì)排查和分析mysql的性能問(wèn)題,還是有很大的幫助的?;蛘呤怯袝r(shí)候,不清楚程序執(zhí)行了什么sql語(yǔ)句,但是又要排除錯(cuò)誤,找不到原因的情況下,也是可以短暫的開啟這個(gè)general log日志的。
mysql5.0版本,如果要開啟slow log、general log,需要重啟,從MySQL5.1.6版開始,general query log和slow query log開始支持寫到文件或者數(shù)據(jù)庫(kù)表兩種方式,并且日志的開啟,輸出方式的修改,都可以在Global級(jí)別動(dòng)態(tài)修改。
開啟general log有很多的方式。
下面簡(jiǎn)單介紹和演示下:
方法一:更改my.cnf配置文件
[root@git-server ~]# grep general_log /etc/my.cnf
general_log = 1
general_log_file = /tmp/general.log
重新啟動(dòng)mysql,這個(gè)操作相當(dāng)于是永久生效。當(dāng)然這種方式是不允許在生產(chǎn)上采用的。因?yàn)橐貑ysql,會(huì)中斷mysql的業(yè)務(wù)。同時(shí)general.log會(huì)記錄所有的關(guān)于mysql的DDL和DML語(yǔ)句,非常消耗資源,一般都是在協(xié)助排除mysql故障時(shí),臨時(shí)短暫的開啟幾分鐘。事后都要關(guān)閉的。
方法二:在mysql命令控制臺(tái)操作
需要root用戶才有訪問(wèn)此文件的權(quán)限
默認(rèn)這個(gè)日志是被關(guān)閉掉的。
mysql> show global variables like '%general%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log | OFF |
| general_log_file | /data/mysql/data/git-server.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)
mysql>
有時(shí)需要臨時(shí)開啟MySQL的全局general_log,可以登錄mysql直接設(shè)置日志的路徑并開啟general_log
mysql> set global general_log_file='/tmp/general_log';
Query OK, 0 rows affected (0.00 sec)
mysql> set global general_log=on;
Query OK, 0 rows affected (0.02 sec)
mysql> show global variables like '%general%';
+------------------+------------------+
| Variable_name | Value |
+------------------+------------------+
| general_log | ON |
| general_log_file | /tmp/general_log |
+------------------+------------------+
2 rows in set (0.00 sec)
mysql>
[root@git-server ~]# tailf /tmp/general_log
180717 22:55:51 2 Query show databases
180717 22:56:04 2 Query SELECT DATABASE()
2 Init DB test
180717 22:56:14 2 Query select * from student3
在使用完后可以直接set global general_log=off;關(guān)閉這個(gè)日志
方法三:將日志保存在mysql數(shù)據(jù)庫(kù)general_log表中
mysql> set global log_output='table';
mysql> set global general_log=on;
mysql> use mysql;
mysql> select * from test.student3;
+----+--------------+------------+--------+------+
| id | teacher_name | teacher_id | name | sex |
+----+--------------+------------+--------+------+
| 1 | 花花 | 1 | 三安 | 女 |
| 4 | 散散 | 2 | 三安 | 女 |
| 6 | bibi | 3 | 三安 | 女 |
+----+--------------+------------+--------+------+
3 rows in set (0.00 sec)
mysql> select * from general_log;
| 2018-07-17 23:00:12 | root[root] @ localhost [] | 2 | 1132333306 | Query | select * from test.student3
查看/tmp/general.log的信息,可以大致看到哪些sql查詢/更新/刪除/插入比較頻繁了。比如有些表不是經(jīng)常變化的,查詢量又很大,就完全可以cache;對(duì)主備延遲要求不高的表,讀可以放到備庫(kù);等等
上面就是本次介紹的general_log日志的全部知識(shí)點(diǎn)內(nèi)容,感謝大家的閱讀和對(duì)腳本之家的支持。
您可能感興趣的文章:- Mysql在線回收undo表空間實(shí)戰(zhàn)記錄
- MySQL redo死鎖問(wèn)題排查及解決過(guò)程分析
- MYSQL SERVER收縮日志文件實(shí)現(xiàn)方法
- MySQL中常見的幾種日志匯總
- mysql日志觸發(fā)器實(shí)現(xiàn)代碼
- MySQL5.7慢查詢?nèi)罩緯r(shí)間與系統(tǒng)時(shí)間差8小時(shí)原因詳解
- mysql將bin-log日志文件轉(zhuǎn)為sql文件的方法
- Mysql數(shù)據(jù)庫(kù)清理binlog日志命令詳解
- 詳解MySQL 重做日志(redo log)與回滾日志(undo logo)