(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バイトになります。
(図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) 対処方法
他に使用しているユーザがおらず、意図せずセッションが残ってしまっている場合は、一度データベースを再起動してからコマンドを再実行する事で解決する可能性があります。