Oracle Immutable Tableを19c (19.11)で使ってみた

Blockchain Table

Oracle Databaseの新機能である改ざん不能型データベースのOracle Blockchain Tableに続きOracle Immutable Tableが使えるようになりました。今回はOracle Immutable Tableを使うまでの準備から実際に使用するまでを紹介します。

現在Oracle Immutable Tableは19cのRUである19.11にて利用ができます。

前回の記事ではOracle Database 19cに19.10RUパッチ + 個別パッチを当ててOracle Blockchain Tableを作成しました。今回も同じDatabaseにRUパッチを当てて19.11にバージョンを上げて使用します。

Oracle Immutable Tableとは

Oracle Immutable Tableとはこちらのドキュメント では以下のように説明されています。

Immutable tables are insert-only tables in which existing data cannot be modified. Immutable tables protect data against unauthorized modification by insiders. Immutable tables also prevent accidental data modification that may be caused by human error.

訳:イミュータブルテーブルとは既存データの修正が不可能であるInsert-Onlyのテーブルであり、内部の承認されていない修正からデータを保護するテーブルである。また、誤ってデータを変更、削除してしまうといったヒューマンエラーも防ぎます。

Immutable Tables Database New Features Guide
(https://docs.oracle.com/en/database/oracle/oracle-database/19/newft/immutable-tables.html)

名前の通りImmutable (不変な) テーブルであり、Insert-Onlyであるためデータに変更を加える操作や削除操作ができません。

Oracle Blockchain Tableでも同じ機能がありましたが、Oracle Blockchain Tableからhash値の計算、格納、検証といった監査性を除き、耐改ざん性に特化したものがOracle Immutable Tableになります。

では早速Oracle Immutable Tableの利用準備に取り掛かります。

利用環境

まず今回利用する環境です。

こちらの記事の「19cでOracle Blockchain Tableを作成した環境」を引き続き使います。

  • OS Oracle Linux 7.9
  • Oracle Database 19c EE (バージョン 19.10 + 個別パッチ「32431413」適用済)
  • オンプレミス想定(非クラウドサービス)
  • マルチテナント PDB構成

RU 19.11パッチの適用

まずパッチファイルをダウンロードしてきます。Doc ID 19202104.9こちらのドキュメントからDATABASE RELEASE UPDATE 19.11.0.0.0 Patch <32545013>をダウンロードします。

NameDownload Link
Database Release Update 19.11.0.0.210420<Patch 32545013>

*ご利用の環境に対応したパッチをダウンロードしてください(2021/4/29 現在はLinux x86-64 (American English) のみ)。

ダウンロードしたp32545013_190000_Linux-x86-64.zipを解凍したディレクトリに移動します。

[oracle@db19c-146641 Downloads]$ cd 32545013
[oracle@db19c-146641 32545013]$

OPatchを使いパッチの競合確認、パッチの適用を行います。*この時データベースをシャットダウンしておいてください。

[oracle@db19c-146641 32545013]$ $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./
Oracle Interim Patch Installer version 12.2.0.1.24
Copyright (c) 2021, Oracle Corporation.  All rights reserved.

PREREQ session

Oracle Home       : /u01/app/oracle/product/19.3/dbhome_1
Central Inventory : /u01/app/oraInventory
   from           : /u01/app/oracle/product/19.3/dbhome_1/oraInst.loc
OPatch version    : 12.2.0.1.24
OUI version       : 12.2.0.7.0
Log file location : /u01/app/oracle/product/19.3/dbhome_1/cfgtoollogs/opatch/opatch2021-04-27_13-51-10PM_1.log

Invoking prereq "checkconflictagainstohwithdetail"

Prereq "checkConflictAgainstOHWithDetail" passed.

OPatch succeeded.

競合チェックにパスしたのでパッチを適用します。

19.10でOracle Blockchain Tableを使用するために適用した個別パッチ「32431413」はロールバックされるようです。

[oracle@db19c-146641 32545013]$ $ORACLE_HOME/OPatch/opatch apply
Oracle Interim Patch Installer version 12.2.0.1.24
Copyright (c) 2021, Oracle Corporation.  All rights reserved.


Oracle Home       : /u01/app/oracle/product/19.3/dbhome_1
Central Inventory : /u01/app/oraInventory
   from           : /u01/app/oracle/product/19.3/dbhome_1/oraInst.loc
OPatch version    : 12.2.0.1.24
OUI version       : 12.2.0.7.0
Log file location : /u01/app/oracle/product/19.3/dbhome_1/cfgtoollogs/opatch/opatch2021-04-27_13-52-38PM_1.log

Verifying environment and performing prerequisite checks...

Conflicts/Supersets for each patch are:

Patch : 32545013

        Bug Superset of 32431413
        Super set bugs are:
        32431413


Patches [   32431413 ] will be rolled back.

OPatch continues with these patches:   32545013

Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.

Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/u01/app/oracle/product/19.3/dbhome_1')


Is the local system ready for patching? [y|n]
y
User Responded with: Y
Backing up files...
Applying interim patch '32545013' to OH '/u01/app/oracle/product/19.3/dbhome_1'
ApplySession: Optional component(s) [ oracle.network.gsm, 19.0.0.0.0 ] , [ oracle.rdbms.ic, 19.0.0.0.0 ] , [ oracle.rdbms.tg4db2, 19.0.0.0.0 ] , [ oracle.tfa, 19.0.0.0.0 ] , [ oracle.options.olap.api, 19.0.0.0.0 ] , [ oracle.ons.cclient, 19.0.0.0.0 ] , [ oracle.options.olap, 19.0.0.0.0 ] , [ oracle.network.cman, 19.0.0.0.0 ] , [ oracle.oid.client, 19.0.0.0.0 ] , [ oracle.ons.eons.bwcompat, 19.0.0.0.0 ] , [ oracle.net.cman, 19.0.0.0.0 ] , [ oracle.xdk.companion, 19.0.0.0.0 ] , [ oracle.jdk, 1.8.0.191.0 ]  not present in the Oracle Home or a higher version is found.
Rolling back interim patch '32431413' from OH '/u01/app/oracle/product/19.3/dbhome_1'

Patching component oracle.rdbms, 19.0.0.0.0...

Patching component oracle.rdbms.rsf, 19.0.0.0.0...

~中略~

Do you want to proceed? [y|n]
y
User Responded with: Y
RollbackSession removing interim patch '32431413' from inventory

OPatch back to application of the patch '32545013' after auto-rollback.

Patching component oracle.rdbms.rsf, 19.0.0.0.0...
~中略~
Patching component oracle.precomp.lang, 19.0.0.0.0...

Patching component oracle.jdk, 1.8.0.201.0...

~中略~

Do you want to proceed? [y|n]
y
User Responded with: Y
Patch 32545013 successfully applied.
Sub-set patch [32218454] has become inactive due to the application of a super-set patch [32545013].
Please refer to Doc ID 2161861.1 for any possible further required actions.
OPatch Session completed with warnings.
Log file location: /u01/app/oracle/product/19.3/dbhome_1/cfgtoollogs/opatch/opatch2021-04-27_13-52-38PM_1.log

OPatch completed with warnings.

私の環境ではいろいろいじっているため途中Warningが出ましたが、無事OPatchが完了しました。

次にデータベースを立ち上げてデータパッチを適用します。

//Databaseにアクセスして起動
[oracle@db19c-146641 32545013]$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on Tue Apr 27 13:57:15 2021
Version 21.1.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 4865391928 bytes
Fixed Size                  9145656 bytes
Variable Size            1090519040 bytes
Database Buffers         3758096384 bytes
Redo Buffers                7630848 bytes
Database mounted.
Database opened.
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 MIYAPDB1                       MOUNTED
SQL> alter session set container = miyapdb1;

Session altered.

//PDBも起動
SQL> startup
Pluggable Database opened.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

//データパッチを実行
[oracle@db19c-146641 32545013]$ $ORACLE_HOME/OPatch/datapatch -verbose
SQL Patching tool version 19.11.0.0.0 Production on Tue Apr 27 13:58:19 2021
Copyright (c) 2012, 2021, Oracle.  All rights reserved.

Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_9519_2021_04_27_13_58_19/sqlpatch_invocation.log

Connecting to database...OK
Gathering database info...done

Note:  Datapatch will only apply or rollback SQL fixes for PDBs
       that are in an open state, no patches will be applied to closed PDBs.
       Please refer to Note: Datapatch: Database 12c Post Patch SQL Automation
       (Doc ID 1585822.1)

Bootstrapping registry and package to current versions...done
Determining current state...done

Current state of interim SQL patches:
  No interim patches found

Current state of release update SQL patches:
  Binary registry:
    19.11.0.0.0 Release_Update 210413004009: Installed
  PDB CDB$ROOT:
    Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 14-APR-21 03.19.23.924487 PM
  PDB MIYAPDB1:
    Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 14-APR-21 03.24.03.358609 PM
  PDB PDB$SEED:
    Applied 19.10.0.0.0 Release_Update 210108185017 successfully on 14-APR-21 03.19.25.157843 PM

Adding patches to installation queue and performing prereq checks...done
Installation queue:
  For the following PDBs: CDB$ROOT MIYAPDB1
    No interim patches need to be rolled back
    Patch 32545013 (Database Release Update : 19.11.0.0.210420 (32545013)):
      Apply from 19.10.0.0.0 Release_Update 210108185017 to 19.11.0.0.0 Release_Update 210413004009
    No interim patches need to be applied
  For the following PDBs: PDB$SEED
    No interim patches need to be rolled back
    Patch 32545013 (Database Release Update : 19.11.0.0.210420 (32545013)):
      Apply from 19.10.0.0.0 Release_Update 210108185017 to 19.11.0.0.0 Release_Update 210413004009
    No interim patches need to be applied

Installing patches...

Patch installation complete.  Total patches installed: 3

Validating logfiles...done
Patch 32545013 apply (pdb CDB$ROOT): SUCCESS
  logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/32545013/24175065/32545013_apply_MIYADB_CDBROOT_2021Apr27_13_58_42.log (no errors)
Patch 32545013 apply (pdb MIYAPDB1): SUCCESS
  logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/32545013/24175065/32545013_apply_MIYADB_MIYAPDB1_2021Apr27_14_00_22.log (no errors)
Patch 32545013 apply (pdb PDB$SEED): SUCCESS
  logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/32545013/24175065/32545013_apply_MIYADB_PDBSEED_2021Apr27_14_01_43.log (no errors)
SQL Patching tool complete on Tue Apr 27 14:02:46 2021

CDB、PDBともに適用が完了しました。

改めてログインしてみると、Versionが19.11の表示が確認できます。

[oracle@db19c-146641 32545013]$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on Tue Apr 27 14:04:17 2021
Version 21.1.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

Oracle Immutable Tableの作成

さっそくImmutable Tableを作成したいのですが、構文がわからないので手探りで行います。Oracle Immutable Tableの紹介スライドや記事では「Create Immutable Table …」という句で作成できるとあったので試してみます。

こちらのドキュメントに使い方が書いてありました。

CREATE IMMUTABLE TABLE im_table(col1 varchar2(20));

次のコマンドの開始中にエラーが発生しました : 行 1 -
create immutable table im_table(col1 varchar2(20))
エラー・レポート -
ORA-00905: キーワードがありません。
00905. 00000 -  "missing keyword"
*Cause:    
*Action:

キーワードが足りないようです。Blockchain Tableと同様必須句があるようです。Blockchain Table作成の句からHashの一文を除いたものを試してみます。

CREATE IMMUTABLE TABLE im_table (insert_date DATE DEFAULT SYSDATE, col2 VARCHAR2(20), col3 NUMBER(20))
                     NO DROP UNTIL 5 DAYS IDLE
                     NO DELETE UNTIL 16 DAYS AFTER INSERT;
					 
次のコマンドの開始中にエラーが発生しました : 行 3 -
CREATE immutable TABLE im_table(insert_date DATE DEFAULT SYSDATE, col2 VARCHAR2(20), col3 NUMBER(20))
                     NO DROP UNTIL 5 DAYS IDLE
                     NO DELETE UNTIL 16 DAYS AFTER INSERT
エラー・レポート -
ORA-00406: COMPATIBLEパラメータは、19.11.0.0.0以上必要です。
ORA-00722: 機能"Immutable table"
00406. 00000 -  "COMPATIBLE parameter needs to be %s or greater"
*Cause:    The COMPATIBLE initialization parameter is not high
           enough to allow the operation. Allowing the command would make
           the database incompatible with the release specified by the
           current COMPATIBLE parameter.
*Action:   Shutdown and startup with a higher compatibility setting.

NO DROP UNTIL n DAYS IDLE」と「NO DELETE UNTIL n DAYS AFTER INSERT」が必要な様です。

しかしCOMPATIBLEパラメータが19.10のままだったのでエラーとなりました。19.11に変更し、変更後に再起動をします。

*通常COMPATIBLEパラメータはRUを指定しません。変更するときは注意してください。

SQL> SHOW PARAMETER COMPATIBLE;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      19.10.0.0.0
noncdb_compatible                    boolean     FALSE

SQL> ALTER SYSTEM SET COMPATIBLE = '19.11.0.0.0' SCOPE=SPFILE;

System altered.

Database再起動

SQL> SHOW PARAMETER COMPATIBLE;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      19.11.0.0.0
noncdb_compatible                    boolean     FALSE

これで準備は整ったのでImmutable Tableを作成します!

CREATE immutable TABLE im_table1 (insert_date DATE DEFAULT SYSDATE, col2 VARCHAR2(20), col3 NUMBER(20))
                     NO DROP UNTIL 5 DAYS IDLE
                     NO DELETE UNTIL 16 DAYS AFTER INSERT;
					 
Immutable TABLEは作成されました。

SET COLINVISIBLE ON;       
desc im_table1;

名前                                   Nullかどうか タイプ                         
------------------------------------ -------- --------------------------- 
INSERT_DATE                                   DATE                        
COL2                                          VARCHAR2(20)                
COL3                                          NUMBER(20)                  
ORABCTAB_SPARE$ (INVISIBLE)                   RAW(2000 BYTE)              
ORABCTAB_USER_NUMBER$ (INVISIBLE)             NUMBER                      
ORABCTAB_HASH$ (INVISIBLE)                    RAW(2000 BYTE)              
ORABCTAB_SIGNATURE$ (INVISIBLE)               RAW(2000 BYTE)              
ORABCTAB_SIGNATURE_ALG$ (INVISIBLE)           NUMBER                      
ORABCTAB_SIGNATURE_CERT$ (INVISIBLE)          RAW(16 BYTE)                
ORABCTAB_SEQ_NUM$ (INVISIBLE)                 NUMBER                      
ORABCTAB_CHAIN_ID$ (INVISIBLE)                NUMBER                      
ORABCTAB_INST_ID$ (INVISIBLE)                 NUMBER                      
ORABCTAB_CREATION_TIME$ (INVISIBLE)           TIMESTAMP(6) WITH TIME ZONE

どうやら隠しカラムはBlockchain Tableと同じ様ですね。hashやchain_idのカラムが一応あるみたいです。

Oracle Immutable Tableの操作

Immutable Tableが作成できたので、色々試してみたいと思います。まずはInsertしてcommit、rollbackも試します。

insert into im_table1(col2, col3)values('TEST',1);
1行挿入しました。

SELECT INSERT_DATE, COL2, COL3, ORABCTAB_INST_ID$ "inst", ORABCTAB_CHAIN_ID$ "chain",
    ORABCTAB_SEQ_NUM$ "seq", ORABCTAB_CREATION_TIME$ "time", ORABCTAB_USER_NUMBER$ "user", ORABCTAB_HASH$ "hash"
FROM im_table1;

INSERT_DATE COL2   COL3  inst  chain seq time                               user hash
----------  -----  ----  ----  ----- --- --------------------------------   ---- ---------
21-04-27    TEST   1		         21-04-27 14:29:08.181017000 GMT    106	

commit;
コミットが完了しました。

SELECT INSERT_DATE, COL2, COL3, ORABCTAB_INST_ID$ "inst", ORABCTAB_CHAIN_ID$ "chain",
    ORABCTAB_SEQ_NUM$ "seq", ORABCTAB_CREATION_TIME$ "time", ORABCTAB_USER_NUMBER$ "user", ORABCTAB_HASH$ "hash"
FROM im_table1;

INSERT_DATE COL2   COL3  inst  chain seq time                               user hash
----------  -----  ----  ----  ----- --- --------------------------------   ---- ---------
21-04-27    TEST   1		         21-04-27 14:29:08.181017000 GMT    106	

insert into im_table1(col2, col3)values('TEST2',2);
INSERT_DATE COL2   COL3  inst  chain seq time                               user hash
----------  -----  ----  ----  ----- --- --------------------------------   ---- ---------
21-04-27    TEST   1		         21-04-27 14:29:08.181017000 GMT    106	
21-04-27    TEST2  2		         21-04-27 14:38:57.436607000 GMT    106	

rollback;
ロールバックを完了しました。

INSERT_DATE COL2   COL3  inst  chain seq time                               user hash
----------  -----  ----  ----  ----- --- --------------------------------   ---- ---------
21-04-27    TEST   1			 21-04-27 14:29:08.181017000 GMT    106	

Blockchain Tableと違ってINSERT時点でtimeやuserに値が入っています。また、コミットしてもhash値やchain idが生成、格納されません。

ロールバックも行われました。

次に変更、削除を試してみます。

UPDATE im_table1 SET col2 = 'HELLO' WHERE col3=1;

次のコマンド行の開始中にエラーが発生しました : 30 -
UPDATE im_table1 SET col2 = 'HELLO' WHERE col3=1
コマンド行 : 30 列 : 8 でのエラー
エラー・レポート -
SQLエラー: ORA-05715: operation not allowed on the blockchain or immutable table

DELETE FROM im_table1 WHERE col3=1;

次のコマンド行の開始中にエラーが発生しました : 33 -
DELETE FROM im_table1 WHERE col3=1
コマンド行 : 33 列 : 13 でのエラー
エラー・レポート -
SQLエラー: ORA-05715: operation not allowed on the blockchain or immutable table

TRUNCATE TABLE im_table1;

次のコマンドの開始中にエラーが発生しました : 行 36 -
TRUNCATE TABLE im_table1
エラー・レポート -
ORA-05715: operation not allowed on the blockchain or immutable table

DROP im_table1;

次のコマンドの開始中にエラーが発生しました : 行 27 -
drop im_table1
エラー・レポート -
ORA-00950: DROPオプションは無効です。
00950. 00000 -  "invalid DROP option"
*Cause:    
*Action:

UPDATE, DELETE, TRUNCATE, DROPを試しましたがすべてエラーとなりました。しっかりImmutableなテーブルになっています。

次のようにData Dictionary ViewsでRetention期間を確認できます。

SELECT row_retention "Row Retention Period", row_retention_locked "Row Retention Lock", table_inactivity_retention "Table Retention Period"
FROM dba_immutable_tables
WHERE table_name = 'IM_TABLE1';

Row Retention Period Row Retention Locked Table Retention Period
-------------------- -------------------- ----------------------
                  16                   NO                      5

おわりに

本日はOracle Databaseの新機能「Oracle Immutable Table」を紹介しました。耐改ざん性に特化したTableであることが特徴なImmutable Tableですが、Oracle Blockchain Tableと同じようなユースケースが想定されます。

Hash値の計算が不要だったり、隠しカラムへのデータの投入に差があったりするため、Oracle Blockchain TableとOracle Immutable Tableの性能差が気になります。今後も注目していきたいです。

本日も最後までご覧いただきありがとうございました。

コメント

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