2018.01.15

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

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

1.はじめに

こんにちは。倉光です。 今年も皆さんに役立つブログ記事を心がけて、頑張ります。

さて、今年一発目の記事ですが、オンプレミスのデータベースは運用コストがかかるからRDSに移行したい!といったことは少なからずあると思います。
AWSでRDBMSを簡単に構築、パッチ適用などを含めた運用を楽にする手段として、RDSがあります。
今回、PHPを用いて、Oracle DUMPファイルをEC2経由でRDS for OracleにDUMPファイルをインポートする手順を紹介します。
※環境構築編とインポート編の2回にわけて紹介します。

2.概要

RDSは簡単な操作でRDBを構築できるサービスです。
簡単な作業で構築できますが、OSレイヤーのアクセスができない仕様になっており、OSコマンドにてOracleからDUMPファイルをインポート(impdpコマンド)・エクスポートするコマンド(expdpコマンド)が使用できません。
その為、DUMPファイルを出力するには、DBMS DataPump(PL/SQL)を使用して、RDS上のディレクトリにDUMPファイルを入出力する必要があります。

3.事前準備

注)VPC、EC2・RDSのインスタンスは準備ができている前提で話を進めさせていただきます。


環境構築を行うにあたり、事前準備は3点あります。


①Oracle Instant Client及びSQL*PLUSのダウンロード

※今回は管理用のEC2インスタンスからRDSに接続を行いますので、Oracle Instant Client及びSQL*PLUSが必要になります。OTN(Oracle Techlogy Network) [リンク先は Linux x86-64版]よりダウンロード、EC2インスタンス上(/root以下)にアップロードしておいてください。

本手順はOracle Database Version 11.2、12.1前提で話を進めさせていただきます。

 【対象ファイル】

  ◆Basicファイル(ファイル名例:oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm)

  ◆SQL*PLUSファイル(ファイル名例:oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm)

  ◆SDKファイル(ファイル名例:oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm)

②PECL(PHPで利用できる拡張ライブラリ)からOCI8をダウンロード

※今回は管理用のEC2インスタンスにPHP5.6をインストールして、RDSへの転送を行います。PECL(PHP Extension Community Library)よりダウンロード、EC2インスタンス上(/usr/local/src/以下)にアップロードしておいてください。

なお、バージョンは2.0.12を使用します。

③DUMPファイルのEC2へのダウンロード

※今回インポート元のOracle DUMPファイルをRDS for Oracleで作成しています。 オンプレミスから構築する場合は事前にexpdpコマンドでDUMPファイルを作成し、コマンド実行用のEC2にダウンロードをお願いいたします。

4.環境構成図

環境構成図

■手順概要
①EC2からPHPを実行し、RDSのディレクトリにDUMPファイルを転送します。
②RDS上でDBMS_DATAPUMPプロシージャを実行し、RDSにDUMPファイルをインポートします。

プログラムの役割分担としては、
 ・転送:PHP
 ・インポート:PL/SQL
で行います。

■プログラムが必要な理由
MySQLなどと異なり、Oracle DataPumpはデータベースのセキュリティを確保する為、データのインポート/エクスポート先はDBインスタンス上のディレクトリ・オブジェクトに制限されています。
加えて、データの転送についても、Oracleインスタンス間に限定されています。 DataPumpの設計により、データベース内部からデータを出さないようにすることで、セキュリティを強化する目的です。
上記背景より、データを外部に持ち出すためには、プログラムを用いて、データを取り出す、転送する作業が必要になります。

■PHPで行った理由
PerlやJavaなどでも実行することが可能です。
ただ、PerlではDBD(PerlのOracle Database Driver)を利用するのに、コンパイルを実行し、Oracleのライブラリパスが必要なこと、
Javaはスキルセット的にコーディングに時間がかかりそうだったので、PHPにしました。

5.環境構築手順

1.まずはPHP環境を実行するために、PHP-Oracle環境(OCI8)を準備します。

EC2にログイン後、下記コマンドを実行し、パッケージのバージョンを最新にしておきます。

[ec2-user] $  sudo su -
[root] #  yum update
Package Update
2.事前にアップロードしたOracle Instant Client関連パッケージをインストールします。
[root] # rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
[root] # rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
[root] # rpm -ihv oracle-instantclient11.2-devel-11.2.0.4.0-1.i386.rpm
Install Oracle Instant Client(11.2)
※Oracle Database Version 12.1で進める場合はOTNより12.1のBasic、SQL_PLUS、SDKファイルをダウンロード、rpmコマンドを実行してください。
[root] # rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
[root] # rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
[root] # rpm -ihv oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
Install Oracle Instant Client(12.1)
3.PHP5.6をインストールします。
[root] # yum list | grep php56
[root] # yum install php56.x86_64
Install PHP5.6
4.その他、必要な各種パッケージをインストールします。
[root] # yum install php-pear
[root] # yum install systemtap-sdt-devel 
[root] # yum install php56-devel
[root] # yum install gcc
Install Various Package
5.oci8-2.0.12.tgzが存在するディレクトリ(/usr/local/src)に移動し、圧縮ファイルを解凍します。
[root] # mv oci8-2.0.12.tgz /usr/local/src/
[root] # cd /usr/local/src
[root] # tar -zxf oci8-2.0.12.tgz
Unzip OCI8 Package
6.解凍したパッケージを適用します。
[root] # cd oci8-2.0.12
[root] # phpize
Apply Package
7.Oracleの環境変数を設定します。
[root] # vi /etc/profile

