【作業ログ】WSL2とOracleの勉強

WSL2経由でローカルのファイルを操作する。ファイル作成する。

ローカルのフォルダを操作するには
/mnt/c
というようにアクセスすることができます。
例えば、C:\Users\xiaot\Documents\tmp
のフォルダに移動したい場合だと
cd /mnt/c/Users/xiaot/My Documents/tmp
とすればいい。ん?My Documents?

試しに
cd: /mnt/C/Users/xiaot/Documents/tmp
でアクセスすると、そのようなファイルやディレクトリはありません
と怒られる。
なぜMy Documentsになるのだろうか。。
理由はよくわからないが、直接ファイルパスをコピペしても、Windowsだと階層区切りが\で、Linuxだと/なので、そのまま使うということができない。
結局のところ、そこまで一個づつcdで移動していくことになりそうだ。

さて、気を取り直してファイル作成。
ここまでくればあとはファイルを作成するだけ。
touch test.txt
これでtext.txtファイルが作成される。

WSL2にsqlplus19.9をインストール

DMP出力して保存するということをしたかったのでsqlplusをインストールする。
→作業が終わってから気づいた。僕が入れたOracleってOracle Database12cだから、そのバージョンに合わせたsqlplusを使わないとData Pump(expdp/impdp)が使えないやん。。。

上記を参考にやっていく。

必要なモジュールをダウンロードするとのことだが、rpmパッケージでOKとのこと。
ちなみに私のWSL2で使ってるディストリビューションはUbuntuなので、本来であれば.debファイルを使うようだ。
ディストリビューションごとに使うファイルが違う。
Ubuntu→.debファイル
CentOs→.rpmファイル

っで、なぜrpmパッケージでいいのかというと、alienという各パッケージ間の相互変換するプログラムを使って変換するから。なので結局debファイルに後に変換かけます。

.debと.rpmファイルについてより詳しく言うと、以下。

.deb ファイルは Debian から派生した Linux ディストリビューション (Ubuntu, Linux Mint など) で使用されます。.rpm ファイルは主に Redhat ベースのディストロ (Fedora, CentOS, RHEL) や openSuSE ディストロから派生したディストリビューションで使用されます。

https://unix.stackexchange.com/questions/103531/what-are-deb-and-rpm-and-how-are-they-different-from-msi

では、必要なモジュールをダウンロードする。

Basic Package

SQL*Plus Package

SDK Package

任意のフォルダに置いておく

alienのインストールと変換

まずはパッケージリストの更新を行う。
sudo apt-get update
インストールはこれ
sudo apt -y install alien

ダウンロードしたモジュールの格納先まで移動する。

この状態で以下のコマンドを実行する。

sudo alien --to-deb oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm
sudo alien --to-deb oracle-instantclient19.9-devel-19.9.0.0.0-1.x86_64.rpm
sudo alien --to-deb oracle-instantclient19.9-sqlplus-19.9.0.0.0-1.x86_64.rpm

変換にかなり時間がかかる。ちゃんと実行されているのか?という疑問があったので、実際にtmp直下を見てみると、タイムスタンプがその時点のファイルがあったため、実際に動いているなという判断ができた。それがなければキャンセルしてたかも。

っで、結局エラーが出た。

