NEWSニュース&ブログ

RDSへのデータ移行方法三選!(②Oracle SQL*Loaderを 使用したデータ移行)

この記事は最終更新から10年以上経過しています。内容が古くなっている可能性があります。

投稿日: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)形式が必須である点など、所々差を感じました。
以上