RHEL6.4をUNetbootinを使用してインストールする時の問題

UNetbootinを使ってRHEL6.4をインストールする時にハマったこと。

簡単に手順を説明すると

  1. UNetbootinをインストール
  2. http://61.164.110.188:82/Redhat/からrhel-server-6.4-x86_64-boot.isoを入手
  3. UNetbootinを使用してrhel-server-6.4-x86_64-boot.isoを展開
  4. USBを使用してインストール

これの「4.USBを使用してインストール」のところの最後の最後で"The installer has tried to mount image #1 but cannot find it on the hard drive. Please copy this image to the drive and click retry."と表示され、インストールに失敗。
ググったら↓にたどり着いた。
https://access.redhat.com/discussions/1532773

ざっくりまとめると、rhel-server-6.4-x86_64-dvd.isoも必要だということ。手順としては:

  1. http://61.164.110.188:82/Redhat/からrhel-server-6.4-x86_64-dvd.isoをダウンロード
  2. rhel-server-6.4-x86_64-dvd.isoを展開して、imagesディレクトリからinstall.imgとproduct.imgを取り出す
  3. UNetbootinでboot.isoを展開したUSB内に/dvdというディレクトリを作成
  4. /dvdにrhel-server-6.4-x86_64-dvd.isoをコピー
  5. /dvdの中にimagesというディレクトリを作成して、install.imgとproduct.imgをコピー。 下がイメージ図:
    dvd/
    ├─ images/
    │   ├─ install.img
    │   └─ product.img
    └─ rhel-server-6.4-x86_64-dvd.iso
  6. USBからブートして、インストール画面へ進む。デバイスを指定する時にディレクトリに/dvdを指定

以上でインストール可能。

Linuxコマンド集

忘れがちなLinuxコマンド
  1. Linux上でCtrl+vを押してからCtrl+Mを押すとWindowsの改行が出せる。
    これを使用してVimperlWindowsの改行をLinuxの改行に変更できる。
  2. プロセス管理
    • 2秒ごとにコマンドを実行。
      $ watch コマンド
    • コマンドを実行中にCtl-z⇒コマンドを中断
    • フォアグラウンドかバックグラウンドでコマンドを再開
      $ fg # フォアグラウンドで再開
      $ bg # バックグラウンドで再開
    • バックグラウンドでコマンドを実行
      $ コマンド &
    • 実行中のジョブを確認
      $ job -l
    • ジョブを手放す
      $ disown ジョブ番号
  3. sshなどでセッションが途切れてもコマンドを実行し続ける
    $ nohup コマンド 2>&1 &
  4. 複数ファイルを検索して該当したものを特定のディレクトリにコピー
    $ find . -regex '.*[A-Z][0-9].*' -print0|xargs -I{} -0 cp -pi {} ~/tmp/
  5. .tar.gzファイルから必要なものだけを取り出す。
    例:tmpから始まるものだけを取り出す
    $ find . -name '*.tar.gz' -print0|xargs -0 -I{} tar xf {} './tmp*'
  6. egrep ⇒ grepregexを使用する。
    $ egrep '[A-Z][0-9]' filename

SQLコマンド集

