【问题标题】:Log all queries in mysql在mysql中记录所有查询
【发布时间】:2010-09-23 04:06:17
【问题描述】:

我可以在我的 mysql 数据库上打开审计日志吗?

我基本上想监控一个小时的所有查询,并将日志转储到文件中。

【问题讨论】:

标签: mysql logging


【解决方案1】:

为表启用日志

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL log_output = 'table';

通过选择查询查看日志

SELECT * FROM mysql.general_log

如果查询太多,请截断表格:

TRUNCATE table mysql.general_log;

【讨论】:

  • 是否有通配符来记录所有表? (有很多:C)
  • 谢谢,这个设置对我非常有用,因为我无法关闭 mysql-server。我还希望日志出现在日志表中
  • 此表有一个名为“thread_id”的列,有助于区分特定会话中的查询问题,而不是向整个数据库发出的所有查询的转储,否则您就是为 mysql.general_log 表上的 SELECT 查询获取它。
【解决方案2】:

无需重启即可启用 MySQL General Query Log 的快捷方式。

mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';
mysql> SET GLOBAL general_log = 'ON';

我已经通过自制软件安装了 mysql,mysql 版本:mysql Ver 14.14 Distrib 5.7.15, for osx10.11 (x86_64) using EditLine wrapper

【讨论】:

    【解决方案3】:

    更新:不再适用于 MYSQL 5.6+

    使用 --log 选项启动 mysql:

    mysqld --log=log_file_name
    

    或将以下内容放入您的 my.cnf 文件中:

    log = log_file_name
    

    任何一个都会将所有查询记录到 log_file_name。

    您还可以使用--log-slow-queries 选项而不是--log 仅记录慢速查询。默认情况下,需要 10 秒或更长时间的查询被认为很慢,您可以通过将 long_query_time 设置为查询在记录之前必须执行的秒数来更改此设置。

    【讨论】:

    • 这应该是不言而喻的,但是在制作盒中打开它很快就会变得没有娱乐性。 g
    • 如果您无法以这种方式启用日志记录,请仔细检查 mysql 用户是否可以写入适当的文件位置。
    • 是否可以仅记录超过 1 个特定数据库/表的查询?
    • @Temujin phpmyadmin 现在为您指定日志(“版本”)的表提供“跟踪”选项,它将记录影响它的查询以及有关时间和整个查询的信息。
    • 这个接受的答案应该被删除或编辑以反映它不适用于 MySQL 5.6.+ 的事实。
    【解决方案4】:

    作为记录,general_log 和 slow_log 是在 5.1.6 中引入的:

    http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html

    5.2.1。选择通用查询和慢查询日志输出目的地

    从 MySQL 5.1.6 开始,MySQL Server 提供了对 输出到通用查询日志和慢查询日志的目的地, 如果启用了这些日志。日志条目的可能目的地是 日志文件或 mysql 中的 general_log 和 slow_log 表 数据库

    【讨论】:

      【解决方案5】:

      操作系统/mysql版本:

      $ uname -a
      Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64
      
      $ mysql --version
      /usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper
      

      添加日志记录(例如,我不认为/var/log/... 是 Mac OS 上的最佳路径,但可行:

      sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf
      
      [mysqld]
      general_log = on
      general_log_file=/var/log/mysql/mysqld_general.log
      

      重启Mysql

      结果:

      $ sudo tail -f /var/log/mysql/mysqld_general.log
      181210  9:41:04    21 Connect   root@localhost on employees
                 21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
                 21 Query SET NAMES latin1
                 21 Query SET character_set_results = NULL
                 21 Query SET autocommit=1
                 21 Query SELECT USER()
                 21 Query SELECT USER()
      181210  9:41:10    21 Query show tables
      181210  9:41:25    21 Query select count(*) from current_dept_emp
      

      【讨论】:

        【解决方案6】:

        除了我在这里遇到的情况之外,运行以下命令是将查询转储到日志文件而不重新启动的最简单方法

        SET global log_output = 'FILE';
        SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
        SET global general_log = 1;
        

        可以用

        关闭
        SET global general_log = 0;
        

        【讨论】:

        • 非常喜欢这个,适用于数据库上现有的和新的连接
        • 有一些统计条目 - 不确定这些条目是什么,但除此之外,效果非常好。
        • 为此,您的用户必须拥有 SUPER 权限,这是一个全局数据库权限,因此不能仅限于特定的模式或表:GRANT SUPER ON *.* TO user1@localhost
        • 如果可以的话,我会多次投票,我有一个书签指向这里 :) 非常感谢!
        • 比公认的答案更好,在许多情况下,用 mysqld 启动 mysql 有点笨拙。这在您想要进行一些快速调试然后将其关闭的最常见情况下很有用。
        【解决方案7】:

        最佳答案在 mysql 5.6+ 中不起作用。改用这个:

        [mysqld]
        general_log = on
        general_log_file=/usr/log/general.log
        

        在您的 my.cnf / my.ini 文件中

        Ubuntu/Debian:/etc/mysql/my.cnf
        Windows:c:\ProgramData\MySQL\MySQL Server 5.x
        wamp:c:\wamp\bin\mysql\mysqlx.yz\my.ini
        xampp:c:\xampp\mysql\bin\my.ini。

        【讨论】:

        • 如果你用过,能不能告诉我上面的对性能的影响,这样开启日志记录是否明智?
        • Ramesh 性能影响似乎是性能降低了 5-15% 左右。更多信息在这里percona.com/blog/2009/02/10/…
        • 我不明白为什么 Mysql 5.6 不允许从查询中设置日志文件?当您无权访问服务器目录树而只能访问phpMyAdmin 时,如何在 MySQL 5.6 及更高版本中记录所有查询?
        • 在这些更改后从 xampp 控制面板重新启动 mysql 服务。
        • 这在我的本地 Xampp Apache 环境中对我有用,但我仍然必须通过 phpMyAdmin 打开日志记录。此外,它无法在 /usr/log 文件夹中找到该文件,也不会创建它,但它与 general_log_file=filename.log 一样工作得很好
        【解决方案8】:

        注意:对于 mysql-5.6+,这是行不通的。如果你 scroll downclick here,有一个适用于 mysql-5.6+ 的解决方案。)

        如果您不想或无法重新启动 MySQL 服务器,您可以在正在运行的服务器上进行如下操作:

        • mysql 数据库上创建您的日志表
          CREATE TABLE `slow_log` (
           `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                                  ON UPDATE CURRENT_TIMESTAMP,
           `user_host` mediumtext NOT NULL,
           `query_time` time NOT NULL,
           `lock_time` time NOT NULL,
           `rows_sent` int(11) NOT NULL,
           `rows_examined` int(11) NOT NULL,
           `db` varchar(512) NOT NULL,
           `last_insert_id` int(11) NOT NULL,
           `insert_id` int(11) NOT NULL,
           `server_id` int(10) unsigned NOT NULL,
           `sql_text` mediumtext NOT NULL,
           `thread_id` bigint(21) unsigned NOT NULL
          ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
        
          CREATE TABLE `general_log` (
           `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                                  ON UPDATE CURRENT_TIMESTAMP,
           `user_host` mediumtext NOT NULL,
           `thread_id` bigint(21) unsigned NOT NULL,
           `server_id` int(10) unsigned NOT NULL,
           `command_type` varchar(64) NOT NULL,
           `argument` mediumtext NOT NULL
          ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
        
        • 在数据库上启用查询日志记录
        SET global general_log = 1;
        SET global log_output = 'table';
        
        • 查看日志
        select * from mysql.general_log
        
        • 禁用数据库上的查询日志记录
        SET global general_log = 0;
        

        【讨论】:

        • 我不确定这是否适用于每个版本的 MySQL(我在 5.5 上),但我不必创建表。我遵循相同的建议减去创建表,这里提到:stackoverflow.com/a/678310/135101
        • 也许它已经因为某种原因被创建了,@TylerCollier
        • 应该注意CREATE TABLE 命令应该(如果表不存在)在mysql 数据库上执行,而不是在任何用户创建的数据库上。也许可以更新 SQL 语句以反映这一点。
        • 查看日志SELECT * FROM mysql.general_log order by (event_time) desc会更好。只是说。:-)
        • 不同意 note - 服务器版本 5.6.37 完全正常工作。谢谢。
        猜你喜欢
        • 2015-02-02
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 2018-04-27
        相关资源
        最近更新 更多