本記事ではマルチテナント(PDB)環境で Oracle Database の文字列型の最大長を拡張する方法について説明しています。
初期化パラメーター max_string_size
Oracle Database では伝統的にテーブルの VARCHAR2 型や NVARCHAR2 型の列の最大長は 4,000 バイトでした。Oracle Database 12c から初期化パラメーター max_string_size を変更することにより最大バイト数を拡大できるようになりました。
データ型 | 最大バイト数 (デフォルト) | 最大バイト数 (拡張後) | PL/SQL の最大長 |
---|---|---|---|
CHAR | 2,000 | 2,000 | 32,767 |
NCHAR | 2,000 | 2,000 | 32,767 |
VARCHAR2 | 4,000 | 32,767 | 32,767 |
NVARCHAR2 | 4,000 | 32,767 | 32,767 |
RAW | 2000 | 32,757 | 32,767 |
初期化パラメーター max_string_size のデフォルト値は STANDARD 、拡大する場合は EXTENDED を指定します。この初期化パラメーターは一度変更すると元に戻せず、有効化するためには追加手順が必要です。初期化パラメーターの変更方法をPDB単体の場合と、CDB と全 PDB を一括変更する場合についてそれぞれ説明します。Oracle Database 21c における操作方法は こちら のマニュアルで説明されています。
PDB単位の変更
特定の PDB のみ変更する場合は、管理者権限で PDB を UPGRADE モードでオープンします。
$ sqlplus / as sysdba
接続されました。
SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN UPGRADE;
プラガブル・データベースが変更されました。
SQL> ALTER SESSION SET CONTAINER=pdb1;
セッションが変更されました。
初期化パラメーターを変更します。
SQL> SHOW PARAMETER max_string_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string STANDARD
SQL> ALTER SYSTEM SET max_string_size=EXTENDED;
システムが変更されました。
${ORACLE_HOME}/rdbms/admin/utl32k.sql スクリプトを実行します。
SQL> @?/rdbms/admin/utl32k.sql
セッションが変更されました。
セッションが変更されました。
DOC>#######################################################################
DOC>#######################################################################
DOC> The following statement will cause an "ORA-01722: invalid number"
DOC> error if the database has not been opened for UPGRADE.
DOC>
DOC> Perform a "SHUTDOWN ABORT" and
DOC> restart using UPGRADE.
DOC>#######################################################################
DOC>#######################################################################
DOC>#
<<省略>>
セッションが変更されました。
PDB を再オープンします。
SQL> ALTER PLUGGABLE DATABASE pdb1 CLOSE;
プラガブル・データベースが変更されました。
SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;
プラガブル・データベースが変更されました。
SQL> SHOW PARAMETER max_string_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string EXTENDED
CDB の設定はそのままです。
SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;
セッションが変更されました。
SQL> SHOW PARAMETER max_string_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string STANDARD
CDB/PDB 一括の変更
CDB と CDB に含まれる PDB の設定を一括で変更するスクリプト catcon.pl が提供されています。実行前にログファイルを出力するためのディレクトリを作成します。
下記の例では /tmp/utl32k_cdb_pdbs_output ディレクトリを作成し、catcon.pl スクリプトの -l オプションで指定しています。SYS ユーザーのパスワードを聞かれるため入力します。このスクリプトは一部の PDB について初期化パラメーター max_string_size が変更されていても問題ありません。
$ mkdir /tmp/utl32k_cdb_pdbs_output
$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u SYS --force_pdb_mode 'UPGRADE' -d $ORACLE_HOME/rdbms/admin -l '/tmp/utl32k_cdb_pdbs_output' -b utl32k_cdb_pdbs_output utl32k.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/utl32k_cdb_pdbs_output/utl32k_cdb_pdbs_output_catcon_730762.lst]
catcon::set_log_file_base_path: catcon: See [/tmp/utl32k_cdb_pdbs_output/utl32k_cdb_pdbs_output*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/tmp/utl32k_cdb_pdbs_output/utl32k_cdb_pdbs_output_*.lst] files for spool files, if any
Enter Password:
catcon.pl: completed successfully
completed successfully メッセージが出力されたら実行成功です。ログの内容を確認します。
$ cd /tmp/utl32k_cdb_pdbs_output/
$ ll
total 32
-rw------- 1 oracle oinstall 10839 Dec 22 10:51 utl32k_cdb_pdbs_output0.log
-rw------- 1 oracle oinstall 5849 Dec 22 10:51 utl32k_cdb_pdbs_output1.log
-rw------- 1 oracle oinstall 5850 Dec 22 10:51 utl32k_cdb_pdbs_output2.log
-rw------- 1 oracle oinstall 473 Dec 22 10:51 utl32k_cdb_pdbs_output_catcon_730762.lst
インスタンスの再起動を行います。
SQL> SHUTDOWN IMMEDIATE
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> STARTUP
ORACLEインスタンスが起動しました。
Total System Global Area 1644166648 bytes
Fixed Size 9686520 bytes
Variable Size 402653184 bytes
Database Buffers 1224736768 bytes
Redo Buffers 7090176 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> SHOW PARAMETER max_string_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string EXTENDED