SQL関連のメモ
  1. ファイル名に日付を付けてspoolするSQL
    alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
    alter session set NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS';
     
    col spool_file_name new_value spool_file_name for a100
    select 'ファイル名_'|| to_char(sysdate,'YYYY-MM-DD_HH24MISS') || '.csv' spool_file_name from dual;
    spool &spool_file_name
    --spoolするSQLを実行
    spool off
  2. 複数表のDBMS_STATSプロシージャをまとめて作成する
    set pages 0
    select 'BEGIN 
     DBMS_STATS.GATHER_TABLE_STATS (
        ownname           => ''スキーマ名'', 
        tabname           => ''' || table_name || ''', 
        --以下の条件は自由に設定
        estimate_percent  => DBMS_STATS.AUTO_SAMPLE_SIZE, 
        block_sample      => TRUE,
        method_opt        => ''FOR ALL COLUMNS SIZE AUTO'', 
        degree            => 0,
        no_invalidate     => DBMS_STATS.AUTO_INVALIDATE, 
        force             => TRUE
      )' || chr(59) ||
    '
    END' || chr(59) ||
    '
    /' from all_tables where ...--プロシージャを作成する表の条件;
    • シングルクォートを使用するにはシングルクォートを二つ打つ('')かchr(27)を使用する。
    • セミコロンを使用するにはchr(59)を使用する。
    • ちなみにmethod_optで複数列を指定するときにシングルクォート内で改行するとORA-20001が発生する。
  3. FOR LOOPをつかってサンプル表にデータを挿入する
    create table test1(c1 number, c2 number, c3 number);
    
    DECLARE
     v_result number :=0;
    BEGIN
      FOR v_count IN 1..1000 LOOP
        DBMS_OUTPUT.PUT_LINE(v_count);
        v_result := v_result + v_count;
        insert into test1(c1,c2,c3) values(v_result,v_count,v_result-v_count);
      END LOOP;
    END;
    /
  4. シェルスクリプト内でsqlplusを起動する
    sqlplus -s /nolog << EOF >/dev/null 
    conn ユーザー/パスワード
    --コード
    exit
    EOF
  5. 文字化けするときの対応
    ⇒.bash_profile内のLANGにあわせて.oraenv内でNLS_LANGをexportすると楽
    例:LANG=”ja_JP.UTF-8”の場合
    $ vi .oraenv
    ...
    export NLS_LANG=Japanese_Japan.AL32UTF8
  6. バイナリ形式で引数を出力。以下の例では16進数と文字コードを表示する
    select dump('引数',1016)
  7. OPTIMIZER_MAX_PERMUTATIONS
    • 10g以降は2000で固定
    • 7! = 5000なので、7表以上は結合しないほうがベター
  8. バインド変数の定義
    variable x number
    execute :x := 2
    
    --ちなみにexecute :x := 2は内部的に以下と同じ
    BEGIN
     :x := 2;
    END;
    /
  9. パーティションごとのサイズ(GB)を出力する
    set pages 100
    column segment_name format a15
    column partition_name format a25
    
    select segment_name,partition_name,bytes/1024/1024/1024 GB from user_segments
    where segment_name = '表名'
    order by segment_name,partition_name;

Perlワンライナー集

perlワンライナーでよく使いかたを忘れるやつ。
  1. 改行コード置き換え
    perl -i.org -pe 's/\r\n/\n/g' filename
  2. 複数条件をREGEXに渡す
    perl -nle '/(AA|BB|CC)/ or print' filename
    ワンライナーREGEXにシングルクォートを含む場合\x27でエスケープする。
  3. コンマで別れている1列のデータを1列に10個ずつ表示し改行する
    perl -ne '@tables = split /,/; $n = 10; $delim = ",";
    while (@x = splice @tables, 0, $n) {print join($delim, @x), "\n";}' filename
  4. Paragraphごとにファイルを出力する
    perl -00 -ne '/(ファイル名になるパターン)/ and open(FH, "> $1\.sql"); print FH "$_"; close(FH);' filename
  5. 特定の文字列からファイルの終わりまでを出力
    perl -nle '/ここにパターン/ .. eof and print' filename
  6. シェル変数をperlの変数に渡す
    perl -sle 'print $x' -- -x=$shell_variable
  7. sar -uのログファイルを加工するPerlワンライナー ※先輩からの頂き物
    perl -lane '$ARGV=~s/.*(\d{2}n\d{1})_(\d{8})\.log$/$1 $2/;($h,$d)=split(q/ /,$ARGV);$F[0]=~/^(0[0-8]:\d{2}:\d{2}|09:[0-3][0-9]:\d{2})/ and $d++; print qq/$h $d $_/' *.log
  8. iostat
    ログファイルで特定のdeviceだけ出力する
    perl -lane '$F[1] =~ /^(xv|dm)/ and print' iostat.log 
    時間帯を絞る
    perl -lane '/^1006092509/ .. /^1006092609/ and print' iostat.log
  9. top
    ログファイルの各行にTimestampをつける
    perl -nle '/^top - ([\d:]+)/ and $t=$1;print qq/$t $_/' top.log > tmp1.log
    特定の時間だけを取り出す
    perl -lane '/^03:00:16/ .. /^04:00:17/ and print' tmp1.log > tmp2.log
    二列目が数値のものだけを取り出す。これによりプロセスのみを取り出すことができる。
    perl -lane '$F[1] =~ /^([\d]+)/ and print' tmp2.log > tmp3.logs

