2021/12/04

Oracle Database Express Edition(XE)で21c新機能を試してみる

この記事は JPOUG Advent Calendar 2021 の4日目です。
3日目は s4r_agent さんの記事『ADWにgoogle colaboratoryから接続する - KNOPP’s blog』でした。

はじめに

今年8月に Oracle Database の最新版 21c のオンプレミス版(Linux)がリリースされ、9月には商用でも無償利用可能な Express Edition(XE) も提供されました。

21c は新しいリリースサイクルの Innovation Release であるため現場では触る機会はありませんが、セミナーや資料で気になった以下の新機能を 21c XE で試したメモになります。
  • Read-only Oracle Home
  • Japanese Imperial Calendar
  • Attention Log
  • Oracle Data Pump Checksum Support
  • Oracle Data Pump Includes and Excludes in the Same Operation
  • SQL*Plus (SET JSONPRINT)

環境

Oracle Database はリリースを重ねるたびにインストール方法が簡素化されてきて、21c では読み取り専用のOracleホームがデフォルトとなり、zipファイルを展開して runInstaller を実行するだけですが、XE の yum コマンドによるインストールはやはり楽です。

# yum -y localinstall https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
# /etc/init.d/oracle-xe-21c configure
Oracle Linux 7.9 環境に 21c XE 、比較用として別の Oracle Linux 7.9 環境にひとつ前のバージョン 18c XE をインストールし、18c の PDB に対して 21c の PDB からは xe18 という接続記述子でアクセスできるように構成しています。

Read-only Oracle Home

$ORACLE_HOME は読み取り専用となり、設定ファイルなどは $ORACLE_BASE_HOME 以下に配置されます。

$ $ORACLE_HOME/bin/orabaseconfig
/opt/oracle

$ $ORACLE_HOME/bin/orabasehome
/opt/oracle/homes/OraDBHome21cXE

$ ls -1 $($ORACLE_HOME/bin/orabasehome)
admin
assistants
cfgtoollogs
dbs
drdaas
hs
install
log
mgw
network
rdbms
sqlpatch
18c XEは読み取り専用Oracleホームではない従来型ですのでどちらのパスも同じですね。
$ $ORACLE_HOME/bin/orabaseconfig
/opt/oracle/product/18c/dbhomeXE

$ $ORACLE_HOME/bin/orabasehome
/opt/oracle/product/18c/dbhomeXE

Japanese Imperial Calendar

新元号の令和がサポートされています。和暦の使用頻度は少なくなりつつありますが大事な対応ですね。

$ sqlplus -S system/oracle@localhost/xepdb1 <<SQL
> SELECT TO_CHAR(sysdate, 'EEYY"年"MM"月"DD"日"', 'nls_calendar=''Japanese Imperial''') AS XE21 FROM dual;
> SELECT TO_CHAR(sysdate, 'EEYY"年"MM"月"DD"日"', 'nls_calendar=''Japanese Imperial''') AS XE18 FROM dual@xe18;
> SQL

XE21
---------------------
令和03年12月04日


XE18
---------------------
平成33年12月04日

Attention Log

Oracle Database のログといえばアラートログがまっさきに浮かびますが、障害情報以外にログスイッチなど通常運用に関わるログも出力されるためログ監視する際にはフィルタリングが必要です。診断機能の強化として、クリティカルなイベントだけが出力される注意ログが新たに増えたようです。

$ head $ORACLE_BASE/diag/rdbms/xe/XE/trace/attention_XE.log

{
  "NOTIFICATION" : "Starting ORACLE instance (normal) (OS id: 7472)",
  "URGENCY"      : "INFO",
  "INFO"         : "Additional Information Not Available",
  "CAUSE"        : "A command to startup the instance was executed",
  "ACTION"       : "Check alert log for progress and completion of command",
  "CLASS"        : "CDB Instance / CDB ADMINISTRATOR / AL-1000",
  "TIME"         : "2021-12-03T15:29:13.981+00:00"
}

