1
2

More than 1 year has passed since last update.

RDS for Oracle のハンズオン (Immersion Day) をやってみて気づきを整理してみた

Posted at

はじめに

RDS for Oracle の細かい部分がよくわかってなかったこともあり、英語のハンズオンをやってみました。基礎から応用編まで詳細な使い方が紹介されているので、興味がある方はやってみても良いと思います。

上記のハンズオンをやってみて、個人的に気になった部分を備忘録的に紹介します。

Creating an RDS Oracle Instance

RDS で Oracle Database を構成する章

 

Create Database

image-20230103142047952.png

 

個人の学習目的で利用するため、Enterprise Edition の BYOL を選択

image-20230103143047164.png

 

instanceの名前、管理者の名前、パスワードを指定

image-20230103143722678.png

 

Instance class の選択

image-20230103144115519.png

 

メモリが多いインスタンスが推奨されている

image-20230103143902237.png

 

CPU やスレッドを調整する機能が備わっている。今回は無効で設定そする

image-20230103144256173.png

 

Storage を指定可能

  • gp3, gp2, io1, magnetic から指定可能

image-20230103144541572.png

 

Multi-AZ は、作成時は無効化

image-20230103144647716.png

 

適当にネットワークを指定

image-20230103144854515.png

 

パスワード認証のみ。Kerberos 認証もできるらしい。

image-20230103144950216.png

 

Initial database name を指定して、それ以外はデフォルト

image-20230103145849155.png

 

Create database を押す

image-20230103145915728.png

 

Creating になった

image-20230103150109130.png

Client Connections

作成した DB Instance に接続する章

 

ハンズオンでは、Cloud9 から接続する方法になっているが、Cloud9 インスタンスではなく EC2 インスタンスでやってみる。

Amazon Linux 2 のインスタンスを作成

image-20230103152144137.png

 

SSH で接続して、Oracle Client とそれに付随する SQL*Plus をインストール

sudo su -

cd /etc/yum.repos.d
wget http://yum.oracle.com/public-yum-ol7.repo
wget http://yum.oracle.com/RPM-GPG-KEY-oracle-ol7
rpm --import RPM-GPG-KEY-oracle-ol7
yum install -y yum-utils
yum-config-manager --enable ol7_oracle_instantclient
yum install -y oracle-instantclient18.3-sqlplus

exit

echo "export ORACLE_HOME=/usr/lib/oracle/18.3/client64/" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib/" >> ~/.bashrc
echo "export PATH=$PATH:/usr/lib/oracle/18.3/client64/bin" >> ~/.bashrc
. ~/.bashrc

 

RDS for Oracle の Endpoint を確認します

mydatabase.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com

image-20230103153654158.png

 

日本語を扱えるように NLS 環境変数を指定

export NLS_LANG=Japanese_Japan.AL32UTF8

 

SQL * Plus で接続します

sqlplus oraadmin@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=mydatabase.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SID=ORCL)))

 

実行例 : パスワードを入力して接続

[ec2-user@ip-192-168-0-168 ~]$ sqlplus oraadmin@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=mydatabase.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SID=ORCL)))

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jan 3 06:39:56 2023
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Tue Jan 03 2023 06:39:45 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL>

Read Replicas (Oracle Data guard)

Oracle Database を選択して、Create replica を押す

image-20230103155220334.png

 

Read Replica 側でも、Multi-AZ の構成が出来そう

image-20230103155457003.png

 

以下はデフォルト

image-20230103155508191.png

 

DB instance identifier を指定

image-20230103155532541.png

 

このまま Create

image-20230103155613749.png

 

Replica が Creating になった

image-20230103155735091.png

 

Replica 側の Endpoint も確認できる

mydatabase-replica.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com

image-20230103161353594.png

Source 側

日本語を扱えるように NLS 環境変数を指定

export NLS_LANG=Japanese_Japan.AL32UTF8

 

SQL * Plus で接続します

sqlplus oraadmin@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=mydatabase.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SID=ORCL)))

 

OPEN_MODE が READ WRITE になっている

SQL> SELECT name, open_mode, database_role from v$database;

NAME      OPEN_MODE            DATABASE_ROLE
--------- -------------------- ----------------
ORCL      READ WRITE           PRIMARY

 

