我有一个服务器上有多个数据库。 它实际上是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并使用它 。
以下是你可以做的事情:
这里是基本的步骤:
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式传输到其他环境,并根据您的需要进行操作。