EC2踏み台サーバーを経由して、RDSのDBを別のRDSのDBに移す方法


はじめに

タイトルどおり、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 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