2008年12月23日火曜日

現在のサービスの状況確認&設定方法

システム起動時に自動的に実行されるデーモン起動スクリプトの状況確認と設定は、
以下のコマンドにて、実施する
%)chkconfig --list
全サービスの状況表示

%)chkconifg --level 6 httpd on
httpd デーモンをランレベル6で起動するように変更

%)chkconfig --list httpd
httpdデーモンのサービス状況を表示

※その他細かいパラメタは、man にて参照されたし

2008年12月19日金曜日

Listenerの肥大したログの対応

リスナーのログファイルは、リスナープロセスが
ファイルをオープンし続けているため削除してはいけないらしい(Oracle10g)

そのため、ログ出力先を変更し、変更前のファイルを削除していくようにする必要がある。
以下、サンプル(Web抜粋)

# ①現在出力しているファイルを一時的に別のファイルへ変更
LSNRCTL> set log_file listener.tmp.log

# ②それまでに出力していたファイルを別のファイルにReName
%) mv listener.log listener.old

# ③ ①で別のファイルへ変更していたのを元に戻す
LSNRCTL> set log_file listener.log

# ログファイルの結合(ふるいログを直近のファイルで、作成しなおす)
(1) %)cat listener.old listener.tmp.log > listener_YYYYMMDD.log
or
(
2) %)cat listener.tmp.log >> listener.old
'>>''>' にタイプミスするとログが上書きされるので、注意。

2008年12月18日木曜日

ARCServe 再インストール時に、Ingresのインストールでエラーの対応

【事象】
ARCServeの再インストール時に、Ingresが既にインストール済みです という
エラーになり、再インストールを進められない。
(正規のアンインストール方法ではなく、インストールディレクトリごと、rmしてしまった状態)
ARCServe Backup Server 11.5 for Linux

【対応】
Ingresのパッケージを全て削除して、再インストールを実施。

Step1:Ingresパッケージの確認
%)rpm -qa | grep ca-ingres

Step2:Ingresパッケージの強制削除
%)rpm -e -f --noscripts パッケージ名

※Step2で、依存関係でエラーになる場合は、エラーの出たパッケージを先に削除

Step3:ARCServe のインストール
%)install

ランレベルについて

ランレベルについて、以下抜粋
 
ランレベル

意味
 
0
シャットダウン(システムの停止)
 
1
シングルユーザーモード(rootのみ)
 
2
ネットワークなしのマルチユーザーモード
 
3
通常のマルチユーザーモード(テキストログイン)
 
4
未使用
 
5
グラフィカルログインによるマルチユーザーモード
 
6
システムの再起動

 動作モードが異なるということは、起動されるプログラムが違うということだ。Linuxでは、
ランレベル別のディレクトリ(/etc/rc.d/rc?.d)にあるファイル
(実際には各プログラムの起動スクリプトへのリンク)の名前により、
各ランレベルで実行するプログラムを指定している。

 例えば、ランレベル3の場合は/etc/rc.d/rc3.dにあるスクリプトが実行される。
/etc/rc.d/rc3.dには、「Kと2けたの数字」で始まるファイルと、
「Sと2けたの数字」で始まるファイルがある。
「K」はKill、つまり実行されないスクリプトを表し、「S」はStart、
つまり実行されるスクリプトを表す。KやSに続く数字は、
実行されるスクリプトの優先順位だ。数字の小さいスクリプトから順に実行される。

シェルでSQLファイルを実行させる方法

sqlplus ID/PASSWORD@SID < $HOME/script/data.sql


※data.sqlファイルに、実行SQLを記述する。

シェルでFTPする方法

ftp -n IPアドレス << _EOF
user iposusr ipospsw
cd /tmp
get aaa.txt
bye
_EOF

ARCServeで、E1138 メディアを検出できませんでした。 タイムエラーの対応

【事象】
ARCServeにて、バックアップジョブをスケジュール化して、実施したところ、
E1138 メディアを検出できませんでした。 タイムエラー。」が発生し、ジョブが異常終了。

【対応】
以下、Web、抜粋
ARCserveはメディアをラベル名とIDさらにはシーケンス番号で管理します。
ラベル名はフォーマットした際の名前ですね、さらにIDは一意の番号になります。
ラベル名:月曜日+ID:0001、とラベル名:月曜日+ID:F001とは表面上同じように見えますがARCserveではまったく別のメディアとして管理されています。
同じ名前で複数のメディアをフォーマットしてもかまわないのですが、IDは必ず別のものになります。
シーケンス番号は一本のメディアに収まらなかった場合の2本目のメディアがシーケンス番号「2」になります。(この際のラベル名、IDは一緒になります、シーケンス番号だけが違う)

