2017年5月14日日曜日

【Linux】bashのコマンド履歴機能を便利に使う

bashにはコマンドの実行履歴を参照できる便利な機能があります。
例えば入力待ちの状態の時、↑を押せば、前回実行したコマンドが出てきます。
↑を複数回押せば、さらにその前のコマンドが出てきます。
※↑↓で履歴を行ったり来たり出来ます。
長いコマンドを何度も手で入力するのは面倒なので、この機能を使って同じコマンドを呼び出して実行することがあります。

historyコマンドで、過去のコマンド履歴をずらりと並べて参照することもできます。

例)
history
    4  su - test
    5  srvctl stop database -d orcl
     :
   <<略>>
     :
1002  cat .bash_history
1003  history → 直近で入力したhistoryも出る。

この左端に出てる番号を「!」付きで実行しても、過去のコマンドを実行できます。
例えば、1002 cat .bash_historyを再度実行したい場合、

!1002

とすれば実行できます。

これはbash君が実行コマンドを履歴としてメモリに蓄えてくれているからでしょう。
※蓄える量に上限はあるけど。

ちなみに、、、

ターミナルが別、つまりGNOMEやTeraTermの窓が別々だと、それぞれの実行履歴は、それぞれから見れないです。
以下、検証してみました。

例)ターミナルA、Bを同時に開いて、それぞれ違うコマンドを実行した場合、それぞれのターミナルから実行履歴が見れるか?

■ターミナルA
export ORACLE_SID=orcl
$ history
    4  su - test
    5  srvctl stop database -d orcl
     :
   <<略>>
     :
1002 export ORACLE_SID=orcl
1003  history

■ターミナルB
cat $ORACLE_HOME/network/admin/tnsnames.ora
$ history
    4  su - test
    5  srvctl stop database -d orcl
     :
   <<略>>
     :
1002  cat $ORACLE_HOME/network/admin/tnsnames.ora
1003  history
※ターミナルAで実行した「export ORACLE_SID=orcl」はターミナルBのhistoryで出てこない。

ターミナルBで、ターミナルAで実行したコマンドが見れないことが分かります。
各ターミナルでメモリ空間が別々だからでしょうか。

そうは言っても、他のターミナルで実行したコマンドが見たい場合もあります。
ターミナルAの実行履歴を.bash_historyに反映させることで、ターミナルBからもAの実行履歴を参照することが出来ます。

例)ターミナルAの実行履歴をBにも反映させたい。

■ターミナルA
export ORACLE_SID=orcl
$ history
    4  su - test
    5  srvctl stop database -d orcl
     :
   <<略>>
     :
1002 export ORACLE_SID=orcl
1003  history
history -a ★ターミナルAの実行履歴を.bash_historyに反映

■ターミナルB
history -n .bash_historyを再読み込み
$ history
    4  su - test
    5  srvctl stop database -d orcl
     :
   <<略>>
     :
1002 cat $ORACLE_HOME/network/admin/tnsnames.ora
1003  history
1004  history -n
1005  export ORACLE_SID=orclターミナルAの実行履歴
1006  historyターミナルAの実行履歴
1007  history -aターミナルAの実行履歴
1008  history

これで、他のターミナルで実行したコマンドも参照出来ました。
いちいち、コピペとかしたり、入力する手間がいりません。


参考文献

2017年5月6日土曜日

【Linux】tail -f でORACLEのアラートlogを出しながら作業

Linux版ORACLEで作業するとき、
何か起きたらすぐに把握できるように、アラートlogを表示した状態で作業します。

例えば、GNOMEやTeraTermからデータベースサーバに接続し、CUIで作業するとします。
sqlplusでデータベースに接続し、テーブル拡張や表領域拡張と言ったORACLE関連の作業をしている裏で、、、
もう一枚、Window(GNOMEやTeraTerm)を立ち上げます。
その新しく起動したGNOMEやTeraTermだと、同じデータベースサーバに接続します。
そのWindowでは、以下のコマンドを実行します。

$ cd /u01/app/oracle/diag/rdbms/XXX/XXX/trace
$ tail -f alert_XXX.log

※XXXはデータベース名

ORACLEのalertログの場所まで移動し、tailコマンドに-fオプションで、alertログを垂れ流し状態にします。
別WindowでORACLE作業をしていて、何かあればORA-エラーが出力されたり、警告が出ます。
それで、リアルタイムに今の作業が原因で何か起きたかかが分かるし、作業を中断して調査することが出来ます。

そのまま作業を続けると、まずいことになるのを防ぐことが出来ます。

2017年5月3日水曜日

ORACLEのORA-600が出たら

データベース運用してて、安定してきたな~って思ってきたら、突然、

ORA-600出ましたあ!

何て、報告受けてびっくりして、夜中タクシー飛ばしてサーバルームに行く何てことありますよね。
ない?それは幸せですね。

ピンチはチャンスと言いますが、こういった障害がらみの対応の時、人は成長します。
ぐんぐんと。
その分、疲れるし、みんなにはせっつかれるしで、針の筵の気分ですが、終わると、ぐったり安心感に包まれます。
終わり方にもよるけど。

さて、ORA-600が出たらどうするか。。。

サポートに問い合わせる。

身もふたもないですが、これが一番早い。
ログを集めて、サポートに送り付けてる間に、自分でも調査しましょう。
ORA-600は原因不明のエラーなので、対処しようがないです。
唯一、前と同じパターンのORA-600なら、前の対処で対応できますが、それ以外は、調査をサポートに任せます。
その間に、サービスに影響ないか、DBに異常はないかを確認しましょう。
まずは、業務が止まっていないということを確認するのが皆にとって優先です。
調査して原因が分かっても、すぐには対処できませんから。

ORA-600が出て、DBが落ちてるんだったらすぐ立ち上げる必要があるし、ブロック破損してたら、リストアリカバリするか検討する必要だってあります。
現状を知ることです。
で、起動できないなり、リストアリカバリが出来ないのであれば、それもサポートに訊きましょう。
訊いてる間に自分でも調べる。

とにかく、やることも多いし、普段本で読んだだけのコマンド使ったり、何でうまく行かないんだろーってOSから調べたりと、ものすごい速度でスキルアップしますよ。

お試しあれ!

って、試したくないですよね^^;