我有一台服务器上有多个数据库。它实际上是 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
:
Nov 18, 2011
:在 MySQL 中创建自定义日志表Dec 27, 2011
:如何进行 MySQL 用户记账Mar 30, 2012
:MySQL 慢日志配置Nov 06, 2012
:AWS RDS MySQL / 慢查询日志
答案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 流式传输到另一个环境并根据需要对其进行操作。