PDB 環境の初期化パラメーター max_string_size 変更を試す（Oracle Database 21c) 

本記事ではマルチテナント（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 における操作方法は [こちら](https://docs.oracle.com/cd/F39414_01/refrn/MAX_STRING_SIZE.html#GUID-D424D23B-0933-425F-BC69-9C0E6724693C) のマニュアルで説明されています。

# PDB単位の変更
　特定の PDB のみ変更する場合は、管理者権限で PDB を UPGRADE モードでオープンします。

```SQL:
$ sqlplus / as sysdba
接続されました。

SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN UPGRADE;

プラガブル・データベースが変更されました。

SQL> ALTER SESSION SET CONTAINER=pdb1;

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

初期化パラメーターを変更します。

```SQL:
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:
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:
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:
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 が変更されていても問題ありません。

```Shell:
$ 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 メッセージが出力されたら実行成功です。ログの内容を確認します。

```Shell:
$ 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:
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
```