【作業ログ】WSL2にsqlplus12.2を入れてexpdpする。

2020年11月10日

前回の話はこちら

まずは自分のOracle Databaseのバージョンが何か意識しないといけなかった。忘れてた。

というわけで、今回こそはsqlplus12.2を入れていく。

ダウンロード

前回もリンク貼ったと思うけど、念のためもう一度。

https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

スクロールしていくと結構下のほうにあった。

ここで前回と同じように必要なモジュールをダウンロードする。
DMP出したりするのが今回の目的なのでtoolsも含める。
対象はこちら

ところで、一瞬「ん?」ってなったけど、toolsのrpmダウンロードしようと思ってみていてもZIPしかない。でもDownloadの拡張子がちゃんとrpmだったのでこいつをダウンロード。軽めの罠?

sqlplusをインストールしている時に発生したエラー

見た感じ、sqlplus19.9をインストールしたことでファイルがかぶっているっぽい。けど、とりあえず放置。何かあれば後でエラー出て苦しむでしょう。。。

root@DESKTOP-RB12Q18:/var/tmp# sudo alien -i oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm*
        dpkg --no-force-overwrite -i oracle-instantclient12.2-devel_12.2.0.1.0-2_amd64.deb
以前に未選択のパッケージ oracle-instantclient12.2-devel を選択しています。
(データベースを読み込んでいます ... 現在 40534 個のファイルとディレクトリがインストールされています。)
oracle-instantclient12.2-devel_12.2.0.1.0-2_amd64.deb を展開する準備をしています ...
oracle-instantclient12.2-devel (12.2.0.1.0-2) を展開しています...
oracle-instantclient12.2-devel (12.2.0.1.0-2) を設定しています ...
root@DESKTOP-RB12Q18:/var/tmp# sudo alien -i oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm*
        dpkg --no-force-overwrite -i oracle-instantclient12.2-sqlplus_12.2.0.1.0-2_amd64.deb
以前に未選択のパッケージ oracle-instantclient12.2-sqlplus を選択しています。
(データベースを読み込んでいます ... 現在 40587 個のファイルとディレクトリがインストールされています。)
oracle-instantclient12.2-sqlplus_12.2.0.1.0-2_amd64.deb を展開する準備をしています ...
oracle-instantclient12.2-sqlplus (12.2.0.1.0-2) を展開しています...
dpkg: アーカイブ oracle-instantclient12.2-sqlplus_12.2.0.1.0-2_amd64.deb の処理中にエラーが発生しました (--install):
 '/usr/bin/sqlplus64' を上書きしようとしています。これはパッケージ oracle-instantclient19.9-sqlplus 19.9.0.0.0-2 にも存 在します
処理中にエラーが発生しました:
 oracle-instantclient12.2-sqlplus_12.2.0.1.0-2_amd64.deb
Unable to install at /usr/share/perl5/Alien/Package/Deb.pm line 97, <GETPERMS> line 5.
        find oracle-instantclient12.2-sqlplus-12.2.0.1.0 -type d -exec chmod 755 {} ;
        rm -rf oracle-instantclient12.2-sqlplus-12.2.0.1.0

ORACLE_HOMEのパスを変更する

.bash_profileに前回以下の設定を入れているので、12.2を見るように書き換える。

export ORACLE_HOME=/usr/lib/oracle/19.9/client64
export PATH=~/.local/bin:~/bin:$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATHroot@DESKTOP-RB12Q18:/usr/lib/oracle#

ただ上記のように設定しても使われるsqlplusは19.9のままであった。
パスが書き換わっているかも確認した。

少し脱線ですが、.bashrcにパスを設定することにした。

.bash_profile に書いていましたが、どうも.bash_profileを読み込むと.bashrcが読み込まれなくなる?
この結論に至ったのは、よく使う「ll」コマンドが .bashrc に設定されていたのを発見したから。
読込順としては .bashrc が遅いというのは前回ググってわかっていたけど、たぶん .bash_profile の中に .bashrc を読み込む命令を書く必要がありそうだ。

ただ、今回は .bash_profile を消して .bashrc の中にパスを書くことにした。

sqlplus19.9をアンインストールする

上記エラーが出てほっとこうと思ったら、どうも12.2のsqlplusがインストールされていないということがわかった。

apt list --installed | grep 'oracle'

なので、sqlplus19.9をアンインストールする。

sudo apt-get --purge remove oracle-instantclient19.9-sqlplus
// その後インストール
sudo alien -i oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm*

sqlplusを叩くとちゃんと12.2になった。

expdpを実行

さて、やっと前回の続きができる。
ここにもハマりポイントがあった。
どこかというと、DMPの吐き出し先をwsl配下にするとエラーを吐く。
しかも、そのエラーも以下のように非常に見づらくわからん。

expdp OTETE/TEST@localhost:1521/PDB full=y directory=DIRDMP dumpfile=data.dmp reuse_dumpfiles=YES

なんとなくアクセス権限まわりのエラーとか関係するのかなと思いつき、とりあえず、/var/tmpにDMPファイルを吐き出すように設定した。

CREATE DIRECTORY DMPDIR2 AS '/var/tmp';
expdp OTETE/TEST@localhost:1521/PDB full=y directory=DMPDIR2 dumpfile=data.dmp reuse_dumpfiles=YES

実際にDMP吐き出された。

このdata.dmpがどこにあるかというと、dockerで走っているoracle内に作られる。本当はwsl内にdmp置きたいけど、どうすればいいんだろう。

docker exec -it my_oracle bash

DMPの吐き出し先

調べてみると、CREATE DIRECTORYでオブジェクトとしてDMPの吐き出し先を定義しないといけないので、 Docker上にしか吐きだすことができない。もし外部(今回の場合で言うと、Dockerを動かしているホスト端末)にDMPファイルを吐き出したければフォルダをマウントするなりして対応する必要がありそうだ。