Rainbow Engine

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

OracleDB

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

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

(0)目次&概説

(1) 記事の目的
(2) キャラクタセット変更手順
(3) 失敗した場合のリカバリ手順
(4) 用語説明
(5) エラー対応
 (5-1) エラー:error while loading shared libraries
  (5-1-1) 発生状況・エラーメッセージ
  (5-1-2) 原因
  (5-1-3) 対処方法
 (5-2) エラー:Unrecognized convertible data found in scanner result
  (5-2-1) 発生状況・エラーメッセージ
  (5-2-2) 原因①
  (5-2-3) 対処方法①
  (5-2-4) 原因②
  (5-2-5) 対処方法②
 (5-3) エラー:Sorry only one session is allowed to run this script
  (5-3-1) 発生状況・エラーメッセージ
  (5-3-2) 原因
  (5-3-3) 対処方法

(1) 記事の目的

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

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

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

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

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

(4) 用語説明

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

(5) エラー対応

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

(5-1-1) 発生状況・エラーメッセージ

<実行コマンド>

$ ./csscan '/ as sysdba' full=y tochar='al32utf8' array=102400 process=1

<エラーメッセージ>

./csscan: error while loading shared libraries: libclntsh.so.11.1: cannot open shared object file: No such file or directory

 

(図511)

目次にもどる

(5-1-2) 原因

環境変数「LD_LIBRARY_PATH」と「PATH」の設定漏れが原因でした。

目次にもどる

(5-1-3) 対処方法

次のコマンドを実行して環境変数を設定します。

export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin

環境変数を省略せずに書くと、私の場合は下記のようなパスでした。

export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib
export PATH=$PATH:/u01/app/oracle/product/11.2.0/dbhome_1/bin

ただし、exportでセットした環境変数はターミナルを閉じるまでしか有効でないため、永続的にセットしたい場合は「.bash_profile」でログイン時にセットされるように仕組む事を検討します。あとrelinkは必要?ライブラリ構成を変える訳ではないので必要ないか・・。

(図513).bash_profileの設定例

目次にもどる

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

(5-2-1) 発生状況・エラーメッセージ

<実行コマンド>
SQL*Plusより下記のコマンドを実行。

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.
(中略)
Checking data validity...
Unrecognized convertible data found in scanner result

目次にもどる

(5-2-2) 原因①

CSSCANの結果「変換不可」や「切り捨て対象」の値が発生していた可能性があります。

私の例では上記メッセージが出た際の「scan.txt」の内容をチェックしていくと「Truncated」となってしまう値が5件残存している事が発覚しました。

(図522)①scan.txtのTruncated傾向

値の特定のため「scan.txt」にて「Truncated」の警告が出ていたテーブル・カラムをチェックしていきました。そのカラムの型は「VARCHAR2(12 CHAR)」でした。

(図522)②テーブル定義 12CHAR

しかし、入っているデータの長さを見ていくと、確かにAL32UTF8へ変換したら12CHARを超えそうなレコードが5件ありました。

ユーロ記号「€」はシングルバイト・キャラクタセット⇒マルチバイト・キャラクタセット(AL32UTF8)への変換時には1バイト⇒3バイトになります(「€」はUnicodeでは3バイトの文字であるため)。なので左記のLENGTH=11の値は変換すると14バイトになります。

一方でカラムの定義としては「CHAR(12)」と12バイトのため、14バイトだとオーバーとなるため、スキャンの結果「Truncation」となっていました。

(図522)③テーブルのレコード確認

目次にもどる

(5-2-3) 対処方法①

変換するとバイト数が足りなくなるカラムについて、ALTER TABLEでカラムのバイト数上限を引き上げていきます。

ALTER TABLE [Table Name] MODIFY ([Column Name] VARCHAR2(20 char));

変更が出来たら、再度スキャン(CSSCAN)を実施⇒CSALTERの順で実行していきます。

目次にもどる

(5-2-4) 原因②

スキャン結果(scan.txt)にCLOB形式以外の”Convertible”データが混入していた事が原因でした。CLOB以外(例:VARCHAR等)の場合は処置が必要で、大きく下記2つのアプローチになります。

(表)CLOB以外の”Convertible”の扱い

Changeless 対処不要
(変更なしで移行可能)
Convertible CLOB以外は要対処。
①Changelessになるようにデータを可能な範囲で修正/削除(例:ASCII以外の文字は消すなど)
②バックアップ取得後にオブジェクトを削除して、キャラクタセット変換後に再度インポート
Truncated 要対処。
(変換の結果、切り捨てられる桁数の分だけ拡張するなど)
Lossy 要対処。

目次にもどる

(5-2-5) 対処方法②

ポイントとなるのはcsscanの「exclude」オプションを用いて、前回”Convertible”となっていたユーザーテーブルを対象外にしてスキャンをして、まずはCSALTERを最後まで実行させる事が必要となります。対象外にしたテーブルは事前にバックアップを取得しておき、CSALTER後に再度インポートします。

①”Convertible”と判定されたユーザーテーブルはexpdpでエクスポートします。

(※詳細な実行方法はOracleデータベースのバックアップをexpdpでリストアする方法を参照)

./expdp directory=DATA_PUMP_DIR dumpfile=APEX_SYSMAN_20200322.dmp tables=APEX_030200.WWV_FLOW_BANNER,APEX_030200.WWV_FLOW_BUTTON_TEMPLATES,(中略),SYSMAN.MGMT_SWLIB_ENTITY_DOCUMENTS

 

(図525)①expdp

