您当前的位置:首页 > 互联网教程

如何查看sql数据库操作日志

发布时间:2025-05-14 11:08:13    发布人:远客网络

如何查看sql数据库操作日志

一、如何查看sql数据库操作日志

1.利用数据库自带的日志功能:大多数数据库系统都提供了日志记录功能,可以记录数据库的所有操作。这些日志通常包括执行的SQL语句、操作时间、执行结果等信息。例如,MySQL可以通过配置general log来记录所有服务器的操作;Oracle有审计追踪和日志挖掘功能;SQL Server有SQL Server Management Studio工具可以查看执行日志等。

2.使用第三方工具:除了数据库自带的日志功能外,还可以使用第三方工具来查看和分析数据库操作日志。这些工具通常提供更详细的分析和报告功能,帮助用户更好地理解日志数据。比如LogMiner和DBArtisan等。它们能帮助发现潜在的数据库问题,提高数据库性能。

3.查询日志文件位置:不同的数据库管理系统日志文件的位置可能不同,可以通过查询数据库的配置文件或者系统表来找到日志文件的位置。例如,在MySQL中,可以通过查看my.cnf或my.ini配置文件中的log-error参数来确定日志文件的位置。在Oracle中,可以通过查看DBA_HIST_WR_CONTROL视图来确定审计日志的位置。找到日志文件后,可以直接打开查看或使用工具分析。

数据库操作日志是记录数据库所有操作的重要工具,它可以帮助数据库管理员监控数据库的使用情况,诊断问题并优化性能。不同的数据库管理系统可能有不同的日志记录方式和查看方法。利用数据库自带的日志功能是最直接的方式,通过配置相关参数可以开启或关闭日志记录功能,并指定日志文件的位置。使用第三方工具可以提供更强大的分析和报告功能,帮助用户从日志中获取更多有价值的信息。查询日志文件位置也是一种常见的方法,通过查询数据库的配置文件或系统表可以找到日志文件的具体位置,然后直接查看或使用工具进行分析。这些方法都有助于DBA监控数据库的操作情况,保障数据库的安全和稳定运行。

二、mysql的几种日志记录

防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2

innodb_log_group_home_dir指定日志文件组所在的路径,默认./,表示在数据库的数据目录下。

innodb_log_files_in_group指定重做日志文件组中文件的数量,默认2

关于文件的大小和数量,由一下两个参数配置:

innodb_log_file_size重做日志文件的大小。

innodb_mirrored_log_groups指定了日志镜像文件组的数量,默认1

很重要一点,redo log是什么时候写盘的?前面说了是在事物开始之后逐步写盘的。

之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,

原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。

保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

事务开始之前,将当前是的版本生成undo log,undo也会产生 redo来保证undo log的可靠性

当事务提交之后,undo log并不能立马被删除,

而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。

MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数

如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

关于MySQL5.7之后的独立undo表空间配置参数如下

innodb_undo_directory=/data/undospace/--undo独立表空间的存放目录

innodb_undo_logs= 128--回滚段为128KB

innodb_undo_tablespaces= 4--指定有4个undo log文件

用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。

用于数据库的基于时间点的还原。

逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。

但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

在使用mysqlbinlog解析binlog之后一些都会真相大白。

因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。

事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。

这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。

因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。

这是因为binlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。

binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

配置文件的路径为log_bin_basename,binlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。

对于每个binlog日志文件,通过一个统一的index文件来组织。

慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。

show variables like“long_query_time”;默认10s

show variables like“%slow%”;

标签:basename逻辑最大的指定bin判断purgeselectredo

三、如何在MySql中记录SQL日志记录

错误日志在Mysql数据库中很重要,它记录着mysqld启动和停止,以及服务器在运行过程中发生的任何错误的相关信息。

--log-error=[file-name]用来指定错误日志存放的位置。

如果没有指定[file-name],默认hostname.err做为文件名,默认存放在DATADIR目录中。

也可以将log-error配置到my.cnf文件中,这样就省去了每次在启动mysqld时都手工指定--log-error.例如:

log-error=/var/lib/mysql/test2_mysqld.err

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: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日志记录了数据库所有操作,对于访问频繁的系统,此种日志会造成性能影响,建议关闭。

--log=[file-name]用来指定错误日志存放的位置。

如果没有指定[file-name],默认为主机名(hostname)做为文件名,默认存放在DATADIR目录中。

也可以将log配置到my.cnf文件中,这样就省去了每次在启动mysqld时都手工指定--log.例如:

log=/var/lib/mysql/query_log.log

查询日志是纯文本格可,可以使用OS文本读取工具直接打开查看。例如:

[mysql@test2]$ tail-n 15 query_log.log

080313 7:58:28 17 Query show tables

080313 10:01:48 18 Connect root@localhost on

080313 10:02:38 18 Query SELECT DATABASE()

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)

慢查询日志是记录了执行时间超过参数long_query_time(单位是秒)所设定值的SQL语句日志。

Note:慢查询日志对于我们发现性能有问题的SQL有很帮助,建议使用并经常分析

--log-slow-queries=[file-name]用来指定错误日志存放的位置。

如果没有指定[file-name],默认为hostname-slow.log做为文件名,默认存放在DATADIR目录中。

也可以将log-slow-queries配置到my.cnf文件中,这样就省去了每次在启动mysqld时都手工指定--log-slow-queries.例如:

log-slow-queries=/var/lib/mysql/slow_query_log.log

[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

# User@Host: root[root]@ localhost []

# Query_time: 108 Lock_time: 0 Rows_sent: 0 Rows_examined: 8738

select count(1) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name;

# 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

# User@Host: root[root]@ localhost []

# Query_time: 11 Lock_time: 0 Rows_sent: 4537467 Rows_examined: 4537467

如果慢查询日志记录很多可以使用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

在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。

#Enter a name for the binary log. Otherwise a default name will be used.

#Enter a name for the query log file. Otherwise a default name will be used.

#Enter a name for the error log file. Otherwise a default name will be used.

#Enter a name for the update log file. Otherwise a default name will be used.

mysql>show variables like'log_bin';

那日志文件就在mysql的安装目录的data目录下

3.查看从某一段时间到某一段时间的日志

mysqlbinlog--start-datetime='2008-01-19 00:00:00'

--stop-datetime='2008-01-30 00:00:00'/var/log/mysql/mysql-bin.000006