Insight Technology

2021.06.23

ローカルマシンにインストールせずにコマンド SQL クライアントを使う ( Oracle 編 )

このエントリーをはてなブックマークに追加

こんにちは。インサイトテクノロジーの松尾です!

札幌もだいぶ暖かくなってきてとてもいい季節ですね♪

前回の私のブログでは、Amazon Aurora や Amazon RDS など、クラウド上の VM にインストールした PostgreSQL など、リモートで起動している DBMS に対して SQL を実行したいというケースで、Dockerを使って psql や mysql コマンドを実行する方法を紹介しました。

さて、Amazon RDS for Oracle や、Oracle Cloud でもまったく同じ状況となることは想像に難くありません。

今回は、同じような手段で Oracle Cloud へ接続してみたいと思います。

SQL*Plus を Docker で使用するには?

ちょっと調べてみた限り、前回の psql や mysql コマンドのときのような、一発でそのまま使えるような Docker イメージがなさそうでした。 そのため、以下のような Dockerfile をまず用意します。

FROM oraclelinux:7-slim

ARG oraclever=19.11

RUN  yum -y install oracle-release-el7 && \
     yum-config-manager --enable ol7_oracle_instantclient && \
     yum -y install oracle-instantclient${oraclever}-basic \
        oracle-instantclient${oraclever}-sqlplus

CMD ["sqlplus", "-v"]

この Dockerfile をもとにイメージをビルドします。

$ docker build -t sqlplus-docker .
[+] Building 47.6s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 331B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/oraclelinux:7-slim                                              3.9s
 => [auth] library/oraclelinux:pull token for registry-1.docker.io                                                 0.0s
 => [1/2] FROM docker.io/library/oraclelinux:7-slim@sha256:25c372fae3eae2ef5c0def6ddb156006bd0282e2377c45af2966ac  8.9s
 => => resolve docker.io/library/oraclelinux:7-slim@sha256:25c372fae3eae2ef5c0def6ddb156006bd0282e2377c45af2966ac  0.0s
 => => sha256:e9123134eb04f7ad4fb085314a07bbe3170bced73d6737dc688db06c38b10ca2 1.48kB / 1.48kB                     0.0s
 => => sha256:cbf629395cd4d267c366a2b3ac4cfbe6a6c5cfd5bdd8e89a7157e0901e898cf4 48.26MB / 48.26MB                   4.7s
 => => sha256:25c372fae3eae2ef5c0def6ddb156006bd0282e2377c45af2966ac394c1f658c 547B / 547B                         0.0s
 => => sha256:a83ef2db4125fe92dab92f83622fd6505c0288f62dbfee650ff33413c82a2fc4 529B / 529B                         0.0s
 => => extracting sha256:cbf629395cd4d267c366a2b3ac4cfbe6a6c5cfd5bdd8e89a7157e0901e898cf4                          3.9s
 => [2/2] RUN  yum -y install oracle-release-el7 &&      yum-config-manager --enable ol7_oracle_instantclient &&  32.3s
 => exporting to image                                                                                             2.4s
 => => exporting layers                                                                                            2.4s
 => => writing image sha256:fe134d6502b47e08cc2cb2c88117a8927e1d6fe99ffea7900b52105e50b7ccec                       0.0s
 => => naming to docker.io/library/sqlplus-docker

$ docker run --rm -it sqlplus-docker sqlplus -v

SQL*Plus: Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

これで、SQL*Plus を使用する準備ができました。

Amazon RDS for Oracle への接続は以下のように指定します。

docker run --rm -it sqlplus-docker sqlplus USERNAME@HOSTNAME/DATABASE

HOSTNAME, USERNAME, DATABASE は、それぞれ、ホスト名(RDS for Oracleの場合はエンドポイント)、ユーザー名、データベース名です。接続後にパスワードの入力が要求されます。

実際に接続してみると、以下のように接続できました!

$ docker run --rm -it sqlplus-docker sqlplus scott@xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com/scott

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jun 3 23:58:52 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Thu Jun 03 2021 23:56:46 +00:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL>

なお、AWS のドキュメント によると、以下の指定方法が推奨されているようですので、参考までに記載しておきます。

$ docker run --rm -it sqlplus-docker sqlplus 'scott@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=scott)))'

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jun 3 23:59:25 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Thu Jun 03 2021 23:58:54 +00:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL>

Oracle Cloud へ接続するには?

さて、上記までの手順で、Amazon RDS for Oracle や、一般的なパスワード認証を行う Oracle への接続を行うことができました。ところで Oracle Cloud の ATP ( Oracle Autonomous Transaction Processing ) へ接続するにはどのようにすればいいでしょうか?

基本的には Oracle Cloudのドキュメント に従いますが、これを Docker ベースで行うには、前述の Dockerfile を以下のように少し修正します。

FROM oraclelinux:7-slim

ARG oraclever=19.11

RUN  yum -y install oracle-release-el7 && \
     yum-config-manager --enable ol7_oracle_instantclient && \
     yum -y install oracle-instantclient${oraclever}-basic \
        oracle-instantclient${oraclever}-sqlplus

COPY ./tnsnames.ora /root
COPY ./cwallet.sso /root
COPY ./sqlnet.ora /root
ENV TNS_ADMIN=/root

CMD ["sqlplus", "-v"]

追加しているのは、RUNCMD の間の4行で、ATPへの接続に必要な、Walletのファイルをイメージの中にコピーしています。

前述と同様に、イメージをビルドしたいところですが、sqlnet.ora ファイルを以下のように修正します。変更箇所は、DIRECTORY の指定を、docker 内でのパス /root にしている部分です。

WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/root")))
SSL_SERVER_DN_MATCH=yes

以下のファイルを同ディレクトリ内に用意した上で、イメージをビルドします。

  • Dockerfile
  • tnsnames.ora
  • cwallet.sso
  • sqlnet.ora
$ ls
Dockerfile  cwallet.sso  sqlnet.ora  tnsnames.ora
$ docker build -t sqlplus-docker .

イメージがビルドできたら、接続しましょう。今回は、tnsnames.ora が用意されていますので、そこで指定されている サービス名 を指定するのが簡単です。

docker run --rm -it sqlplus-docker sqlplus USERNAME@SERVICENAME

USERNAME, SERVICENAME は、それぞれ、ユーザー名、サービス名です。接続後にパスワードの入力が要求されます。

実際に接続してみると、以下のように接続できました!

$ docker run --rm -it sqlplus-docker sqlplus scott@scott_tp

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 4 00:41:03 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Thu Jun 03 2021 15:00:33 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0

SQL>

簡単でしたね!

おわりに

今回、Oracle Database のコマンドクライアント SQL*Plus を Docker で使用する方法をご紹介しました。

次回は・・、せっかくなので Microsoft SQL Server への接続も試してみたいと思います。どうぞお楽しみに!

開発メンバー募集中デス。

インサイトテクノロジーにご興味を持たれたエンジニアの方、ぜひご連絡をお待ちしております♪

シリーズ「ローカルマシンにインストールせずにコマンド SQL クライアントを使う 」

  1. PostgreSQL / MySQL 編
  2. Oracle 編
ページトップへ
DB TECH SHOWCASE テックギークに贈る、データテックカーニバル! 2021.11.17[WED]-19[FRI]/ONLINEDB TECH SHOWCASE テックギークに贈る、データテックカーニバル! 2021.11.17[WED]-19[FRI]/ONLINE