2012年5月31日木曜日

Amazon RDS の MySQL でトランザクション分離レベルを変更する

Amazon RDSのMySQLインスタンスはデフォルトで、トランザクション分離レベル(tx_isolation)が、"REPEATABLE READ"になっています。これは、RDSのMySQLはInnoDBしか選択できず、InnoDBのトランザクション分離レベルのデフォルトが"REPEATABLE READ"。
今回必要があり"READ COMMITTED"に変更する手順を調べました。

mysqlのクライアントから以下のコマンドを実行しても権限がないということで拒否されます。GLOBALでない場合は可能。
mysql>SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
RDSではデータベースの設定はパラメーターグループで管理されています。現在、パラメータグループはAWS Consoleから変更できないようなので、CLIを使って変更します。

また、デフォルトのパラメーターグループは変更できないので、あらかじめ新しいパラメータグループを作成し、変更したいインスタンスのパラメータグループを変更しておきます。

まず、RDS CLIインストールします。
Amazon RDS Command Line Toolkitをダウンロードします(今回は 1.8.002)。展開したフォルダを適当な場所に移動し、以下の環境変数を追加します。

  • AWS_RDS_HOME : C:\RDSCli-1.8.002
  • PATH : %PATH%;%AWS_RDS_HOME%\bin

認証情報は以下のいずれかの方法で指定します(証明書を使用することも可能)。
  1. 環境変数AWS_CREDENTIAL_FILE でキーを記載したファイルを指定
  2. --aws-credential-file オプションでキーを記載したファイルを指定
  3. --I <ACCESS_KEY> --S  <SECRET_KEY> のようにオプションで直接指定
1,2で使用するファイルは以下のような形式で記載します。
AWSAccessKeyId=<Write your AWS access ID> AWSSecretKey=<Write your AWS secret key>

rds-describe-db-instancesコマンドを実行して動作確認します。

C:\> rds-describe-db-instances --region ap-northeast-1 --headers
DBINSTANCE  DBInstanceId  Created                   Class        Engine  Storage  Master Username  Status     Endpoint Address          Port  AZ               Backup Retention  Multi-AZ Version  License

DBINSTANCE  mysql-master  2012-05-29T08:20:33.655Z  db.m1.small  mysql   10  user              available  mysql.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com  3306  ap-northeast-1a  7                 n         5.5.20   general-pu
blic-license
      SECGROUP  Name          Status
      SECGROUP  default       active
      PARAMGRP  Group Name        Apply Status
      PARAMGRP  default.mysql5.5  in-sync
      OPTIONGROUP  Name               Status
      OPTIONGROUP  default:mysql-5-5  in-sync
リージョンは、--region オプションで指定しますが、環境変数AWS_REGIONで指定することも可能です。

tx_isolationを変更します。gourp1の部分がパラメータグループです。method=immediateを指定すると変更は再起動を待たずすぐに反映されます。
C:\> rds-modify-db-parameter-group gourp1 --region ap-northeast-1 --parameters="name=tx_isolation, value=READ-COMMITTED, method=immediate"
DBPARAMETERGROUP group1

mysqlコマンドでtx_isolationが変更されていることを確認します。
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+-----------------------+----------------+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+-----------------------+----------------+
| READ-COMMITTED        | READ-COMMITTED |
+-----------------------+----------------+
ただし、変更の反映は少し時間(1分未満くらい?)がかかるようです。

0 件のコメント:

コメントを投稿