ニュース&ブログ
RDSへのデータ移行方法三選!(②Oracle SQL*Loaderを 使用したデータ移行)
投稿日:2021/8/5
「Oracle+AWS」の環境にてデータ移行の検証を行っていきたいと思います。 前回はOracleのオリジナルexport/importを使用して、オンプレミスの環境からAWSのRDS(Oracle)へのデータ移行を検証しました。今回はOracle SQL*Loaderを使用して、ローカル環境のCSVデータをAWSのRDS(Oracle)へデータロードする簡単な方法を記載します。
まず、Oracleの標準機能として用意されているSQL*Loaderを知らない方の為に、簡単に紹介していきます。
SQL*Loaderとは
SQL*Loaderは、CSVファイルやテキストなどの外部ファイルデータを、Oracleデータベースの表にロード(取り込む)する機能です。Oracle Client がインストールされたクライアント環境からもSQL*Loaderを使用してデータをOracleデータベースにロードすることができます。同一のテーブルに大量のデータをinsertする時などに使用することができます。 SQL*Loaderの事例についてはOracleが提供しているマニュアルを参照して下さい。
URL:http://docs.oracle.com/cd/E16338_01/server.112/b56303/ldr_concepts.htm#i1006494
検証で使用する環境と実施する内容
検証で使用する環境を紹介します。RDSが構築済みの環境で検証を行います。 AWS上にRDS(Oracle 11gR2)を一つ作成し、私の端末に入っているOracle Client 11gR2からSQL*Loaderを使用して、スキーマ自身がCSVデータをスキーマ自身の表にロードを行います。
図1:検証環境の構成説明
・手順
① 私の端末にてCSVデータと制御ファイルを作成します。
② 私の端末からネットワーク経由でRDSに向けてSQL*Loaderにてデータのロードを行います。
以上です。以下にコマンドを含めた詳細なものを載せていきます。
<<私の端末>>
まず、データロードを行う準備としてCSVデータファイルと制御ファイル(CSVファイル名やロードするデータ型を指定するファイル)を作成します。
■データロードを行う準備(クライアント側)
(1)CSVファイルと制御ファイルを格納するフォルダを作成 今回はc:\app\administrator 配下にtestフォルダを作成します。(2)CSVファイルを作成 今回は例として以下のCSVファイルを作成します。 ファイル名:data.csv
図2:CSVファイルを作成 ※8レコード目は値が大きすぎるため、ロード時にエラーとなることを検証します。
(3)制御ファイルを作成 今回は例として以下の制御ファイルを作成します。 ファイル名:data.ctl
図3:data.ctlファイルの中身

(4)CSVファイルと制御ファイルをtestフォルダに格納 c:\app\administrator\testフォルダ配下に’data.csv’と’data.ctl’を
格納します。
■データロードを行う準備(RDS(Oracle)側)
今回は検証用に表領域・スキーマ・テーブルを作成します。
(1)Oracle Client からRDS(Oracle)にログイン
sqlplus awsuser/<パスワード>@<エンドポイント名>:1521/ORCL
図4:RDS(Oracle)にログイン
(2)表領域 USERS1を作成
CREATE TABLESPACE “USERS1” DATAFILE AUTOEXTEND ON MAXSIZE 200M;
図5:表領域USERS1作成
表領域作成確認
select tablespace_name,file_name,bytes/1024/1024 MB,AUTOEXTENSIBLE from dba_data_files order by 1;
図6:表領域USERS1作成確認
(3)スキーマUSER1を作成 USER1のデフォルト表領域をUSERS1に指定し、表領域の使用制限を無制限にします。
CREATE USER USER1 IDENTIFIED BY test123 DEFAULT TABLESPACE USERS1 QUOTA UNLIMITED ON USERS1 TEMPORARY TABLESPACE TEMP;
図7:スキーマUSER1作成
スキーマUSER1作成確認
デフォルト表領域がUSERS1に指定され、ACCOUNT_STATUSがOPENであることを確認します。
col profile for a10
col username for a24
set pages 1000
set line 150
col account_status for a20
col DEFAULT_TABLESPACE for a20
select username,account_status,default_tablespace,profile from dba_users where username = ‘USER1’;
図8:スキーマUSER1作成確認
(4)スキーマUSER1に権限付与
grant create session, create table to USER1;
col GRANTEE for a30
col PRIVILEGE for a25
select * from DBA_SYS_PRIVS where GRANTEE = ‘USER1’ order by 1;
図9:スキーマUSER1権限付与・確認
(5)Oracle Client からRDS(Oracle)にログイン(USER1)
AWSUSERはexitします。USER1でログインします。
sqlplus USER1/<パスワード>@<エンドポイント名>:1521/ORCL
図10:RDS(Oracle)にログイン(USER1)
(6)テーブルEMP_MASTER_TBLを作成 USER1のテーブル(EMP_MASTER_TBL)を作成します。
create table USER1.EMP_MASTER_TBL(
EMP_ID char(5) not null,
NAME varchar2(20) not null,
ENTRY_DATE date,
RESIGN_DATE date,
DEPT varchar2(20) not null,
POSITION varchar2(20) not null
tablespace USERS1;
図11:表の作成(USER1)
USER1のテーブル(EMP_MASTER_TBL)確認
col owner for a15
col table_name for a30
select owner,table_name from all_tables where owner = ‘USER1’;
図12:表の確認(USER1)
USER1のテーブル(EMP_MASTER_TBL)確認(続き)
desc USER1.EMP_MASTER_TBL;
select count(*) from USER1.EMP_MASTER_TBL;
図13:表の確認(USER1)
SQL*Loaderの実行
(1)SQL*Loaderの実行 以下のディレクトリに移動します。
cd C:\app\administrator\test
以下のコマンドを実行しSQL*Loaderを実行します。
<パスワード>@<エンドポイント名>:1521/ORCL CONTROL=”data.ctl” LOG=”data.log”
図14:SQL*Loaderの実行
(2)SQL*Loaderの実行結果確認(ログファイル)
以下のディレクトリのログを確認します。値が大きいレコード以外はロードに成功していることを確認します。
C:\app\administrator\test ・data.log
図15:SQL*Loaderのログ確認
(3)SQL*Loaderの実行結果確認(表の確認)
RDS(Oracle)にUSER1でログインします。
sqlplus USER1/<パスワード>@<エンドポイント名>:1521/ORCL
データをロードした表を確認します。
set line 100
set pages 1000
col NAME for a15
col POSITION for a10
col DEPT for a10
col ENTRY_DATE for a13
col RESIGN_DATE for a13
select * from EMP_MASTER_TBL;
select count(*) from EMP_MASTER_TBL;
図16:表の確認
正しく入力されたデータのみがデータベースにロードされていることが確認できました。
今回の検証はこれで終わりになります。
今回の検証では、特にRDSとOracleデータベースとの大きな差はありませんでしたが、表領域作成時に OMF(Oracle Managed File)形式が必須である点など、所々差を感じました。
以上