// 以下を最終行に追加(Version11.2) //
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:$LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/11.2/client64/bin:$PATH
export ORACLE_HOME=/usr/lib/oracle/11.2/client64/lib/
export TNS_ADMIN=/usr/local/oracle/network/admin
Set Environment Variables(11.2)
// 以下を最終行に追加(Version12.1) //
export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib:$LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/12.1/client64/bin:$PATH
export ORACLE_HOME=/usr/lib/oracle/12.1/client64/lib/
export TNS_ADMIN=/usr/local/oracle/network/admin
Set Environment Variables(12.1)
8.環境変数を適用・確認します。
[root] # source /etc/profile
[root] # printenv
Apply and Check Environment Variables
9.tnsnames.oraを設定します。

※tnsnames.oraの中身"[ ]"には値を入力します。"Oracle Service Name"は任意の値、"RDS for Oracle Endpoint Name"にはRDS構築時に表示されるエンドポイント名を指定します。

[root] # mkdir -p /usr/local/oracle/network/admin
[root] # cd /usr/local/oracle/network/admin
[root] # vi tnsnames.ora

// 下記の設定を追加 //
[Net Service Name]=
   (DESCRIPTION= 
         (ADDRESS=(PROTOCOL=tcp) 
         (HOST=[RDS for Oracle Endpoint Name]) (PORT=1521)) 
         (CONNECT_DATA=(SERVICE_NAME=ORCL)) 
    )
Set tnsnames.ora
10.SQL*PLUSでRDS for Oracleに接続します。

※"[ ]"には値を入力します。"Master User Name"はRDS構築時に設定したマスターユーザー、"Master User Password"はそのマスターユーザーのパスワード、"Net Service Name"はtnsnames.oraで指定したネットサービス名を入力します。

[root] # sqlplus64 [Master User Name]/[Master User Password]@[Net Service Name]
Connect RDS for Oracle
11.SDKパッケージを"Client64"ディレクトリにコピーします。

※"Client64"ディレクトリ以下にファイルが存在していれば必須です。すでにClient64ディレクトリ以下にファイルが存在した場合は不要です。
本記事寄稿時は11.2はClient64が存在しなかった為、手順を実行。12.1はファイルが存在した為、手順はスキップしています。

[root] # mkdir /usr/include/oracle/11.2/client64
[root] # cp -r /usr/include/oracle/11.2/client/* /usr/include/oracle/11.2/client64
Copy Oracle Client SDK Package
12.PHP - Oracle(OCI8)の紐づけを行います。

※No11の手順と同様、"Client64"ディレクトリ以下にファイルが存在していれば必須です。すでにClient64ディレクトリ以下にファイルが存在した場合は不要です。
本記事寄稿時は11.2はClient64が存在しなかった為、手順を実行。12.1はファイルが存在した為、手順はスキップしています。

[root] # cd /usr/lib/oracle/11.2/client/lib/
[root] # unlink libclntsh.so 
[root] # unlink libocci.so
[root] # ln -s /usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 libclntsh.so
[root] # ln -s /usr/lib/oracle/11.2/client64/lib/libnnz11.so libnnz.so
[root] # cd /usr/lib/oracle/11.2/client64/lib/
[root] # ln -s libclntsh.so.11.1 libclntsh.so
[root] # ln -s libnnz11.so libnnz.so
[root] # ln -s libocci.so.11.1 libocci.so
PHP - Oracle Association
13.OCI8のconfigureファイルを実行します。
(Version 11.2)
[root] # cd /usr/local/src/oci8-2.0.12
[root] # ./configure --with-oci8=instantclient,/usr/lib/oracle/11.2/client64/lib
Execute Configure File
(Version 12.1)
[root] # cd /usr/local/src/oci8-2.0.12
[root] # ./configure --with-oci8=instantclient,/usr/lib/oracle/12.1/client64/lib
Execute Configure File
14.コンパイルを実行します。
[root] # make
[root] # make install
Compile
15.php.iniファイルを編集します。
[root] # cd /etc/
[root] # vi php.ini

// 以下を最終行に追加 //
extension=oci8.so
Edit php.ini

6.まとめ

いかがでしたでしょうか。
次回はいよいよRDS for Oracleにインポートする手順を紹介します。
最後まで読んでいただき、ありがとうございました。

47 件

関連する記事