このエントリは JPOUG Advent Calendar 2014 4日目のエントリです。
昨日のエントリは charade_oo4oさんの 「[JPOUG Advent Calendar] Oracle on Hyper-V 2014」でした。
Oracle Database導入済みのVirtualBox VMイメージを使って、簡単にOracle Databaseを使い始めてみましょう! という方向のエントリを書こうと思っていたのですが・・・・
オラクル社が公開しているVMイメージが、どれも初心者には不適切なものばかりだったので、当初の狙いから変え、Database App Development VM についていくつか導入方法といくつか注意点をまとめる内容にします・・・。残念。
オラクル社が公開している製品導入済みVirtualBox VMイメージ
- Pre-Built Developer VMs (for Oracle VM VirtualBox)
http://www.oracle.com/technetwork/community/developer-vm/index.html
にて、Oracle Databaseをはじめとする、様々な製品がインストールされたVMイメージが公開されています。
2014/12/03 時点で、XEでないOracle DatabaseがインストールされたVMイメージは
以下の通りです。
- MySQL and Oracle Enterprise Manager Developer VM
- Oracle Data Integrator 12c VM
- Oracle Big Data Lite VM
- Database App Development VM
残念ながら、どのVMも、Oracle Databaseを気軽に試す・・ という目的には一長一短です。
(よいVMがあればこれをもとにエントリを書こうと、1つ1つ確認したのですが・・・残念)
MySQL and Oracle Enterprise Manager Developer VM
Contentsに Oracle Database 11g (for Linux x86-64) が記載されていますが、
これは、OEMのリポジトリDBとしてOracle Databaseを使用しているということでした。
Oracle Databaseの学習用には不適切ですし、VMイメージのサイズが 17GBときわめて大きいため
取り回しにくいです。
Oracle Data Integrator 12c VM
Oracle Data Integrator と Oracle GoldenGate を使用することを想定したVMです。
Oracle Databaseの学習用には不適切です。
Oracle Big Data Lite VM
Oracle Big Data Appliance に含まれるソフトウェア群で構成した
Oracle Big Data Appliance を模したVMイメージです。
Oracle Databaseの学習用には不適切です。
Database App Development VM
後述
Database App Development VMについて
Oracle Database を用いたアプリケーション開発を想定したVMであり、
これらの中では最もOracle Databaseの学習用には適切・・・なはずですが、
Oracle Databaseを気軽に試す・・ という目的に対しては、いろいろと課題があります。
- OSがなぜかOracle Linux 7
- データベースがマルチテナント
- いにしえの環境変数の罠
課題のレベル感はさまざまですが、使用するまでの手順に説明しながら、課題への対処策と併せてみてゆきたいと思います。
Database App Development VMをダウンロードする
まず、
- Oracle Technology Network Developer Day
Database Virtual Box Appliance / Virtual Machine
http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html
から、Database App Development VMのovaファイル Oracle_DB_Developer_VM_new.ova をダウンロードします。ovaファイルはVMイメージの標準フォーマットです。
また、ダウンロードには、ライセンス規約を受け入れること、オラクルのアカウントでログインすることが必要です。ova形式のVMイメージをVirtualBoxにインポートする
上記の作業で得られた Oracle_DB_Developer_VM_new.ova をVirtualBoxにインポートします。
インポートが完了すると Oracle DB Developer VM という名称のVMが構成されます。
起動前にいくつかVMの設定を修正しておくことをお勧めします。
まず、マシンのメモリサイズに併せて、VMに割り当てるメモリサイズを調整しておきましょう。
また、VMのネットワーク構成を調整してもよいかもしれません。
VMのネットワーク構成は各自の好みや制約の部分もありますので、一概にどうすべきということは
言えませんが、NAT+ホストオンリーネットワークの構成が一般にお勧めです。
デフォルトの状態でNAT用のNICが構成されているので、ホストオンリーネットワーク用のNICを1つ追加しておきましょう。NAT用のNICをインターネットへのアクセスに使用し、ホストオンリーネットワーク用のNICをマシンとの通信に使用します。VMを起動し、設定を修正する
Database App Development VM の OS は、Oracle Linux 7です。
以前のDatabase App Development VM の OS はOracle Linux 6だったと思うのですが、なぜか現行はOracle Linux 7になってしまいました。Oracle Linux 7は、Red Hat Enterprise Linux 7と同様にリリースされて半年ほどしか経過していません。Oracle Linux 7のスキルを持ち合わせている人は少ないのではないでしょうか。
また、現在 企業システムで使われるLinuxの大部分は、Red Hat Enterprise Linux 6 (≒ Oracle Linux 6)または Red Hat Enterprise Linux 5 ( ≒ Oracle Linux 5)ですので、今のタイミングでOracle Linux 7 のスキルを習得するのに躊躇されるかたもいらっしゃるのではないでしょうか。(率直にいって、私もその一人です)VMを起動すると、(このVMでは)oracleユーザーでGNONEのデスクトップにログインした状態になります。早速、Oracle Databaseを使用して・・・と行きたいところですが、いくつか設定の修正をしておきましょう。
まず、デフォルトではキーボードレイアウトが英語配列になっており、一般的な日本語キーボードでは記号類が適切に入力できませんので、修正します。
Applications → System Tools → Settings
から
Keyboard を選択し、Input Souces で日本語入力を追加して、デフォルトの英語入力を削除します。
次に、追加したホストオンリーネットワーク用のNICを有効にし、
固定IPアドレスを割り当てましょう。
ここで指定したIPアドレスを用いて、ホストマシンからVMへアクセスします。NICの設定は
Applications → System Tools → Settings
からNetwork を選択し、追加したNICを有効にしてプロファイルを追加してIPアドレスを設定します。
VirtualBoxは、デフォルトでホストオンリーネットワーク用に192.168.56.0/24のセグメントを割り当て、192.168.56.101以降の帯域をDHCPを用いた動的IPアドレス割り当てに使用します。
したがって、ホストオンリーネットワーク用のNICに割り当てる固定IPアドレスは、
192.168.56.2-100の範囲から選んでください。
ここでは、192.168.56.2を指定しています。これで、ホストマシンからsshでVMに接続できるようになります。
データベースに接続する・・・しかしなんか変だ
初期状態でデータベース、リスナーが構成済みで、OS起動時に自動起動するようになっています。
また、データベースの名前は cdb1 で、Oracle Database 12cから導入されたマルチテナント構成です。
12c の目玉がマルチテナントなのはわかりますが、初めてさわるデータベースがマルチテナント構成というのはちょっと厳しい・・・しかも、こんな罠に引っかかってしまいました。
[oracle@localhost ~]$ sqlplus / as sysdba
SQL\*Plus: Release 12.1.0.2.0 Production on 水 12月 3 21:49:44 2014
Copyright (c) 1982, 2014, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
お馴染みの sqlplus / as sysdba で接続しようとするとORA-01017で接続に失敗します。
試しにユーザー名とパスワードを明示的に指定すると接続に成功します。
[oracle@localhost ~]$ sqlplus sys/oracle as sysdba
SQL\*Plus: Release 12.1.0.2.0 Production on 水 12月 3 21:51:36 2014
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>
なぜだかわかりますかね? また、どこら辺が怪しいと思われますか?
自分はユーザー名を指定すると成功することから、OS認証が適切に機能していないことを疑い、OS認証関連の箇所を調査しました。でも、どこも怪しくないんですねぇ・・・・
[oracle@localhost ~]$ id
uid=1000(oracle) gid=1000(oracle) groups=1000(oracle),10(wheel),990(vboxsf) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
oracleユーザーはoracleグループのメンバで、
[oracle@localhost ~]$ grep DBA $ORACLE_HOME/rdbms/lib/config.c
/* SS_DBA_GRP defines the UNIX group ID for sqldba adminstrative access. */
\#define SS_DBA_GRP “oracle”
{SS_DBA_GRP, SS_OPER_GRP, SS_ASM_GRP,
Oracle Database側でも DBAグループはちゃんと”oracle”になっている・・・
なんとか糸口を見つけようとシステムコールトレースを習得しても、Netトレースを取得してもわからない・・・が、いろいろやっているうちにヒントにつながる奇妙な動作を見つけました。
[oracle@localhost lib]$ sqlplus sys/oracle as sysdba
SQL\*Plus: Release 12.1.0.2.0 Production on Wed Dec 3 20:08:22 2014
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> shutdown immediate
Pluggable Database closed.
SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
[oracle@localhost lib]$ lsnrctl stop
LSNRCTL for Linux: Version 12.1.0.2.0 – Production on 03-DEC-2014 20:08:38
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
The command completed successfully
インスタンスとリスナーを停止して、プロセスを確認・・・
[oracle@localhost lib]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 19:32 ? 00:00:02 /usr/lib/systemd/systemd –switched-root –system –deserialize 23
:
oracle 1749 1 0 19:33 ? 00:00:00 ora_pmon_cdb1
oracle 1753 1 0 19:33 ? 00:00:03 ora_psp0_cdb1
oracle 1798 1 0 19:33 ? 00:00:03 ora_vktm_cdb1
oracle 1802 1 0 19:33 ? 00:00:00 ora_gen0_cdb1
oracle 1817 1 0 19:33 ? 00:00:00 ora_mman_cdb1
oracle 1824 1 0 19:33 ? 00:00:00 ora_diag_cdb1
oracle 1829 1 0 19:33 ? 00:00:01 ora_dbrm_cdb1
oracle 1832 1 0 19:33 ? 00:00:00 ora_vkrm_cdb1
oracle 1835 1 0 19:33 ? 00:00:02 ora_dia0_cdb1
oracle 1839 1 0 19:33 ? 00:00:00 ora_dbw0_cdb1
oracle 1853 1 0 19:33 ? 00:00:00 ora_lgwr_cdb1
oracle 1868 1 0 19:33 ? 00:00:01 ora_ckpt_cdb1
oracle 1871 1 0 19:33 ? 00:00:00 ora_lg00_cdb1
oracle 1882 1 0 19:33 ? 00:00:00 ora_smon_cdb1
oracle 1890 1 0 19:33 ? 00:00:00 ora_lg01_cdb1
oracle 1895 1 0 19:33 ? 00:00:00 ora_reco_cdb1
oracle 1899 1 0 19:33 ? 00:00:00 ora_lreg_cdb1
oracle 1901 1 0 19:33 ? 00:00:00 ora_pxmn_cdb1
oracle 1906 1 0 19:33 ? 00:00:04 ora_mmon_cdb1
oracle 1914 1 0 19:33 ? 00:00:02 ora_mmnl_cdb1
oracle 1917 1 0 19:33 ? 00:00:00 ora_d000_cdb1
oracle 1928 1 0 19:33 ? 00:00:00 ora_s000_cdb1
oracle 1934 1 0 19:33 ? 00:00:00 ora_s001_cdb1
:
oracle 4329 3094 0 20:08 pts/1 00:00:00 ps -ef
あれ? shutdownしたのに バックグラウンドプロセスがまだ残っている・・・
なにかおかしい・・・ もう一度接続すると・・・
[oracle@localhost lib]$ sqlplus sys/oracle as sysdba
SQL\*Plus: Release 12.1.0.2.0 Production on Wed Dec 3 20:08:47 2014
Copyright (c) 1982, 2014, Oracle. All rights reserved.
ERROR:
ORA-12541: TNS:no listener
Enter user-name:
ERROR:
ORA-12541: TNS:no listener
Enter user-name:
ERROR:
ORA-12541: TNS:no listener
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL\*Plus
なぜインスタンスに接続しようとしているのに、リスナーに接続を試みたようなエラーメッセージがでるのだろうか? マルチテナント・・・ リスナー経由の接続・・・・
もしやPDBに接続をしている?
しかし、SQL\*Plusではローカル接続を指定しているので、接続先はCDBに限定されるはず・・・
ローカル接続で接続先を変更するようなものってあったっけ?
お分かりになりましたでしょうか。ただ、ほとんど使用されない環境変数なのでご存じないかもしれません。~/.bash_profileに記載されたTWO_TASK=orclが犯人でした。
[oracle@localhost ~]$ cat ~/.bash_profile
\# .bash_profile
\# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
\# User specific environment and startup programs
\#cat /home/oracle/Desktop/readme.txt
export ANT_HOME=/usr/local/apache-ant-1.9.3
export ORACLE_HOME=/home/oracle/app/oracle/product/12.1.0/dbhome_1
export ORACLE_SID=cdb1
export TWO_TASK=orcl <=== export XDB_HOL=Desktop/Database_Track/XMLDB/ PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:$ANT_HOME/bin export PATH cd ~ \#gsettings set org.gnome.Vino require-encryption false環境変数TWO_TASKってなんだっけ?
TWO_TASKはほとんど使用されることがない環境変数です。
マニュアルでも、TWO_TASKについて説明している個所は本当に少ない・・・- SQL\*Plusのクイック・スタート – SQL\*PlusRユーザーズ・ガイドおよびリファレンス リリース12.1 B71396-02
http://docs.oracle.com/cd/E49329_01/server.121/b71396/qstart.htm
環境変数TWO_TASK(UNIXの場合)またはLOCAL(Windowsの場合)には接続識別子を設定できます。これによって、SQL\*PlusまたはSQL\*Plus Instant Clientで接続が行われるたびに接続識別子を明示的に入力する必要がなくなります。このUNIXの例では、MYDB4という名前のデータベースに接続します。
TNS_ADMIN=/home/user1
export TNS_ADMIN
TWO_TASK=MYDB4
export TWO_TASK
sqlplus hr
TWO_TASKが原因だと分かってから、Googleで調べると、悔しいことに事例がたくさん見つかります (><)
- OTN – Oracle Database 12c Feature: Multitenant Database
http://www.oracle.com/technetwork/articles/database/multitenant-part1-pdbs-2193987.html
- Oracle 12c Developer Days VM – Stojan’s Oracle Blog
http://www.stojanveselinovski.com/blog/2014/07/07/oracle-12c-developer-days-vm/もしかするとマルチテナント環境では環境変数TWO_TASKを設定することが一般的になるのかもしれません(本当?)。皆様 要注意です・・・・
明日は Ayumu Shibata さんです。よろしくお願いいたします?