Performance Tuning

※ソースは以下のリンク:
http://www.orapub.com/tools-firefighting-diagnostic-xls-toolkit パフォーマンス・チューニングにおいて覚えておくことは3つ。

  1. Must empbrace different perspective
    様々な視点から考える。Oracleのパフォーマンス・チューニングにおいて持つべき視点は以下の三つ:
    1. Operating System - いわゆるOS。IO、CPU、メモリなどの視点
      1. 使用するコマンド
        1. top
        2. iostat
        3. sar
        4. vmstat
        5. netstat
    2. Application - SQL。どういったものが実行されているか。
      1. SQLが何をしているか
        1. CPU/LIO(Logical I/O)/Buffer Gets
        2. PIO-R(物理読み込み)
        3. DML
        4. Sorting
        5. Query
        6. Parsing
      2. SQLの種類を識別したらAWRを使用して詳細を確認⇒上位のものや、複数回出てくるSQLに注意
        1. SQL Statistics
          1. SQL ordered by Elapsed Time/CPU Time
          2. SQL ordered by Gets/Reads
    3. Oracle - インスタンス。待機イベントなど
      1. コストベースとタイムベースという考え方が出来る。 今回はタイムベースについて。ユーザーには二種類おり、別の基準をもっている。
        1. OLTP-centric users - 速いレスポンスタイムを求めている。
        2. Batch-centri users - 仕事をより早くこなして欲しい。
      2. Elapsed Time = CPU Time + Wait Time ⇒ 経過時間 = CPUの処理時間 + 待機時間
        1. AWRのTime Model StatisticsのDB CPUとbackground cpu timeの合計がTotal
        2. AWRのWait Eventsで待機イベントとTotal Wait Time(s)を確認できる。また以下の動的パフォーマンスビューでも確認できる:
          1. wait: v$system_event
          2. cpu: v$sys_time_model
        3. Oracleがwait timeを導き出す方法:
          1. サーバープロセスにstraceを使用して、clock_gettimeとpreadを確認。
          2. preadの前後のclock_gettimeを引き算して導き出す。
          3. 仮にプロセス番号が2518だとするとコマンドは"$ strace -rp 2518"
        4. DB TimeはCPU timeとWait timeに分けられる。CPU timeにはサーバープロセスのものとバックグラウンドプロセスのものがあるが、バックグラウンドプロセスの時間は無視してよい(コミットなど、文字通り裏方として作業をしているため)。Wait timeはI/Oとそれ以外のものに分類できる。I/Oはさらに読み込みと書き込みに分類される。
  2. 以上の3つの視点とそれぞれの分析&サマリがあると分かりやすい。
  3. Must be quantitative based
    数値化する。数値は信頼性があり、再現性があるので伝えやすい。
  4. Understand that seriarization is death
    1秒かかるプロセスが100個あったとする⇒すべてのプロセスをシリアルで処理すると100秒。
    1. Elapsed Time = Pieces of work * Time to process
      1. 経過時間=仕事の数*処理にかかる時間
      2. Wall Time = Elapsed Time/Parallelism
      3. 処理に必要な時間=経過時間÷並列度
    2. すなわち処理に必要な時間を減らす方法は三つ
      1. 仕事の数を減らす⇒SQLチューニングなどで余計なIOを減らすなど。
      2. 仕事をより早く処理する⇒ストレージを高速化、CPUの高速化など。
      3. 並列度をふやす。

iostatの使用方法

iostatの出力例

