Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

OracleDB

OracleDB11gのキャラクタセットを変更する手順について(手順編)

投稿日:2020年4月1日 更新日:

(0)目次&概説

(1) 記事の目的
(2) キャラクタセット変更手順
 (2-1) CSSCAN実行の準備
  (2-1-1) csminst.sqlファイルの確認
  (2-1-2) SQL*PlusにSYSDBAとして接続
  (2-1-3) csminst.sqlファイルの実行
  (2-1-4) ORA-12162エラーが出た時の対処
 (2-2) CSSCAN実行
 (2-3) CSSCANの実行結果の確認
 (2-4) CSALTERの実行
 (2-5) CSALTERの実行結果の確認
(3) 失敗した場合のリカバリ手順
 (3-1) 失敗した場合のリカバリ手順
  (3-1-1) データベースの停止
  (3-1-2) データベースの起動
  (3-1-3) 再度CSALTERスクリプトを実行
  (3-1-4) データベースの停止
  (3-1-5) データベースの起動
(4) 用語説明
(5) エラー対応
 (5-1) エラー:error while loading shared libraries
 (5-2) エラー:Unrecognized convertible data found in scanner result
 (5-3) エラー:Sorry only one session is allowed to run this script

(1) 記事の目的

別記事「OracleDB11gのキャラクタセットを変更する手順について(概要編)」の1章にて記載

(2) キャラクタセット変更手順

(2-1) CSSCAN実行の準備(csminst.sqlの実行)

まず最初の作業として、CSSCANを実行するために必要な「システム表」の作成などの準備作業を行います。これは「csminst.sql」を実行すると下記の処理を行ってくれます。

【csminst.sqlの処理内容】

①「CSMIG」ユーザー(≒スキーマ)の作成
②「CSMIG」への必要権限の割り当て
③「CSMIG」へのデフォルト表領域の割り当て
④「CSMIG」スキーマにCharacter Set Scanner用のシステム表の作成

 

(2-1-1) csminst.sqlファイルの確認

「csminst.sql」は原則は以下のパスに格納されています。

$ORACLE_HOME/rdbms/admin/csminst.sql

(図211)

もし環境変数「$ORACLE_HOME」が設定されていない場合は下記のコマンドでセットを行います。(※「/u01/app/oracle/product/11.2.0/dbhome_1」の部分は環境によって異なり、以下は一例です)

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
 
(2-1-2) SQL*PlusにSYSDBAとして接続

事前にOracleDB用のユーザーにスイッチします。

$ sudo su oracle

UNIX系OSの場合は次のコマンドで「csminst.sql」を実行します。

$ cd $ORACLE_HOME/bin 
$ ./sqlplus sys/password as sysdba
 
(2-1-3) csminst.sqlファイルの実行

下記のコマンドで「csminst.sql」を実行します。

SQL> START csminst.sql

(図213)①

(2-1-4) ORA-12162エラーが出た時の対処

もしSQL*Plusの起動時に「ORA-12162」エラーが出たら、環境変数「$ORACLE_SID」が設定されていない可能性があるので、下記の「セットコマンド」でセットします。

<エラーメッセージ>

SQL*Plus: Release 11.2.0.1.0 Production on Sun Mar 22 10:41:08 2020

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

ERROR:
ORA-12162: TNS:net service name is incorrectly specified

<セットコマンド>
“orcl”の箇所は各自のSIDに置き換えて実行します。

export ORACLE_SID=orcl

 

目次にもどる

(2-2) CSSCAN実行

CSSCANは「Character Set Scanner」の略で、DBのキャラクタセットを「変更」する場合の実現可能性を精査してくれるユーティリティです。DB内の全ての文字をチェックして、エンコーディングによって問題が発生するかをテストして結果のレポートを出力してくれます。

 

CSSCANを実施するためのコマンドを実行します。下記は変更先のキャラクタセットを”AL32UTF8″に設定した例です(※実行には「SYSDBA」の権限が必要)。

$ cd $ORACLE_HOME/bin
$ ./csscan "'SYSTEM/[your pass] AS SYSDBA'" full=y tochar=al32utf8 array=102400 process=1


↑【重要】ユーザー/パスワードの指定は「”‘user/pass'”」のようにダブルクォーテーション(“)とシングルクォーテーション(‘)の組み合わせで囲ってエスケープしている所がポイントになります。

目次にもどる

(2-3) CSSCANの実行結果の確認

スキャン結果のアウトプットは以下のファイルとして生成されます。
①scan.outファイル
どの表がスキャンされたかを示します。

(図231)

②scan.txt
データベース・スキャンのサマリー・レポートです。次のステップに進めるかのエラーの有無チェックにおいて重要なファイルです。このファイルで移行可否の状況(Convertible/Truncated/Lossy)などを確認できます。

(図232)

③scan.err
データベース・スキャンの個別例外レポートです。
(図233)

目次にもどる

(2-4) CSALTERの実行

(2-4-1) CSALTERの概要・実行方法

CSSCANの結果、CSALTERの実行条件を満たしている場合は、次はキャラクタセットの移行処理をするプログラム(csalter.plb)を実行します。CSALTERの実行前は原則、データベースのバックアップを取得します。

 CSALTERは引数を取らず、そのデータベース上で実行された最新のCSSCAN結果の情報をインプットとして実行されます。例えば、変換後のキャラクタセットの情報はCSSCANの「TOCHAR=al32utf8」の情報を使うなど。

■SQL*Plusへログイン

