はじめに
RDS for Oracle の細かい部分がよくわかってなかったこともあり、英語のハンズオンをやってみました。基礎から応用編まで詳細な使い方が紹介されているので、興味がある方はやってみても良いと思います。
上記のハンズオンをやってみて、個人的に気になった部分を備忘録的に紹介します。
Creating an RDS Oracle Instance
RDS で Oracle Database を構成する章
Create Database
個人の学習目的で利用するため、Enterprise Edition の BYOL を選択
instanceの名前、管理者の名前、パスワードを指定
Instance class の選択
メモリが多いインスタンスが推奨されている
CPU やスレッドを調整する機能が備わっている。今回は無効で設定そする
Storage を指定可能
- gp3, gp2, io1, magnetic から指定可能
Multi-AZ は、作成時は無効化
適当にネットワークを指定
パスワード認証のみ。Kerberos 認証もできるらしい。
Initial database name を指定して、それ以外はデフォルト
Create database を押す
Creating になった
Client Connections
作成した DB Instance に接続する章
ハンズオンでは、Cloud9 から接続する方法になっているが、Cloud9 インスタンスではなく EC2 インスタンスでやってみる。
Amazon Linux 2 のインスタンスを作成
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
日本語を扱えるように 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 を押す
Read Replica 側でも、Multi-AZ の構成が出来そう
以下はデフォルト
DB instance identifier を指定
このまま Create
Replica が Creating になった
Replica 側の Endpoint も確認できる
mydatabase-replica.cwvq7vck29x3.ap-northeast-1.rds.amazonaws.com
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 を確認可能
Read Replica の Switch Over も可能
High Availability (Multi-AZ)
Modify を押す
Multi-AZ を有効化する
Continue
即変更
Modifying に変わる
Available になりました
Multi-AZ が有効になっている
Reboot するときに、Multi-AZ の対抗側にフェールオーバーする機能がある
Backup & Restore
- Point-In-Time-Restore 機能を使うことで、任意の時間のデータを使って、新しい DB Instance を復元することが可能。通常の自動バックアップでは、1日1回バックアップといった方法となる。Point-In-Time-Restore では、より細かい粒度でデータを復元が可能。通常は、最短で 5 分前のデータの復元が出来る。
- Snapshot のクロスリージョンバックアップ機能がある
Performance Monitoring
RDS for Oracle でも、Enterprise Manager の配下で管理が可能
Add option を押す
OEM_AGENT の選択肢があり、連携が可能
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 にアップロードした
RDS に IAM Role の付与
詳細画面を開く
IAM Role と、S3_INTEGRATION を選択して、Add role を押す
Option Group の変更
Add option
DB Instance に紐づける Option Group の変更
DB Instance の Modify から、Option Group を変更
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 の閲覧
ログの閲覧やダウンロードが可能
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 が選択可能となる
RDS IAM Role の設定
移行元 : テストデータの作成と 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 にアップロードされました
移行先 : 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
instance名の指定
DMS の Instance Type の選び方の Document がある。基本的にはパフォーマンステストの実施を事前にするのが良いと思う。
以下のパラメータを指定
- Instance Class の指定
- DMS の Engine Version の指定
- Multi-AZ の有無を指定
ストレージサイズの指定
ネットワーク系の指定
メンテナンス枠の指定をして、Create
Creating になりました
DMS : Endpoint の作成
移行元と移行先の 2 つの Endpoint を作成
移行元の Endpoint を指定
接続の Endpoint や、Username, Password 等を指定
接続テストのための機能がある。このまま Create Endpoint を押す
移行先の Endpoint を指定
- 21c の RDS Instance は、一覧に出てこないので、手動でエンドポイントを指定していく
手動で指定
Endpoint が 2 つ作成されました
DMS : DMS CDC Task
Create
Data Pump を使って初期データは移行済みなので、Replicate data changes only を選ぶ
SCN (System change number) を控えていたので、その時の番号を入力します。
このあたりはデフォルトのまま
このあたりもデフォルトのまま
DEMO Schema をレプリケーションの対象にします
Transformation Rule を指定
Create Task
Creating になりました
自動的に Starting に変わります
Status が、Replication ongoing となり、Progress が 100 % です
View Logs を押します
SCN が見えた
データ同期テスト
データ移行元で 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 で、実際に数値がカウントされていることがわかる
データ移行先で、レプリケーションされていることを確認
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 にデータを格納することもできる。
その他気が付いたこと
NLS_LANG
RDS for Oracle では、初期化パラメータで、NLS_LANGUAGE
等を変更することが出来ないので、接続クライアント側で NLS_LANG 環境変数を利用するのが一番シンプルな方法
参考 URL