想定するに今回の問題は下記のような状態かなぁと思われます。

1.即時実行でバックアップ、バックアップ対象は現在テープ装置に入っているメディア「ラベル名:フルバックアップ+ID:AAAA」、「上書き - 同名のメディア、ブランク メディアのみ」<=標準の設定
バックアップ対象にするターゲットを選択する際、ついそのメディアを選んでしまうんです。
2.バックアップは正常に実施される
ただし、メディアは上書<=つまりフォーマットされます<=「ラベル名:フルバックアップ+ID:BBBB」
フォーマットされるのでIDが変わってしまうんです!
3.即実行のジョブを変更してそのまま繰り返しのジョブとして登録すると。。。。
バックアップ対象のターゲットは「ラベル名:フルバックアップ+ID:AAAA」のままです。
4.バックアップは失敗します。対象のメディアがないといわれる、なぜ??
バックアップのジョブではターゲットは「ラベル名:フルバックアップ+ID:AAAA」
しかし現在入っているメディアは2でフォーマットされて「ラベル名:フルバックアップ+ID:BBBB」
これはバックアップ対象にしたものと違うメディアなんです。

対処方法
1.何でも上書してしまう問題があるのですが、すぐに確認するには最適な方法で
「上書き - 同名のメディア、ブランク メディア、その他のメディア」にしてしまう。
※テープ装置がローダ(複数のメディアを入れることができる装置)なんかだと絶対やってはいけない方法ですけど。(常に1スロット目のメディアしか使用されません)
2.IDは無視して再利用してもらう設定
本当はこの設定が良いです。
Windows版でもLinux版でもバックアップ対象をデスティネーションで選ぶ際、メディアを選ばず
グループを左ペインで選び(例:GROUP0)、上のメディア名が[*]になりますのでここに[フルバックアップ]など直接キーボードから入力してくださ い。<=これでIDがどんなものでも「ラベル名:フルバックアップ」が利用されます。この入力は登録直前に行うのをお勧めします。(ソース画面を設定した りしてると設定がなくなることがありましたので)

※確認方法:ジョブステータス画面で対象のジョブを選ぶとしたのペインにジョブ詳細が表示されますがその中でメディアIDが表示されていなかったり、[*]になっていればOKです。
※この設定はr11.5のWindows版なら「名前のみを使用してメディアを区別する」のオプションがあるのですがLinux版は確かないので直接入力します。

ARCserveの繰り返しジョブで失敗する(1回目は良いけど。。)多くのケースがこれです。
画面を見ながら、試験してみてください。

2008年12月17日水曜日

ARCServe Agent for OracleでOracleDBにログインできない件の対応

【事象】
ARCServeの管理画面からバックアップマネージャにて、
DBのあるサーバにログイン後、該当するDBにログインすると、
Database is offline というエラーになって、バックアップ対象ファイルが見えない

【対応】
回避
ログを見ると、Oracleユーザにロックが掛かっており、見えないと判明。
暫定的に、ロックを解除して回避
根本的に、なぜ、ロックが掛かっていたかは不明(調査中)

ARCServe でインストール時にライセンスキーが入らない場合の対応

前提:ARCServe Backup 11.5 for linux

インストール時に、購入時のライセンキーを入力しても、Invalid Lisenceと言われる場合、
以下の対応にて、回避をした。

1.インストール時は、ライセンスキーをいれずに、Skipして、そのままインストール
2.インストール完了後、以下のディレクトリのコマンドを実行してキーを投入。
/opt/CA/SharedComponents/ca_lic/CALicense ライセンキーNO

特定のセッションを停止

以下のSQLを実行

ALTER SYSTEM KILL SESSION '7,15';

※'7,15'は 接続中のセッションのSID,SERIAL#

接続中のセッション情報を表示

以下のSQLを実行

SELECT SID,SERIAL#,STATUS
FROM V$SESSION WHERE USERNAME = 'caomu';

USERNAMEは、該当するユーザを指定して、検索が可能。

Oracleユーザ削除

以下のコマンドを実行

%)sqlplus /nolog
SQL>conn sys as sysdba
SQL>drop user caomu cascade;

cascadeのオプションつきで、関連しているデータも消えます。

Oracleユーザ作成

SQL*PLUSから以下のコマンドを実行

%)sqlplus /nolog
SQL>conn sys as sysdba

SQL>create user caomu
SQL>identified by caomu
SQL>default tablespace users
SQL>temporary tablespace temp;