適当にテーブルを作成

CREATE TABLE emp 
(
  empno VARCHAR2(10) NOT NULL,
  empname VARCHAR2(50),
  gender_f NUMBER(1,0)
);

 

データを入れる

INSERT INTO emp VALUES (1, '鈴木', 1);
INSERT INTO emp VALUES (2, '佐藤', 2);
INSERT INTO emp VALUES (3, '田中', 2);
COMMIT;

 

確認

SQL> SELECT * FROM emp;

EMPNO      EMPNAME                                              GENDER_F
---------- -------------------------------------------------- ----------
1          鈴木                                                        1
2          佐藤                                                        2
3          田中                                                        2

Replica 側

SQL * Plus で接続します

sqlplus oraadmin@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=mydatabase-replica.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SID=ORCL)))

 

実行例

[ec2-user@ip-192-168-0-168 ~]$ sqlplus oraadmin@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=mydatabase-replica.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SID=ORCL)))

SQL*Plus: Release 18.0.0.0.0 - Production on 火 1月 3 07:14:25 2023
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

パスワードを入力してください:
最終正常ログイン時間: 火 1月  03 2023 07:07:44 +00:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
に接続されました。
SQL>

 

OPEN_MODE が、READ ONLY になっている。Read Replica 側なので、想定通り。

SQL> SELECT name, open_mode, database_role from v$database;

NAME      OPEN_MODE            DATABASE_ROLE
--------- -------------------- ----------------
ORCL      READ ONLY WITH APPLY PHYSICAL STANDBY

 

Source 側で格納したデータもちゃんと見える

SQL> SELECT * FROM emp;

EMPNO      EMPNAME                                              GENDER_F
---------- -------------------------------------------------- ----------
1          鈴木                                                        1
2          佐藤                                                        2
3          田中                                                        2

 

Read Replica 側での Insert は失敗する

SQL> INSERT INTO emp VALUES (4, '佐々木', 1);
INSERT INTO emp VALUES (4, '佐々木', 1)
            *
行1でエラーが発生しました。:
ORA-16000:
データベースまたはプラガブル・データベースは読取り専用アクセスでオープンされてい
ます

 

Replica Lag を確認可能

image-20230103162032220.png

  

Read Replica の Switch Over も可能

image-20230103162309876.png

High Availability (Multi-AZ)

Modify を押す

image-20230103163019954.png

  

Multi-AZ を有効化する

image-20230103163231341.png

 

Continue

image-20230103163244410.png

 

即変更

image-20230103163307563.png

 

Modifying に変わる

image-20230103163346039.png

 

Available になりました

image-20230103165552548.png

 

Multi-AZ が有効になっている

image-20230103165811324.png

 

Reboot するときに、Multi-AZ の対抗側にフェールオーバーする機能がある

image-20230103191244375.png

image-20230103191300668.png

Backup & Restore

  • Point-In-Time-Restore 機能を使うことで、任意の時間のデータを使って、新しい DB Instance を復元することが可能。通常の自動バックアップでは、1日1回バックアップといった方法となる。Point-In-Time-Restore では、より細かい粒度でデータを復元が可能。通常は、最短で 5 分前のデータの復元が出来る。
  • Snapshot のクロスリージョンバックアップ機能がある
    image-20230103192347650.png

Performance Monitoring

RDS for Oracle でも、Enterprise Manager の配下で管理が可能

image-20230103193001515.png

 

Add option を押す

image-20230103193146239.png

 

OEM_AGENT の選択肢があり、連携が可能

image-20230103193320816.png

Data Pump with S3 Integration

Data Pump などで取得したダンプファイルを RDS for Oracle に Import 可能

S3 bucket にダンプファイルのアップロード

ハンズオンで公開されているダンプファイルをダウンロード
https://solution-references-us-east-1.s3.amazonaws.com/rdspg/HR.dmp

 

S3 Bucket にアップロードした

image-20230103200427666.png

RDS に IAM Role の付与

詳細画面を開く

image-20230103200647971.png

 

IAM Role と、S3_INTEGRATION を選択して、Add role を押す

image-20230103203107100.png

Option Group の変更

