株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

他のDBを触って改めて感じるPDBの取り回しやすさとマルチテナントへの流れ

引き続き、JPOUG Tech Talk Night #4での12c座談会を念頭におき、マルチテナントについての雑感をつれづれ書いてみますね。

仕事の関係上、PostgreSQLやMySQLを触る機会が増えているのですが、データベースが簡単に作成できることに驚かされます。

例えば、PostgreSQLでは、initdbコマンドで瞬時にデータベース(正確にはPostgreSQLの用語でデータベースクラスタが作成できますし・・・・

[pgusr ~]$ export PGDATA=/var/tmp/pgdata
[pgusr ~]$ time /usr/pgsql-9.0/bin/initdb --no-locale --encoding=UTF8
The files belonging to this database system will be owned by user "pgusr".
This user must also own the server process.

The database cluster will be initialized with locale C.
The default text search configuration will be set to "english".

fixing permissions on existing directory /var/tmp/pgdata ... ok
  : 
Success. You can now start the database server using:

    /usr/pgsql-9.0/bin/postgres -D /var/tmp/pgdata
or
    /usr/pgsql-9.0/bin/pg_ctl -D /var/tmp/pgdata -l logfile start

real    0m1.704s←★
user    0m0.546s
sys     0m0.644s

MySQLでも同様にmysql_install_dbスクリプトで簡単にデータベース (正確にはMySQLの用語でデータディレクトリ)が作成できます。

[root@l64rw3 ~]# time mysql_install_db --datadir=/var/tmp/mysql --user=mysql
Installing MySQL system tables...2014-03-04 14:13:20 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2014-03-04 14:13:20 21541 [Note] InnoDB: The InnoDB memory heap is disabled
2014-03-04 14:13:20 21541 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2014-03-04 14:13:20 21541 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-03-04 14:13:20 21541 [Note] InnoDB: Using Linux native AIO
2014-03-04 14:13:20 21541 [Note] InnoDB: Not using CPU crc32 instructions
2014-03-04 14:13:20 21541 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2014-03-04 14:13:20 21541 [Note] InnoDB: Completed initialization of buffer pool
2014-03-04 14:13:20 21541 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created!
2014-03-04 14:13:20 21541 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB
2014-03-04 14:13:20 21541 [Note] InnoDB: Database physically writes the file full: wait...
2014-03-04 14:13:20 21541 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB
2014-03-04 14:13:21 21541 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB
2014-03-04 14:13:22 21541 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
2014-03-04 14:13:22 21541 [Warning] InnoDB: New log files created, LSN=45781
2014-03-04 14:13:22 21541 [Note] InnoDB: Doublewrite buffer not found: creating new
2014-03-04 14:13:22 21541 [Note] InnoDB: Doublewrite buffer created
2014-03-04 14:13:22 21541 [Note] InnoDB: 128 rollback segment(s) are active.
2014-03-04 14:13:22 21541 [Warning] InnoDB: Creating foreign key constraint system tables.
2014-03-04 14:13:22 21541 [Note] InnoDB: Foreign key constraint system tables created
2014-03-04 14:13:22 21541 [Note] InnoDB: Creating tablespace and datafile system tables.
2014-03-04 14:13:22 21541 [Note] InnoDB: Tablespace and datafile system tables created.
  : 

real    0m6.173s←★
user    0m0.155s
sys     0m0.590s

それに比べて、Oracle Databaseでデータベースを作成するのに必要な時間と言ったら・・・・

[oracle@l64rw3 ~]$ time dbca -silent -createDatabase -templateName General_Purpose.dbc    -gdbname CDB1 -sid CDB1 -responseFile NO_VALUE -characterSet AL32UTF8    -emConfiguration LOCAL -createAsContainerDatabase true   -memoryPercentage 30 -sysPassword oracle -systemPassword oracle
Copying database files
1% complete
3% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
46% complete
47% complete
52% complete
57% complete
58% complete
59% complete
62% complete
Completing Database Creation
66% complete
70% complete
74% complete
85% complete
96% complete
100% complete
Look at the log file "/u03/app/oracle/cfgtoollogs/dbca/CDB1/CDB1.log" for further details.

real    19m33.420s←★
user    0m8.499s
sys     0m7.643s
[oracle@l64rw3 ~]$

なかなか時間がかかります。

もちろん時間がかかるのには理由があります。思いつくままに上げると以下があるでしょうか。

  1. Oracle Databaseではデータベースの作成時(*1)に、PostgreSQLやMySQLでは実施していない領域の事前割り当てを行っているため(*1: 正確には表領域の作成時)
  2. Oracle Databaseは、データベース側でオプションなどにかかわるソフトウエアコンポーネントを保持しているため

ソフトウエアコンポーネントについては、補足が必要かもしれません。Oracle Databaseでは、様々な拡張機能をデータベースにインストールしたり、しなかったり、制御することができます。例えば、Oracle Textが必要ないデータベースにはOracle Textに関連するソフトウエアコンポーネントをインストールしなかったり、Oracle JVMが必要ないデータベースにはOracle JVMに関連するソフトウエアコンポーネントをインストールしなかったりすることができます。

DBCAでデータベースを作成すると、データベースの元となるテンプレートにはすでにこれらのソフトウェアコンポーネントは導入済みであるため、インストール時にソフトウエアコンポーネントを導入する必要なないのですが、いかんせんソフトウエアコンポーネントの実体を保管するSYSTEM表領域は大きくなり、データベース作成に時間を要する原因となります。

ただ、そもそも、データベースごとにインストールするソフトウエアコンポーネントを細かく制御する必要ってあるのか?というところが疑問になってきます。乱暴に議論を進めますが・・・・答えは、そんな必要なない!

というか、ほぼマルチテナント前提の話になってきますが、これからは統合が前提となる可能性が高い。とすると、データベースごとに細かい差異なんてあってほしくないわけです。ちょっと議論が乱暴ですが。 これからは、CDBにはあらかじめすべてのソフトウエアコンポーネントをインストールしておき、PDBは個々のソフトウェアコンポーネント有無を意識しないのがあるべき姿になるのではないでしょうか。

その証拠に(?)・・・

SQL> set timing on
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdbadmin IDENTIFIED BY password
  2    FILE_NAME_CONVERT = ('/pdbseed/' , '/pdb1/');

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

経過: 00:00:43.10←★

PDBの作成はかなり早い! (それでもMySQL, PostgreSQLに比べれば遅いですが)

今後は是非、データベース=PDBという方向性にしてほしいところであります。

若干妄想を含めた話になりますが、Oracle Database Standard Editionにおいて、わざわざ 最大PDB数1のマルチテナントデータベースがサポートされているのは、オラクルとしてもできる限り PDBを使ってほしいという想いが込められてているのではないかと・・・。 (オンラインREDOのサイジングなど、もちろん細かく考えるべきことはあるのですがね、もちろん・・・)

今後はすべてのデータベースがマルチテナント化されるかも? 皆さんはどう考えますか?

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