はじめに
タイトルどおり、EC2踏み台サーバーを経由して、RDSのDBを別のRDSのDBに移す方法について記載します。
流れ
①EC2にSSH接続する
②EC2からRDSのmysqlにログインできるか確認
③RDSのDBをEC2にエクスポートする
④別のRDSのDBパラメータグループのパラメータを変更
⑤EC2から別のRDSにインポートする
環境
EC2:Amazonlinux2
RDS:Aurora/mysql
①EC2にSSH接続する
こちらの記事を参考にしてください。
SSH接続した状態で①〜⑤まで作業してください。
②EC2からRDSのmysqlにログインできるか確認
$ mysql -h RDSのエンドポイント -P 3306 -u ユーザー名 -p
Enter password:
mysql> SHOW DATABASES;
old_DB
コピーしたいDB名をold_DB
とします。
エラー対処①「Access denied」
ERROR 1045 (28000): Access denied for user
「Access denied」が表示され、mysqlにログインできない場合は、セキュリティグループに問題がある可能性があります。RDSのインバウンドルールを確認し、EC2からの接続が許可されているか確認してみてください。
また、RDSのエンドポイント
、ユーザー名
、パスワード
が間違っている可能性もありますので、確認方法が分からない方は、以下のサイトを参考に調べてください。
【AWS図解】RDSのユーザ名とパスワードを忘れた場合の確認方法
Aurora/mysqlであれば、リージョン別クラスターのライターインスタンス
をRDSのエンドポイント
に指定しました。
エラー対処②「mysql: コマンドが見つかりません」
mysqlをインストールしましょう
mysql-communityリポジトリを使ってmysqlをyumでインストールします。
$ sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
$ sudo yum install -y mysql
$ mysql --version
mysql Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)
他にもHomebrewでmysqlをインストールする方法もあります。
③RDSからEC2にエクスポートするコマンド
$ mysqldump --skip-column-statistics --quick --single-transaction -h RDSのエンドポイント -u 別のRDSのユーザー名 -p DB名 | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /var/tmp/dump.sql
DB名:new_DB
オプション:--skip-column-statistic --quick --single-transaction
なぜこのようなコマンドなのかはこちらを参考にしてください。
MySQLのDBからAWSのRDSへデータをインポートする
④別のRDSのDBパラメータグループのパラメータを変更
別のRDSのmysqlにログインし、下記のValueがOFFであればONにする必要があります。
mysql> SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF |
+---------------------------------+-------+
OFFのままだと、⑤のEC2から別のRDSにインポートができません。
RDSのDBパラメータグループのパラメータを新しく作成し、log_bin_trust_function_creators
を1に変更し、RDSにアタッチさせ、再起動します。すると、ValueがONになります。
RDSに元々ついているデフォルトのDBパラメータグループは、パラメータが変更できない仕様になっていますので、新しく作成する必要があります。
mysql> SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON |
+---------------------------------+-------+
詳しい方法は下記を参照してください。
AWS RDS MySQL で create function できるようにする
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-mysql-functions/
⑤EC2から別のRDSにインポートする
別のRDSに新しくDBを作成し、そのDBにインポートします。
mysql> CREATE DATABASE new_DB;
$ mysql -h RDSのエンドポイント -u 別のRDSのユーザー名 -p DB名 < /var/tmp/dump.sql