MySQL:为每个数据库分开的日志文件

我有一个服务器上有多个数据库。 它实际上是AmazonRDS上的一个实例,所以我没有访问my.cnf文件。 我想要做的是为每个数据库单独创build一个日志,logging以前运行的查询以及这些查询产生的可能的错误。 这是可能的与MySQL有一个单独的日志文件为每个数据库/架构?

更新

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

我不能用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
  • 添加两个索引
    • 由start_time
    • 由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); 

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

 [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 

这样,每个查询和它的祖母都logging在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

这里是我在mysql.slow_log有关使用mysql.slow_log过去文章:

  • Nov 18, 2011 : 在MySQL中创build一个自定义日志表
  • Dec 27, 2011 : 如何做MySQL用户帐户
  • Mar 30, 2012 : MySQL慢日志configuration
  • Nov 06, 2012 : AWS RDS MySQL /慢查询日志

看看pt-query-digest – 它可以作为tcpdump的input输出,看起来有可能创build自定义的filter来提取只有特定types的查询[也可能查询到特定的数据库]。

请注意,这可能是很好的故障排除工具,但对于永久性日志logging来说这不是非常方便的解决方

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

如果您想为每个数据库查询日志,则需要使用其他产品。 可能的候选人是MySQL代理或获取您的应用程序或应用程序框架来logging查询。

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

使用RDS中的MySQL 5.6,您可以使用binlog访问function将binlogstream式传输到其他环境,并根据您的需要进行操作。