技術ブログ
引き続き、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 ~]$
なかなか時間がかかります。
もちろん時間がかかるのには理由があります。思いつくままに上げると以下があるでしょうか。
ソフトウエアコンポーネントについては、補足が必要かもしれません。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のサイジングなど、もちろん細かく考えるべきことはあるのですがね、もちろん・・・)
今後はすべてのデータベースがマルチテナント化されるかも? 皆さんはどう考えますか?