AWS DMS Binary Readerを試してみる :下準備

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)

```sql
[opc@testdb0721 ~]$ sudo -i
[root@testdb0721 ~]# su - oracle
最終ログイン: 2020/07/21 (火) 12:37:14 UTC
[oracle@testdb0721 ~]$ sqlplus / as sysdba
```

```sql
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 データベースの使用](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.Oracle.html)

```sql
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;
```

```sql
GRANT SELECT on v_$transportable_platform TO dms_user;
GRANT EXECUTE on DBMS_FILE_GROUP TO dms_user;
```

上のマニュアルにはないが、下記の権限も必要っぽい。
[Oracle をソースエンドポイントとして使用する場合に、AWS DMS が必要とするアクセス許可について教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/dms-permissions-oracle-source/)

```sql
GRANT SELECT on SYS.DBA_REGISTRY to dms_user;
GRANT SELECT on SYS.OBJ$ to dms_user;
```

8/10:さらにいくつか追加

```sql
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;
```

テストデータ作成用

```sql
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> 
```

```sql
CREATE USER dms_asm_user IDENTIFIED BY dmsTESTasm0721;
GRANT SYSASM to dms_asm_user;
```

## DBの設定

DBレベルでのサプリメンタルロギングを有効化する。

```sql
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のインスタンスに入れてしまう。

```sh

# yum install postgresql
# psql -h <host名> -U <user名>
```

# 動作テスト

## ソーステーブル

Oracle DB

```sql
CREATE TABLE TEST1
(
    COL_A NUMBER(4) PRIMARY KEY
   ,COL_B DATE
);
insert into TEST1 values(0000,SYSDATE);
commit;
```

テーブルレベルのサプリメンタルロギングを有効化しておく。

```sql
alter table TEST1 add supplemental log data (PRIMARY KEY) columns;
```

```sql
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

とりあえず同名のスキーマを作成しておく。

```sql
CREATE SCHEMA DMS_USER;
postgres=> \dn
    スキーマ一覧
   名前   |  所有者  
----------+----------
 dms_user | postgres
 public   | postgres
(2 行)
```

## DMS

データベース移行タスクからタスク作成。
テーブルマッピングで対象のテーブルを追加する。

## 確認

```sql:Aurora
dms_test=> select * from "DMS_USER"."TEST1";
 COL_A |        COL_B        
-------+---------------------
     0 | 2020-07-21 15:26:15
(1 行)
```

```sql:oracle
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がうまく動かなかった

フルロードは完了するものの、ソースを更新しても反映されず。
とりあえずここまで。

## ログをみてみる

```text:CloudWatch
[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)
```