LV名は中身を反映した名前にすべき

昨日の記事「VG名は毎回違う名前にすべき」の続きです。

LV(ロジカルボリューム)名ってのはlvscanしたときに出てくる名前です。

# lvscan
  ACTIVE            '/dev/VG_seagate320/centos5' [58.59 GB] inherit
  ACTIVE            '/dev/VG_seagate320/home' [97.66 GB] inherit
  ACTIVE            '/dev/VG_seagate320/swap' [7.78 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [1.94 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol02' [58.91 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol00' [39.28 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol03' [19.56 GB] inherit
#

見ての通りなんですが、「LogVol00」のようなLV名だと中身がサッパリわかりません。

「home」のように、マウントポイントと同じ名前をつければ十分だと僕は思います。大した手間じゃないんだから、適切なLV名をつけた方がいいと思いますよ。マジで。

VG名は毎回違う名前にすべき

VG(ボリュームグループ)名ってのは、vgscanしたときに出てくるアレです。

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "VG_seagate320" using metadata type lvm2
  Found volume group "VolGroup00" using metadata type lvm2
#

もしくは、dfしたときに見えるアレ、と言った方がわかりやすいかもしれません。

# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VG_seagate320-centos5
                      59514964  17807500  38635464  32% /
/dev/mapper/VolGroup00-LogVol00
                      40542804  19828052  19479072  51% /home
/dev/sdb1               101086     18826     77041  20% /boot
tmpfs                  3048384         0   3048384   0% /dev/shm

インストーラの指示に従って作ると上のように「VolGroup00」なんてのが出来てしまいますが、別の場所で作った同じVG名を持つHDD2台を同じマシンにつなぐと、LVMの認識が狂います。(参考:LinuxでLVMのデータを抜き出す方法 - 佐野裕のサーバ管理者日記:ITpro

なにより、HDDを何台もつなぐ場合に適切な名前がついていないと見にくい

そんなわけで、(僕の例が適切かどうかはともかく)所有者・設定者・用途などによって適切なVG名をつけるべきだと思います。CentOS付属のGUIインストーラでも変更可能です。

SQL*PlusでTSV出力

Oracle内にあるデータをMySQLに移したくなりました。MySQLでLOAD DATA INFILEとか使えばいいわけですから、TSVで出力したいわけです。

Oracle CSV TSV」とかでググれば腐るほど方法が出てきますが、完璧なものは皆無だと思います。というか、たぶんSQL*Plusを選ぶ時点で失敗です。仕事でやるなら「SI Object Browser」とかを使った方がいいと思います。どうせOracleを買う時点で予算は潤沢なんでしょ?

皮肉はさておき、僕のはまった内容を紹介します。

  • CSVは無理にしてもタブ区切りなら大丈夫だろうと思ったが、データにタブが含まれていた
  • それどころか、データに改行が含まれていた
    • データに改行が含まれていると、ネット上に落ちてるSQL*PlusでCSV吐く方法は大抵ダメです

で、どうしたかというと、

  1. 全テーブルを「SELECT * FROM xxx」した結果をspoolで記録
  2. テキストファイルをgrepして0x0bと0x0cがデータ内に無いことを確認

安全な文字が2個見つかりましたので、出力する方針が決まりました。

  • 区切り文字を0x0b(垂直タブ)にした
  • データ内の改行を0x0c(改ページ)にした
  • レコード区切り(行末)は0x0a。普通ですね。

これならSQL*Plusでも出力できるよ!具体的には次のようなファイルをSQL*Plusに食わせました。

set linesize 32767
set pagesize 0
set trimspool on
set colsep '^K'
set feedback off
set term off
set tab off
set flush off
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
spool /foo/bar/baz.tsv
select REPLACE(REPLACE(id,CHR(13),''),CHR(10),CHR(12)),REPLACE(REPLACE(col1,CHR(13),''),CHR(10),CHR(12)),… FROM table1;
spool off
exit

^Kは便宜的に書いただけで、0x0bの1文字です。CHR(11)とかは書けなかった気がしますので、頑張ってそういうキャラクタを書いてください。

また、最後のレコードがNULLになるとフィールド数が減ります。嫌だったらSELECT句の最後にダミーで,'1'とか書くと幸せになれるかもしれません。

HDDの速度をチェックする

なんかHDDが遅い気がしていたのだが、確認してみたらひどかった。

# hdparm -t /dev/hda

/dev/hda:
 Timing buffered disk reads:   10 MB in  3.39 seconds =   2.95 MB/sec

これはひどい。2.95*8=23.6Mbps。ネットワークの方が断然速いですよ?というか、SATAって普通は/dev/sd*にならないっけ…?

で、BIOSの設定を変更。SATAコントローラの設定の「Configure SATA as」で「AHCI」を選んで起動(それまで「IDE」だった)。すると、/dev/sdaが出来ている。

# hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads:  230 MB in  3.00 seconds =  76.55 MB/sec

同じHDDなのに25倍くらい速いよ!SATAコントローラのICHI10Rの問題なのだろうか。誰のせいなんだ。

内容としては「(続き) EX915 に Fedora Core3 test1 インストール - memologue」と同じ状況のようで、IDEのままでもうまくいきそう。でもこれでいいや。

というか、/dev/hdaに対して少し書くと、topでkjournaldがやたら目立つので変だとは思ってました。

余談

このマザーボードには別のSATAコントローラもついていたので、別のSATAディスクをつないでみた。/dev/sdbができていた。

# hdparm -t /dev/sdb

/dev/sdb:
 Timing buffered disk reads:  224 MB in  3.01 seconds =  74.42 MB/sec

そりゃ、これくらいは出るよね。ついでに手元にあった16GBのUSBメモリも測定してみた。

# hdparm -t /dev/sdc

/dev/sdb:
 Timing buffered disk reads:   94 MB in  3.01 seconds =  31.23 MB/sec

USBメモリって意外と速い!大昔に買った256MBのUSBメモリも試してみよう。

# hdparm -t /dev/sdc

/dev/sdb:
 Timing buffered disk reads:   24 MB in  3.10 seconds =   7.75 MB/sec

興味が出てきたのでUSB接続のDVD-Rで実験してみたが、毎回どんどん結果がよくなっていって、実験にならなかった。明示的にキャッシュクリアできない機種だったみたい。

dbca

dbcaを使ってデータベースを作ってみました。oracleユーザーでXからログインして、

$ dbca


あとはGUIの質問に答えるだけです。

  • ステップ3/12
    • グローバルデータベース名:「プロジェクト名.会社名」
    • SID:勝手に「プロジェクト名」が埋まった
  • パスワード:インストール時と同じにした(実運用だったら問題あるんだろうけど)
  • ステップ10/12

で、/etc/oratabを編集して、接続名の3カラム目をNからYに修正します。

プロジェクト名:/opt/oracle/10.2.0/:Y

環境変数をセットしていなければセットします。

ORACLE_SID=プロジェクト名

で、DBを起動します。

$ dbstart

CentOS5にOracle10gをインストール

米OTN版をインストール。本家ドキュメントよりブログ記事をかなり参考にした。

gunzip -cd 10201_database_linux_x86_64.cpio.gz | cpio -idmv
  • ORACLE_HOMEが設定されていない場合、恐ろしく深いディレクトリにインストールされるので注意。
    • 1画面目でどこにインストールしようとしているか要チェック。
  • 「初期データベースの作成」をしない。
  • IPがDHCPじゃないのに、DHCPだって言われて怒られた。無視して進めたが問題なかった。
  • centos5なのに、redhat-3とか判定された。