首页 文章

在mysql中记录所有查询

提问于
浏览
239

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

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

11 回答

  • 205

    使用--log选项启动mysql:

    mysqld --log=log_file_name
    

    或者将以下内容放在 my.cnf 文件中:

    log = log_file_name
    

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

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

  • 102

    如果使用AWS RDS MYSQL,请在此处逐步指导 .

    设置为“文件”输出时,您可以直接从AWS RDS“Log”控制台查看日志 .

    AWS RDS MYSQL Logging

  • 5

    最佳答案在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.y.z \ my.ini
    xampp :c:\ xampp \ mysql \ bin \ my.ini .

  • 11

    无需重新启动即可快速启用MySQL常规查询日志 .

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

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

  • 6

    启用表的日志

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

    按选择查询查看日志

    select * from mysql.general_log
    
  • 172

    为了记录,在5.1.6中引入了general_log和slow_log:

    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表

  • 1

    Note :对于mysql-5.6,如果你scroll downclick here,这会赢得't work. There'一个适用于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;
    
  • 1

    您应该知道,mysql登录确实会影响性能,但这可能是明智之举 .

    我通常把它留在开发服务器上(除非它让我们疯了:))

  • 24

    默认情况下,除错误日志外,不会启用任何日志 . 这样做是有原因的,即日志记录从DB的主要功能中夺走了一些服务器资源 . 实际上,MySQL文档建议您在尝试发现导致性能问题时仅启用某些日志 . 当然,在事实之后开启日志记录会带来一系列问题 .

    出于这些原因,我使用专业的监视工具来评估我的数据库实例的性能和 Health 状况 . 多年来我经历过各种各样的工具,但是我最喜欢的监控工具是Navicat Monitor for MySQL/MariaDB . 它使用称为"agentless architecture"的东西,这意味着您不需要在数据库服务器上安装任何软件,并且您可以通过Web浏览器从任何地方访问您的数据库统计数据 .

    您可以在查询分析器屏幕上监视已执行的查询 . 它实时显示查询并显示所有正在执行的查询的摘要信息 . 它对于发现有问题的查询(例如执行时间最慢的查询)以及检测死锁非常有用 .

    您的所有指标都可用于生成高质量的报告 . 这些可以包括一个或甚至多个实例的图表来比较和分析数据 . 您还可以将报告另存为高质量的PDF文档 .

    试一试,你想要的是什么!

  • 0

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

    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;
    
  • 155

    OS / 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
    

相关问题