Data Pump のチェックサム機能を試す（Oracle Database 21c）

Oracle Database 21c の Data Pump にはチェックサム機能が追加されました。これはエクスポート時にダンプファイルのブロックにチェックサムを付与し、インポート時に検証を行うというものです。ダンプファイルの検証のみを行うこともできます。

# 準備
この機能を利用するためには、初期化パラメーター compatible を 20.0 以上に指定する必要があります。

```SQL:compatible
SQL> SHOW PARAMETER compatible

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      21.0.0
noncdb_compatible                    boolean     FALSE
```

# エクスポート
expdp コマンドによるエクスポート時、標準ではチェックサムは付与されません。チェックサム機能を有効にするには CHECKSUM=YES オプションを指定します。チェックサムのアルゴリズムはデフォルトでは SHA256 が使用されます。デフォルト値を変更する場合には CHECKSUM_ALGORITHMオプションを指定します。指定できる値は「CRC32」、「SHA256」、「SHA384」、「SHA512」です。CHECKSUM_ALGORITHM オプションだけを指定してもチェックサム機能は有効になります。
チェックサムを有効にしたエクスポートではログに「ダンプ・ファイル・セットのチェックサムを生成しています」が出力されます。

```SHELL:export_with_checksum
$ expdp userid=pdbadmin/{password}@PDB1 schemas=scott dumpfile=scott_sha512.dmp checksum=yes checksum_algorithm=sha512

Export: Release 21.0.0.0.0 - Production on 木 10月 14 17:17:42 2021
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
"PDBADMIN"."SYS_EXPORT_SCHEMA_01"を起動しています: userid=pdbadmin/********@PDB1 schemas=scott dumpfile=scott_sha512.dmp checksum=yes checksum_algorithm=sha512
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
オブジェクト型SCHEMA_EXPORT/USERの処理中です
オブジェクト型SCHEMA_EXPORT/SYSTEM_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/DEFAULT_ROLEの処理中です
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
. . "SCOTT"."DATA1"                             1.425 MB  100000行がエクスポートされました
マスター表"PDBADMIN"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
ダンプ・ファイル・セットのチェックサムを生成しています
******************************************************************************
PDBADMIN.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  /u01/app/oracle/admin/O21C/dpdump/C97E54F196FA8565E053E101A8C0F15D/scott_sha512.dmp
ジョブ"PDBADMIN"."SYS_EXPORT_SCHEMA_01"が木 10月 14 17:17:51 2021 elapsed 0 00:00:08で正常に完了しました
```

チェックサム機能を有効にした場合、またアルゴリズムを変更した場合でもダンプファイルのサイズは変わりませんでした。

# チェック
ダンプファイルの整合性をチェックためには impdp コマンドに VERIFY_ONLY=YES オプションを指定します。以下の例ではダンプファイル scott_sha512.dmp ファイルが一部破損した状態でチェックを行っています。破損をチェックして「ORA-39412」エラーが出力されています。ただし expdp コマンドの終了ステータスは 0 になっています。

```SHELL:import_verify_only
$ impdp userid=pdbadmin/{password}@PDB1 schemas=scott dumpfile=scott_sha512.dmp verify_only=yes

Import: Release 21.0.0.0.0 - Production on 木 10月 14 19:01:02 2021
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
ダンプ・ファイル・チェックサムを検証しています
マスター表"PDBADMIN"."SYS_IMPORT_SCHEMA_01"は正常にロード/アンロードされました
ダンプ・ファイル・セットは完全です
ORA-39412: ダンプ・ファイル"/u01/app/oracle/admin/O21C/dpdump/C97E54F196FA8565E053E101A8C0F15D/scott_sha512.dmp"でファイル・チェックサム・エラーが発生しました

ダンプ・ファイル・セットには一貫性がありません
ジョブ"PDBADMIN"."SYS_IMPORT_SCHEMA_01"が完了しましたが、1エラーが木 10月 14 19:01:04 2021 elapsed 0 00:00:01で発生しています

$ echo $?
0
```

# インポート
チェックサムを付与したダンプファイルを通常通りインポートしてもチェックサムは検証されません。以下の例では破損したファイルをインポートしていますがエラーは検知できていません。ログに「警告: ダンプ・ファイル・チェックサムの検証が無効です」が出力されます。

```SHELL:import_default
$ impdp userid=pdbadmin/{password}@PDB1 schemas=scott dumpfile=scott_sha512.dmp content=data_only

Import: Release 21.0.0.0.0 - Production on 木 10月 14 17:21:45 2021
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
警告: ダンプ・ファイル・チェックサムの検証が無効です
マスター表"PDBADMIN"."SYS_IMPORT_SCHEMA_01"は正常にロード/アンロードされました
"PDBADMIN"."SYS_IMPORT_SCHEMA_01"を起動しています: userid=pdbadmin/********@PDB1 schemas=scott dumpfile=scott_sha512.dmp content=data_only
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "SCOTT"."DATA1"                             1.425 MB  100000行がインポートされました
ジョブ"PDBADMIN"."SYS_IMPORT_SCHEMA_01"が木 10月 14 17:21:49 2021 elapsed 0 00:00:03で正常に完了しました
```

チェックサムの検証とインポートを両方実施する場合には VERIFY_CHECKSUM=YES オプションを指定します。下記の例ではチェックサムのエラー「ORA-39412」と「ORA-39002」が発生してます。エラーが発生すると impdp コマンドの終了ステータスは 1 になります。

```SHELL:import_with_verify
$ impdp userid=pdbadmin/{password}@PDB1 schemas=scott dumpfile=scott_sha512.dmp content=data_only verify_checksum=yes

Import: Release 21.0.0.0.0 - Production on 木 10月 14 19:13:13 2021
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
ORA-39002: 操作が無効です
ORA-39412: ダンプ・ファイル"/u01/app/oracle/admin/O21C/dpdump/C97E54F196FA8565E053E101A8C0F15D/scott_sha512.dmp"でファイル・チェックサム・エラーが発生しました

$ echo $?
1
```