【アップデート】Amazon RDSでMySQL 5.7が使用可能になりました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。
本日RDSでMySQL 5.7が使用可能になったので、早速試してみました。

RDS for MySQL 5.7で何が変わった?

RDSでは対応した主なアップデート

MySQL 5.7では様々なアップデートがあるので、一部をご紹介します。

  • ネイティブでのJSON対応。様々なJSON関数が追加されています。
  • 実行計画のJSON出力が可能になり、詳細情報が出力可能になりました。
  • パラレルレプリケーションに対応しました。
  • Boost.Geometryを使用した空間インデックスのGIS対応。
  • innodb_buffer_pool_sizeの動的変更が可能になりました。
  • innodb_buffer_pool_dump_pctシステム変数が追加され、バッファプルからダンプするかとパーセンテージで指定できます。
  • バルクデータロードのパフォーマンスが改善されています。
  • ディスク書き込みスレッドが2つになりパフォーマンスが改善されています。

RDSでは対応していない主なアップデート

RDSでは対応していない主なアップデートをご紹介します。

  • マルチソースレプリケーション:レプリケーションの設定はmysql.rds_set_external_masterのみで設定可能です。
  • STOP SLAVEでのレプリケーション停止不要のCHANGE MASTER TO実行:そもそもCHANGE MASTER TOを実行できません。
  • GTID関連の機能:RDS for MySQL 5.7ではGTIDを有効にできません。

起動してみる

今までと同じようにRDSの画面でMySQLを選択します。

RDS_·_AWS_Console

今回は「開発/テスト」を選択します。

RDS_·_AWS_Console

MySQLのバージョンは「5.7.10」が選択可能です。

RDS_·_AWS_Console

DBパラメータグループはMySQL 5.7用になります。

RDS_·_AWS_Console

ログインしてみます。MySQL 5.7.10になっています。

$ mysql -u awsuser -pmypassword -h mysql57.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com mydb
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.7.10-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

実行計画のJSON出力を試してみます。
最初は普通に出力します。

mysql> explain select * from mysql.user ;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | user  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

次にJSONフォーマットで出力します。
JSONフォーマットの場合は実行コストが表示されるので、クエリの詳細を把握する時に役立つと思われます。

mysql> explain format = json select * from mysql.user ;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "2.69"
    },
    "table": {
      "table_name": "user",
      "access_type": "ALL",
      "rows_examined_per_scan": 3,
      "rows_produced_per_join": 3,
      "filtered": "100.00",
      "cost_info": {
        "read_cost": "2.09",
        "eval_cost": "0.60",
        "prefix_cost": "2.69",
        "data_read_per_join": "1K"
      },
      "used_columns": [
        "Host",
        "User",
        "Select_priv",
        "Insert_priv",
        "Update_priv",
        "Delete_priv",
        "Create_priv",
        "Drop_priv",
        "Reload_priv",
        "Shutdown_priv",
        "Process_priv",
        "File_priv",
        "Grant_priv",
        "References_priv",
        "Index_priv",
        "Alter_priv",
        "Show_db_priv",
        "Super_priv",
        "Create_tmp_table_priv",
        "Lock_tables_priv",
        "Execute_priv",
        "Repl_slave_priv",
        "Repl_client_priv",
        "Create_view_priv",
        "Show_view_priv",
        "Create_routine_priv",
        "Alter_routine_priv",
        "Create_user_priv",
        "Event_priv",
        "Trigger_priv",
        "Create_tablespace_priv",
        "ssl_type",
        "ssl_cipher",
        "x509_issuer",
        "x509_subject",
        "max_questions",
        "max_updates",
        "max_connections",
        "max_user_connections",
        "plugin",
        "authentication_string",
        "password_expired",
        "password_last_changed",
        "password_lifetime",
        "account_locked"
      ]
    }
  }
} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql>

default_password_lifetimeに注意点!!!

MySQL 5.7での一番のハマりどころであるdefault_password_lifetimeに注意です。default_password_lifetimeはパスワードの有効期限の日数を設定するパラメータです。MySQL 5.7.11からデフォルト値が0(無制限)になったのですが、今回対応したバージョンはMySQL 5.7.10であるためデフォルト値が360日になっています。DBパラメータグループのデフォルト値は空欄になってるため360日に設定されます。

mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| default_password_lifetime | 360   |
+---------------------------+-------+
1 row in set (0.00 sec)

パスワードを変更していないとRDSを起動した約1年後に突如ログインできなくなるので、MySQL 5.6以前と同様の設定にするにはdefault_password_lifetimeを「0」に設定しましょう。

参考:日々の覚書: MySQL 5.7.4で導入されたdefault_password_lifetimeがじわじわくる(MySQL 5.7.11でFIX!!)

さいごに

MySQL 5.6ではMySQL 5.6のGA(2013年2月)から5ヶ月(2013年7月)かかってRDS for MySQLで対応しました。しかし、今回のMySQL 5.7ではGA(2015年10月)から4ヶ月(2016年2月)での対応をスピートを速めています。
今後もこの調子で機能アップデートをして欲しいですね。