Oracle Data Pump Checksum Support

大きなエクスポートファイルを遠隔地に送る場合、ファイルが破損していないか別途コマンドでファイルのチェックサムを取得して検証していましたが、Data Pump ユーティリティだけで可能となったみたいです。

チェックサムなしのダンプファイルと、
$ expdp system/oracle@localhost/xepdb1 schemas=hr include=TABLE/TABLE dumpfile=xe21_hr_table.dmp

Export: Release 21.0.0.0.0 - Production on Sat Dec 4 05:04:15 2021
Version 21.3.0.0.0

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

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@localhost/xepdb1 schemas=hr include=TABLE/TABLE dumpfile=xe21_hr_table.dmp
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /opt/oracle/admin/XE/dpdump/D240A6CAB1D22558E0555054006AC8C7/xe21_hr_table.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Dec 4 05:04:36 2021 elapsed 0 00:00:19
チェックサムありのダンプファイルを
$ expdp system/oracle@localhost/xepdb1 schemas=hr include=TABLE/TABLE dumpfile=xe21_hr_table_checksum.dmp checksum=yes

Export: Release 21.0.0.0.0 - Production on Sat Dec 4 05:05:03 2021
Version 21.3.0.0.0

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

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@localhost/xepdb1 schemas=hr include=TABLE/TABLE dumpfile=xe21_hr_table_checksum.dmp checksum=yes
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
Generating checksums for dump file set
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /opt/oracle/admin/XE/dpdump/D240A6CAB1D22558E0555054006AC8C7/xe21_hr_table_checksum.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Dec 4 05:05:24 2021 elapsed 0 00:00:19
雑に diff してみるとファイル冒頭にチェックサムが追加されており、デフォルトのアルゴリズムは SHA256 であることが伺えます。(マニュアルに書いてある)
$ diff -u <(strings xe21_hr_table.dmp) <(strings xe21_hr_table_checksum.dmp) | grep -v STRMTABLE
--- /dev/fd/63  2021-12-04 05:08:18.674075337 +0900
+++ /dev/fd/62  2021-12-04 05:08:18.675075355 +0900
@@ -4,9 +4,14 @@
 AL32UTF8
 21.00.00.00.00
 001:001:000001:000001
+w;T:-s
+w?8el^
+YKArd
+8*]:
+V)5Q
 i<?xml version="1.0"?><ROWSET><ROW>
-KUPC$C_1_20211204050416_0
+KUPC$C_1_20211204050504_0
 21.3.0.0.0
 ol7xe21:XE
 SCHEMA
@@ -14,10 +19,9 @@
 SYS_EXPORT_SCHEMA_01
 EXPORT
 Linux x86 64-bit
-       U"$[
 21.0.0.0.0
        EXECUTING
-KUPC$S_1_20211204050416_0
+KUPC$S_1_20211204050504_0
 +00:00
 SYSTEM
 XEPDB1
@@ -35,20 +39,23 @@
 export.log
 COMMAND_LINE_CLIENT
 CLIENT_COMMAND
