Amazon RDS(MySQL Engine)提供了将MySQL Engine的慢查询日志存储到数据表或数据文件的功能。
当我们需要对慢查询日志进行分析时,如果该日志是存储在数据表中的,就需要为其编写复杂的SQL语句来分析,带来的困扰是第一是编写 SQL 语句很麻烦,第二是执行这些 SQL 会为数据库带来负载, 所以请尽量将RDS(MySQL Engine)的日志存储设置为数据文件( log_output = FILE)
。
而这些存储到数据文件中的RDS Logs又有以下特点:
对于RDS来说,用户是没有文件系统权限的,所以虽然设置为存储到数据文件,但是实际上你还是必须使用API来访问这些文件
只保存最近24个小时内的日志
日志每小时轮替一次,共有24个文件
24个日志文件单从文件名无法判断先后顺序,并且没有按时间排序列出这些文件的功能,使用SHELL很难一个循环简单按序dump
API有Web管理页面,及RDS Command Line Tools
据其特点,实际使用中会遇到的问题是:
24小时之前的性能问题就追踪不到了
日志使用API即时获取,因此没有办法用mysqlslap/pt-query-digest等工具进行分析
一天的日志被分为24个,很难一次操作
为了解决以上问题,我做了一个小工具 rds_dump_log
,用来放在 Linux 的 crontab 中,每天从 RDS API 获取日志文件,按序 Dump 到位于本地磁盘的单个日志文件中。
配置自动Dump方法:
1.
首先,你需要在你的能访问RDS的Linux Server上安装配置RDS Command Line Tools,这是一个 JAVA 编写的命令行工具,可以在 Linux 中使用命令行来管理 RDS。
http://docs.aws.amazon.com/AmazonRDS/latest/CommandLineReference/StartCLI.html
2.
将以下环境变量添加到你的 /etc/profile 文件中并 source(各变量值根据你的实际安装路径配置)。
# Settings for AWS Command Line Tools
export AWS_RDS_HOME='/home/dba/maintain/RDSCli-1.15.001'
export JAVA_HOME='/usr/java/default'
export PATH=${PATH}:${AWS_RDS_HOME}/bin
export EC2_REGION=us-east-1
export AWS_CREDENTIAL_FILE=/home/dba/maintain/RDSCli-1.15.001/credential-file-path.template
3.
在Shell中使用 rds –help 来测试你的工具是否安装成功。
4.
安装 Python 2.7 以上版本(如果现有版本已经>=2.7,则跳过)。
6.
添加定时任务,每日自动Dump日志文件到本地
需要注意的是,由于该日志每小时自动轮替,并且只保存最近24小时的文件,因此你的crontab的两次连续任务之间的间隔必须小于24小时,不然你就会漏掉一些日志了,我选择的是每12小时Dump一次。
另外,dump_rds_log.py的使用方法可用python dump_rds_log.py –help查看,或到这里https://github.com/phang001/dump_rds_log/blob/master/README.md
例如,我当前配置的自动Dump GameFuse的slow日志的定时任务如下:
###将RDS的SLOW LOG DUMP到本地存放#######################
0 0,12 * * * source /etc/profile; /usr/bin/python /home/slow_log_dump/dump_rds_log.py rds-id-1 slow /home/slow_log_dump/
0 1,13 * * * source /etc/profile; /usr/bin/python /home/slow_log_dump/dump_rds_log.py rds-id-2 general /home/general_log_dump/
0 2,14 * * * source /etc/profile; /usr/bin/python /home/slow_log_dump/dump_rds_log.py rds-id-3 slow /home/slow_log_dump/
注意:
crontab 命令中的source /etc/profile是必须的,因为Linux crontab目前不能自动读取到系统环境变量,而调用RDS Command Line Tools需要上述那些环境变量的支持。
虽然AWS提供了一个python库叫做boto,用来管理RDS,但是目前该库功能有限,远不如RDS Command Line Tools功能强大,因此随着boto的进步,这个工具可能会变得更简单易用。
实际上该工具也可以用来转储general log、error log,将第二个参数改为general或error就可以了,甚至也可用用来转储 RDS的sqlserver engine、oracle engine的日志。