image-20230103203203547.png

 

Add option

image-20230103203233218.png

DB Instance に紐づける Option Group の変更

DB Instance の Modify から、Option Group を変更

image-20230103203414533.png

RDS のインスタンスに、S3 上のダンプファイルをダウンロード

SQL * Plus で接続

[ec2-user@ip-192-168-0-168 ~]$ sqlplus oraadmin@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=mydatabase.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SID=ORCL)))

SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jan 3 11:38:55 2023
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Tue Jan 03 2023 07:07:44 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL>

 

MY_DUMP_DIR の作成

exec rdsadmin.rdsadmin_util.create_directory(p_directory_name => 'MY_DUMP_DIR');

 

確認

SQL> select * from table(rdsadmin.rds_file_util.listdir(p_directory => 'MY_DUMP_DIR'));

FILENAME
--------------------------------------------------------------------------------
TYPE         FILESIZE MTIME
---------- ---------- ---------
01/
directory        4096 03-NOV-22


SQL>

 

S3 にアップロードした Data Pump のダンプファイルを、RDS のインスタンスにdownloadする

select rdsadmin.rdsadmin_s3_tasks.download_from_s3(
	p_bucket_name=> 'rds-bucket-test01',
	p_directory_name => 'MY_DUMP_DIR')
as TASK_ID from dual; 

 

実行例

SQL> select rdsadmin.rdsadmin_s3_tasks.download_from_s3(
        p_bucket_nam  2  e=> 'rds-bucket-test01',
        p_directory_name => 'MY_DUMP_DIR')
as TASK_ID from dual;  3    4

TASK_ID
--------------------------------------------------------------------------------
1672746304588-643

 

Task の実行結果を確認

select text from table(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-1672746304588-643.log'));

 

実行例 : HP.dmp をダウンロードしたログが表示されている

SQL> select text from table(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-1672746304588-643.log'));

TEXT
--------------------------------------------------------------------------------
2023-01-03 11:45:04.679 UTC [INFO ] This task is about to list the Amazon S3 obj
ects for AWS Region ap-northeast-1, bucket name rds-bucket-test01, and prefix .

2023-01-03 11:45:04.742 UTC [INFO ] The task successfully listed the Amazon S3 o
bjects for AWS Region ap-northeast-1, bucket name rds-bucket-test01, and prefix
.

2023-01-03 11:45:04.757 UTC [INFO ] This task is about to download the Amazon S3
object or objects in /rdsdbdata/userdirs/01 from bucket name rds-bucket-test01
and key HR.dmp.


TEXT
--------------------------------------------------------------------------------
2023-01-03 11:45:04.922 UTC [INFO ] The task successfully downloaded the Amazon
S3 object or objects from bucket name rds-bucket-test01 with key HR.dmp to the l
ocation /rdsdbdata/userdirs/01.

2023-01-03 11:45:04.923 UTC [INFO ] The task finished successfully.

 

ファイル一覧を見ると、正常に HR.dmp がダウンロードされている

SQL> select * from table(rdsadmin.rds_file_util.listdir(p_directory=>'MY_DUMP_DIR'));

FILENAME
--------------------------------------------------------------------------------
TYPE         FILESIZE MTIME
---------- ---------- ---------
01/
directory        4096 03-JAN-23

HR.dmp
file           720896 03-JAN-23

ダンプファイルを Import

User アカウントを作成

create user hr identified by hr;
grant create session, resource to hr;
alter user hr quota 100M on users;

 

以下コマンドを実行

DECLARE 
      hdnl NUMBER; 
      BEGIN 
      hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null); 
      DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'HR.dmp', directory => 'MY_DUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); 
      DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'HR_imp.log', directory => 'MY_DUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); 
      DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''HR'')'); DBMS_DATAPUMP.START_JOB(hdnl); END;
      / 

 

実行例

PL/SQL procedure successfully completed.

 

正常に Import が終了

SQL> select table_name from dba_tables where owner = 'HR';

TABLE_NAME
--------------------------------------------------------------------------------
COUNTRIES
REGIONS
LOCATIONS
JOB_HISTORY
DEPARTMENTS
JOBS
EMPLOYEES

7 rows selected.

 