-[system/********@localhost/xepdb1 schemas=hr include=TABLE/TABLE dumpfile=xe21_hr_table.dmp
+qsystem/********@localhost/xepdb1 schemas=hr include=TABLE/TABLE dumpfile=xe21_hr_table_checksum.dmp checksum=yes
 SCHEMA_LIST
 'HR'
 SCHEMA_EXPR
  IN ('HR')
-N/opt/oracle/admin/XE/dpdump/D240A6CAB1D22558E0555054006AC8C7/xe21_hr_table.dmp
+W/opt/oracle/admin/XE/dpdump/D240A6CAB1D22558E0555054006AC8C7/xe21_hr_table_checksum.dmp
 DATA_PUMP_DIR
-xe21_hr_table.dmp
+xe21_hr_table_checksum.dmp
 INCLUDE_PATH_LIST
 'TABLE/TABLE'
 INCLUDE_PATH_EXPR
  IN ('TABLE/TABLE')
+CHECKSUM
 ESTIMATE
 BLOCKS
+CHECKSUM_ALGORITHM
+SHA256
 COMPRESSION
 METADATA_ONLY
 COMPRESSION_ALGORITHM
@@ -2633,7 +2640,7 @@
 SCHEMA_EXPORT
 SYSTEM
 DW00
-#      EXECUTING
+       EXECUTING
 ol7xe21
 UNLOAD DATA
 TABLE
試しにエクスポートファイルを破損させて、
$ dd if=/dev/urandom of=xe21_hr_table_checksum.dmp bs=1024 seek=$((RANDOM%10)) count=1 conv=notrunc
それをインポートしてみると、書き換えたのは1ブロック程度だからかエラーは出ませんでした。
$ impdp system/oracle@localhost/xepdb1 remap_schema=hr:hr2 dumpfile=xe21_hr_table_checksum.dmp

Import: Release 21.0.0.0.0 - Production on Sat Dec 4 05:30:31 2021
Version 21.3.0.0.0

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

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Warning: dump file checksum verification is disabled
Master table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_FULL_01":  system/********@localhost/xepdb1 remap_schema=hr:hr2 dumpfile=xe21_hr_table_checksum.dmp
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Job "SYSTEM"."SYS_IMPORT_FULL_01" successfully completed at Sat Dec 4 05:30:36 2021 elapsed 0 00:00:03
ダンプファイルのチェックサムを検証するには VERIFY_CHECKSUM=YES を指定する必要があるようです。
$ impdp system/oracle@localhost/xepdb1 remap_schema=hr:hr2 dumpfile=xe21_hr_table_checksum.dmp verify_checksum=yes

Import: Release 21.0.0.0.0 - Production on Sat Dec 4 05:32:10 2021
Version 21.3.0.0.0

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

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
ORA-39002: invalid operation
ORA-39412: file checksum error in dump file "/opt/oracle/admin/XE/dpdump/D240A6CAB1D22558E0555054006AC8C7/xe21_hr_table_checksum.dmp"
VERIFY_CHECKSUM と排他的なパラメータ VERIFY_ONLY=YES を指定するとダンプファイルの検証のみを行うようです。
$ impdp system/oracle@localhost/xepdb1 remap_schema=hr:hr2 dumpfile=xe21_hr_table_checksum.dmp verify_only=yes

Import: Release 21.0.0.0.0 - Production on Sat Dec 4 05:39:53 2021
Version 21.3.0.0.0

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

Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Verifying dump file checksums
Master table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
dump file set is complete
ORA-39412: file checksum error in dump file "/opt/oracle/admin/XE/dpdump/D240A6CAB1D22558E0555054006AC8C7/xe21_hr_table_checksum.dmp"

dump file set is inconsistent
Job "SYSTEM"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Sat Dec 4 05:39:56 2021 elapsed 0 00:00:02

Oracle Data Pump Includes and Excludes in the Same Operation

Data Pump で対象とするオブジェクトをフィルタリングする場合、INCLUDE と EXCLUDE は排他的なパラメータでした。

$ expdp system/oracle@localhost/xepdb1 schemas=hr include=TABLE exclude=TABLE/INDEX dumpfile=xe18_hr_table.dmp

Export: Release 18.0.0.0.0 - Production on Sat Dec 4 05:58:19 2021
Version 18.4.0.0.0

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

Connected to: Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
UDE-00011: parameter include is incompatible with parameter exclude
21c ではそれらを同時に指定できるようになったようです。 フィルタリングの動作はクライアント側で行われるようなので接続先のリリースは 21c である必要はないみたいです。
$ expdp system/oracle@xe18 schemas=hr include=TABLE exclude=TABLE/INDEX dumpfile=xe21_hr_table.dmp

Export: Release 21.0.0.0.0 - Production on Sat Dec 4 06:04:27 2021
Version 21.3.0.0.0

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

Connected to: Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@xe18 schemas=hr include=TABLE exclude=TABLE/INDEX dumpfile=xe21_hr_table.dmp
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
. . exported "HR"."EMPLOYEES"                            17.08 KB     107 rows
. . exported "HR"."LOCATIONS"                            8.437 KB      23 rows
. . exported "HR"."JOB_HISTORY"                          7.195 KB      10 rows
. . exported "HR"."JOBS"                                 7.109 KB      19 rows
. . exported "HR"."DEPARTMENTS"                          7.125 KB      27 rows
. . exported "HR"."COUNTRIES"                            6.367 KB      25 rows
. . exported "HR"."REGIONS"                              5.546 KB       4 rows
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /opt/oracle/admin/XE/dpdump/D23FFD4646A72468E0555054001EA5C2/xe21_hr_table.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Dec 4 06:04:47 2021 elapsed 0 00:00:19
ということは Instant Client 21.4.0.0.0 の Tools Package に含まれる expdp コマンドでも使えそうですね。

SQL*Plus (SET JSONPRINT)

21c でバイナリ JSON データ型の追加など JSON サポートが強化されましたので、SQL*Plus でも JSON フレンドリーな出力をするオプション JSONPRINT 変数が追加されたようです。

$ sqlplus system/oracle@localhost/xepdb1

SQL*Plus: Release 21.0.0.0.0 - Production on Sat Dec 4 06:51:14 2021
Version 21.3.0.0.0

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

Last Successful login time: Sat Dec 04 2021 06:51:03 +09:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> set heading off newpage none feedback off
SQL> select json('[{a:"\u32FF"},{b: 1}]') from dual;
[{"a":"㋿"},{"b":1}]
SQL> set jsonprint pretty
SQL> /
[
  {
    "a" : "㋿"
  },
  {
    "b" : 1
  }
]

SQL> set jsonprint pretty ascii
SQL> /
[
  {
    "a" : "\u32FF"
  },
  {
    "b" : 1
  }
]

SQL>

おわりに

Oracle Database は非常に多機能で 21c の新機能だけでも多数ありますが、個人的にはその多くは使用することもなく、また理解も追いつかないため、手軽に試せるかなり偏ったピックアップとなってしまいました。

今年後半の Oracle Technology Night では非常にボリュームのある 21c 新機能の解説が 3 回に渡って開催されており、それらの資料もすぐに公開されていますのでマニュアルと合わせて手元で動かして理解を深めてゆこうと思います。

おまけ

ライセンス的に XE は商用利用可能とはいえリソース制限が厳しいためどちらかというと開発目的で何度でも作り直すような用途だと思っていますが、ドキュメントには移行手順があることを知りました。

手順に沿って今回の検証で使用した 18c XE の XEPDB1 をアンプラグして 21c XE にプラグ、アップグレードしてみましたがあまりの手軽さに驚きました。(上記マニュアルの "Performing a Sanity Check for the new PDB" の最後のSELECT文の STATUS が余計に付与されているため構文エラーになることに気づきました。。。)

プラグついでにスナップショット・コピーPDBを試してみると、3つ以上の PDB が作れたので調子に乗ってたくさん複製してるとデータベースファイルサイズ 12GB の上限に達してしまいました。ライセンス情報ページの備考に書いてあるとおりでした。。。

  • Licensing Information
    XE: Included option; you are licensed to create up to 252 PDBs, however, the actual number of PDBs you can create might be lower due to XE resource limits.
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 XEPDB1                         READ ONLY  NO
         4 XEPDB2                         READ WRITE NO
         5 XEPDB1_SNAP_COPY               READ WRITE NO
         6 XEPDB1_SNAP_COPY2              READ WRITE NO
         7 XEPDB1_SNAP_COPY3              READ WRITE NO
         8 XEPDB1_SNAP_COPY4              READ WRITE NO
         9 XEPDB1_SNAP_COPY5              READ WRITE NO
        10 XEPDB1_SNAP_COPY6              READ WRITE NO
        11 XEPDB1_SNAP_COPY7              READ WRITE NO
        12 XEPDB1_SNAP_COPY8              READ WRITE NO
        13 XEPDB1_SNAP_COPY9              READ WRITE NO
        14 XEPDB1_SNAP_COPY10             READ WRITE NO
        15 XEPDB1_SNAP_COPY11             READ WRITE NO
        16 XEPDB1_SNAP_COPY12             READ WRITE NO
        17 XEPDB1_SNAP_COPY13             READ WRITE NO
        18 XEPDB1_SNAP_COPY14             READ WRITE NO
        19 XEPDB1_SNAP_COPY15             READ WRITE NO
        20 XEPDB1_SNAP_COPY16             READ WRITE NO
        21 XEPDB1_SNAP_COPY17             READ WRITE NO
        22 XEPDB1_SNAP_COPY18             READ WRITE NO
        23 XEPDB1_SNAP_COPY19             MOUNTED
        24 XEPDB1_SNAP_COPY20             MOUNTED
        25 XEPDB1_SNAP_COPY21             MOUNTED
        26 XEPDB1_SNAP_COPY22             MOUNTED
        27 XEPDB1_SNAP_COPY23             MOUNTED
        28 XEPDB1_SNAP_COPY24             MOUNTED
        29 XEPDB1_SNAP_COPY25             MOUNTED
        30 XEPDB1_SNAP_COPY26             MOUNTED
        31 XEPDB1_SNAP_COPY27             MOUNTED
        32 XEPDB1_SNAP_COPY28             MOUNTED
        33 XEPDB1_SNAP_COPY29             MOUNTED
        34 XEPDB1_SNAP_COPY30             MOUNTED
        35 XEPDB1_SNAP_COPY31             MOUNTED
        36 XEPDB1_SNAP_COPY32             MOUNTED
        37 XEPDB1_SNAP_COPY33             MOUNTED
        38 XEPDB1_SNAP_COPY34             MOUNTED
        39 XEPDB1_SNAP_COPY35             MOUNTED
        40 XEPDB1_SNAP_COPY36             MOUNTED
        41 XEPDB1_SNAP_COPY37             MOUNTED
        42 XEPDB1_SNAP_COPY38             MOUNTED
        43 XEPDB1_SNAP_COPY39             MOUNTED
        44 XEPDB1_SNAP_COPY40             MOUNTED
        45 XEPDB1_SNAP_COPY41             MOUNTED
        46 XEPDB1_SNAP_COPY42             MOUNTED
        47 XEPDB1_SNAP_COPY43             MOUNTED
        48 XEPDB1_SNAP_COPY44             MOUNTED
        49 XEPDB1_SNAP_COPY45             MOUNTED
        50 XEPDB1_SNAP_COPY46             MOUNTED
SQL> !df -h .
ファイルシス                サイズ  使用  残り 使用% マウント位置
/dev/mapper/vg_main-lv_root    33G   18G   16G   54% /

SQL> !du -csh $ORACLE_BASE/oradata/XE
5.6G    /opt/oracle/oradata/XE
5.6G    合計
XEPDB1_SNAP_COPY19(23):Error 12954 during pluggable database XEPDB1_SNAP_COPY19 opening in read write
2021-12-04T09:18:10.913150+09:00
XEPDB1_SNAP_COPY19(23):Errors in file /opt/oracle/diag/rdbms/xe/XE/trace/XE_ora_29568.trc:
ORA-12954: The request exceeds the maximum allowed database size of 12 GB.

0 件のコメント:

コメントを投稿