bash プロンプトの変更方法

bashのプロンプトを変更するには

Linuxの標準シェルであるbashでは、PS1という環境変数によってプロンプトを定義している。
従って、exportコマンドでPS1を変更すればいい。

 デフォルトでは「[ユーザー名@ホスト名 カレントディレクトリ]」というプロンプトになっている。これを単純に「$」というプロンプトに変更するには、以下のコマンドを実行する。
export PS1="$ "

 デフォルトのプロンプトに戻すには、以下のコマンドを実行する。
export PS1="[\u@\h \W]\\$ "

 bashのプロンプトには、以下のような特殊な文字を使用できる。これらを組み合わせれば、オリジナルプロンプトも作成可能だ。
\a ASCIIのベル文字(07)を表示する(ビープ音を鳴らす)
\d 「曜 日 月 日」の形式(例:Fri Jan 5)で日付を表示する
\e ASCIIのエスケープ文字(033)を表示する
\h ホスト名のうち最初の「.」までの部分を表示する
\H ホスト名を表示する
\n 改行する
\r 復帰する
\s シェルの名前を表示する
\t 現在の時刻を24時間の「HH:MM:SS」形式で表示する
\T 現在の時刻を12時間の「HH:MM:SS」形式で表示する
\@ 現在の時刻を12時間の「am/pm」形式で表示する
\u 現在のユーザー名を表示する
\v bashのバージョンを表示する
\V bashのリリースを表示する
\w 現在の作業ディレクトリを、ユーザーのホームディレクトリからの絶対パスで表示する
\W 現在の作業ディレクトリを表示する
\! このコマンドの履歴番号を表示する
\# このコマンドのコマンド番号(現在のシェルのセッション中に実行されたコマンドのシーケンスにおける位置)を表示する
\$ 実効UIDが0の場合に#となり、それ以外の場合に$となる
\nnn 8進数nnnに対応する文字を表示する
\\ バックスラッシュを表示する
\[ 非表示文字のシーケンスを開始する。これを使って、プロンプト中に端末の制御シーケンスを埋め込むことができる
\] 非表示文字のシーケンスを終了する

VPN経由でARCServeの管理画面でエラーの対応方法

前提:VPN Clientで、ARCServe Backupがインストールされているサーバへアクセス。

以下のポートがルータに定義されていなかったためと判明。
TCP :80
6060
6072
6051
UDP:6051

ネットワークの設定

■ネットワークカードの情報
 /etc/sysconfig/network-scripts/ifcfg-eth*(*は任意の数字です)
■ルーティングの情報
 /etc/sysconfig/static-routes
■ホスト名やゲートウェイ情報
 /etc/sysconfig/network
に保持されています

gatewayだけの情報を維持したいのであれば/etc/sysconfig/networkに
GATEWAY="xxx.xxx.xxx.xxx(任意のIP)"としておけばいいでしょうし
ルーティング情報を保持したいのであれば
/etc/sysconfig/static-routesにrouteコマンドのroute add以下の
記述内容を入れておけばネットワーク再起動後でも反映されます。
##勿論上記更新後にネットワークの再起動をお忘れなきよう。

# TurboLinux Static Routes File
# Generated by TurboNetCfg's Routing plug-in module.
# Generated on Tue Apr 18 14:31:14 2000

eth1 net ???.???.???.??? netmask ???.???.???.??? gw ???.???.???.???

Java Out Of Memoryが発生したときのアプローチ

以下、Webからの抜粋

【OutOfMemoryError が出た時のアプローチ(①)】
OutOfMemoryError はメモリの使用量がヒープメモリサイ ズの指定を超えると発生します。
OutOfMemoryError に陥るケースは二つあります。

 (A) 不要なオブジェクトが無駄にメモリに残っている場合
 (B) ヒープサイズの絶対量が不足している場合
 以下にそれぞれの対処を記します。

  (A)不要なオブジェクトが無駄にメモリに残っている場合
  この場合、まず問題のあるオブジェクトを 見つけます。
  問題のあるオブジェクトに対して、以下の対処を施します。

   1. 不要になったオブジェクトは参照を破棄 ( 変数に null を代入 ) する

使い終わった不要なオブジェクトをメモリから解放し、メモリを有効活用でき るようにします。
Java の場合、使い終わった不要なオブジェクトはガーベージコレクション ( 以下 GC ) によりメモリから解放されます。
通常、GC が行われることで OutOfMemoryError は発生しません。

この GC は不定期に実行されるもので、「不要となったオブジェクト」を解放 します。
GC は解放の前に「不要であるかどうか」判断します。