Import したテーブルの中身を確認

SQL> select first_name, last_name, job_id, salary from hr.employees where rownum <10;

FIRST_NAME           LAST_NAME                 JOB_ID         SALARY
-------------------- ------------------------- ---------- ----------
Donald               OConnell                  SH_CLERK         2600
Douglas              Grant                     SH_CLERK         2600
Jennifer             Whalen                    AD_ASST          4400
Michael              Hartstein                 MK_MAN          13000
Pat                  Fay                       MK_REP           6000
Susan                Mavris                    HR_REP           6500
Hermann              Baer                      PR_REP          10000
Shelley              Higgins                   AC_MGR          12008
William              Gietz                     AC_ACCOUNT       8300

9 rows selected.

DBS タスク

Log の閲覧

image-20230103205409973.png

ログの閲覧やダウンロードが可能

image-20230103205430534.png

RMAN を使ったバックアップ

RDS に備わっているバックアップ機能に加えて、RMAN を使ったバックアップも可能。

Migrate Oracle to Amazon RDS

オンプレミスの Oracle Database から、Data Pump と DMS (Database Migration Services) を使って、ダウンタイムの最小限にする移行方法が紹介されている。

  • データ移行元 : RDS for Oracle の 19c
  • データ移行先 : RDS for Oracle の 21c

移行先 : RDS インスタンスの作成

RDS for Oracle を適当に作成。Multitenant Architecture を有効にすると、21c が選択可能となる

image-20230104151841259.png

 

RDS IAM Role の設定

image-20230104155527688.png

移行元 : テストデータの作成と Archivelog の保持期間を設定

テストデータの作成

create user  demo identified by Welcome123;
grant dba to demo;

create table demo.event_history(
event_id number generated always as identity(start with 1 increment by 1),
event_name varchar2(10),
event_date date not null);

alter table demo.event_history add ( constraint eventid_pk primary key (event_id));

insert into demo.event_history (event_name,event_date) select dbms_random.string('x',10), to_date(trunc(dbms_random.value(to_char(DATE '2020-01-01','J'), to_char(DATE '2021-01-01','J'))),'J')
event_date from dual connect by level <=50;
commit;

alter table demo.event_history modify( event_id drop identity);
select * from demo.event_history;

 

データの確認結果

SQL> select * from demo.event_history;

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
         1 9QSHO2K9J0 08-MAR-20
         2 FL5B0R1LP9 11-OCT-20
         3 W67AJ8L1XH 18-DEC-20
         4 FQEOKRMM8U 16-SEP-20
         5 0FFMQXFV6N 24-MAR-20
         6 G1BQA3IRIG 02-DEC-20
         7 T9Q3NE9GF9 17-MAR-20
         8 CTX8Z3RO6Y 31-DEC-20
         9 RGOS3J435O 23-DEC-20
        10 QJ31ZDV4EZ 14-JAN-20
        11 E9AU2SOQI7 22-MAY-20

 

アーカイブログの保持期間が 0 になっている

SQL> set serveroutput on
SQL> EXEC rdsadmin.rdsadmin_util.show_configuration;
NAME:archivelog retention hours
VALUE:0
DESCRIPTION:ArchiveLog expiration specifies the duration in hours before
archive/redo log files are automatically deleted.

PL/SQL procedure successfully completed.

 

24 時間の指定と supplemental logging の有効化

exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours', 24);
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','PRIMARY KEY');

 

24 時間の指定

SQL> EXEC rdsadmin.rdsadmin_util.show_configuration;
NAME:archivelog retention hours
VALUE:24
DESCRIPTION:ArchiveLog expiration specifies the duration in hours before
archive/redo log files are automatically deleted.

 

移行元データベースの SCN (system change number) を表示する。システム内部で利用されるタイムスタンプ的な数字となっており、DMS でレプリケーションする際に利用される。

SQL>
select current_scn from v$database;SQL>

CURRENT_SCN
-----------
     601167

移行元 : Data Pump を使って、S3 にダンプファイルを出力

Data Pump を使って、ローカルにダンプファイルを吐き出す。demo スキーマを Data Pump の対象にしている (はず)

