ラベル RDS の投稿を表示しています。 すべての投稿を表示
ラベル RDS の投稿を表示しています。 すべての投稿を表示

2013-09-08

非RDSのMySQLをRDSへ短時間メンテナンスで移行する方法

非RDSのMySQLをRDSに移行する方法としてまず思い浮かぶのが

  1. 移行先のRDSを用意
  2. メンテナンスを入れて非RDSへの書き込みがなくなるようにする
  3. 非RDSからmysqldump
  4. mysqldumpしたデータをRDSへ投入
  5. 利用するDBをRDSに切り替え
  6. 動作確認
  7. メンテナンス解除

といった具合ですが、データベースに格納されているデータが大きいとメンテナンス時間は長時間に及びます
mysqldumpした後のデータサイズが約40GBの状態で試算してみると
mysqldumpに1時間、投入に3時間ぐらいは掛かりそうな雰囲気でした
これだけ長時間になるとサービスに与える影響が大きいなぁということで、いろいろと調べていてたどり着いたのがこの方法

  1. 非RDSからmysqldump
  2. 移行先のRDSを用意
  3. mysqldumpしたデータをRDSへ投入
  4. RDSを非RDSをマスターとしてレプリケーションするように設定
  5. メンテナンスを入れて非RDSへの書き込みがなくなるようにする
  6. RDSのレプリケーション設定を解除して、マスターモードで稼働するよう設定
  7. 利用するDBをRDSに切り替え
  8. 動作確認
  9. メンテナンス解除
※ただし、RDSを非RDSからレプリケーションさせるには5.5系だと5.5.33以降、5.6系だと5.6.13以降である必要あり

この方法ならば、長時間に及ぶ作業はメンテナンス前に実施してしまい
メンテナンス中に行う作業は短時間の作業のみにできます
1時間もあれば十分な感じです

具体的な方法は次の通り

1.RDS Parameter Groupを3つ準備(デフォルトから変更するパラメータのみ記載)
・データ投入向け RDS Parameter Group
autocommit=0
innodb_flush_log_at_trx_commit=0
innodb_support_xa=0
character-set-client-handshake=0
character_set_client=utf8
character_set_connection=utf8
character_set_database=utf8
character_set_filesystem=utf8
character_set_results=utf8
character_set_server=utf8
・レプリケーション向けRDS Parameter Group
innodb_flush_log_at_trx_commit=0
character-set-client-handshake=0
character_set_client=utf8
character_set_connection=utf8
character_set_database=utf8
character_set_filesystem=utf8
character_set_results=utf8
character_set_server=utf8
・本番運用向けRDS Parameter Group
innodb_flush_log_at_trx_commit=2
character-set-client-handshake=0
character_set_client=utf8
character_set_connection=utf8
character_set_database=utf8
character_set_filesystem=utf8
character_set_results=utf8
character_set_server=utf8

2.RDS起動
5.5系なら5.5.33以降、5.6系なら5.6.13以降を選択
データ投入向けRDS Parameter Groupを選択
binlogを出力しないよう設定(Enabled Automatic BackupsをNoに設定)
Multi AZ=No

3.非RDSでmysql binlogが出力されるよう設定
/etc/my.cnfに以下を設定してrestart
[mysqld]
log-bin=mysql-bin
expire_logs_days=7

4.非RDSでレプリケーション用ユーザ作成
mysql> grant all on *.* to replicator identified by 'password';
Query OK, 0 rows affected (0.09 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)

5.非RDSの3306ポートにRDSから接続できるようFWやセキュリティグループを設定

6.既存DBから、フルダンプをファイルに書き出しつつRDSに投入
(投入速度をあげるために、ユニークキー、外部キーのチェックをOFFにしている)
$ (echo "SET unique_checks=0;SET foreign_key_checks=0;"; mysqldump --order-by-primary --add-drop-table --add-locks --master-data=2 --quick --all-databases -udbuser -p) | tee /mnt/storage/dump.sql | mysql -f -urdbuser -p -h xxx.yyy.ap-northeast-1.rds.amazonaws.com database_name

待つこと数時間…

7.書き出したファイルからbinlogのファイル名とポジションを確認
$ grep -m 1 MASTER_LOG /mnt/storage/dump.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000242', MASTER_LOG_POS=24812749;

8.RDSでレプリケーションの設定
CALL mysql.rds_set_external_master('10.xxx.xxx.xxx',3306,'replicator','password','mysql-bin.000242',24812749,0);
Query OK, 0 rows affected (0.11 sec)

CALL mysql.rds_start_replication;

+-------------------------+
| Message    |
+-------------------------+
| Slave running normally. |
+-------------------------+
1 row in set (1.05 sec)

Query OK, 0 rows affected (1.05 sec)

9.RDSでレプリケーションステータスの確認
mysql> show slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 11069

10.念のためマスター側(非RDS)の方でもプロセスを確認
mysql> show processlist;
| 123 | replicator | ip-10-xxx-xxx-xxx.ap-northeast-1.compute.internal:57028 | NULL    | Binlog Dump |   77 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL  
RDSから接続が来ていますね

このあたりが確認できれば接続はOK
あとは、マスターDBからの遅延時間
Seconds_Behind_Master: 11069
が0になってくれるまで待機


11.待っている間にレプリケーション中にエラーが起きた場合は、内容を確認してスキップするなどして対処する
mysql> CALL mysql.rds_skip_repl_error;
+-------------------------------------+
| Message         |
+-------------------------------------+
| Statement in error has been skipped |
+-------------------------------------+
1 row in set (0.04 sec)

+---------------------------+
| Message      |
+---------------------------+
| Slave is running normally |
+---------------------------+
1 row in set (2.05 sec)

Query OK, 0 rows affected (2.05 sec)