②”Convertible”と判定されたユーザーテーブルはcsscanの「exclude」オプションで一旦スキャンの対象外にしてスキャンを実施する事でCSALTERの処理が完結するようにスキャン結果(scan.txt等)を生成します。

(※詳細な実行方法はこちらの(2-2)を参照)

./csscan "'SYSTEM/[Your Password] AS SYSDBA'" full=y tochar=al32utf8 array=102400 process=1 exclude=APEX_030200.WWV_FLOW_BANNER,APEX_030200.WWV_FLOW_BUTTON_TEMPLATES,(中略),SYSMAN.MGMT_SWLIB_ENTITY_DOCUMENTS

 

(図525)②csscan

■スキャン結果例

[Scan Summary]

All character type data in the data dictionary are convertible to the new character set
All character type application data remain the same in the new character set

[Data Dictionary Conversion Summary]

Data Dictionary Tables:

Datatype                    Changeless      Convertible       Truncation            Lossy
--------------------- ---------------- ---------------- ---------------- ----------------
VARCHAR2                     4,466,116                0                0                0
CHAR                             2,588                0                0                0
LONG                           240,470                0                0                0
CLOB                            92,175            7,391                0                0
VARRAY                          42,148                0                0                0
--------------------- ---------------- ---------------- ---------------- ----------------
Total                        4,843,497            7,391                0                0
Total in percentage             99

The data dictionary can be safely migrated using the CSALTER script

XML CSX Dictionary Tables:

Datatype                    Changeless      Convertible       Truncation            Lossy
--------------------- ---------------- ---------------- ---------------- ----------------
VARCHAR2                           495                0                0                0
CHAR                                 0                0                0                0
LONG                                 0                0                0                0
CLOB                                 0                0                0                0
VARRAY                               0                0                0                0
--------------------- ---------------- ---------------- ---------------- ----------------
Total                              495                0                0                0
Total in percentage            100

[Application Data Conversion Summary]

Datatype                    Changeless      Convertible       Truncation            Lossy
--------------------- ---------------- ---------------- ---------------- ----------------
VARCHAR2                     3,809,983                0                0                0
CHAR                                48                0                0                0
LONG                                 0                0                0                0
CLOB                             7,937                0                0                0
VARRAY                           6,912                0                0                0
--------------------- ---------------- ---------------- ---------------- ----------------
Total                        3,824,880                0                0                0
Total in percentage            100

 

③CSALTERスクリプトを実行します。
(※詳細な実行方法はこちらの(2-4)を参照)

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

(図525)③csalter


※スキップしたテーブルは一時的に文字化けする(再度インポートすれば直る)

④キャラクタセットの変更が完了したら、”Convertible”と判定されたユーザーテーブルをimpdpで再度インポートします(インポート時に自動的に新しいキャラクタセットで取り込まれる)。注意点としてオプション「table_exists_action=REPLACE」でテーブルを上書きインポートしています。

(※詳細な実行方法はOracleデータベースのバックアップをimpdpでリストアする方法を参照)

./impdp directory=DATA_PUMP_DIR dumpfile=APEX_SYSMAN_20200322.dmp logfile=APEX_SYSMAN_20200322.log tables=APEX_030200.WWV_FLOW_BANNER,APEX_030200.WWV_FLOW_BUTTON_TEMPLATES,(中略),SYSMAN.MGMT_SWLIB_ENTITY_DOCUMENTS table_exists_action=REPLACE

 

(図525)④impdp


インポート後は文字化けが直る

  >目次にもどる

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

(5-3-1) 発生状況・エラーメッセージ

<実行コマンド>
SQL*Plusより下記のコマンドを実行。

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.
(中略)
Checking data validity...
Sorry only one session is allowed to run this script

目次にもどる

(5-3-2) 原因

スクリプトを実行しているセッションが既に存在している場合にこのエラーが発生しています。

目次にもどる

(5-3-3) 対処方法

他に使用しているユーザがおらず、意図せずセッションが残ってしまっている場合は、一度データベースを再起動してからコマンドを再実行する事で解決する可能性があります。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-OracleDB

執筆者:


comment

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

関連記事

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

目次 (4)インストーラの進行  (4-1)セキュリティUpdate構成  (4-2)インストールオプション選択  (4-3)Gridインストールオプション  (4-4)製品言語の選択  (4-5)デ …

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

掲題の通り、LinuxにOracleDB(11g)をインストールする方法について書きます。 「(その3)」の続編記事です。 https://rainbow-engine.com/2017/05/05/ …

Tomcatを使ったフォーム認証でユーザ情報をデータベース管理する方法

<目次> (1) Tomcatを使ったフォーム認証でユーザ情報をデータベース管理する方法  (1-1) 前提条件  (1-2) STEP1:context.xmlにコネクションプールを設定  (1-3 …

SQLでCASE文の結果をWHERE句に指定する方法およびコスト面の考察

本記事では、 ・SQLでCASE文の結果をWHERE句に指定する方法について記述します。 ・CASE文を使う場合のコストについて考察します。 (0)目次&概説 (1) NG例 (2) OK例&解説 ( …

OracleDBのexpdp/impdpで発生したエラー対処[ORA-39002,ORA-39070,ORA-39087]&[ORA-39083,ORA-01658]

(4) エラー対応  (4-1) エラー1:ORA-39002,ORA-39070,ORA-39087   (4-1-1) 発生状況・エラーメッセージ   (4-1-2) 原因   (4-1-3) 対 …

  • English (United States)
  • 日本語
Top