结语

结语

我有一台服务器上有多个数据库。它实际上是 AmazonRDS 上的一个实例,因此我无法访问 my.cnf 文件。我想做的是为每个数据库分别创建一个日志,以记录之前运行的查询以及这些查询可能产生的错误。mysql 是否可以为每个数据库/架构创建一个单独的日志文件?

更新

我正在寻找这样的解决方案,但不是针对整个服务器。https://stackoverflow.com/questions/650238/how-to-show-the-last-queries-executed-on-mysql

答案1

我不能用 AmazonRDS 来说话,但这里有一些通用的方法可以尝试

您是否知道,如果您激活慢速日志,它就是一个 CSV 文件?

如果你查看 mysql.slow_log,你会看到以下内容:

mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: 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
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)

mysql>

作为 CSV 文件,这对您来说没有任何用处。您可以将其转换为 MyISAM 并使用它

您可以执行以下操作:

  • 复制原始 CSV 慢速日志
  • 将 CSV 转换为 MyISAM
  • 添加两个索引
    • 按开始时间
    • 通过 db,start_time
  • 激活慢日志

基本步骤如下:

CREATE TABLE mysql.slow_log_original LIKE mysql.slow_log;
ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX starttime (start_time);
ALTER TABLE mysql.slow_log ADD INDEX db_starttime (db,start_time);

mysql.slow_log接下来,通过将其添加到来启用日志记录/etc/my.cnf

[mysqld]
slow-query-log
log-format=TABLE

如果除了表格之外,您还想要一个用于慢速查询的文本文件,那么使用

[mysqld]
slow-query-log
slow-query-logfile=/var/log/mysql_slow.log
log-format=TABLE

现在你可能想知道为什么我展示的是表格mysql.slow_log而不是mysql.general_log。好吧,这里是mysql.general_log

mysql> desc mysql.general_log;
+--------------+------------------+------+-----+-------------------+-----------------------------+
| Field        | Type             | Null | Key | Default           | Extra                       |
+--------------+------------------+------+-----+-------------------+-----------------------------+
| event_time   | timestamp        | NO   | MUL | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user_host    | mediumtext       | NO   |     | NULL              |                             |
| thread_id    | int(11)          | NO   |     | NULL              |                             |
| server_id    | int(10) unsigned | NO   |     | NULL              |                             |
| command_type | varchar(64)      | NO   |     | NULL              |                             |
| argument     | mediumtext       | NO   |     | NULL              |                             |
+--------------+------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.01 sec)

mysql>

没有任何东西可以将查询指向数据库中mysql.general_log

哦,顺便说一下,你必须设置其他东西才能捕获mysql.slow_log一切

[mysqld]
slow-query-log
log-format=TABLE
log-query-time=0
log-queries-not-using-indexes

这样,每个查询及其祖母都会被记录下来mysql.slow_log

结语

您需要做的就是针对 运行查询mysql.slow_log。例如,要查看mydb今天数据库中的所有查询,您可以运行:

SELECT * FROM mysql.slow_log
WHERE db = 'mydb'
AND start_time >= DATE(NOW()) + INTERVAL 0 SECOND;

由于您使用的是 Amazon RDS,因此您必须检查文档以了解是否可以mysql.slow_log按您的喜好进行操作。

以下是我过去在 StackExchange 中发布的有关使用的帖子mysql.slow_log

答案2

看一眼pt-查询-摘要- 它可以作为 tcpdump 的输入输出,并且似乎可以创建自定义过滤器来仅提取特定类型的查询[可能还包括对特定数据库的查询]。

请注意,这可以成为很好的故障排除工具,但对于永久记录来说它并不是非常方便的解决方案。

答案3

这不可能。查询日志是服务器级别的设置。

如果您需要每个数据库的查询日志,则需要使用不同的产品。可能的候选产品包括MySQL 代理或者让您的应用程序或应用程序框架记录查询。

答案4

RDS 支持通过数据库参数组设置启用常规日志。默认情况下,它会转到 TABLE,但您可以将 log_output 修改为 FILE 并重新启动数据库实例,然后您可以通过日志访问 API 下载和解析文件。(http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html

使用 RDS 中的 MySQL 5.6,您可以使用 binlog 访问功能将 binlog 流式传输到另一个环境并根据需要对其进行操作。

相关内容