set scan off
set serveroutput on
set escape off
whenever sqlerror exit 
DECLARE
    h1 number;
    s varchar2(1000):=NULL;
    errorvarchar varchar2(100):= 'ERROR';
    tryGetStatus number := 0;
    success_with_info EXCEPTION;
    PRAGMA EXCEPTION_INIT(success_with_info, -31627);
    flashbackscn number;
begin
    select current_scn into flashbackscn from v$database;
    h1 := dbms_datapump.open (operation => 'EXPORT', job_mode => 'SCHEMA', job_name => 'EXP_DEMO', version => 'COMPATIBLE'); 
    tryGetStatus := 1;
    dbms_datapump.set_parameter(handle => h1, name => 'COMPRESSION', value => 'ALL'); 
    dbms_datapump.set_parallel(handle => h1, degree => 2); 
    dbms_datapump.add_file(handle => h1, filename => 'EXPDAT-'||to_char(sysdate,'hh24_mi_ss')||'.LOG', directory => 'DATA_PUMP_DIR', filetype => 3); 
    dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 1); 
    dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''DEMO'')'); 
    dbms_datapump.add_file(handle => h1, filename => 'EXPDAT%U-'||to_char(sysdate,'hh24_mi_ss')||'.DMP', directory => 'DATA_PUMP_DIR', filesize => '500M',  filetype => 1); 
    dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1); 
    dbms_datapump.set_parameter(handle => h1, name => 'FLASHBACK_SCN', value => flashbackscn);
    dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC'); 
    dbms_datapump.set_parameter(handle => h1, name => 'ESTIMATE', value => 'BLOCKS'); 
    dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0); 
    dbms_datapump.detach(handle => h1); 
    errorvarchar := 'NO_ERROR'; 
EXCEPTION
    WHEN OTHERS THEN
    BEGIN 
        IF ((errorvarchar = 'ERROR')AND(tryGetStatus=1)) THEN 
            DBMS_DATAPUMP.DETACH(h1);
        END IF;
    EXCEPTION 
    WHEN OTHERS THEN 
        NULL;
    END;
    RAISE;
END;
/

 

Dump ファイルが DB Instance 内に出力されている

SQL> select * from table(rdsadmin.rds_file_util.listdir(p_directory=>'DATA_PUMP_DIR'));

FILENAME
--------------------------------------------------------------------------------
TYPE         FILESIZE MTIME
---------- ---------- ---------
datapump/
directory        4096 04-JAN-23

EXPDAT-07_25_57.LOG
file             1233 04-JAN-23

EXPDAT02-07_25_57.DMP
file            77824 04-JAN-23


FILENAME
--------------------------------------------------------------------------------
TYPE         FILESIZE MTIME
---------- ---------- ---------
EXPDAT01-07_25_57.DMP
file            24576 04-JAN-23


 

S3 に Dump ファイルをアップロードします

select rdsadmin.rdsadmin_s3_tasks.upload_to_s3(p_bucket_name=>'rds-bucket-test01', p_directory_name=>'DATA_PUMP_DIR') as TASK_ID from dual;

 

実行例 : TASK_ID が返ってきます

SQL> select rdsadmin.rdsadmin_s3_tasks.upload_to_s3(p_bucket_name=>'rds-bucket-test01', p_directory_name=>'DATA_PUMP_DIR') as TASK_ID from dual;

TASK_ID
--------------------------------------------------------------------------------
1672817389382-646

 

Bucket にアップロードされました

image-20230104163046953.png

移行先 : S3 からダンプファイルをローカルにdownload

移行先のインスタンスに接続します

sqlplus oraadmin@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle-target-21c.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SID=ORCL)))

 

移行先の DB Instance に、S3 からダンプファイルをダウンロードします

select rdsadmin.rdsadmin_s3_tasks.download_from_s3(p_bucket_name=> 'rds-bucket-test01', p_directory_name => 'DATA_PUMP_DIR') as TASK_ID from dual; 

 

TASK_ID が返ってきます

SQL> select rdsadmin.rdsadmin_s3_tasks.download_from_s3(p_bucket_name=> 'rds-bucket-test01', p_directory_name => 'DATA_PUMP_DIR') as TASK_ID from dual;

TASK_ID
--------------------------------------------------------------------------------
1672817790036-29

 