12.Enabled Automatic BackupsをYesに設定
Modifyして1日以上に設定

13.マスター稼働用のパラメータグループに変更

14.RDSをマスターモードに切り替え
mysql> CALL mysql.rds_stop_replication;
+---------------------------+
| Message      |
+---------------------------+
| Slave is down or disabled |
+---------------------------+
1 row in set (1.08 sec)

Query OK, 0 rows affected (1.08 sec)

mysql> CALL mysql.rds_reset_external_master;
+----------------------+
| message        |
+----------------------+
| Slave has been reset |
+----------------------+
1 row in set (0.18 sec)

Query OK, 0 rows affected (0.18 sec)

ここまで来たら、あとは動作確認して終了ヾ(*・∀・)ノ"

2012-12-10

Amazon RDS(MySQL)とのクライアント接続でSSLを利用してみた

まずは、クライアントマシンで公開鍵を入手
https://rds.amazonaws.com/doc/rds-ssl-ca-cert.pemからダウンロード
でもって、クライアント起動時にSSL通信を行う旨指示して接続
mysql -h [RDSサーバのホスト名] --ssl_ca=[公開鍵のパス] -u[接続ユーザ名] -p[接続パスワード]
あとは、本当にSSL通信できているか確認
まずは、サーバ側でSSL通信に対応しているかを確認(接続時にエラーになってないから不要だとは思うけど・・・)
mysql> show variables like '%have_%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   |
| have_ssl      | YES   |
+---------------+-------+
2 rows in set (0.02 sec)
次に、SSL通信されているかを確認
mysql> SHOW STATUS LIKE 'Ssl_cipher';
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| Ssl_cipher    | AES256-SHA |
+---------------+------------+
1 row in set (0.01 sec)
値が空白でなければSSLで通信されてるそうですヾ(*・ω・)シ

2012-07-04

Amazon RDSから取得したdumpデータを通常のMySQLサーバへリストア

Amazon RDSをmysqldumpでバックアップで作成したダンプファイルを復元しようと、単純に
zcat hoge.zip | mysql -uxxxx -pxxxx
で良いのかと思ったのですがシステムテーブル関連でエラーが出て、1つ1つ対処していこうかとも思ったのですが量が多かったので-fオプションつけちゃいました(ノ゚⊿゚)ノ
zcat hoge.gz | mysql -f
ERROR 1465 (HY000) at line 8860: Triggers can not be created on system tables
ERROR 1465 (HY000) at line 8884: Triggers can not be created on system tables
ERROR 1465 (HY000) at line 9274: Triggers can not be created on system tables
ERROR 1465 (HY000) at line 9309: Triggers can not be created on system tables
ERROR 1465 (HY000) at line 9344: Triggers can not be created on system tables
ERROR 1142 (42000) at line 9395: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'cond_instances'
ERROR 1044 (42000) at line 9396: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9397: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9431: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'events_waits_current'
ERROR 1044 (42000) at line 9432: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9433: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9467: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'events_waits_history'
ERROR 1044 (42000) at line 9468: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9469: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9503: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'events_waits_history_long'
ERROR 1044 (42000) at line 9504: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9505: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9530: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'events_waits_summary_by_instance'
ERROR 1044 (42000) at line 9531: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9532: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9557: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'events_waits_summary_by_thread_by_event_name'
ERROR 1044 (42000) at line 9558: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9559: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9583: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'events_waits_summary_global_by_event_name'
ERROR 1044 (42000) at line 9584: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9585: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9606: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'file_instances'
ERROR 1044 (42000) at line 9607: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9608: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9631: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'file_summary_by_event_name'
ERROR 1044 (42000) at line 9632: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9633: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9657: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'file_summary_by_instance'
ERROR 1044 (42000) at line 9658: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9659: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9680: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'mutex_instances'
ERROR 1044 (42000) at line 9681: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9682: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9704: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'performance_timers'
ERROR 1044 (42000) at line 9705: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9706: INSERT command denied to user 'root'@'localhost' for table 'performance_timers'
ERROR 1044 (42000) at line 9707: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9729: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'rwlock_instances'
ERROR 1044 (42000) at line 9730: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9731: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9752: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9753: INSERT command denied to user 'root'@'localhost' for table 'setup_consumers'
ERROR 1044 (42000) at line 9754: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9776: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9777: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9798: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9799: INSERT command denied to user 'root'@'localhost' for table 'setup_timers'
ERROR 1044 (42000) at line 9800: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1142 (42000) at line 9821: SELECT,LOCK TABL command denied to user 'root'@'localhost' for table 'threads'
ERROR 1044 (42000) at line 9822: Access denied for user 'root'@'localhost' to database 'performance_schema'
ERROR 1044 (42000) at line 9823: Access denied for user 'root'@'localhost' to database 'performance_schema'
と、大量にエラーが発生したものの自分で作成したデータなどはリストアされているみたいですヽ(´ー`)/

2012-06-28

Amazon RDSをmysqldumpでバックアップ

何も考えずにmysqldumpを行うとアクセスできないテーブルがあるために怒られてしまいました(´・ω・`)
mysqldump --all-databases  -uxxxx -pxxxx -h xxxx | gzip -c > dump.gz
mysqldump: Got error: 1142: SELECT,LOCK TABL command denied to user 'xxxx'@'hoge.com' for table 'cond_instances' when using LOCK TABLES
そんなときは--skip-lock-tablesを指定してあげると良いみたいです
ついでに--debug-infoをくっつけてデバッグ情報も表示しちゃいます
mysqldump --all-databases --skip-lock-tables --debug-info -uxxxx -pxxxx -h xxxx | gzip -c > dump.gz

User time 4.43, System time 0.35
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 1092, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10625, Involuntary context switches 182
で行けましたよヾ(*・ω・)シ