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>をダウンロードします。
Name | Download 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の性能差が気になります。今後も注目していきたいです。
本日も最後までご覧いただきありがとうございました。
コメント