S3 からダウンロードするタスクのログを表示

select text from table(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-1672817790036-29.log'));

 

実行例 : 末尾の方に successfully と表示されている

SQL> select text from table(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-1672817790036-29.log'));

TEXT
--------------------------------------------------------------------------------
2023-01-04 07:36:30.330 UTC [INFO ] This task is about to list the Amazon S3 obj
ects for AWS Region ap-northeast-1, bucket name rds-bucket-test01, and prefix .

2023-01-04 07:36:30.399 UTC [INFO ] The task successfully listed the Amazon S3 o
bjects for AWS Region ap-northeast-1, bucket name rds-bucket-test01, and prefix
.

2023-01-04 07:36:30.416 UTC [INFO ] This task is about to download the Amazon S3
 object or objects in /rdsdbdata/datapump/F16B3D273B93159FE0530100007FEA4F from
bucket name rds-bucket-test01 and key EXPDAT-07_25_57.LOG.


TEXT
--------------------------------------------------------------------------------
2023-01-04 07:36:30.533 UTC [INFO ] The task successfully downloaded the Amazon
S3 object or objects from bucket name rds-bucket-test01 with key EXPDAT-07_25_57
.LOG to the location /rdsdbdata/datapump/F16B3D273B93159FE0530100007FEA4F.

2023-01-04 07:36:30.533 UTC [INFO ] This task is about to download the Amazon S3
 object or objects in /rdsdbdata/datapump/F16B3D273B93159FE0530100007FEA4F from
bucket name rds-bucket-test01 and key EXPDAT01-07_25_57.DMP.

2023-01-04 07:36:30.646 UTC [INFO ] The task successfully downloaded the Amazon
S3 object or objects from bucket name rds-bucket-test01 with key EXPDAT01-07_25_
57.DMP to the location /rdsdbdata/datapump/F16B3D273B93159FE0530100007FEA4F.

TEXT
--------------------------------------------------------------------------------

2023-01-04 07:36:30.646 UTC [INFO ] This task is about to download the Amazon S3
 object or objects in /rdsdbdata/datapump/F16B3D273B93159FE0530100007FEA4F from
bucket name rds-bucket-test01 and key EXPDAT02-07_25_57.DMP.

2023-01-04 07:36:30.759 UTC [INFO ] The task successfully downloaded the Amazon
S3 object or objects from bucket name rds-bucket-test01 with key EXPDAT02-07_25_
57.DMP to the location /rdsdbdata/datapump/F16B3D273B93159FE0530100007FEA4F.

2023-01-04 07:36:30.760 UTC [INFO ] The task finished successfully.

9 rows selected.

 

実際にdownloadされていることがわかります

SQL> select * from table(rdsadmin.rds_file_util.listdir(p_directory=>'DATA_PUMP_DIR'));

FILENAME
--------------------------------------------------------------------------------
TYPE         FILESIZE MTIME
---------- ---------- ---------
F16B3D273B93159FE0530100007FEA4F/
directory        4096 04-JAN-23

EXPDAT02-07_25_57.DMP
file            77824 04-JAN-23

EXPDAT-07_25_57.LOG
file             1233 04-JAN-23


FILENAME
--------------------------------------------------------------------------------
TYPE         FILESIZE MTIME
---------- ---------- ---------
EXPDAT01-07_25_57.DMP
file            24576 04-JAN-23


移行先 : ダンプファイルを import

ファイル名を書き換えて実行

create user demo identified by Welcome123;
grant dba to demo;
set scan off
set serveroutput on
set escape off
whenever sqlerror exit
DECLARE
    h1 number;
    s varchar2(1000):=NULL;
    errorvarchar varchar2(100):= 'ERROR';
    tryGetStatus number := 0;
    success_with_info EXCEPTION;
    PRAGMA EXCEPTION_INIT(success_with_info, -31627);
begin
    h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'SCHEMA', job_name => 'IMP_DEMO', version => 'COMPATIBLE');
    tryGetStatus := 1;
    dbms_datapump.set_parallel(handle => h1, degree => 2);
    dbms_datapump.add_file(handle => h1, filename => 'IMPDAT-'||to_char(sysdate,'hh24_mi_ss')||'.LOG', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file );
    dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''DEMO'')');
    dbms_datapump.add_file(handle => h1, filename => 'EXPDAT01-07_25_57.DMP', directory => 'DATA_PUMP_DIR',filetype => dbms_datapump.ku$_file_type_dump_file);
    dbms_datapump.add_file(handle => h1, filename => 'EXPDAT02-07_25_57.DMP', directory => 'DATA_PUMP_DIR',filetype => dbms_datapump.ku$_file_type_dump_file);
    DBMS_DATAPUMP.START_JOB(h1);
    errorvarchar := 'NO_ERROR';
