Edited at

Oracle CloudにあるAutonomous Data WarehouseにRから接続してみる(ROracleの利用)


はじめに

ROracleは、RからOracle Databaseに接続する際に利用します。

Rプログラムを実行するクライアント側にインストールして利用します。

Oracle Autonomous Data Warehouse(ADW)はOracle Cloud Infrastructure(OCI)環境にあるAutonomousで超高速なデータベースですが、これもOracle Databaseなので、ROracleで接続できます。

具体的には、


  • Oracle Client (Instant Client でも Full Clientでも良いが、今回は前者を利用。Instant Clientの場合、ROracleを動かすにはSDKのインストールも必要。)

  • ROracle

をインストールします。

※以前、Python -- cx_Oracle -- Oracle Instant Client -- ADW で接続してみましたが、それのRでやってみた版です。


環境


  • Ubuntu (WSL上の)

  • R version 3.5.2

※Rのインストールは、以下を参考にしました。

WSLのUbuntu 18.04にRをインストールする

※WSL=Windows Subsystem for Linux


インストール

公式ドキュメントの英語版・日本語版

に従って実施。以下やったこと。


Instant Client のインストール

今回は /u01/app/oracle 以下にインストールすることにする。

OTNダウンロードサイト:Oracle Instant Client より、Version 18.3.0.0.0 の、


  • Base - Basic Package の、
    instantclient-basic-linux.x64-18.3.0.0.0dbru.zip

  • Development and Runtime - SDK Package の、 instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip

2つをダウンロード。

/u01/app/oracle 直下にダウンロードしたファイルを配置し、unzip。

$ mkdir -p /u01/app/oracle

$ cd /u01/app/oracle
$ unzip instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
$ unzip instantclient-sdk-linux.x64-18.3.0.0.0dbru.zip

シンボリックリンクの状況は、前回 と同じだったので割愛。


libaioのインストール

前回 と同じ環境なので今回は実施していない。


ROracleのインストール

ADWのドキュメント該当箇所からは、


ROracle: To install ROracle for R, use the instructions on the following page: ROracle


で、INSTALL用のREADME的な資料に飛ぶので、それを参考にして実施。

Oracle Instant Clientの場合は、SDKが必要なことは冒頭に記載あり。


If using an Oracle Instant Client, you need

either the Basic or Basic Lite packages in addition to the SDK package.



ROracleをダウンロード

上のREADMEのひとつ上のディレクトリ:

http://cran.cnr.berkeley.edu/web/packages/ROracle/

から、ROracle_1.3-1.tar.gz をダウンロードした。


環境変数 LD_LIBRARY_PATH と OCI_LIB を設定

$ export LD_LIBRARY_PATH=/u01/app/oracle/instantclient_18_3:$LD_LIBRARY_PATH

$ export OCI_LIB=/u01/app/oracle/instantclient_18_3


ROracleをインストール

$ R CMD INSTALL --configure-args='--with-oci-inc=/u01/app/oracle/instantclient_18_3/sdk/include --with-oci-lib= /u01/app/oracle/instantclient_18_3' ROracle_1.3-1.tar.gz

公式ドキュメント(README的なやつ)では、環境変数LD_LIBRARY_PATH と OCI_LIBの2つを設定すれば、インストールは R CMD INSTALL ROracle_1.3-1.tar.gz だけでOKのはず。なのだが、色々とエラーで進めなかったので、今回は上記のように --configure-args 内で--with-oci-inc= と--with-oci-lib= の2つを指定して実行した。


補足

R CMD INSTALL ROracle_1.3-1.tar.gz 実行で失敗していた際のエラーメッセージ。丁寧な確認ができなかったので手順ミスの可能性はあるが、備忘録として。

R CMD INSTALL 時のエラー:その①

configure: error: OCI libraries not found

ERROR: configuration failed for package ‘ROracle’

R CMD INSTALL 時のエラー:その②

Error: package or namespace load failed for ‘ROracle’ in dyn.load(file, DLLpath = DLLpath, ...):

unable to load shared object '/usr/local/lib/R/site-library/ROracle/libs/ROracle.so':
libclntsh.so.18.1: cannot open shared object file: No such file or directory


ADW環境への接続


ROracle 詳しい方へ:ざっくり説明

ADWに特化した情報としては、


  • 接続に必要なクライアント資格証明ファイル一式(Wallet_XXX.zip)が必要で、Oracle Clientの network/admin 配下に置き展開

  • *.zip内に tnsnames.ora も含むので、R からは dsn= で、tnsnames.ora のエントリ(ネット・サービス名)を指定

  • ※ ADWではインスタンス作成時に3つの事前定義されたネット・サービス名が作られる( XXX_high, _medium, _low ) ので、通常はそのどれかを指定すればよい


準備・接続に必要なセキュリティ資格証明を設定

前回 と全く同じなので割愛。

Oracle Instant Client のインストール箇所が前回と異なるため、network/admin の場所は適宜読み替えて実行。


  • 前回:$HOME/instantclient_18_3/network/admin/

  • 今回:/u01/app/oracle/instantclient_18_3/network/admin/


ADWに接続しSQLを実行

dbConnect()に、接続情報を指定する。

dbname=にtnsnames.oraのエントリを指定。

$ export LD_LIBRARY_PATH=/u01/app/oracle/instantclient_18_3:$LD_LIBRARY_PATH

$ export OCI_LIB=/u01/app/oracle/instantclient_18_3

$ R

R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library(ROracle)
Loading required package: DBI
> drv <- dbDriver("Oracle")
> con <- dbConnect(drv, username = "scott", password="tiger", dbname="myadw_high")
> res <- dbSendQuery(con, "select * from sh.costs")
> fetch(res,n=10)
PROD_ID TIME_ID PROMO_ID CHANNEL_ID UNIT_COST UNIT_PRICE
1 118 2000-12-31 999 4 7 7
2 120 2000-07-06 999 2 8 8
3 120 2000-07-23 999 2 8 8
4 120 2000-08-01 999 2 8 8
5 120 2000-08-09 999 2 8 8
6 120 2000-08-14 999 2 8 8
7 120 2000-08-31 999 2 8 8
8 120 2000-10-04 999 2 8 8
9 120 2000-11-02 999 2 8 8
10 120 2000-11-03 999 2 8 8
>
> quit()
$


参考

前回前回言ってるのはこちら:

Oracle CloudにあるAutonomous Data WarehouseにPythonから接続してみる(cx_Oracleの利用)