Database

Oracle 11g XEへのデータ移行方法を検討してみる

スポンサーリンク

Oracleのデータ移行時は移行元と移行先の文字コードに注意する必要があります。

Windows環境のOracleでは「JA16SJIS」や「JA16SJISTILDE」が標準の文字コードであり、Oracle 11g Express Edition(XE)では「AL32UTF8」が標準の文字コードです。

文字コードの違いは、sjisが1文字あたり1~2バイトで扱い、UTFは1文字あたり1~3バイトで扱います。
1文字あたりのバイト数が異なる為、文字列型(VARCHAR, VARCHA2)のデータを移行する場合にバイト数オーバーでエラーになる場合があります。

ここでは文字コードが「JA16SJISTILDE」のDBから「AL32UTF8」のXEへデータを移行すると想定した場合の移行方法を記載します。

案1 文字コードを変更する

移行元と移行先の文字コードを同じにしてデータ移行を行います。

Oracle 11g XEで文字コードを変更する場合は、1サーバ1インスタンスの制約がある為、データベースを再作成する必要があり、再作成時に文字コードを「JA16SJISTILDE」に指定します。

案2 定義を変更する

文字型を扱う単位をバイト数から文字数に変更してデータ移行を行います。

文字型の項目をVARCHAR2→NVARCHAR2に定義を変更してデータ移行を行います。
移行元で定義変更が難しい場合は、先に表定義のみインポートして定義変更後にデータを移行します。

1.表定義のエクスポート

expdp system/manager@orcl directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名
CONTENT=metadata_only -- VERSION=11.2.0 12cの場合に指定

2.表定義のインポート

impdp system/manager@xe directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名

3.表定義の変更
VARCHAR2の項目をNVARCHAR2に変更する

4.データのエクスポート

expdp system/manager@orcl directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名 
CONTENT=data_only VERSION=11.2.0 -- VERSION=11.2.0 12cの場合に指定

5.データのインポート

impdp system/manager@xe directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名

または、Oracleパラメータ「NLS_LENGTH_SEMANTICS」を変更してデータ移行を行います。
 icon-check-square-o パラメータを設定後にテーブルを作成する必要があります。テーブルをインポートして作成した場合は設定は反映されません。

SQL> show parameters nls_length_semantics;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      BYTE

SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR';

セッションが変更されました。


SQL> show parameters nls_length_semantics;

NAME
------------------------------------
TYPE                                         VALUE
-------------------------------------------- ------------------------------
nls_length_semantics
string                                       CHAR

タイトルとURLをコピーしました