見出し画像

【MySQL】AWS同一アカウント内の異なるRDS間でmysqldumpによりデータ連携する

おはようございます、ねすたです、よろしくどうぞお願いいたします。

今回は古の技術、mysqldumpです。

ねすたはこれまで恥ずかしながらmysqldump使ったことなかったので、備忘録として記載してみます。

mysqldumpというとデータのバックアップとして使われるそうですが、今回のケースとしては、

「AWSの同一アカウント内における別のRDS間におけるデータ連携」

としてmysqldumpを実行しました。

1.やりたいこと

諸事情により、Aurora MySQL 5.7 クラスタ → MySQL 5.7 クラスタに対してデータを移行したい。

■Aurora MySQL 5.7:start-cluster

■MySQL 5.7:end-cluster

とする。

start-clusterからmysqldumpによりdumpファイルをエクスポートし、end-clusterにインポートする流れを実現したい。

また、状況としてはend-clusterには既にデータが格納されており、dumpファイルの内容にまるっと上書きするのではなく、dumpファイルの分のみを差分反映するようなデータ連携を行う。

2.前提条件

■RDSで2つのDBクラスタが同じVPC内で作成済みであること。

■双方のDBに同一定義で同一テーブルが存在していること。

■start-clusterの対象テーブルには連携したいデータが格納済みであること。

■同じVPC内に双方のDBに接続可能なEC2インスタンスが作成されていること。(踏み台サーバーのような役割)


3.dumpファイルのエクスポート

まずはstart-clusterからdumpファイルのエクスポートを行う。

EC2インスタンスにログインし、ホームディレクトリから分かりやすいように「dump」ディレクトリを作成。

$ mkdir dump

で、移動。

$ cd dump

そしたらmysqldumpを実行する。

今回のケースでは差分反映という目的もあるので、

--no-create-info

(インポート時にcreate tableのステートメントを削除する)

上記のオプションは必須となります。無いと上書きされてend-clusterの既存残しておきたい既存データが無くなります。

(最初付けてなくて吹っ飛ばした、、、バックアップテーブル無かったら開発環境とはいえ真っ青になってた)


また、よく分かっていませんがインポート時にエラーになったので、エクスポートで以下の警告が出ないようにオプションが必要です。

--set-gtid-purged=OFF

Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.

※おそらく他のRDSでインポートする際にエラーにならないようにするためのもの(?)


あとは読み込み時にロックがかかってしまわないように、

--single-transaction

のオプション、さらにエクスポート時にある程度データを絞り込んで起きたい場合には、

--where '{対象テーブルで絞り込む際のWHERE句での条件式}'

オプションを交えてmysqldumpコマンドを定義します。

$ mysqldump -h {ホスト} -u {ユーザ} --password {接続先のDB} {テーブル名A} {テーブル名B(以降複数可能)} --where '{条件式}' --single-transaction --set-gtid-purged=OFF --no-create-info > dumptest.sql

※{}内は適宜変更。DBまわりはstart-cluster設定値。

※ホストはリーダーインスタンスのエンドポイントが望ましい。

※ファイル名は任意。拡張子も.dumpとかでもいけるはず。

あえてパスワードを後から入れるようにしているので、パスワードを入れると、dumpファイルがエクスポートできているはずです。

正常に実行できていれば特に何も言われないので、作成できているか確認。

$ ls
→ dumptest.sqlが作成できていればOK!

※権限まわりのエラーになったら定義したMySQLユーザの権限を気にしてください。

これでエクスポートは完了。


4.dumpファイルからインポート

今度はend-clusterへのインポートです。

エクスポートのほうのオプション設定でエラーになる要因を潰しているので問題なくできるようになっているはずですので、コマンドのみ記載しておきます。
※引き続きdumpディレクトリ上で操作。

$ mysql -h {ホスト} -u {ユーザ} -p {接続先のDB} < dumptest.sql

※{}内は適宜変更。DBまわりはend-cluster設定値。

ターミナルに何も言われなければ正常に完了しているはずなので、上書きではなく差分反映できていることも踏まえて対象テーブルを適宜確認してください。


こちらからは以上です。

この記事が気に入ったらサポートをしてみませんか?