$ iostat -x 20
avg-cpu: %user %nice %system %iowait %steal %idle
0.35 0.00 0.48 0.04 0.00 99.13
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 1.37 0.13 4.70 2.13 62.13 13.30 0.01 1.69 0.66 0.32
dm-0 0.00 0.00 0.13 5.87 2.13 62.13 10.71 0.01 1.63 0.53 0.32
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  • rrqm/s - read requests merged per second:マージされた読込IO要求。大きければ効率よくまとめて読み込んでいる。
  • wrqm/s - write requests merged per second:マージされた書き込みIO要求。大きければ効率よくまとめて書き込んでいる。
  • r/s - reads per second:一秒間に読み込んだ量
  • w/s - writes per second:一秒間に書き込んだ量
  • r/s + w/s = IOPS(Input Output per Second):秒間I/O。
  • rsec/s - The number of sectors read from the device per second:読み込まれたセクタ数(秒間)
  • wsec/s - The number of sectors written to the device per second:書き込まれたセクタ数(秒間)
  • avgrq-sz - The average size (in sectors) of the requests that were issued to the device:平均リクエストサイズ。 セクタの数なので、仮にセクタが512byteだった場合、上記のサンプルでは13.30*512で6.8KB
  • avgqu-sz - The average queue length of the requests that were issued to the device.:待ち行列の長さの平均
  • await - The average time (in milliseconds) for I/O requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them:レスポンスタイム。待ち行列に並んでいる時間+サービスの時間。逆に言えばawait - svctmで列で待機していた平均時間になる。
  • svctm - The average service time (in milliseconds) for I/O requests that were issued to the device:平均処理時間。当然IOが少なければ速くなる。
  • %util - Percentage of CPU time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100%:使用率(ビジー率)

メモ

  • I/O性能が劣化すると平均IOサイズ(avgrq-sz)が変わらないのにサービスタイム(svctm)が大きくなる。
  • I/Oが増えて待ちが発生するとIOPSが増えて、avgqu-szとレスポンスタイム(await)が大きくなる。

 

STATSPACKレポートの使用方法

基本的に通常時のデータと異常事態が発生しているときのデータを見比べて問題点を発見する。

今回は以下の項目について:
1. Load Profile
2. Top 5 Timed Events
3. Instance Efficiency Percentages

1. Load Profile
レポート対象期間中のPer SecondとPer Transactionでの統計情報が出力される。
システムの傾向を見ることができる。内容は以下の通り:

  1. DB time(s) - SQLの実行にかかった時間。増えている場合は処理するデータ量が増えているのか速度が落ちているのかを調べる必要がある。
  2. DB CPU(s) - SQLの実行にかかったCPU時間
  3. Redo size - 生成されたREDOログ量(byte)
  4. Logical reads - アクセスしたブロック数
  5. Block changes - 変更されたブロック数
  6. Physical reads - ディスクから読み込んだブロック数
  7. Physical writes - ディスクに書き込んだブロック数
  8. User calls - ログイン、解析、フェッチ、実行などユーザ・コール数
  9. Parses - SQLの解析回数
  10. Hard parses - SQLのハードパース回数。Parsesに対して割合が高い場合はリテラルではなくバインド変数を検討する。
  11. W/A MB processed - SQL作業領域の使用量
  12. Logons - ログオン数
  13. Executes - SQL実行回数(再帰SQL含む)
  14. Rollbacks - ロールバック回数
  15. Transactions - トランザクション

2. Top 5 Timed Events
Wait Timeの長い待機イベントが表示される。待機イベントは以下の待機クラスに分類される:

  1. User I/O
  2. System I/O 
  3. Commit
  4. Concurrency
  5. Application
  6. Idle

3. Instance Efficiency Percentages
その名の通り、インスタンス効率の指標。基本的に100%に近いほうがいい。
ベースラインと比べて低かったらチューニングをする。内容は以下の通り:

  1. Buffer Hit% - 必要なデータがデータベース・バッファ・キャッシュ上にあった割合。バッファ・キャッシュが小さい場合は大きくする。索引を使わないSQLがフルスキャンを行いバッファ・キャッシュからデータがもれた可能性もある。その場合は索引を追加作成する。
  2. Library Hit % - 必要なSQLPL/SQLがライブラリ・キャッシュにあった割合。バインド変数を使ったSQL文に書き換えることが有効。
  3. Soft Parse % - 全ての解析のうち再利用可能なものの割合。
  4. In-Memory Sort% - ソートがメモリ内で行われた割合。
  5. Latch Hit% - 全てのラッチのヒット率。
  6. Parse CPU to Parse Elapsed % - 解析CPU時間/解析のトータル時間。
  7. Execute to Parse% - SQL実行に対し解析が行われなかった割合。
  8. %non-parse CPU - 解析以外で使用されたCPU時間の割合。
  9. Buffer Nowait% - バッファに要求を出したときに、即座に使用可能だった割合。
  10. Redo Nowait% - REDOログに要求を出したときに、即座に使用可能だった割合。