会社の方に、つまらないところで躓かず効率的に学習しないと、という駄目だしをもらい学習意欲がだだ落ちですが...効率が悪いと言われても学習しないとですね、誰も教えてくれるわけじゃないですからね。
現状を変えるには、自分で学習を始めなければならないと思うわけです。
というわけで、前回、CentOS7.4系にOracle Database 12c Release 2 (12.2.0.1.0)をインストールしたのですが、今回は、実際にDB(データベース)とかを作成していきたいと思います。
⇩ 前回までの流れはこちら
今回もハマりにハマっているわけで、一体いつになったら効率の良い学習ができるのか...絶望的な気分のまま、レッツ、トライ~。
想像以上に収集のつかない状態になっていますので、お時間のある方のみご照覧ください。
Oracle Database 12c の特徴
DB作成の前に、Oracle Databaseって何じゃろう?
Oracle Database 12cから、構造がだいぶ変わったようで、
⇧ 上記サイト様の図を参考にさせていただくと、
ということで、Oracle Database 12c からは、1つのOracleインスタンスで複数のDBを扱うことができるようになったようです。
Oracle Database 12c のDB接続のイメージ
Oracle Databaseに出てくる用語が何を指してるのか分からなさすぎるので調査。
⇧ 上記サイト様でまとめてくださっています。
で、いろいろな設定やDBの作成などが済むと、イメージ図のような感じでDBに接続できるようです。
で、ORACLE_HOMEを環境変数に追加していない状態でSQL*Plusを起動しようとすると、怒られました。
⇧ ORACLE_HOME をセッティングする必要あり!
Oracle DatabaseにアクセスするSQL*Plusなどの特定のツールを使用する前に、オペレーティング・システム用の環境変数を構成する必要があります。これらの環境変数は、ツールの接続先となるデータベース・インスタンスを判別するときにOracle Databaseによって使用されます。
⇧ 公式の説明に、載ってましたね。
で、もしインストールした場所忘れたり、そもそも場所が分からないときはどうすれば?
⇧ 上記サイト様によると、『/etc/oratab』なるファイルに環境変数の設定に必要な情報が記載されてるらしい?と。
残念ながら、何の情報も得られず。
同じ疑問を持たれた先輩が!
⇧ 上記サイト様を参考に、Oracle Databaseをインストールした場所にあるbinを検索すれば良さそうです。
sudo find / -name bin
/binの部分を除いたパスを環境変数に設定します。
export ORACLE_HOME=/opt/app/oracle/product/12.2.0.1/dbhome_1
⇧ 設定できました。
SQL*Plusの起動はできましたが...
ログインできず。
『ORA-12162: TNS:net service name is incorrectly specified』というエラーは、「ORACLE_SID 」を環境変数に設定していてない場合に起こるようです。
「ORACLE_SID 」はどこで確認すれば?
⇧ 上記サイト様によると、パラメータファイルに記載されている、db_nameの値と一致していれば何でも良いようです。
パラメータファイルは、デフォルトでは下記の場所にあるようです。
$ORACLE_HOME/dbs/init.ora
自分でパラメータファイルを作ったりしていなければ、デフォルトのinit.ora がパラメータファイルとして利用されるのではないかと思われます。(<= 違ってました。詳細は後半で。)
export ORACLE_SID=ORCL
で、再度、SQL*Plus カモ~ン!
駄目じゃん...今度は何よ?
⇧ 上記サイト様によると、
のどちらかが影響してるらしいと。ちなみに、
⇧ 上記サイト様によると、
「sqlplus /nolog」でログインせずに接続できるようです。
./sqlplus /nolog
OS 認証で SYSDBA に接続し、
conn / as sysdba
インスタンスの起動!
startup
駄目じゃん...今度は何すか?
「LRM-00109: could not open parameter file '/opt/app/oracle/product/12.2.0.1/dbhome_1/dbs/initORCL.ora'」って、そもそもそんなファイル作ってないでしょ...
もしかして、init[ORACLE_SID].oraってファイルが存在しないとマズイとか?(そういうことみたいですね。)
作成。
で、再度、SQL*Plus カモ~ン!!
駄目じゃん...今度は何なんすか?
⇧ 上記サイト様によると、Oracleのトラブルシューティングに載っているようです。
Linuxシステムで、オペレーティング・システムの/dev/shm
マウント・サイズが、Oracleのシステム・グローバル領域(SGA)およびプログラム・グローバル領域(PGA)に対して小さすぎる場合、次のエラーが発生します。
ORA-00845: MEMORY_TARGET not supported on this system
初期化パラメータMEMORY_TARGET
またはMEMORY_MAX_TARGET
を設定する「メモリー・サイズ(SGAおよびPGA)」は、オペレーティング・システムの共有メモリー・ファイル・システム(/dev/shm
)より大きい値にはできません。
https://docs.oracle.com/cd/E49329_01/install.121/b71312/app_ts.htm#BEIIJCDJ
⇧ メモリのサイズの問題ということらしいですね。
⇧ 上記サイト様に解決方法が載ってそうです。
残念ながら、MEMORY_TARGETとMEMORY_MAX_TARGETの値の確認ができませんが(インスタンスが動いてないんだから、そんな気がしましたよ)、
/dev/shm の値を大きくするしかないようです。
で、なんとかMEMORY_TARGETとMEMORY_MAX_TARGETの値を調べる方法がないもんかと、
Increase memory_target on Oracle DB 12c Linux ORA-00845: MEMORY_TARGET not supported on this systema70t.wordpress.com
⇧ 上記サイト様によると、「alert.log」っちゅうDataBaseのlogファイルにメッセージが出てるよ、ということらしいですね。(インスタンスが起動してなくても見れるんかいな?)
一応、ログファイル(Oracle Database関連)は、
DIAGNOSTIC_DEST
$ORACLE_BASE
環境変数の値から導出される。$ORACLE_BASE
が設定されていない場合は、Oracle Universal Installerの設定に従って、ORACLE_BASE
から導出される。ORACLE_BASE
が設定されていない場合は、$ORACLE_HOME/rdbms/log
が使用される。
<diagnostic_dest>/diag/rdbms/<dbname>/<instname>
ADRホーム・ディレクトリの下に配置されるファイルは、次のとおりです。
-
トレース・ファイル -
<adr-home>/trace
サブディレクトリに配置されます。 -
アラート・ログ -
<adr-home>/alert
サブディレクトリに配置されます。また、alert.log
ファイルは現在XMLフォーマットであり、Oracle ARBロギング標準に従います。 -
コア・ファイル -
<adr-home>/cdumd
サブディレクトリに配置されます。 -
インシデント・ファイル - 各重大エラー(たとえば、ORA-600、ORA-1578、ORA-7445)が発生するとインシデントが発生します。各インシデントにはIDが割り当てられ、各インシデント(エラー・スタック、コール・スタック、ブロック・ダンプなど)のダンプは独自のファイルに保存され、プロセス・トレース・ファイルから分離されます。インシデント・ダンプ・ファイルは
<adr-home>/incident/<incdir#>
に配置されます。プロセス・トレース・ファイル内でインシデント・ダンプ・ファイルの場所がわかります。
ってなっているのですが、自分の場合ですと、ORACLE_BASEは設定されてないようなので、
$ORACLE_HOME/rdbms/log/diag/rdbms/<dbname>/<instname>っていうADRホーム・ディレクトリが...
これまた、残念ながら、存在しないようです。一応、logフォルダにあるファイルを見てみるも、インスタンスが起動していないことが分かったぐらいですかね。
OSのほうのログとかで何か分からんか?と思い確認。
CentOS7系でログを確認するには、
⇧ 上記サイト様によると、journalctlコマンドでいけるようです。
権限がないって...rootユーザーじゃないと駄目かな?rootユーザーでいけました。
特に欲しい情報がなし(涙)。Ctrl + C で終了します。
仕方がないので、公式のトラブルシューティングにあるように、オペレーティング・システムの共有メモリー・ファイル・システム(/dev/shm)を適当に大きくします。(7gっていうサイズの根拠が分からん。)
mount -t tmpfs shmfs -o size=7g /dev/shm
出た...rootユーザーしか実行できない問題。もう一つコマンドプロンプトを起ち上げ、
最初に開いていたコマンドプロンプトで確認すると、/dev/shmのサイズが7.0Gに増えてますね!
じゃあ、いきますか。再度、SQL*Plus カモ~ン!!!
........もう駄目だ...疲れた...続きは明日。
ということで、翌日、 このエラーは何なのさ?ということで、
- ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
- ORA-01262: Stat failed on a file destination directory Linux-x86_64 Error: 2: No such file or directory
⇧ 上記サイト様によると、「.ora」ファイルに設定されているパラメータに該当するディレクトリが存在しないらしい...「.ora」ファイルの設定重要なんすね。
...省略... # Change '<ORACLE_BASE>' to point to the oracle base (the on# install time) db_name='ORCL' memory_target=1G audit_trail ='db' db_block_size=8192 db_domain='' db_recovery_file_dest='<ORACLE_BASE>/fast_recovery_area' db_domain='' db_block_size=8192 audit_trail ='db' processes = 150 audit_file_dest='<ORACLE_BASE>/admin/orcl/adump' audit_trail ='db' db_block_size=8192 db_domain='' db_recovery_file_dest='<ORACLE_BASE>/fast_recovery_area' db_recovery_file_dest_size=2G diagnostic_dest='<ORACLE_BASE>' dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)' open_cursors=300 remote_login_passwordfile='EXCLUSIVE' undo_tablespace='UNDOTBS1'
むっちゃ、<ORACLE_BASE>を変更しろってなってますね...。
で、ORACLE_BASEはどこを確認すれば分かるんですかね?
⇧ インストレーションガイドによると、インストールディレクトリってことで、あと、環境変数の設定の項目を見ると、
$ORACLE_HOME = $ORACLE_BASE/product/12.2.0/dbhome_1
という構造になっているようですね。
我々は、ORACLE_HOMEは解決していたので、echo $ORACLE_HOMEで確認して、
環境変数が消えてる...
⇧ 上記サイト様によると、設定ファイルに記述しておかないと、仮想マシンのシャットダウン、ログイン、ログアウト、どれが影響しているかは分からないですが、環境変数はリセットされるってことですかね。
Oracleの公式のインストレーションガイドにも、
Oracle Database インストール・ユーザーの環境変数を.bash_profile に設定します。
設定後、再ログインすることで環境変数が反映されます。
Oracle Database インストール・ユーザー $HOME/.bash_profile ファイル設定例
umask 022 export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1 export PATH=$ORACLE_HOME/bin:$PATH export LANG=ja_JP.UTF-8 export NLS_LANG=Japanese_Japan.AL32UTF8
と、Oracle Database インストール・ユーザー $HOME/.bash_profile に環境変数を設定しろってなってますね。
⇧ .bash_profileがおりました。ファイルの権限がoracleユーザーになっているので、rootユーザーでなくても編集できそうです。
viエディターで編集していきます。
vi .bash_profile
「i」でINSERTモード(挿入モード、つまりファイルに書き込みができる状態)になりましたら、
.bash_profileの一番下に下記を追記します。(ORACLE_BASE、ORACLE_HOMEのパスは、ご自分の環境に合わせてください。)
⇧ 上記サイト様で、ORACLE_HOMEの場所は分かると思います。
(※ただし、Oracle Databaseがインストール済みである場合。)
umask 022
export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=/opt/app/oracle/product/12.2.0.1/dbhome_1
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8
PATH=$ORACLE_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
export PATH
そしたらば、「Esc」キーを押して、「:wq」でファイルの保存をし、viエディターを閉じます。
.bash_profileの設定すぐに反映させたい場合は、
⇧ 上記サイト様によると、
source ~/.bash_profile
でいけそうです。「.bashrc」を反映させれば「.bash_profile」も反映するのかな?今回は試す前に、「.bash_profile」を先に反映させてしまった...。
そして、誤ったパスを追加したため、環境変数が酷いことに。
⇧ 上記サイト様のコマンドで無事整いました。
ということで、ORACLE_BASEが決まったんで、「.ora」ファイルの編集。
vi /opt/app/oracle/product/12.2.0.1/dbhome_1/dbs/initORCL.ora
<ORACLE_BASE>を$ORACLE_BASEの値に書き換えますか。他にも、「ORA-00845: MEMORY_TARGET not supported on this system」のエラーって、『memory_target=1G > dev/shm=497M』ってことが原因だったってことですかね?
ちょいと脱線しますと、
⇧ 上記サイト様によると、インスタンスが起動するときに「init[ORACLE_SID].ora」の設定が利用されるため、「init[ORACLE_SID].ora」をしっかり編集してないとマズイようです...「.ora」ファイルむっちゃ重要ですやん。
ちなみに、インスタンス起動時に利用される設定ファイルには
と2種類のファイルがあり、 「init[ORACLE_SID].ora」は「テキスト形式のpfile(初期化パラメータ・ファイル)」ということらしいですね。
「バイナリ形式のSPFILE(サーバー・パラメータ・ファイル)」は、またの機会に調査ということで。
ということで、「init[ORACLE_SID].ora」を編集していきたいと思います。
# Change '<ORACLE_BASE>' to point to the oracle base (the o ne you specify at # install time) db_name='ORCL' memory_target=1G processes = 150 audit_file_dest='/opt/app/oracle/admin/orcl/adump' audit_trail ='db' db_block_size=8192 db_domain='' db_recovery_file_dest='/opt/app/oracle/fast_recovery_area' db_recovery_file_dest_size=2G diagnostic_dest='/opt/app/oracle/' dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)' open_cursors=300 remote_login_passwordfile='EXCLUSIVE' undo_tablespace='UNDOTBS1' # You may want to ensure that control files are created on separate physical # devices control_files = (ora_control1, ora_control2) compatible ='12.2.0.1.0' # cdb enable_pluggable_database=true # Oracle Managed Files db_create_file_dest='/opt/app/oracle/oradata'
ファイル編集後、ふと、インスタンス自体存在するのか?気になったので、
PMONプロセスを停止することで、インスタンスが停止します。
⇧ 上記サイト様によると、「PMONプロセス」で起動してるインスタンスは確認できるようです。
これだと、インスタンスが存在してるかの確認はできなさそうです。
じゃあ、起動・停止の状態に関わらずインスタンスの確認はできないものか。
⇧ 上記サイト様でプロセスのことは詳しく説明してくださっています。
が、自分の知識では結局理解できず(涙)。
まぁ、とりあえず、再度、SQL*Plus カモ~ン!!!!
はい、出ました~、新たなエラー。
⇧ 上記サイト様によると、「ORACLE_SID 」が環境変数に追加されてないと。設定ファイルに追加しとらんかったですね。編集。
再度、SQL*Plus カモ~ン!!!!!
出た出た、「ORA-00845: MEMORY_TARGET not supported on this system」。
解決できてなかったんか~い。
あれ? /dev/shmのサイズが元に戻ってる(497M => 7.0Gの変更がなかったことにされているんですが...)...どういうこと?
Linuxが稼働しているマシンのメモリー上に作成できるファイル・システムです。tmpfsを任意のディレクトリにマウントするだけで,通常のパーティションのようにファイルの読み書きなどに利用できます。
ただし,tmpfsはメモリー上に作成するファイル・システムであるため,マシンの電源を落としたり,マシンを再起動したりすると書き込んだファイルは消えてしまいます。
⇧ 上記サイト様によるとそういうことみたいですね。仮想マシンの再起動でリセットされとったんじゃ~!
ということで、/dev/shm のデフォルトのサイズを設定ファイルとかで編集できる?
⇧ 上記サイト様によると、/etc/fstabってファイルで可能であるようです。
さっそくバックアップを作成して編集していきます。
はい~、rootユーザーじゃないと権限がないですね、もう一つコマンドプロンプトを起ち上げ、
cp -p /etc/fstab /etc/fstab.bak.20180322
viエディターで、/etc/fstabを編集。
vi /etc/fstab
とりあえず、一番最後の行に追記してみました。
tmpfs /dev/shm tmpfs defaults,size=7g 0 0
⇧ 上記サイト様によると、
mount -a mount
で反映できるようです。
駄目でした~、
⇧ 上記サイト様によると、パスを指定しないと駄目のよう。
oracleユーザーでログインしてるコマンドプロンプトのほうにも反映されてます。
何度目?再度、SQL*Plus カモ~ン!!!!!!
しまった...「init[ORACLE_SID].ora」で設定したパスのディレクトリ作成してなかった。2つのディレクトリってことは、
audit_file_dest='/opt/app/oracle/admin/orcl/adump' db_recovery_file_dest='/opt/app/oracle/fast_recovery_area'
⇧ この人たちですかね。
で、階層のあるディレクトリをいっぺんに作成するには、
⇧ 上記サイト様によると、mkdir -p というように-pオプションが要るようです。
mkdir -p /opt/app/oracle/admin/orcl/adump mkdir -p /opt/app/oracle/fast_recovery_area
再度、SQL*Plus カモ~ン!!!!!!!
⇧ インスタンスが起動しましたよ!だが、しかし、エラー!
「ORA-00205: ?????????????????????????????????????????」
- ORA-00205: 制御ファイル識別エラー。詳細はアラート・ログをチェックしてください。
-
原因: システムは指定された名前およびサイズの制御ファイルを見つけることができません。
-
処置: すべての制御ファイルがオンラインになっていること、およびコールド・スタート時にシステムで作成された同じファイルであることを確認してください。
⇧ 公式の説明だと、アラート・ログを見れば分かると。
そもそも、データベースが起動するまでには3つのSTEPを経ていくようで、
データベースの起動が完了するまでには「START」、「MOUNT」、「OPEN」の3つのステップが存在します。
⇧ 上記サイト様によると、
という流れですかね。
で、いま、「MOUNT」の段階で進めなくなっていると。
んじゃあ、アラート・ログを見ていきますか。自分の場合、「init[ORACLE_SID].ora」で、
diagnostic_dest='/opt/app/oracle/'
と設定しているので、DIAGNOSTIC_DESTっちゅう値の説明より、
DIAGNOSTIC_DEST
$ORACLE_BASE
環境変数の値から導出される。$ORACLE_BASE
が設定されていない場合は、Oracle Universal Installerの設定に従って、ORACLE_BASE
から導出される。ORACLE_BASE
が設定されていない場合は、$ORACLE_HOME/rdbms/log
が使用される。
<diagnostic_dest>/diag/rdbms/<dbname>/<instname>
ADRホーム・ディレクトリの下に配置されるファイルは、次のとおりです。
-
トレース・ファイル -
<adr-home>/trace
サブディレクトリに配置されます。 -
アラート・ログ -
<adr-home>/alert
サブディレクトリに配置されます。また、alert.log
ファイルは現在XMLフォーマットであり、Oracle ARBロギング標準に従います。 -
コア・ファイル -
<adr-home>/cdumd
サブディレクトリに配置されます。 -
インシデント・ファイル - 各重大エラー(たとえば、ORA-600、ORA-1578、ORA-7445)が発生するとインシデントが発生します。各インシデントにはIDが割り当てられ、各インシデント(エラー・スタック、コール・スタック、ブロック・ダンプなど)のダンプは独自のファイルに保存され、プロセス・トレース・ファイルから分離されます。インシデント・ダンプ・ファイルは
<adr-home>/incident/<incdir#>
に配置されます。プロセス・トレース・ファイル内でインシデント・ダンプ・ファイルの場所がわかります。
となっているから、アラート・ログは、 <diagnostic_dest>/diag/rdbms/<dbname>/<instname>/alertフォルダにあるはず。
⇧ ありましたね。
さっそく、見てみることに。
ちょっと、想像以上に量が多いので、一旦、ホスト(Windows 10 Home)のほうにファイルを転送(ダウンロード)してチェックしたいと思います。
Tera Termを起動し、検索したパスを...あれ?『/opt/app/oracle/diag/rdbms/orcl/ORC
L/alert/log.xml』じゃないけど...まぁ、これしかないっぽいですしね。
表示されたパスをコピーし、
「ファイル(F)」>「SSH SCP...」を選択。
「Receive」のほうの「From:」のテキストエリアに、
先ほどのパスを貼り付けたら、「To:」で受取先を指定します。
「Receive」をクリック。
警告が出るけど、「OK」。
デスクトップにダウンロードされてますが、中身が空という...。
やり直し。findコマンドの上手い使い方が分からず。
上書きするか聞かれるので、「はい(Y)」。
今度は、OKそうですね。
で開いてみると、
<msg time='2018-03-22T09:03:43.951+00:00' org_id='oracle' comp_id='rdbms' type='UNKNOWN' level='16' host_id='xx.0.x.xx' host_addr='xx.0.x.xx' module='MMON_SLAVE' pid='24530'> <txt>Errors in file /opt/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_m000_24530.trc: ORA-00202: control file: '/opt/app/oracle/product/12.2.0.1/dbhome_1/dbs/ora_control2' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 7 ORA-00210: cannot open the specified control file ORA-00202: control file: '/opt/app/oracle/product/12.2.0.1/dbhome_1/dbs/ora_control1' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 7 </txt> </msg> <msg time='2018-03-22T09:03:44.097+00:00' org_id='oracle' comp_id='rdbms' msg_id='dbkh_generate_new_failure_alert:2846:3311820762' type='ERROR' group='DRA' level='1' host_id='xx.0.x.xx' host_addr='xx.0.x.xx' module='MMON_SLAVE' pid='24530'> <txt>Checker run found 2 new persistent data failures </txt> </msg>
どうやら、DBが無い状態で、startupするのは良くないらしい。startup nomount にすれば良いらしいです。
一旦、仮想マシンを停止。
これは SHUTDOWN 時にデータベースが MOUNT状態にないことを検知しているも のです。データベースが NOMOUNT状態の時に、ORA-1507 が出力されるのは想 定動作となり、問題ありません。エラーを無視してください。
Oracle OPEN していないデータベースを SHUTDOWN すると ORA-1109 や ORA-01507 が発生する | ORACLE専用データ復旧ソフトウェア Oracle DUL
DataBaseの作成
12cから、データベースの構造が変わったようで、データベースをCDB(マルチテナント・コンテナ・データベース)で作成する場合に、
の2つの方法があるようで、
Oracle Managed Filesを使用するには、初期化パラメータDB_CREATE_FILE_DEST
を設定する必要があります。このパラメータは、CDBで作成されて自動的に名前が付けられる様々なCDBファイル用のベース・ディレクトリを定義します。
となっているようで、 『2.Oracle Managed Filesを使用したCDBの作成』でDBを作る場合は、「init[ORACLE_SID].ora」の中で、『db_create_file_dest='/opt/app/oracle/oradata'』のように、DB_CREATE_FILES_DESTというものを設定する必要があるようです。
ログファイル、DBファイルを格納するためのディレクトリを事前に作っておく必要があるようです。一旦、ログアウトし、ディレクトリを作成。
mkdir -p /opt/app/oracle/oradata
再度、sqlplusでログインしたらば、
データベースの作成。
CREATE DATABASE ORCL
USER SYS IDENTIFIED BY sys_password
USER SYSTEM IDENTIFIED BY system_password
EXTENT MANAGEMENT LOCAL
DEFAULT TABLESPACE users
DEFAULT TEMPORARY TABLESPACE temp
UNDO TABLESPACE undotbs1
ENABLE PLUGGABLE DATABASE
SEED
SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
SYSAUX DATAFILES SIZE 100M;
しばし待つと、データベースが作成されました!
必要なコンポーネントをインストールする必要があるようです。
catcdb.sqlのSQLスクリプトを実行します。このスクリプトによって、CDBで必要なコンポーネントがすべてインストールされます。
catcdb.sqlのSQLスクリプトを実行します。
@?/rdbms/admin/catcdb.sql
いや、何の説明もないから分からんけど、空Enterにしました。
⇧ むちゃくちゃエラーっぽい気がするんだが...。
上記スクリプトを実行したときに「Can't locate Term/ReadKey.pm in @INC」のエラーが出力されてしまう場合は、PATH変数に$ORACLE_HOME/perl/binを追加してみてください。
⇧ 上記サイト様によると、ORACLE_HOMEにインストールされてるperlを環境変数に追加すれば良いみたいですね。
まぁ、一旦、ログアウトします。
.bash_profileに環境変数を追加してまいりますか~。
PATH変数に$ORACLE_HOME/perl/binを追加したら、「Esc」キーを押して、「:wq」で、ファイル保存しviエディターを閉じます。
.bash_profileの変更を反映。
source ~/.bash_profile
そしたらば、もう一回、catcdb.sqlのSQLスクリプトを実行してみますか。
例のごとく、空Enterで...エラーが変わったけど、エラーに変わりはない。
SQL> Rem The script relies on the caller to have connected to the DB SQL> SQL> Rem This script invokes catcdb.pl that does all the work, so we just need to SQL> Rem construct strings for $ORACLE_HOME/rdbms/admin and SQL> Rem $ORACLE_HOME/rdbms/admin/catcdb.pl SQL> SQL> Rem $ORACLE_HOME SQL> column oracle_home new_value oracle_home noprint SQL> select sys_context('userenv', 'oracle_home') as oracle_home from dual; SQL> SQL> Rem OS-dependent slash SQL> column slash new_value slash noprint SQL> select sys_context('userenv', 'platform_slash') as slash from dual; SQL> SQL> Rem $ORACLE_HOME/rdbms/admin SQL> column rdbms_admin new_value rdbms_admin noprint SQL> select '&&oracle_home'||'&&slash'||'rdbms'||'&&slash'||'admin' as rdbms_admin from dual; 旧 1: select '&&oracle_home'||'&&slash'||'rdbms'||'&&slash'||'admin' as rdbms_admin from dual 新 1: select '/opt/app/oracle/product/12.2.0.1/dbhome_1'||'/'||'rdbms'||'/'||'admin' as rdbms_admin from dual SQL> SQL> Rem $ORACLE_HOME/rdbms/admin/catcdb.pl SQL> column rdbms_admin_catcdb new_value rdbms_admin_catcdb noprint SQL> select '&&rdbms_admin'||'&&slash'||'catcdb.pl' as rdbms_admin_catcdb from dual; 旧 1: select '&&rdbms_admin'||'&&slash'||'catcdb.pl' as rdbms_admin_catcdb from dual 新 1: select '/opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin'||'/'||'catcdb.pl' as rdbms_admin_catcdb from dual SQL> SQL> host perl -I &&rdbms_admin &&rdbms_admin_catcdb --logDirectory &&1 --logFilename &&2 1に値を入力してください: 2に値を入力してください: Can't locate util.pm in @INC (you may need to install the util module) (@INC contains: /opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin /opt/app/oracle/product/12.2.0.1/dbhome_1/perl/lib/site_perl/5.22.0/x86_64-linux-thread-multi /opt/app/oracle/product/12.2.0.1/dbhome_1/perl/lib/site_perl/5.22.0 /opt/app/oracle/product/12.2.0.1/dbhome_1/perl/lib/5.22.0/x86_64-linux-thread-multi /opt/app/oracle/product/12.2.0.1/dbhome_1/perl/lib/5.22.0 .) at /opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin/catcdb.pl line 35. BEGIN failed--compilation aborted at /opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin/catcdb.pl line 35.
catcdb.sql and the util.pm issue in Oracle Database 12.2
catcdb.sql and the util.pm issue in Oracle Database 12.2 - Oracle Blog - Oracle - Toad World
⇧ はい、issue(バグ)でした(涙)。
しかも、「1に値を入力してください:」「2に値を入力してください:」には、
「Rem $ORACLE_HOME/rdbms/admin」、
「Rem $ORACLE_HOME/rdbms/admin/catcdb.pl」
つまり、
「/opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin」、「/opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin/catcdb.pl」
をそれぞれ入力せんとマズそうですね。
で、バグの内容ですが、
BEGIN failed--compilation aborted at /opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin/catcdb.pl line 35.
$ORACLE_HOME/rdbms/admin/catcdb.plの35行目で問題が起こっているらしく、
vi +35 /opt/app/oracle/product/12.2.0.1/dbhome_1/rdbms/admin/catcdb.pl
⇧ 「use util qw(trim, splitToArray)」ってとこの、utilのuが小文字になってるのが問題らしいです...perlとか分からんですわ。
実際、ORACLE_HOMEの中を検索してみると、perlのモジュールでutil.pmは存在しないけど、Util.pmは5件スマッシュヒット。
なので、$ORACLE_HOME/rdbms/admin/catcdb.plの35行目を、
use Util qw(trim, splitToArray);
のように修正します。
で、保存したらば、もう一回 catcdb.sqlのSQLスクリプトを実行していこうと思いますが、Util.pmが環境変数に追加されていない場合は、catcdb.sqlのSQLスクリプトを実行するディレクトリを移動しておく必要があるようです。
移動しておくディレクトリは、
$ORACLE_HOME/perl/lib/5.22.0/x86_64-linux-thread-multi/Hash/
@?/rdbms/admin/catcdb.sql
@?がついていて、
sqlplusにおいて「?」はOracle Homeディレクトリに置換されます。つまり、「@?/sqlplus/admin/plustrce.sql」は、「@$ORACLE_HOME/sqlplus/admin/plustrce.sql」の意味となります。
⇧ という意味らしいです。
というわけで、一旦、ログアウトし、
ディレクトリを移動しておいて、再度、ログイン。
今度は、ちゃんと入力。新しいパスワードを自分で決めて良いみたいですね。(忘れないようにメモしておこう、独り言です。)
適当なパスワードを入力して、Enter。
データベース作成のときに「DEFAULT TEMPORARY TABLESPACE temp」で指定してた名前でOKかと。
で、エラー...どんだけエラー出しまくってるんだって話ですね。
「database is not openUse of uninitialized value $instanceName in concatenation (.) or string at」ってエラーらしいでんすが、
⇧ 上記サイト様によると、Perlで変数の初期化が行われていないと起こるようです。
で、実際エラーの起きてるとこを見てみると、
sub get_instance_status_and_name (\@$$$) { my ($connectString, $DoneCmd, $DoneFilePathBase, $debugOn) = @_; my @GetInstStatusStatements = ( "connect ".$connectString->[0]."\n", "set echo off\n", "set heading off\n", "select \'C:A:T:C:O:N\' || status, instance_name from v\$instance\n/\n", ); # should return exactly 1 row my ($out_ref, $Spool_ref) = exec_DB_script(@GetInstStatusStatements, "C:A:T:C:O:N", $DoneCmd, $DoneFilePathBase, $debugOn); my $InstStatus; my $InstName; if (!@$out_ref || $#$out_ref != 0) { # instance status and name could not be obtained; if this was due to the # fact that the instance was idle (ORA-01034 reported), return Idle as # InstStatus; otherwise, report an error if (!@$out_ref) { for my $SpoolLine ( @$Spool_ref ) { if ($SpoolLine =~ /ORA-01034/) { return ("Idle", "N/A"); } } } print_exec_DB_script_output("get_instance_status_and_name", $Spool_ref, 1); } else { # split the row into instance status and instance name ($InstStatus, $InstName) = split /\s+/, $$out_ref[0]; } return ($InstStatus, $InstName); } ...途中省略... # status and name of the instance (v$instance.status and # v$instance.instance_name) my ($instanceStatus, $instanceName) = get_instance_status_and_name(@connectString, $catcon_DoneCmd, $doneFileNamePrefix, $catcon_DebugOn); if (!$instanceStatus) { log_msg("catconInit: unexpected error in ". "get_instance_status_and_name\n"); return 1; } elsif ($instanceStatus !~ /^OPEN/) { log_msg("catconInit: database is not open"); if ($EZConnect eq "") { # default instance log_msg(" on the default instance (".$instanceName.")\n"); } else { log_msg(" on instance ".$instanceName." with EZConnect string = ". $EZConnect."\n"); } return 1; }
my ($instanceStatus, $instanceName)のところで、$instanceNameに何も代入されなかったということですかね。
CATALOG.SQL, CATPROC.SQL and PUPBLD.SQL scripts were not executed using the catcon.pl script provided by Oracle. This means views for the data dictonary were only created in your root database (the CDB) but not in the seed database.
Oracle 12c: ORA-00942 on CREATE PLUGGABLE DATABASE – Simon Krenger
⇧ 上記サイト様によると、catcon.pl(perlのファイル)のスクリプトが実行されなかったのは、PERL5LIBっていう環境変数を設定していなかったからって言ってますね(OracleのDB作成のガイドのどこにもそんな話は出てきてないという...)
まぁ、とりあえず、やってみますか。一応、ORACLEインスタンスは起動した状態(STARTUP NOMOUNTで起動してるのでDBにマウントされてない状態)にしておいて、
もう一つコマンドプロンプトを起ち上げて、Oracleユーザーでログインしておきます。
したらば、PERL5LIBっていう環境変数を設定。
$ORACLE_HOMEはご自分の環境のパスに置き換えてください。
perl $ORACLE_HOME/rdbms/admin/catcon.pl -n 1 -l /home/oracle -b catalog $ORACLE_HOME/rdbms/admin/catalog.sql;
駄目じゃん...。
駄目もとで、マウントした状態で、試してみる。 (一回、SHUTDOWNでORACLEインスタンスを停止してから、STARTUPしてください。)
かなり時間かかりますが、
completed successfully
来たー!!!DB作成した後に、ORACLEインスタンスをマウントモードで起動しなおさないといけなかったようです、分かるかい!
$ORACLE_HOMEはご自分の環境のパスに置き換えてください。
perl $ORACLE_HOME/dbhome_1/rdbms/admin/catcon.pl -n 1 -l /home/oracle -b catproc $ORACLE_HOME/dbhome_1/rdbms/admin/catproc.sql;
むちゃくちゃ時間かかりましたが、上手くいきました。
$ORACLE_HOMEはご自分の環境のパスに置き換えてください。
perl $ORACLE_HOME/rdbms/admin/catcon.pl -n 1 -l /home/oracle -b pupbld -u SYSTEM/oracle $ORACLE_HOME/sqlplus/admin/pupbld.sql;
⇧ エラー。どうやら、SYSTEMユーザーのパスワードが合ってないみたい。
と思ったら、SYSTEMユーザーがロックされてたらしい。
ALTER USER [ユーザー名] IDENTIFIED BY [ユーザー名のパスワード] ACCOUNT UNLOCK;
で、再度、pupbld.sqlのSQLスクリプトを実行したら、エラーが...権限が足りてないそうな。SYSTEMユーザーだと権限が足りなかったようです。
pupbld.sqlのSQLスクリプトに関しては、直接、SQLで試してみますか。
@?/sqlplus/admin/pupbld.sql;
う~ん、どっちにしろエラーが発生しますな。
「ORA-00942: 表またはビューが存在しません。」
「ORA-01434: 削除するプライベート・シノニムが存在しません。」
ORA-01432: 削除するパブリック・シノニムが存在しません。
ORA-00942: 表またはビューが存在しません。
ORA-01918: ユーザー' string' は存在しません
ORA-01919: ロール' string' は存在しません
ORA-04043: オブジェクトstring は存在しません。
ORA-02289: 順序が存在しません。
ORA-01434: 削除するプライベート・シノニムが存在しません
のようなエラーはcatproc.sqlなどDB作成完了後に ディクショナリ作成したり,基本のプロシーじゃなどを作るスクリプトで普通に出ます。
作る前にまず削除してから作ろうとするからです。
ですからこれらがcatproc.sqlなどでこれらが出ているのならば問題ありません。
Oracle Technology Network (OTN) Japan - 掲示板 : ORA-01034: ORACLE not availableについて。 ...
⇧ 上記サイト様によると、pupbld.sqlのSQLスクリプトの実行で、これらのエラーは出ても問題なさそうですね。
制御ファイル
で、制御ファイルと呼ばれるファイルを「init[ORACLE_SID].ora」のcontrol_filesに指定するようです。
例によって場所が分からんという...ORCLっていうフォルダは作られたけど...
データベースを作成するとできるってなってますね、どこに?
制御ファイルは、データベースがオープンしているときに必ずOracle Databaseサーバーが書き込めるように、使用可能にしておく必要があります。制御ファイルがないと、データベースがマウントできず、リカバリが困難になります。
Oracle Databaseの制御ファイルはデータベースとともに作成されます。デフォルトでは、データベースの作成時に、制御ファイルのコピーが少なくとも1つ作成されます。デフォルトで複数のコピーが作成されるオペレーティング・システムもあります。データベース作成時に、制御ファイルのコピーを2つ以上作成することをお薦めします。その後も、制御ファイルを失ったり、制御ファイル内の設定を変更する場合には、制御ファイルを作成できます。
⇧ 公式の説明だと、
データベースの作成前にCONTROL_FILES
に対してファイルを指定しない場合は、次のように処理されます。
-
Oracle Managed Filesを使用していない場合、データベースではデフォルトのファイル名で制御ファイルが作成されます。デフォルトのファイル名はオペレーティング・システムによって異なります。
-
Oracle Managed Filesを使用している場合は、この機能を使用可能にするために設定した初期化パラメータによって制御ファイルの名前と位置が決定されます。
-
Oracle Automatic Storage Management (Oracle ASM)を使用している場合は、不完全なOracle ASMファイル名を
DB_CREATE_FILE_DEST
およびDB_RECOVERY_FILE_DEST
初期化パラメータに設定できます。Oracle ASMによって、制御ファイルが適切な場所に自動的に作成されます。
ってなってますね、 「init[ORACLE_SID].ora」の設定を相当しっかりやっとかないとマズかったんじゃないの?と思われますね。
制御ファイルの場所は、SQLで分かるみたいですね。
SELECT name FROM v$controlfile;
⇧ 「.ctl」の拡張子がついてないけど、大丈夫なんですかね?「init[ORACLE_SID].ora」の設定をしっかりしとけば...。
とりあえず、制御ファイルのバックアップを取ります。
- 制御ファイルをバイナリ・ファイル(既存の制御ファイルの複製)にバックアップを作成
- 後で制御ファイルの再作成に使用できるSQL文を生成
の2パターンあるようです。
まずは、『制御ファイルをバイナリ・ファイル(既存の制御ファイルの複製)にバックアップを作成』を試してみます。ディレクトリは存在してるものを指定します。ファイル名は適当で良さそうです。
ALTER DATABASE BACKUP CONTROLFILE TO [バックアップ先ディレクトリ/バックアップファイル名];
作成されています。
もう一つの、『後で制御ファイルの再作成に使用できるSQL文を生成』も試してみます。
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
アラートログを確認してみると($ORACLE_BASE=/opt/app/oracleの場合)、
cat /opt/app/oracle/diag/rdbms/orcl/ORCL/alert/log.xml
⇧ 「/opt/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_1766.trc」 っていうトレースファイルができたようです。
pfile(初期化パラメータ・ファイル)で、ORACLEインスタンスの起動とDBのマウント
pfile(初期化パラメータ・ファイル)、つまり「init[ORACLE_SID].ora」を使ってORACLEインスタンスの起動とDBのマウントができれば良いようです。
とりあえず、一旦、ORACLEインスタンスとDBをSHUTDOWNしときます。
pfile(初期化パラメータ・ファイル)に制御ファイルのパスを追加していくわけですが、制御ファイルの拡張子が付いてないので、「.ctl」を付けたいと思います。
変更できましたので、
「init[ORACLE_SID].ora」に、制御ファイルのパスを追加します。
control_filesのところを、
変更して保存。
そしたらば、sqlplusでログインして、pfile(初期化パラメータ・ファイル)でORACLEインスタンスの起動とDBのマウントを行います。$ORACLE_HOME、init[ORACLE_SID].oraはご自身の環境に置き換えてください。
startup pfile=$ORACLE_HOME/dbs/init[ORACLE_SID].ora
無事、起動しました。
テキスト形式のpfile(初期化パラメータ・ファイル)を元に、バイナリ形式のSPFILE(サーバー・パラメータ・ファイル)を作成しておきます。
create spfile from pfile;
正常にSHUTDOWN、STARTUPができればOKです。
長い闘いでしたが、無事、DBの起動までできましたね。
後はテーブルとかを作成していけば、ようやくJavaとかからのDB接続の練習ができますね。
今回も、無駄に時間を浪費してしまいましたが(まるまる3日ぐらい潰してしまった...)。有識者の方に聞ける環境があればもっと効率よくできるんでしょうね。
先生が欲しいですね。
今回はこのへんで。