OracleのDockerイメージwnameless/oracle-xe-11gを使うと文字コードのデフォルトはAL32UTF8
になります。
プロジェクトで使っているOracleは文字コードがJA16EUC
になっており、
その文字コードで動くOracleの構築の際に色々と躓いたのでメモ代わりに。
環境
Oracle 11g
手順
Oracleの文字コードを変更するのは、DBの設定を書き換えれば終わりと言うわけにはいかないようで、
既存のDBを一度削除して、文字コードを指定して再度作成する必要があるとのこと。
参考: Oracle 11g XEのDBをShift JIS化する
ただ、Dockerのイメージ作成のタイミングだとまだDBを作成していないので、
最後の
createdb.sh -dbchar JA16SJIS
の部分だけを実行するだけでよかったのでそれで構築。
※ちなみに、init.oraあたりを書き換えたらすんなり出来るのでは、と思って色々試してみたのですが、うまく行かず…
準備
以下のDockerファイルを用意
FROM wnameless/oracle-xe-11g
RUN su -l oracle -c "PATH=$PATH:/u01/app/oracle/product/11.2.0/xe/bin/ ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe /u01/app/oracle/product/11.2.0/xe/bin/createdb.sh -dbchar JA16EUC"
rootユーザでコマンドを実行するとエラーになったのでoracleユーザに切り替えて実行したのですが、
何故か環境変数が読み込まれず、sqlplus
がnot foundになったりしたので、
oracleユーザで実行しつつ明示的に環境変数を指定しています。
上記では、createdb.sh
の場所を直指定するのと、sqlplus
等のoracle周りのコマンドが実行できるようPATH
とORACLE_HOME
の環境変数を指定しています。
実行
上記のDockerのコンテナを起動します。
一度DBが削除されるので、起動直後にDBに接続しようとするとエラーになる場合があります。
少し時間を置いた後、sqlplus
等で接続して確認。
# sqlplus sys/oracle@oracle/xe as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on 火 9月 17 09:32:02 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
VALUE
--------------------------------------------------------------------------------
JA16EUC
SQL>
無事文字コードがJA16EUC
に変更されました。
課題
今回、createdb.sh
を使ってDBを作り直していますが、
この処理に時間がかかるみたいで、コンテナ作成してから使えるようになるまで時間がかかっていました。
time
でbuildの時間を計ってみたんですが、50分ほどかかりました。
この設定なしで普通にbuildした場合は数分で終わるので、色々と改善点はありそうです。
Dockerfile
も、もう少し最適化できる気がするのでいずれ調査します。