cd $ORACLE_HOME/bin
sqlplus sys/[your password] as sysdba

■CSALTER実行

SQL> @@'$ORACLE_HOME/rdbms/admin/csalter.plb'

SQL> @@'/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/csalter.plb'

■実行結果サンプル

This script will update the content of the Oracle Data Dictionary
Please ensure you have a full backup before initiating this procedure
Would you like to proceed (Y/N)?Y
old   6:     if (UPPER('&conf') <> 'Y') then
new   6:     if (UPPER('Y') <> 'Y') then
Checking data validity
begin converting system objects
178 rows in table SYS
(中略)
1 row in table ORDDATA

PL/SQL procedure successfully completed

Alter the database character set
CSALTER operation completed, please restart database

PL/SQL procedure successfully completed

0 rows deleted

Function dropped

Function dropped

Procedure dropped

 

(図241)

目次にもどる

(2-4-2) CSALTERの処理概要
1)実行条件チェック

この実行の中での主な処理として、「ユーザーログインがSYSかどうか?」のチェック(SYSにしか実行権限がない)や直近7日間の間にCSSCANを実施したか?のチェックなど、実行条件を満たしているか?のチェックや、CLOB列が変換可能か?などがチェックされます。

もしシングル・バイト・キャラクタセット→マルチ・バイト・キャラクタセットへ変換する場合、文字によっては「文字数<バイト数」となるケースがあるため、既存のカラム長(例:VARCHAR(n))では不足してしまい、切り落とされるケースが出てきてしまいます。

なので、もしスキャン結果(主にscan.txt)に”Lossy”(変換時消失)や”Truncated”(変換時切り捨て)が発生した場合は、修正⇒再スキャンが必要となります。

またConvertibleでもCLOB以外のデータ型のカラム(VARCHARなど)については修正処置が必要になってきます。

(表)scan.txtから読み取れるCSALTER実行可能条件について

Changeless 対処不要
(変更なしで移行可能)
Convertible CLOB以外は要対処。
①Changelessになるようにデータを可能な範囲で修正/削除(例:ASCII以外の文字は消すなど)
②バックアップ取得後にオブジェクトを削除して、キャラクタセット変換後に再度インポート
Truncated 要対処。
(変換の結果、切り捨てられる桁数の分だけ拡張するなど)
Lossy 要対処。
2)変換処理
データディクショナリやサンプルスキーマの全CLOBデータを変換したのちに、結果が「CSM$TABLES」ビューに保存されます。そして次に各種メタデータも移行先のキャラクタセットに変換されていきます。

 

(2-5) CSALTERの実行結果の確認

「CSALTER operation completed, please restart database」の通り、データベースを再起動します。

・データベースの停止

SQL> SHUTDOWN NORMAL

・データベースの起動

SQL> STARTUP OPEN

再度「sys.props$」テーブルを照会して「NLS_CHARACTERSET」の値を確認します。

(図251)

目次にもどる

(3) 失敗した場合の対応

(3-1) 失敗した場合のリカバリ手順

(3-1-1) データベースの停止
SQL> SHUTDOWN ABORT
(3-1-2) データベースの起動
SQL> STARTUP OPEN
(3-1-3) 再度CSALTERスクリプトを実行
SQL> @@'$ORACLE_HOME/rdbms/admin/csalter.plb'
(3-1-4) データベースの停止
SQL> SHUTDOWN NORMAL
(3-1-5) データベースの起動
SQL> STARTUP OPEN

目次にもどる

(4) 用語説明

別記事「OracleDB11gのキャラクタセットを変更する手順について(概要編)」の4章にて記載

(5) エラー対応

(5-1) エラー対応1:error while loading shared libraries

別記事「OracleDB11gのキャラクタセットを変更時に遭遇したエラーの対処方法」の5章1節にて記載

(5-2) エラー:Unrecognized convertible data found in scanner result

別記事「OracleDB11gのキャラクタセットを変更時に遭遇したエラーの対処方法」の5章2節にて記載

(5-3) エラー:Sorry only one session is allowed to run this script

別記事「OracleDB11gのキャラクタセットを変更時に遭遇したエラーの対処方法」の5章3節にて記載

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-OracleDB

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

OracleDB11gのキャラクタセットを変更時に遭遇したエラーの対処方法

(0)目次&概説 (1) 記事の目的 (2) キャラクタセット変更手順 (3) 失敗した場合のリカバリ手順 (4) 用語説明 (5) エラー対応  (5-1) エラー:error while load …

OracleDB11g で新規表領域とスキーマの作成

(0) 目次 (1) 表領域の作成 (2) スキーマの作成 (3) スキーマの接続権限を付与 (4) 用語解説 (1) 表領域の作成 表領域とデータベースファイル(dbf)を以下のコマンドで作成します …

ORA-28000エラーの解除方法と発生原因について

<目次> (1) 記事の目的  (1-1) エラー概要  (1-2) エラー原因  (1-3) エラー対策 (1) 記事の目的 (1-1) エラー概要 SQLDeveloperを使ってOracleDB …

ORA-00257エラーの対応(“archiver error. Connect Internal only. until freed”)

ORA-00257エラーの対応法についてです。 (“archiver error. Connect Internal only, until freed”) (0) 目次 (1 …

Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その1)

掲題の通り、LinuxにOracleDB(11g)をインストールする方法について書きます。 ■目次 (0)前提条件 (1)インストール要件の確認 (2)ユーザ/グループ作成 (3)Oracle DBソ …

  • English (United States)
  • 日本語
Top