EXCEPTION
    WHEN OTHERS THEN
    BEGIN
        IF ((errorvarchar = 'ERROR')AND(tryGetStatus=1)) THEN
            DBMS_DATAPUMP.DETACH(h1);
        END IF;
    EXCEPTION
    WHEN OTHERS THEN
        NULL;
    END;
    RAISE;
END;
/

 

demo スキーマで、データが復元されました

select * from demo.event_history;

 

実行例

SQL> select * from demo.event_history;

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
         1 9QSHO2K9J0 08-MAR-20
         2 FL5B0R1LP9 11-OCT-20
         3 W67AJ8L1XH 18-DEC-20
         4 FQEOKRMM8U 16-SEP-20
         5 0FFMQXFV6N 24-MAR-20
         6 G1BQA3IRIG 02-DEC-20
         7 T9Q3NE9GF9 17-MAR-20
         8 CTX8Z3RO6Y 31-DEC-20
         9 RGOS3J435O 23-DEC-20
        10 QJ31ZDV4EZ 14-JAN-20
        11 E9AU2SOQI7 22-MAY-20

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
        12 H1TNSHF4E0 29-SEP-20
        13 FUXLU86O7D 03-APR-20
        14 1BQLRAMBJ5 11-JAN-20
        15 K6VJFIA55E 17-NOV-20
        16 CU528HV3R9 12-SEP-20
        17 8NLXFTZAFK 07-DEC-20
        18 ADD34EB32P 12-FEB-20
        19 7EY2NDEK9D 03-SEP-20
        20 54ACFSPQ2P 01-APR-20
        21 PYAHJKYTVG 02-FEB-20
        22 6P8BTD8O3P 21-JAN-20

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
        23 KPSWU4ESCF 30-JAN-20
        24 HVINM691CK 24-MAY-20
        25 DF3QOGTF4A 16-DEC-20
        26 IU4LYDA8YY 15-DEC-20
        27 PDVI2FK8I3 29-JUN-20
        28 OFHCOJJ3AY 07-DEC-20
        29 MGG1XF8ZA9 09-OCT-20
        30 8X659PBJMY 22-MAY-20
        31 Z7T4HGL6VK 27-MAY-20
        32 5FSXAFVI9C 07-JUN-20
        33 VLQ20352OY 20-FEB-20

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
        34 FLXIIM4KPF 10-MAR-20
        35 1VHL48LW2U 23-DEC-20
        36 P9T8MI940Z 28-DEC-20
        37 3XBJFZKXGE 20-APR-20
        38 C6UAMZ7WNO 29-MAY-20
        39 9TK1SQ5KOI 12-FEB-20
        40 DEWLP62AC7 27-FEB-20
        41 KKF7UFXSF8 24-OCT-20
        42 NY4AKJ9GKR 16-SEP-20
        43 9RKGO9K3T8 21-DEC-20
        44 O1EGQJKSI5 28-JAN-20

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
        45 HPG5YMN12G 04-DEC-20
        46 414HFIR1EX 08-NOV-20
        47 2EVU4CRLN8 28-MAY-20
        48 QWJ3CBNJQD 31-DEC-20
        49 TJTYHLZQC7 25-JUN-20
        50 CJLHQ8AAH6 30-OCT-20

50 rows selected.

DMS : インスタンスの作成

Create replication instance

image-20230104184354637.png

 

instance名の指定

image-20230104184530270.png

 

DMS の Instance Type の選び方の Document がある。基本的にはパフォーマンステストの実施を事前にするのが良いと思う。

 

