ASM + Binary Readerが試したかった
Source DBの準備
OCIのDBCSでサクッと行きたかった。
DBの作成
「DBシステムの作成」から、
- シェイプ・タイプの選択: 仮想マシン
- シェイプの選択: VM.Standard2.1
- 合計ノード数:1
- Oracle Databaseソフトウェア・エディション: Enterprise Edition
- ストレージ管理ソフトウェアの選択: Oracle Grid Infrastructure
- 使用可能なストレージ(GB):256GB
- SSHキー:適当に追加
- データベースのバージョン:11.2
CPUを絞ったせいか、あまりサクッとは行かなかった。後続のインスタンス作成を進めたほうが良い。
起動済:
2020年7月21日(火) 11:12:03 UTC
終了済:
2020年7月21日(火) 12:02:43 UTC
DMS用ユーザ作成(DB)
[opc@testdb0721 ~]$ sudo -i
[root@testdb0721 ~]# su - oracle
最終ログイン: 2020/07/21 (火) 12:37:14 UTC
[oracle@testdb0721 ~]$ sqlplus / as sysdba
SQL> CREATE USER dms_user IDENTIFIED BY dmsTESTuser0721
DEFAULT TABLESPACE USERS;
User created.
SQL> ALTER USER dms_user ACCOUNT UNLOCK;
User altered.
SQL>
権限付与
AWS DMS のソースとしての Oracle データベースの使用
GRANT CONNECT TO dms_user;
GRANT SELECT ANY TRANSACTION TO dms_user;
GRANT SELECT on V_$ARCHIVED_LOG TO dms_user;
GRANT SELECT on V_$LOG TO dms_user;
GRANT SELECT on V_$LOGFILE TO dms_user;
GRANT SELECT on V_$DATABASE TO dms_user;
GRANT SELECT on V_$THREAD TO dms_user;
GRANT SELECT on V_$PARAMETER TO dms_user;
GRANT SELECT on V_$NLS_PARAMETERS TO dms_user;
GRANT SELECT on V_$TIMEZONE_NAMES TO dms_user;
GRANT SELECT on V_$TRANSACTION TO dms_user;
GRANT SELECT on ALL_INDEXES TO dms_user;
GRANT SELECT on ALL_OBJECTS TO dms_user;
GRANT SELECT on v_$transportable_platform TO dms_user;
GRANT EXECUTE on DBMS_FILE_GROUP TO dms_user;
上のマニュアルにはないが、下記の権限も必要っぽい。
Oracle をソースエンドポイントとして使用する場合に、AWS DMS が必要とするアクセス許可について教えてください。
GRANT SELECT on SYS.DBA_REGISTRY to dms_user;
GRANT SELECT on SYS.OBJ$ to dms_user;
8/10:さらにいくつか追加
GRANT SELECT on ALL_TABLES to dms_user;
GRANT SELECT on ALL_USERS to dms_user;
GRANT SELECT on ALL_CATALOG to dms_user;
GRANT SELECT on ALL_CONSTRAINTS to dms_user;
GRANT SELECT on ALL_CONS_COLUMNS to dms_user;
GRANT SELECT on ALL_TAB_COLS to dms_user;
GRANT SELECT on ALL_IND_COLUMNS to dms_user;
GRANT SELECT on ALL_LOG_GROUPS to dms_user;
GRANT SELECT on DBA_TABLESPACES to dms_user;
GRANT SELECT on ALL_TAB_PARTITIONS to dms_user;
GRANT SELECT on ALL_ENCRYPTED_COLUMNS to dms_user;
GRANT SELECT on ALL_VIEWS to dms_user;
GRANT CREATE ANY DIRECTORY to dms_user;
テストデータ作成用
GRANT CREATE TABLE TO dms_user;
GRANT UNLIMITED TABLESPACE TO dms_user;
ASMユーザの作成
rootに戻ってgridからASMインスタンスにログイン。(DBCSのGIは19cみたい)
[root@testdb0721 ~]# su - grid
最終ログイン: 2020/07/21 (火) 13:14:18 UTC
[grid@testdb0721 ~]$ sqlplus / as sysasm
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 21 13:19:56 2020
Version 19.7.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
SQL>
CREATE USER dms_asm_user IDENTIFIED BY dmsTESTasm0721;
GRANT SYSASM to dms_asm_user;
DBの設定
DBレベルでのサプリメンタルロギングを有効化する。
SELECT supplemental_log_data_min FROM v$database;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SELECT supplemental_log_data_min FROM v$database;
DMSの準備
レプリケーションインスタンス
DBCSのインスタンス作成と並行して、
- インスタンスクラス: dms.t2.micro
- エンジンバージョン: 3.3.3
- パブリックアクセス可能にチェック
- 今回はインターネット越しにやるので。
Target DBの準備
Aurora
DBCSのデプロイを待つ間に進めます。
RDSから、
-
標準作成
-
エンジンのオプション: Amazon Aurora
-
エディション: PostgreSQL との互換性を持つ Amazon Aurora
-
バージョン: Compatible with PostgreSQL 11.6
-
テンプレート: 開発/テスト
-
DB インスタンスクラス: バースト可能クラス (t クラスを含む) > db.t3.medium
-
マルチ AZ 配置: Aurora レプリカを作成しない
-
パブリックアクセス可能:あり
-
追加設定 > 最初のデータベース名: DB名を入れておく
-
セキュリティグループは待ち受けポートへのアクセス許可がついたものをつけておく。
DMSの設定
Target エンドポイント
エンドポイントの作成から、ターゲットエンドポイントを選び、
「RDS DBインスタンスの選択」を選ぶと適宜補完してくれる。
- パスワードとDB名だけ入れる
- 接続テストで問題なければok
Source エンドポイント
- ソースエンジン: oracle
- サーバー名: IPアドレス
- ポート: 設定したポート(デフォルト1521)
追加の接続パラメータ
useLogMinerReader=N;useBfile=Y;asm_user=dms_asm_user;asm_server=RAC_server_ip_address:port_number/+ASM;
入れずに接続テストをすると、LogMiner用の権限も必要になる。
Aurora(postgreSQL)のクライアント
DBCSのインスタンスに入れてしまう。
# yum install postgresql
# psql -h <host名> -U <user名>
動作テスト
ソーステーブル
Oracle DB
CREATE TABLE TEST1
(
COL_A NUMBER(4) PRIMARY KEY
,COL_B DATE
);
insert into TEST1 values(0000,SYSDATE);
commit;
テーブルレベルのサプリメンタルロギングを有効化しておく。
alter table TEST1 add supplemental log data (PRIMARY KEY) columns;
SQL> select COL_A, to_char(COL_B,'YYYY/MM/DD hh24:Mi:ss') from TEST1;
COL_A TO_CHAR(COL_B,'YYYY
---------- -------------------
0 2020/07/21 15:26:15
ターゲットDB
とりあえず同名のスキーマを作成しておく。
CREATE SCHEMA DMS_USER;
postgres=> \dn
スキーマ一覧
名前 | 所有者
----------+----------
dms_user | postgres
public | postgres
(2 行)
DMS
データベース移行タスクからタスク作成。
テーブルマッピングで対象のテーブルを追加する。
確認
dms_test=> select * from "DMS_USER"."TEST1";
COL_A | COL_B
-------+---------------------
0 | 2020-07-21 15:26:15
(1 行)
insert into TEST1 values((select max(COL_A) + 1 from TEST1),SYSDATE);
commit;
select * from TEST1 where COL_A = (select max(COL_A) from TEST1);
CDCがうまく動かなかった
フルロードは完了するものの、ソースを更新しても反映されず。
とりあえずここまで。
ログをみてみる
[SOURCE_CAPTURE ]E: ORA-01031: insufficient privileges [1022317] (oracle_endpoint_utils.c:3169)
[SOURCE_CAPTURE ]E: ORA-06550: line 1, column 7: PL/SQL: Statement ignored [1022307] (oracle_endpoint_utils.c:3169)