Oracle 11g XEのキャラクタセットはUTF-8ですが、古いシステムだとシフトJISで使用しているところがあります。 今まで2回だけOracleを使用しているところでの仕事がありましたが、どちらもシフトJISでした。 そのため、データベースのキャラクタセットをシフトJISに変更してみます。 ただし、無料版は同時にインスタンスが1つしか使えないため、デフォルトのデータベースとの共存ができないそうです。 そこで、一旦UTF-8のデータベースを削除して、シフトJISに変更したデータベースを作成します。

データベース削除前の準備

initXE.oraの作成

自分でpfileを作成できる人は必要ないですが、Oracleが良く分かってない場合は デフォルトのspfileからpfileを作成するのが簡単かと思います。 そのためデータベースを削除する前に、デフォルトのspfileからinitXE.oraを作成しておきます。 デフォルトのspfileは以下になります。

/u01/app/oracle/product/11.2.0/xe/dbs/spfileXE.ora

作成は、spfileXE.oraがあるディレクトリに移動後、sysdbaで接続して"create pfile"コマンドで行います。

$ cd /u01/app/oracle/product/11.2.0/xe/dbs
$ sqlplus / as sysdba
SQL> create pfile = 'initXE.ora' from spfile = 'spfileXE.ora';

作成されたinitXE.oraファイルの中身は以下になります。

XE.__db_cache_size=117440512
XE.__java_pool_size=4194304
XE.__large_pool_size=4194304
XE.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
XE.__pga_aggregate_target=167772160
XE.__sga_target=251658240
XE.__shared_io_pool_size=0
XE.__shared_pool_size=117440512
XE.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/XE/adump'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/XE/control.dbf'
*.db_name='XE'
*.DB_RECOVERY_FILE_DEST='/u01/app/oracle/fast_recovery_area'
*.DB_RECOVERY_FILE_DEST_SIZE=10G
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=XEXDB)'
*.job_queue_processes=4
*.memory_target=417333248
*.open_cursors=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=20
*.shared_servers=4
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'

データベース削除

データベースの停止・削除

sysdbaで接続してシャットダウンを実施します。

# su - oracle
$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on 金 9月 5 15:28:29 2014

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



Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

データベースを削除するときは以下のようにrestrictを指定して起動します。

SQL> startup restrict mount
ORACLEインスタンスが起動しました。

Total System Global Area  417546240 bytes
Fixed Size                  2227080 bytes
Variable Size             306185336 bytes
Database Buffers          104857600 bytes
Redo Buffers                4276224 bytes
データベースがマウントされました。

その後、データベースを削除してsqlplusを一旦終了します。

SQL> drop database;

データベースが削除されました。

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionとの接
続が切断されました。
SQL> quit
					$

シフトJISのデータベース作成

11g. EXでデフォルトのデータベースを削除したので、新規データベースの作成が可能になります。 データベース作成では、最初に作成用のスクリプトを作成しておきます。 いろいろなパラメータを決めたスクリプトができたら、sqlplusから実行してデータベースを作成します。

データベース作成用スクリプト

シフトJIS用データベースを作成するファイルを作成します。 今回のは、Oracleのドキュメントページにあったものを参考にして作成しました。

/u01/app/oracle/product/11.2.0/xe/dbs/createdb.sql

CREATE DATABASE XE
   LOGFILE GROUP 1 ('/u01/app/oracle/oradata/XE/redo01a.log') SIZE 100M BLOCKSIZE 512,
           GROUP 2 ('/u01/app/oracle/oradata/XE/redo02a.log') SIZE 100M BLOCKSIZE 512,
           GROUP 3 ('/u01/app/oracle/oradata/XE/redo03a.log') SIZE 100M BLOCKSIZE 512
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   CHARACTER SET JA16SJIS
   NATIONAL CHARACTER SET UTF8
   EXTENT MANAGEMENT LOCAL
   DATAFILE '/u01/app/oracle/oradata/XE/system01.dbf'
      SIZE 325M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   SYSAUX DATAFILE '/u01/app/oracle/oradata/XE/sysaux01.dbf'
      SIZE 325M REUSE  AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TABLESPACE users
      DATAFILE '/u01/app/oracle/oradata/XE/users01.dbf'
      SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TEMPORARY TABLESPACE temp
      TEMPFILE '/u01/app/oracle/oradata/XE/temp01.dbf'
      SIZE 20M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   UNDO TABLESPACE undotbs1
      DATAFILE '/u01/app/oracle/oradata/XE/undo01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
				