dpkg-shlibdeps: warning: package could avoid a useless dependency if debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libocijdbc19.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libclntshcore.so.19.1 debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libociei.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/liboramysql19.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/bin/genezi debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/bin/adrci debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libclntsh.so.19.1 were not linked against libnsl.so.1 (they use none of the library's symbols)
dpkg-shlibdeps: error: cannot continue due to the errors listed above
Note: libraries are not searched in other binary packages that do not have any shlibs or symbols file.
To help dpkg-shlibdeps find private libraries, you might need to use -l.
dh_shlibdeps: error: dpkg-shlibdeps -Tdebian/oracle-instantclient19.9-basic.substvars debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/bin/adrci debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/bin/genezi debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libclntsh.so.19.1 debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libclntshcore.so.19.1 debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libipc1.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libmql1.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libnnz19.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libocci.so.19.1 debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libociei.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/libocijdbc19.so debian/oracle-instantclient19.9-basic/usr/lib/oracle/19.9/client64/lib/liboramysql19.so returned exit code 2
dh_shlibdeps: error: Aborting due to earlier error
make: [debian/rules:27: binary-arch] エラー 25 (無視されました)
dh_gencontrol
dpkg-gencontrol: warning: Depends field of package oracle-instantclient19.9-basic: substitution variable ${shlibs:Depends} used, but is not defined
dh_md5sums
dh_builddeb
dpkg-deb: エラー: コントロールディレクトリの許可属性 777 は不正です (>=0755 かつ <=0775 でなければなりません)
dh_builddeb: error: dpkg-deb --build debian/oracle-instantclient19.9-basic .. returned exit code 2
dh_builddeb: error: Aborting due to earlier error
make: *** [debian/rules:30: binary-arch] エラー 25

なんとなく、で動くからいつも大変なことになるけど、まあ個人的な勉強も兼ねてるからいいかということで、まずざっくり上記エラーを自分なりに解釈する。
たぶん、重要なのはディレクトリの許可属性の部分じゃないかなとあたりを付ける。
っで、/mnt/~という具合に、windowsのローカルディレクトリで変換作業がされており、その時に必要だった権限がなくて発生しているエラーなのかなと。
いや、本当はちゃんと読まないといけないのはわかってる。
でも、結局インストールできればいいじゃんという考えのもと
①wsl内部にファイルをもってきてそこで展開してインストール
②alienで 以下のようなコマンドで。そのままインストールできるんじゃないか。
sudo alien -i oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm
とりあえず、エラー出そうだけど②からやってみる。
 →同じエラーでできなかった。

気を取り直して、①をやっていく。wsl内部ならrootで操作しているので権限の問題もクリアにできるだろうという考え。
①でやるために、まずはlinux上のどこかしらにファイルを持ってくる必要がある。今回は/var/tmpに持ってくる。以下のリンクを見てわかるように、ここにあるファイルは定期的に掃除してくれるようだ。

では、モジュールをLinux上にもっていき、実際にインストールしていく。

cp oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm /var/tmp
cp oracle-instantclient19.9-devel-19.9.0.0.0-1.x86_64.rpm* /var/tmp
cp oracle-instantclient19.9-sqlplus-19.9.0.0.0-1.x86_64.rpm* /var/tmp

cd /var/tmp

sudo alien -i oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm*
sudo alien -i oracle-instantclient19.9-devel-19.9.0.0.0-1.x86_64.rpm*
sudo alien -i oracle-instantclient19.9-sqlplus-19.9.0.0.0-1.x86_64.rpm*

oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm*が終わった段階で、以下のメッセージを確認できたので、他の二つも同じようにやる。

libaio1のインストール

sudo apt install libaio1

こちらは何のひねりもなくうまくいった。

環境変数の設定

以下のリンクで .bash_profile について調べた。
というのも、 .bash_profileが存在しなかったので。

https://www.wakuwakubank.com/posts/389-linux-bashrc/

~/.bash_profile

~/.bash_login

~/.profile
上のファイルがなければ下のファイルを読み込みます。

なくても問題ないファイルか。ないなーと思ったけど作ればいいのかな。
ということで、.bash_profileを作る。

.bash_profileを作る。

$ cd
$ touch .bash_profile
$ code .bash_profile

vs codeで開いて以下保存

cat .bash_profileでちゃんと保存されているか確認

sqlplusが使えるか確認

前回作ったユーザが使えるか確認してみる。

sqlplus OTETE/TEST@localhost:1521/PDB

Dockerで走らせているOracle12cのユーザのDMPを取得する

以下を参考にしつつやっていく。

https://oracle-chokotto.com/ora_export_expdp.html

まずはexpdpの出力先となるディレクトリオブジェクトを作成する

ディレクトリオブジェクトというのは、oracle内でディレクトリを実際のパスで指定しないでいいように、オブジェクトとして保持するための仕組みのようです。DMPの吐き出し先を設定しておく。

CREATE DIRECTORY dirDmp AS '/mnt/c/tmp';

expdpを実行

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

実行してみるとコマンドが存在しない・・・

expdpが使用できない

sqlplusをインストールしたタイミングで付属でついてきてない?
というのも本来であればORACLE_HOME/bin/expdp
があるはず。

っで調べてみると、どうやら Tools Package (RPM) をインストールしていないからのようだ。

最後にAppendixで、 Tools Package (RPM) のインストールについて書いてます。

再度 expdpを実行

ここにきてようやく気付いた。
入れるべきsqlplusのバージョンが違うということを。。。

次回sqlplus12を入れていく話をする。

Appendixというかメモ

bash_profileを作成してからUbuntuの初回起動でllが使えなくなった。

→bashと打ち込めば打てる。
bash_profileが読み込めてないのか?

Tools Package (RPM) のインストール

cp oracle-instantclient19.9-tools-19.9.0.0.0-1.x86_64.rpm /var/tmp
cd /var/tmp

sudo alien -i oracle-instantclient19.9-tools-19.9.0.0.0-1.x86_64.rpm

ORACLE_HOME/binの中身を確認。
無事expdpがインストールされた。