1. データベース削除前の準備
  2. データベース削除
  3. シフトJISのデータベース作成
  4. 確認

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です。