GC が実行されても、GC が不要と判断しない限り、オブジェクトはメモリから 解放されません。

GC は「オブジェクトへの参照が無い」事を見て不要と判断します。

GC にメモリを解放してもらうためには、プログラマ上では「この時点でこのオブジェクトはもう要らないな」 と判断できるところで、
そのオブジェクトへ の参照がない状態すなわち変数の値を null 値にします。

    2. Session オブジェクトに大きなオブジェクトを格納する事は極力避ける

SSJS、サーブレット、JSP の場合、Session にオブジェクトを格納して 画面間でデータを持ちまわったり画面遷移の制御をする
と思います。

Session に格納する時は、必要な分だけに留めるべきです。

アクセスが集中した時、セッション数が増えます。 大きなオブジェクトを格納するとセッションの数に比例してメモリ使用量が

大きく増加することとなる。

    3. Session に格納した場合、不要となった時点で削除する

格納したオブジェクトは不要になった時点で、セッションから削除します。

削除を怠れば、セッションタイムアウト時間までJava VM のメモリ上に残ったままになります。

(B) ヒープサイズの絶対量が不足している場合
上記(①)で対処を行ってもなお OutOfMemoryError が発生する場合は、システム の規模等に対し、ヒープサイズが不足しています
ので -Xms、-Xmx パラメータの値を調整して ヒープサイズを大きくとります。この時に設定する値は-Xms、-Xmxともに同じ値を設定する。

パラメータ -verbose:gc を使用することでFullGC の発生頻度、メモリ使用量、GC の 種類が確認できますので、得られた結果からチュー
ニングを行います。 設定できる値はディスクスワップの発生しないサイズ、すなわち物理メモリサイズです。
最大負荷をかけるテストを行い、FullGC の頻度と FullGC の実行時間を確認し、以下を 目安に調整します。

* FullGCの発生頻度が多い場合
ヒープサイズを大きくとる
Java VMパラメータでNew領域の内容を調整し、オブジェクトがOLD領域に移動しないようにする。

※Java VMパラメータにつきましては、以下のURLがチューニングの参考になります。
http://java.sun.com/docs/hotspot/
http://www.ingrid.org/java/jserv/performance
http://www.atmarkit.co.jp/fjava/rensai2/webopt06/webopt06.html
http://www.atmarkit.co.jp/fjava/rensai2/webopt09/webopt09.html


(2)Java VMパラメータチューニングによる安定動作の運用事例
現在まで弊社に届いた情報を元に安定的な稼動に成功している事例に共通する事項をまとめてみました。

以下の事項は、安定稼動が達成されている動作環境要件 と安定稼動を実現する為に行われたSun JavaVMのパラメータチューニング

についてより具体的な情報を記載いた します。
(A)動作環境要件

intra-martシステム稼動前のFreeメモリ容量(1サーバ当りの容量で仮想メモリは含みません。): 2GByte以上
(B)安定的な稼動を実現したSun JavaVMのパラメータ

Unix系
-Xms=1024m -Xmx=1024m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:NewSize=320m -XX:MaxNewSize=320m
-XX:SurvivorRatio=2 -XX:TargetSurvivorRatio=80

Windows系
-Xrs -Xms=1024m -Xmx=1024m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:NewSize=320m -XX:MaxNewSize=320m
-XX:SurvivorRatio=2 -XX:TargetSurvivorRatio=80

※上記パラメータは2行で表現されておりますが 実際に設定される場合は一行です。

再起動時にファイルシステムのチェックを行なう方法

以下のコマンドを実施

%)shutdown -F -r now
-Fがファイルチェックのオプション

パッケージの強制削除方法

以下のコマンドにて、実施。
rpm -e -f --noscripts パッケージ名

ファイルの文字コードを見る方法

以下のコマンドを実行

%)file ファイル名

exp)
file stock.csv
stock.csv: ASCII text, with CRLF line terminators

SQLファイルにパラメタを渡す方法

前提:シェルスクリプトからSQLファイルをコールし、シェルのパラメタをそのまま
    SQLファイルに渡して実行する

#!/bin/sh
# 実行するシェル
# パラメタ$1
# パラメタ$2
${ORACLE_HOME}/bin/sqlplus test/test@testora test.sql $1 $2


----------------------------------------------
test.sql
spool test.log

SELECT COUNT(*) FROM TM_PRD
WHERE M_DATE BETWEEN &1 AND &2;
spool off;     (↑引数部分を"%1"、"%2"では
exit;          なく、"&1"、"&2"とする)