AWS Database Migration Service (DMS)
データベースや分析システム間のデータを安全かつ最小限のダウンタイムで移行できるサービス。
業務を止めずに安全にデータを引越しできるツール。
仕組みを簡潔に整理する
VPCの中に、レプリケーションインスタンスをたて、そのレプリケーションインスタンスを使用してソースデータストアに接続し、ソースデータを読み取り、ターゲットデータストアで使用するためにデータをフォーマットする。
主なデータ連携は3つ
-
フルロード
- 移行開始時点にある既存データをまとめてコピーする
-
CDC
- 移行開始後にソースDBで発生したデータの追加・変更・削除(差分)をリアルタイムで検知し、ターゲットDBに反映
-
フルロードとODC
- 既存データをフルロードで移行したあと、CDCによる差分同期を実施する
多いのが3のパターン。
既存のデータを移行しつつ、CDCとの差分を同期する。
実行までに必要なステップ
1. エンドポイントとエンジンタイプの確認
ソース(移行元)かターゲット(移行先)かを確認。MySQL、Oracle、PostgreSQL、Auroraなど、データベースの種類を指定。
2. 接続情報の確認
ホスト名(IPアドレス)、ポート、ユーザー名、パスワードなどの認証情報を指定する。
※ 以下、oracle→postgresの移行にあたって確認したことを記載します
2-1. ロールレベルの基本権限確認
スーパーユーザー権限やデータベース作成権限の有無を確認。
SELECT
rolname AS current_user,
rolsuper AS is_superuser,
rolcreatedb AS can_create_db,
rolcreaterole AS can_create_role
FROM pg_roles
WHERE rolname = CURRENT_USER;
2-2. 対象データベースへ接続権限の確認
同期先のデータベースに対する CONNECT 権限があるか確認する
SELECT has_database_privilege(CURRENT_USER, current_database(), 'CONNECT') AS has_connect_privilege;
2-3. 対象スキーマへの権限確認
データ移行先のスキーマ(例: public や移行用スキーマ)に対する権限を確認します。
-- 'public' の部分を移行対象のスキーマ名に変更してください
SELECT
has_schema_privilege(CURRENT_USER, 'public', 'USAGE') AS has_usage,
has_schema_privilege(CURRENT_USER, 'public', 'CREATE') AS has_create;
2-4. 対象テーブルの権限と所有者チェック
DMSのCDC(継続的同期)やフルロード時の制約処理では、「ユーザーが対象テーブルの所有者(Owner)であるか」 または 「ALL権限(CRUD)を持っているか」
-- 'public' の部分を移行対象のスキーマ名に変更して実行してください
SELECT
t.tablename,
-- ログインユーザーがテーブル所有者か
(t.tableowner = CURRENT_USER) AS is_owner,
-- DML・DDL操作権限
has_table_privilege(CURRENT_USER, quote_ident(t.schemaname) || '.' || quote_ident(t.tablename), 'SELECT') AS can_select,
has_table_privilege(CURRENT_USER, quote_ident(t.schemaname) || '.' || quote_ident(t.tablename), 'INSERT') AS can_insert,
has_table_privilege(CURRENT_USER, quote_ident(t.schemaname) || '.' || quote_ident(t.tablename), 'UPDATE') AS can_update,
has_table_privilege(CURRENT_USER, quote_ident(t.schemaname) || '.' || quote_ident(t.tablename), 'DELETE') AS can_delete,
has_table_privilege(CURRENT_USER, quote_ident(t.schemaname) || '.' || quote_ident(t.tablename), 'TRUNCATE') AS can_truncate
FROM pg_tables t
WHERE t.schemaname = 'public';
3. SSLモード
通信を暗号化するための設定です。セキュリティ要件に応じて証明書を適用する。