以下のパラメータを指定

  • Instance Class の指定
  • DMS の Engine Version の指定
  • Multi-AZ の有無を指定

image-20230104185220365.png

 

ストレージサイズの指定

image-20230104185322154.png

 

ネットワーク系の指定

image-20230104185431988.png

 

メンテナンス枠の指定をして、Create

image-20230104185456978.png

 

Creating になりました

image-20230104185546742.png

DMS : Endpoint の作成

移行元と移行先の 2 つの Endpoint を作成

image-20230104191458293.png

 

移行元の Endpoint を指定

image-20230104191737815.png

 

接続の Endpoint や、Username, Password 等を指定

image-20230104191821614.png

 

接続テストのための機能がある。このまま Create Endpoint を押す

image-20230104191922453.png

 

移行先の Endpoint を指定

  • 21c の RDS Instance は、一覧に出てこないので、手動でエンドポイントを指定していく

image-20230104192117564.png

 

手動で指定

image-20230104192213361.png

 

Endpoint が 2 つ作成されました

image-20230104192335253.png

DMS : DMS CDC Task

Create

image-20230104192416336.png

 

Data Pump を使って初期データは移行済みなので、Replicate data changes only を選ぶ

image-20230104192533581.png

 

SCN (System change number) を控えていたので、その時の番号を入力します。

image-20230104193020444.png

 

このあたりはデフォルトのまま

image-20230104193109252.png

 

このあたりもデフォルトのまま

image-20230104193213088.png

 

DEMO Schema をレプリケーションの対象にします

image-20230104193314467.png

 

Transformation Rule を指定

image-20230104193425958.png

 

Create Task

image-20230104193447762.png

 

Creating になりました

image-20230104193512660.png

 

自動的に Starting に変わります

image-20230104193639197.png

 

Status が、Replication ongoing となり、Progress が 100 % です

image-20230104193830817.png

 

View Logs を押します

image-20230104194003522.png

 

SCN が見えた

image-20230104194055053.png

データ同期テスト

データ移行元で Insert を行う

insert into demo.event_history(event_id,event_name,event_date) values(51,'demoevent1','04-SEP-21');
insert into demo.event_history(event_id,event_name,event_date) values(52,'demoevent2','03-SEP-21');
commit;

 

データの確認

select * from demo.event_history;

 

Insert がされている

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
        45 HPG5YMN12G 04-DEC-20
        46 414HFIR1EX 08-NOV-20
        47 2EVU4CRLN8 28-MAY-20
        48 QWJ3CBNJQD 31-DEC-20
        49 TJTYHLZQC7 25-JUN-20
        50 CJLHQ8AAH6 30-OCT-20
        51 demoevent1 04-SEP-21
        52 demoevent2 03-SEP-21

52 rows selected.

 

DMS の Database Migration Task で、実際に数値がカウントされていることがわかる

image-20230104194354034.png

 

データ移行先で、レプリケーションされていることを確認

select * from demo.event_history;

 

Insert したデータが同期されている

  EVENT_ID EVENT_NAME EVENT_DAT
---------- ---------- ---------
        45 HPG5YMN12G 04-DEC-20
        46 414HFIR1EX 08-NOV-20
        47 2EVU4CRLN8 28-MAY-20
        48 QWJ3CBNJQD 31-DEC-20
        49 TJTYHLZQC7 25-JUN-20
        50 CJLHQ8AAH6 30-OCT-20
        51 demoevent1 04-SEP-21
        52 demoevent2 03-SEP-21

52 rows selected.

Database Activity Streams

Database Activity Streams の機能を有効にすると、ほぼリアルタイムにアクティビティを Kinesis Data Streams に流すことができる。このデータは、監査ログとして利用ができる。例えば、SELECT や INSERT といったコマンド履歴をリアルタイムに取得が可能。

Kinesis Data Streams から Lambda を起動して、例えば OpenSearch Service にデータを格納することもできる。

image-20230104195639928.png

image-20230104195655603.png

その他気が付いたこと

NLS_LANG

RDS for Oracle では、初期化パラメータで、NLS_LANGUAGE 等を変更することが出来ないので、接続クライアント側で NLS_LANG 環境変数を利用するのが一番シンプルな方法

参考 URL

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2