aws memo

AWS関連の備忘録 (※本ブログの内容は個人的見解であり、所属組織及び企業の意見を代弁するものではありません。1年以上古いエントリは疑ってかかってください)

RDS: MySQL5.6 のbinlogアクセス権限

RDS MySQLで、5.6のエンジンがサポートされた。

Amazon Web Services ブログ: 【AWS発表】 Amazon RDSがMySQL 5.6をサポート!

そのなかで

バイナリログアクセス - バイナリログを付属のmysqlbinlogツールを使って、ダウンロードしたりストリームすることができます。 この機能はオンプレミス環境とのデータの同期や、監査ログ、分析、レプリケーションエラーのデバッグといった様々な目的に使うことができます。この機能を利用するには、自動バックアップ機能を有効にする必要があります。

と書かれている。まずは権限の確認。ユーザ名「test」で作ったRDS MySQL5.5と5.6を比較すると

MySQL 5.5

mysql>SHOW GRANTS FOR test\G
*************************** 1. row ***************************
Grants for test@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'test'@'%' IDENTIFIED BY PASSWORD '略' WITH GRANT OPTION

MySQL 5.6

mysql>SHOW GRANTS FOR test\G
*************************** 1. row ***************************
Grants for test@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'test'@'%' IDENTIFIED BY PASSWORD '略' WITH GRANT OPTION

となっていて、レプリカスレーブのアクセス権限が付与されていることがわかる。

試しに、SHOW BINLOG EVENTS を実行してみると

MySQL 5.5

mysql>SHOW BINLOG EVENTS LIMIT 5;
ERROR 1227 (42000): Access denied; you need (at least one of) the REPLICATION SLAVE privilege(s) for this operation

MySQL 5.6

mysql> SHOW BINLOG EVENTS LIMIT 5;
+----------------------------+-----+-------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------+
| Log_name                   | Pos | Event_type  | Server_id | End_log_pos | Info                                                                                                                               |
+----------------------------+-----+-------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin-changelog.000105 |   4 | Format_desc | 252030926 |         120 | Server ver: 5.6.12-log, Binlog ver: 4                                                                                              |
| mysql-bin-changelog.000105 | 120 | Query       | 252030926 |         194 | BEGIN                                                                                                                              |
| mysql-bin-changelog.000105 | 194 | Query       | 252030926 |         330 | use `tpcc`; INSERT INTO orders values(1,4,55,2103,'2013-07-07 06:21:01',4,8, 1)                                                    |
| mysql-bin-changelog.000105 | 330 | Query       | 252030926 |         522 | use `tpcc`; INSERT INTO order_line values(1,4,55,1,39866,55,'2013-07-07 06:21:01',5,53.880001068115234,'0LwtP7YDbrc8dUr5bu5UuGbw') |
| mysql-bin-changelog.000105 | 522 | Query       | 252030926 |         712 | use `tpcc`; INSERT INTO order_line values(1,4,55,2,13887,55,'2013-07-07 06:21:01',5,94.9000015258789,'5wO9wj3n78MIkBsspMhuyZxS')   |
+----------------------------+-----+-------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

と、5.5ではREPLICATION SLAVE権限が付与されていないため参照できないが、5.6ではbinlogのイベントを参照できることが確認できる。

つまり、mysqlbinlog --read-from-remote-server をRDSに対して使えるようになったということ。さらに、MySQL 5.6では mysqlbinlogも3.3にバージョンアップし、リモートのファイル操作ができるようになっている。

MySQL :: MySQL 5.6 Reference Manual :: 4.6.8 mysqlbinlog — Utility for Processing Binary Log Files

特定のbinlogを手元にバイナリのままコピーする --raw オプション(従来はtext表示だった)とそれに付随するオプション群が機能強化ポイント。

特定のbinlogを手元にコピーするには

[ec2-user@ip-10-0-2-64 ~]$ mysqlbinlog -utest -ptesttest -h test.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw mysql-bin-changelog.000121
[ec2-user@ip-10-0-2-64 ~]$ ls
mysql-bin-changelog.000121

複数のbinlogを手元にコピーするには

[ec2-user@ip-10-0-2-64 ~]$ mysqlbinlog -utest -ptesttest -h test.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw mysql-bin-changelog.000121 mysql-bin-changelog.000122
[ec2-user@ip-10-0-2-64 ~]$ ls
mysql-bin-changelog.000121 mysql-bin-changelog.000122

特定のbinlog以降のログを手元にコピーするには

[ec2-user@ip-10-0-2-64 ~]$ mysqlbinlog -utest -ptesttest -h test.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw --to-last-log mysql-bin-changelog.000121 
[ec2-user@ip-10-0-2-64 ~]$ ls
mysql-bin-changelog.000121 mysql-bin-changelog.000122 mysql-bin-changelog.000123 mysql-bin-changelog.000124

特定のbinlog以降のログを半永久的に手元にコピーするには

[ec2-user@ip-10-0-2-64 ~]$ mysqlbinlog -utest -ptesttest -h test.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw --stop-never mysql-bin-changelog.000121 
^C
[ec2-user@ip-10-0-2-64 ~]$ ls
mysql-bin-changelog.000121 mysql-bin-changelog.000122 mysql-bin-changelog.000123 mysql-bin-changelog.000124 .....

手元のbinlogにプレフィックスをつけてRDSインスタンスごとの識別をする

[ec2-user@ip-10-0-2-64 ~]$ mysqlbinlog -utest -ptesttest -h test.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --result-file=test_ --raw mysql-bin-changelog.000121 
[ec2-user@ip-10-0-2-64 ~]$ ls
test_mysql-bin-changelog.000121
 

注意:RDSでは、自動バックアップ( Automatic Backup) を有効にし、かつ、Backup Retention Period を1日以上に設定している場合にbinlogを出力するので、binlogが無い場合はRDSのバックアップ設定を見直す。