OracleXE 11gの SJIS化

注釈

この記事について

  • OracleDatabase Express Edition(XE) 11g のDockerコンテナで文字コードを変更するためにやったことを書く(N番煎じ)
  • 11gでは文字コードはデフォルトでUTF8となっており、変更するためにはDBを再構築する必要がある
  • 単体テストとかで使いたいので、起動したときに既に文字コードが変更されている状態にしたい
  • 「え、今の時代に11g…?」
    • 仰るとおりだと思いますが、古いシステムだし皆さんのところにもそういうのありますよね?ね?

前提

  • oracleが公開しているDockerfileを使って作成したイメージをベースイメージとする
    • 記事作成時点での最新コミットは 0972d17

手順

追加で修正する箇所

  • CMDコマンドで実行されている$ORACLE_BASE/$RUN_FILEを実行しないようにする必要がある
    • 起動時に/etc/init.d/oracle-xe configureが実行されないようにするため
  • 以下のことを自前で行う
    • tnsnames.oraの書き換え
    • listener.oraの書き換え
    • /etc/init.d/oracle-xe configureに渡すrspファイルの書き換え
      • SYSとSYSTEM向けのパスワードの部分

上記もろもろに対応したDockerfile

確認

  • コンテナを起動
$ docker run --name oracle --shm-size 1g --rm nkiri/oracle/database:11.2.0.2-sjis
  • 別ターミナルでdocker execでコンテナに入る
$ docker exec -it oracle
  • 以下のコマンドを実行
su -p oracle -c "sqlplus -s / as sysdba" <<EOS
> select * from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
> EOS
  • 結果
PARAMETER
------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
JA16SJISTILDE

まとめ

  • まぁできるんだけど、ビルドに1時間くらいかかる…
  • SYSとSYSTEMのパスワードをビルド時に確定することになるので、公式のやつより若干自由度が下がる