注. ディスクのセクタサイズが4Kの場合は、BLOCKSIZEを4096に変更します。

参考

今回は簡単なテスト用なので、使用するディスク容量を少なくしたいと思い、あとからディスク容量を減らしたスクリプトに変更しました。

インスタンス起動とデータベース作成

データベース作成用スクリプトが用意できたらsysdba権限で接続して、データベース削除前に作成した以下のpfileを指定してインスタンスを起動させます。

/u01/app/oracle/product/11.2.0/xe/dbs/initXE.ora

インスタンスの起動では、マウントせずにpfileを指定します。

SQL> startup nomount pfile=initXE.ora

実行例は以下のようになります。

$ cd /u01/app/oracle/product/11.2.0/xe/dbs/
$ sqlplus / as sysdba
SQL> startup nomount pfile=initXE.ora
ORACLEインスタンスが起動しました。

Total System Global Area  417546240 bytes
Fixed Size                  2227080 bytes
Variable Size             293602424 bytes
Database Buffers          117440512 bytes
Redo Buffers                4276224 bytes

次にシフトJIS用データベース作成スクリプトを実行してデータベースを作成します。

SQL> @createdb.sql

データベースが作成されました。


表領域が作成されました。


データベースが変更されました。

データベース作成後に実行するスクリプト

sysdba権限で以下の2つのスクリプトを実行して必要な機能をインストールします。

/u01/app/oracle/product/11.2.0/xe/rdbms/admin/catalog.sql
/u01/app/oracle/product/11.2.0/xe/rdbms/admin/catproc.sql

実行例

SQL> @/u01/app/oracle/product/11.2.0/xe/rdbms/admin/catalog.sql
・・・
PL/SQLプロシージャが正常に完了しました。


TIMESTAMP
--------------------------------------------------------------------------------
COMP_TIMESTAMP CATALOG    2014-09-16 13:20:52

SQL> @/u01/app/oracle/product/11.2.0/xe/rdbms/admin/catproc.sql
・・・
TIMESTAMP
--------------------------------------------------------------------------------
COMP_TIMESTAMP CATPROC    2014-09-16 13:27:49

1行が選択されました。

SQL>
SQL> SET SERVEROUTPUT OFF

PRODUCT_USER_PROFILE表の再作成

データベースを手動で作成した場合、PRODUCT_USER_PROFILE表の再作成が必要になります。

参考

systemで接続して、以下のスクリプトでPRODUCT_USER_PROFILE表を再作成します。

/u01/app/oracle/product/11.2.0/xe/sqlplus/admin/pupbld.sql
実行例
SQL> connect system/manager
接続されました。
SQL> @/u01/app/oracle/product/11.2.0/xe/sqlplus/admin/pupbld.sql

SQL> --
SQL> -- Copyright (c) Oracle Corporation 1988, 2003.  All Rights Reserved.
SQL> --
SQL> -- NAME
SQL> --   pupbld.sql
SQL> --
SQL> -- DESCRIPTION
SQL> --   Script to install the SQL*Plus PRODUCT_USER_PROFILE tables.  These
SQL> --   tables allow SQL*Plus to disable commands per user.  The tables
SQL> --   are used only by SQL*Plus and do not affect other client tools
SQL> --   that access the database.  Refer to the SQL*Plus manual for table
SQL> --   usage information.
SQL> --
SQL> --   This script should be run on every database that SQL*Plus connects
SQL> --   to, even if the tables are not used to restrict commands.
SQL>
SQL> -- USAGE
SQL> --   sqlplus system/<system_password> @pupbld
SQL> --
SQL> --   Connect as SYSTEM before running this script
SQL>
SQL>
SQL> -- If PRODUCT_USER_PROFILE exists, use its values and drop it
・・・
・・・
SQL> CREATE PUBLIC SYNONYM PRODUCT_USER_PROFILE FOR SYSTEM.PRODUCT_PRIVS;

シノニムが作成されました。

SQL>
SQL> -- End of pupbld.sql

確認

キャラクタセットの確認

データベースのキャラクタセットがシフトJISになっていることを確認します。

SQL> SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%';

PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
JA16SJIS

NLS_NCHAR_CHARACTERSET
UTF8
NLS_CHARACTERSETが JA16SJIS になっていたらOKです。