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は無理にしてもタブ区切りなら大丈夫だろうと思ったが、データにタブが含まれていた
- それどころか、データに改行が含まれていた
で、どうしたかというと、
- 全テーブルを「SELECT * FROM xxx」した結果をspoolで記録
- テキストファイルを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