2018.08.15

【RDS】Oracle DUMPファイルをRDS for Oracleにインポートする(インポート編)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

1.はじめに

みなさん、こんにちは。倉光です。

前回に引き続き、Oracle DUMPファイルをRDS for Oracleにインポートする手順を紹介します。

※リンクは環境構築編の記事になります。

今回はPHPを用いて、いよいよインポートします。

2.PHPファイル作成

1.PHPファイルを作成します。
[ec2-user] $ sudo su -
[root] # mkdir -p /root/oracle-import/dmp/
[root] # cd /root/oracle-import/
[root] # vi sample.php
Make PHP File

PHPのサンプルコードは以下の通りです。サンプルコードの為、変数などはすべてPHPファイルに直書きしています。ご了承ください。
※サンプルコード・インポート元のOracle DUMPファイルともに「/root/oracle-import/」以下に保存しておきます。
本サンプルコードの各種命名についてですが、
・PHP名は「sample.php」
・インポート元DUMPファイルは「sample.dmp」
・PHP実行後のRDS上のDUMPファイル名は「sample_import.dmp」
です。

<?php

date_default_timezone_set('Asia/Tokyo');

$today = date('Ymd');
$log_date = date('Y/m/d H:i:s');
$file_name = "sample.dmp";

# Oracleの接続情報 ※[ ]には任意の値
$RDS_USER = "[Master User Name]";
$RDS_PASS = "[Master User Password]";
$RDS_SERVICE_NAME  = "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=[RDS Endpoint])(PORT=1521))(CONNECT_DATA=(SID=ORCL)))";

$dirname = 'DATA_PUMP_DIR';
$chunk = 8192;

# Oracleへの接続
$conn = oci_connect($RDS_USER, $RDS_PASS, $RDS_SERVICE_NAME);

# インポート用PL/SQLのパッケージ作成
$sql_pkg = 'create or replace package php_global as fh utl_file.file_type; end;';
$sql_global = oci_parse($conn, $sql_pkg);
oci_execute($sql_global);

# RDS for Oracleに書き込むファイルをバイナリーモードでオープン
$data = 'sample_import.dmp';
$sql_pf = 'BEGIN php_global.fh := utl_file.fopen(:dirname, :data, \'wb\'); END;';
$sql_open = oci_parse($conn, $sql_pf);
oci_bind_by_name($sql_open, ':dirname', $dirname);
oci_bind_by_name($sql_open, ':data', $data);
oci_execute($sql_open);

# 転送元Oracle DUMPファイルからRDS for Oraceのファイルに書き込みを実施
$handle = '';
$sql_put = 'BEGIN utl_file.put_raw(php_global.fh, :handle, true); END;';
$sql_write = oci_parse($conn, $sql_put);

$rh = fopen($file_name, "rb");
$cnt = 0;
while(true){
  $handle = fread($rh, 8192);
  oci_bind_by_name($sql_write, ':handle', $handle, $chunk, SQLT_LBI);;
  oci_execute($sql_write);

  if($handle == false){
    fclose($rh);
    break;
  }
}

sql_fc = 'BEGIN utl_file.fclose(php_global.fh); END;';
$sql_close = oci_parse($conn, $sql_fc);
oci_execute($sql_close);

?>
PHP Code(From EC2 to RDS)

参考ドキュメント

https://d0.awsstatic.com/whitepapers/strategies-for-migrating-oracle-database-to-aws.pdf

サンプルコードは上記ドキュメント25ページにありますPerlスクリプトをリコーディングしています。

3.Oracle DUMP Fileのインポート

EC2からRDSへの転送、RDSに転送したDUMPファイルのインポート作業を行っていきます。
1.PHPコードを実行します。
[root] # php sample.php
Execute PHP Code
2.SQL*PLUSでRDS for Oracleに接続し、ファイルが転送されていることを確認します。

※本記事では、ファイルサイズが同じであれば、転送できたものとしています。

[root] # sqlplus64 [Master User Name]/[Master User Password]@[Net Service Name]
[SQL] > select * from table (rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
Check Oracle DUMP File
3.Oracle DataPumpのインポート用PL/SQLを実行します。

(SQL*PLUSのプロンプトで実行します。見やすさを重視して本コマンドのみプロンプトを削除しています。) ※[Schema Name]にはインポートするスキーマ名を指定します。

DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.open( operation => 'IMPORT', job_mode => 'SCHEMA', job_name => null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'sample_import.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'sample_import.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''[Schema Name]'')');
DBMS_DATAPUMP.start_job(hdnl);
END;
/
Import Oracle DUMP File
4.DataPumpのインポートログを確認します。
[SQL] > select * from table(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR', p_filename  => 'sample_import.log'));
Check Import Log
以上でインポート完了です。

データの中身まで確認したい場合はSQL*PLUSやクライアントツールを用いて、SQLを実行し、データベースのデータを確認してください。

【Tips】RDS上のファイルを削除したいとき

RDS上のDUMPファイルやログファイルを削除したいときは下記コマンドを実行することで削除できます。

--[ ]にファイル名を入れる
[SQL] > exec utl_file.fremove('DATA_PUMP_DIR','[File Name]'); 
Detele File

4.まとめ

いかがでしたでしょうか。

Oracle DUMPファイルを自由にインポート・エクスポートができれば、用途が広がると思います。

例えば、今回はオンプレミスのOracle DUMPファイルをインポートする話でしたが、RDS for Oracleから他のDBエンジンに移行するといったことも可能です。

DMSとSCTを使ったDBマイグレーション記事も書いています。興味のある方は読んでいただければ幸いです。

最後まで読んでいただき、ありがとうございました。

24 件

関連する記事