如何查看mysql數據庫操作記錄日志
1、首先確認你日志是否啟用了mysql>show variables like 'log_bin'。
2、如果啟用了,即ON,那日志文件就在mysql的安裝目錄的data目錄下。
3、怎樣知道當前的日志mysql> show master status。
4、看二進制日志文件用mysqlbinlog,shell>mysqlbinlog mail-bin.000001或者shell>mysqlbinlog mail-bin.000001 | tail,Windows 下用類似的。
MySQL的日志操作:
1、首先,登陸mysql后,執行sql語句:show variables like 'log_bin'。
2、#錯誤日志log-errol開啟方式:在my.ini的[mysqld]選項下:添加代碼:log-error=E:\log-error.txt。
記錄內容:主要是記錄啟動、運行或停止mysqld時出現的致命性問題,都是系統級的錯誤記錄。
3、#查詢日志:log,開啟方式:在my.ini的[mysqld]選項下:添加代碼:log=E:/mysql_log.txt。
4、#二進制日志:log-bin,開啟方式:在my.ini的[mysqld]選項下:添加代碼:log-bin=E:/mysql_log_bin,記錄內容:主要是記錄所有的更改數據的語句,可使用mysqlbinlog命令恢復數據。
mysql查看歷史執行的sql
查看mysql的語句,比較常用的大概是show processlist 命令了,但是這個對於查詢時間比較長的語句比較有意義,對於一下子就能執行的語句真心拼不過手速啊.
於是就只能從mysql的歷史記錄里面着手了.為了實現這個目的,我們需要修改/etc/my.cnf文件.
在my.cnf中的[mysqld](其他地方可能無效)下插入log=/etc/tmp/mysql.log(日志的地址可以自己定義,不過不要在home里面,否則可能顯示不出來,主要要有寫的權限).然后要重啟數據庫,用service mysqld restart命令就可以了.這個log會將所有的執行語句記錄下來,所以在數據庫很忙的時候,這個日志可能變得很大,不宜查看.
用tail -f /etc/tmp/mysql.log 命令可以持續觀察執行語句,也可以將該文件下載下來慢慢看.
=========================================
另外還有一個慢查詢歷史記錄,也在my.cnf文件里,配置語句為
?1234 log-slow-queries=/var/lib/mysql/slowquery.log long_query_time=5 log-queries-not-using-indexes
其中log-slow-queries是慢查詢歷史記錄的地址,long_query_time限定超過X秒才能加入到歷史記錄里面,log-queries-not-using-indexes限定沒有使用索引的查詢語句.
這個日志由於記錄語句不多,所以可以長期開啟.
MySQL的日志操作
在MySQL的初期,需要熟練掌握sql語句的運用,最簡單的方式就是多練習多運用,但是好需要有一定的目的性,什么意思呢?
就是每個人的習慣不一樣,可能容易犯的錯誤也不同,所以需要總結自己的常犯錯誤,有針對性的彌補,這樣就會對MySQL的學習和掌握起到事半功倍的效果。今天就說幾種記錄MySQL操作的幾種日志:
#錯誤日志 log-error
#查詢日志 log
#二進制日志 log-bin
#慢日志 log-slow-queries
#更新日志 log-update(官方建議,不開啟,所以在此忽略它)
下面一一詳述:
方法/步驟
-
首先,登陸mysql后,執行sql語句:
show variables like 'log_bin';
查看是否日志開啟,詳細結果如圖:
-
#錯誤日志 log-error
開啟方式:
在my.ini的[mysqld]選項下:
添加代碼:
log-error=E:\log-error.txt
記錄內容:
主要是記錄啟動、運行或停止mysqld時出現的致命性問題,都是系統級的錯誤記錄如圖:
-
#查詢日志 log
開啟方式:
在my.ini的[mysqld]選項下:
添加代碼:
log=E:/mysql_log.txt
記錄內容:
主要是記錄數據庫建立的客戶端連接和執行的語句如圖:
-
#二進制日志 log-bin
開啟方式:
在my.ini的[mysqld]選項下:
添加代碼:
log-bin=E:/mysql_log_bin
記錄內容:
主要是記錄所有的更改數據的語句,可使用mysqlbinlog命令恢復數據。如圖:
-
#慢日志 log-slow-queries
開啟方式:
在my.ini的[mysqld]選項下:
添加代碼:
long_query_time =1 (設定慢查詢的標准,單位是s/秒)
log-slow-queries= E:/mysql_log_slow.txt
記錄內容:
主要是記錄所有執行時間超過long_query_time的查詢或沒有使用索引的查詢如圖:
END
MySql 的操作日志
任何一種數據庫中,都有各種各樣的日志。Mysql也不例外,在Mysql中有4種不同的日志、分別錯誤日志、二進制日志、查詢日志和慢查詢日志。這些日志記錄着Mysql數據庫不同方面的蹤跡。下文將介紹這4種不同的日志作用和用途。
一.錯誤日志
錯誤日志在Mysql數據庫中很重要,它記錄着mysqld啟動和停止,以及服務器在運行過程中發生的任何錯誤的相關信息。
1.配置信息
--log-error=[file-name]用來指定錯誤日志存放的位置。
如果沒有指定[file-name],默認hostname.err做為文件名,默認存放在DATADIR目錄中。
也可以將log-error配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定--log-error.例如:
[mysql@test2]$ vi /etc/my.cnf
# The MySQL server
[mysqld]
....
log-error = /var/lib/mysql/test2_mysqld.err
.....
2.錯誤信息樣板
080313 05:21:55 mysqld started
080313 5:21:55 InnoDB: Started; log sequence number 0 43655
080313 5:21:55 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.0.26-standard-log' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Edition - Standard (GPL)
080313 5:24:13 [Note] /usr/local/mysql/bin/mysqld: Normal shutdown
080313 5:24:13 InnoDB: Starting shutdown...
080313 5:24:16 InnoDB: Shutdown completed; log sequence number 0 43655
080313 5:24:16 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete
080313 05:24:16 mysqld ended
080313 05:24:47 mysqld started
080313 5:24:47 InnoDB: Started; log sequence number 0 43655
080313 5:24:47 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.0.26-standard-log' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Edition - Standard (GPL)
080313 5:33:49 [Note] /usr/local/mysql/bin/mysqld: Normal shutdown
三.查詢日志
查詢日志記錄了clinet的所有的語句。
Note:由於log日志記錄了數據庫所有操作,對於訪問頻繁的系統,此種日志會造成性能影響,建議關閉。
1.配置信息
--log=[file-name]用來指定錯誤日志存放的位置。
如果沒有指定[file-name],默認為主機名(hostname)做為文件名,默認存放在DATADIR目錄中。
也可以將log配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定--log.例如:
# The MySQL server
[mysqld]
......
#query-log
log = /var/lib/mysql/query_log.log
......
2.讀取查詢日志
查詢日志是純文本格可,可以使用OS文本讀取工具直接打開查看。例如:
[mysql@test2]$ tail -n 15 query_log.log
080313 7:58:28 17 Query show tables
080313 8:07:45 17 Quit
080313 10:01:48 18 Connect root@localhost on
080313 10:02:38 18 Query SELECT DATABASE()
18 Init DB test
080313 10:02:42 18 Query show tables
080313 10:03:07 18 Query select * from pet
080313 10:06:26 18 Query insert into pet values('hunter','yxyup','cat','f','1996-04-29',null)
080313 10:06:39 18 Query select * from pet
080313 10:07:13 18 Query update pet set sex='m' where name='hunter'
080313 10:07:38 18 Query delete from pet where name='hunter'
080313 10:13:48 18 Query desc test8
080313 10:14:13 18 Query create table t1(id int,name char(10))
080313 10:14:41 18 Query alter table t1 add sex char(2)
[mysql@test2]$
四.慢查詢日志
慢查詢日志是記錄了執行時間超過參數long_query_time(單位是秒)所設定值的SQL語句日志。
Note:慢查詢日志對於我們發現性能有問題的SQL有很幫助,建議使用並經常分析
1.配置信息
--log-slow-queries=[file-name]用來指定錯誤日志存放的位置。
如果沒有指定[file-name],默認為hostname-slow.log做為文件名,默認存放在DATADIR目錄中。
也可以將log-slow-queries配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定--log-slow-queries.例如:
# The MySQL server
[mysqld]
......
#slow-query-log
log-slow-queries = /var/lib/mysql/slow_query_log.log
......
2.讀取慢查詢日志
[mysql@test2]$ cat slow_query_log.log
/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 080313 5:41:46
# User@Host: root[root] @ localhost []
# Query_time: 108 Lock_time: 0 Rows_sent: 0 Rows_examined: 8738
use test;
select count(1) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name;
# Time: 080313 5:52:04
# User@Host: root[root] @ localhost []
# Query_time: 583 Lock_time: 0 Rows_sent: 0 Rows_examined: 508521177
select count(1) from t1 a, t1 b where a.id=b.id;
/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 080313 10:39:59
# User@Host: root[root] @ localhost []
# Query_time: 11 Lock_time: 0 Rows_sent: 4537467 Rows_examined: 4537467
use test;
select id from tail;
如果慢查詢日志記錄很多可以使用mysqldumpslow進行分類匯總
[mysql@test2]$ mysqldumpslow slow_query_log.log
Reading mysql slow query log from slow_query_log.log
Count: 1 Time=583.00s (583s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
select count(N) from t1 a, t1 b where a.id=b.id
Count: 1 Time=108.00s (108s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
select count(N) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name
Count: 1 Time=11.00s (11s) Lock=0.00s (0s) Rows=4537467.0 (4537467), root[root]@localhost
select id from tail;
mysql有以下幾種日志:
錯誤日志: -log-err
查詢日志: -log
慢查詢日志: -log-slow-queries
更新日志: -log-update
二進制日志: -log-bin
在mysql的安裝目錄下,打開my.ini,在后面加上上面的參數,保存后重啟mysql服務就行了。
例如:
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=
#Enter a name for the query log file. Otherwise a default name will be used.
#log=
#Enter a name for the error log file. Otherwise a default name will be used.
log-error=
#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=
查看日至:
1. 首先確認你日志是否啟用了
mysql>show variables like 'log_bin';
如果啟用了,即ON
那日志文件就在mysql的安裝目錄的data目錄下
cat/tail 日志文件名
2. 怎樣知道當前的日志
mysql> show master status;
3. 查看從某一段時間到某一段時間的日志
mysqlbinlog --start-datetime='2008-01-19 00:00:00' --stop-datetime='2008-01-30 00:00:00' /var/log/mysql/mysql-bin.000006 > mysqllog1.log
附錄:
//顯示所有本機上的二進制日志
mysql> SHOW MASTER LOGS;
//刪除所有本機上的二進制日志
mysql> RESET MASTER;
//刪除所有創建時間在binary-log.xxx之前的二進制日志
mysql> PURGE MASTER LOGS TO 'binary-log.xxx';
//只保留最近6天的日志,之前的都刪掉
find /var/intra -type f -mtime +6 -name "*.log" -exec rm -f {} ;
//用鍵盤左上角(也就是Esc下面)那個鍵包圍起來,說明是命令。-1d是昨天,以此類推-1m是上個月等等
day=`/bin/date -v -1d +%Y%m%d`;
//給文件改名
mv xxx.log xxx-${day}.log;
//這里還要加上數據庫的用戶名密碼,作用是更新日志(包括二進制日志和查詢日志等等)
mysqladmin flush-logs
二進制日志也通常被稱為binlog,它記當着所有的DDL和DML,但不包括數據查詢語句。
1.配置信息
--log-bin=[file-name]用來指定錯誤日志存放的位置。
如果沒有指定[file-name],默認為主機名后面跟-bin做為文件名,默認存放在DATADIR目錄中。
也可以將log-bin配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定--log-bin.例如:
# The MySQL server
[mysqld]
......
log-bin = /var/lib/mysql/log-bin
......
2.查看blnlog
由於binlog以是binary方式存取,不能直接查看,需要用mysql提供的mysqlbinlog工具查看。
3.刪除binlog
(1).用reset master命令刪除所有日志,新日志重新從000001開始編號
(2).用purge master logs to 'mysq-bin.******' 命令可以刪除指定編號前的所有日志
(3).用purge master logs to before 'YYYY-MM-DD HH24:MI:SS'命令可以刪除'YYYY-MM-DD HH24:MI:SS'之前的產生的所有日志
(4).可以在my.cnf中指定--expire_logs_days=#,此參數設置了binlog日志的過期天數
4.測試案例
[mysql@test2]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 18 to server version: 5.0.26-standard-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> use test;
Database changed
mysql> select * from pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.06 sec)
mysql> insert into pet values('hunter','yxyup','cat','f','1996-04-29',null);
Query OK, 1 row affected (0.03 sec)
mysql> select * from pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| hunter | yxyup | cat | f | 1996-04-29 | NULL |
+----------+--------+---------+------+------------+------------+
9 rows in set (0.00 sec)
mysql> update pet set sex='m' where name='hunter';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> delete from pet where name='hunter';
Query OK, 1 row affected (0.00 sec)
[mysql@test2]$ mysqlbinlog log-bin.000002
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
# at 4
#080313 7:52:47 server id 1 end_log_pos 98 Start: binlog v 4, server v 5.0.26-standard-log created 080313 7:52:47
# Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.
# at 98
#080313 10:06:26 server id 1 end_log_pos 229 Query thread_id=18 exec_time=0 error_code=0
use test;
SET TIMESTAMP=1205373986;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
SET @@session.sql_mode=0;
/*!C latin1 */;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8;
insert into pet values('hunter','yxyup','cat','f','1996-04-29',null);
# at 229
#080313 10:07:13 server id 1 end_log_pos 334 Query thread_id=18 exec_time=0 error_code=0
SET TIMESTAMP=1205374033;
update pet set sex='m' where name='hunter';
# at 334
#080313 10:07:38 server id 1 end_log_pos 432 Query thread_id=18 exec_time=0 error_code=0
SET TIMESTAMP=1205374058;
delete from pet where name='hunter';
# at 432
#080313 10:14:13 server id 1 end_log_pos 532 Query thread_id=18 exec_time=0 error_code=0
SET TIMESTAMP=1205374453;
create table t1(id int,name char(10));
# at 532
#080313 10:14:41 server id 1 end_log_pos 625 Query thread_id=18 exec_time=0 error_code=0
SET TIMESTAMP=1205374481;
alter table t1 add sex char(2);
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
[mysql@test2]$
可以看出,三條DML操作和兩條DDL都記錄到了binlog中了,而select並沒有記錄。
linux下MySQL操作歷史記錄 ~/.mysql_history
1,查看你系統的~/.mysql_history隱藏文件
2,測試MySQL用戶管理的SQL會被記錄
3, 如何清除使用痕跡,如果在生產環境中,一般不會依賴此記錄來作審計,從上面演示可以看出,還存在一定的風險。