kdnakt blog

hello there.

Oracle Database 19cをVS CodeのRemote - Containersで動かす

qiita.com

 

こちらの記事を参考に、Oracle 19cをWindows 10上のDockerで動かしてみた。

 

 

[環境情報]

Windows 10 Pro (OSビルド19042.746)

Docker Desktop 3.1.0 (51484)

Oracle Database 19.3.0

VS Code 1.52.1

Remote - Containers v0.155.1

 

[セットアップ] 

▼Dockerイメージの準備

git cloneの手順は参考記事と同じ。

git clone https://github.com/oracle/docker-images.git

 

以下の公式サイトから、Linux x86-64用の「19.3 - Enterprise Edition (also includes Standard Edition 2)」のZIPファイルをダウンロードする*1

ファイル名はLINUX.X64_193000_db_home.zipとなっていた。

www.oracle.com

 

ダウンロードしたZIPファイルを、クローンしたリポジトリに配置する。

cd docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0
cp ~/Downloads/LINUX.X64_193000_db_home.zip .

 

Dockerイメージをビルドする。参考記事では12cを利用していたが、バージョンの指定を19c用に変更した。マシンスペックが貧弱だったのか、ビルドには30分ちょっとかかった。

cd ..
./buildDockerImage.sh -v 19.3.0 -e -i

 

▼Dockerの設定

プロジェクトディレクトリを作成する。

mkdir ./oracle_test

 

データ永続化用のディレクトリを作成する。

mkdir ./oracle_test/oradata
chmod 777 ./oracle_test/oradata

 

参考記事に書かれているように、続けて./oracle_test/docker-compose.ymlファイルを作成してもよい。

しかし、用意されているOracle Linux 7イメージには、viなどのテキストエディタがインストールされていないため、設定ファイルの変更などが難しい。参考記事に記載のとおりdocker exec -it (コンテナ名) bashでコンテナに接続した場合、sudoコマンドも利用できないため、viをインストールすることができない。

これは、docker exec -it -u root (コンテナ名) bashとルートアカウントでコンテナに接続することで回避できる。こうするとyum install viコマンドでviをインストールでき、コンテナライフが少しマシになる。

 

今回は、コンテナの設定ファイルの修正のほか、初期化パラメータファイルの書き換えなども必要となった。そのため、慣れているVS Codeでファイルの編集もできるようにVS Code拡張機能Remote - Containersを利用する。

 

Remote - Containersのための設定ファイル(./oracle_test/.devcontainer/devconntainer.json)を作成する。

{
        "name": "Oracle19 on Docker",
        "dockerComposeFile": [
                "../docker-compose.yml"
        ],
        "service": "db",
        "workspaceFolder": "/workspace",
        "settings": {
                "terminal.integrated.shell.linux": null
        },
        "extensions": []
}

 

また、Remote - Containersのためのワークスペースディレクトリを作成する。

mkdir ./oracle_test/workspace

 

最後に、./oracle_test/docker-compose.ymlファイルを作成する。ファイルの中身は以下の通り。

version: '2'
services:
  db:
    image: oracle/database:19.3.0-ee
    container_name: oracle19
    ports:
      - 1521:1521
      - 5500:5500
    volumes:
      - .oradata:/opt/oracle/oradata
      - .workspace:/workspace:cached
    environment:
      # これがDBユーザーのパスワード
      - ORACLE_PWD=Oracle19
      - ORACLE_PDB=oracle

 

Remote - Containers拡張機能をインストールしたVS Codeでこのプロジェクトディレクトリ(./oracle_test)を開くと、自動的にOracle Database入りのコンテナが起動する。

残念ながら、Oracle Databaseの初回起動にもやはり30分程度の時間がかかる。2回目以降もそれなりに時間がかかる。Mac上でDockerを実行してもこれは変わらないらしい。

nainaistar.hatenablog.com

 

Oracle Databaseが起動したら、VS Codeのターミナルを開くと、以下のようにコンテナ内からコマンドを実行することができる。

[oracle@affb23e08e80 workspace]$ sqlplus SYSTEM/Oracle19@ORCLCDB
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 28 19:02:46 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Last Successful login time: Thu Jan 28 2021 18:53:31 +00:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> 

 

[マルチテナント環境の共通ユーザー接頭辞]

マルチテナント・コンテナ・データベースとしてOracle Databaseをセットアップしている場合、COMMON_USER_PREFIXパラメータが有効になる。

docs.oracle.com

 

これにより、Oracle Databaseにユーザーを作成する際は、共通の接頭辞をつけていないといかのようにエラーとなってしまう。

SQL> CREATE USER kdnakt IDENTIFIED BY dummypassword;
CREATE USER kdnakt IDENTIFIED BY dummypassword
            *
ERROR at line 1:
ORA-65096: invalid common user or role name

  

このサイトを参考にしながら、COMMON_USER_PREFIXを空文字に修正することで、プレフィクス制限を回避する。

blog.dbi-services.com

 

SQL> ALTER SYSTEM SET common_user_prefix='' scope=spfile;
System altered.
SQL> 

 

ここで、sqlplusから直接Oracle Databaseを再起動しようとすると権限不足のエラーが表示された。

SQL> STARTUP FORCE
ORA-01031: insufficient privileges

 

権限のあるユーザーで実行すればよいのだが、その方法がいまいちわからなかった。

ので、諦めてDockerコンテナを再起動することにした。VS Codeのコマンドから、Rebuild Containerを選択すると再起動できる。 

f:id:kidani_a:20210129041327p:plain

 

コンテナが起動したあと、さらにDBが起動するのを待って、再びVS Codeのターミナルを開いてsqlplusで接続する。

COMMON_USER_PREFIXの設定値を確認すると、意図どおり変更できていた。

SQL> SHOW PARAMETER common_user_prefix;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix                   string      
SQL> 

 

ユーザーを作成してみると、今度は接頭辞なしで問題なく作成できた。

SQL> CREATE USER kdnakt IDENTIFIED BY dummypassword;
User created.
SQL> 

 

 

[まとめ]

  • Oracle Database 19cをWindows上でdocker-composeを利用して起動した
  • VS CodeのRemote - Containersと組み合わせたのでファイル編集が楽
  • Oracle Database 12c以降のマルチテナント・コンテナ・データベースで発生するユーザー名接頭辞を回避するコマンドを試した

*1:ダウンロードにはOracleアカウントが必要。