お手軽バックアップ検証環境構築(MHVTL on EC2)

エンタープライズな環境であったりすると、
バックアップも高価なテープライブラリを使ったりするわけですが、
その検証をやりたくても、個人ではなかなか出来ませんでした。

と思っていたのですが、MHVTLという仮想テープライブラリ(https://sites.google.com/site/linuxvtl2/)がオープンソースで公開されていることを知り、早速試してみました。


環境
仮想テープライブラリ側(MHVTL+iSCSIターゲット) Amazon Linux AMI 2012.09.1 (ami-5d7dfa5c) マイクロインスタンス
バックアップホスト (ARCserve16.5*+iSCSIイニシエータ) Windows2008 R2 マイクロインスタンス



*バックアップソフトはなんでも良かったんですが、
体験版のダウンロードが簡単だったのでARCserveにしました。
(バックアップソフトは、お好みに合わせてNetbackup、BackupExec,DataProtector,Netvault等使えば良いかと思います
以下の4までの手順はどのバックアップソフトでも共通です)


1.仮想テープライブラリ側にてパッケージインストール&ダウンロード
Amazon Linuxリポジトリでは何故かscsi-target-utilsが用意されていないので、
CentOS6のリポジトリからscsi-target-utilsを引っ張ってきます。
また、yum -y updateでカーネルのアップデートも行うので、
一旦リブートします。


packages.sh

#!/bin/bash
yum -y update
cat > /etc/yum.repos.d/CentOS-Base.repo <<'EOF'
[centbase]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
enabled=0
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
EOF
curl https://sites.google.com/site/linuxvtl2/mhvtl-2013-01-31.tgz -O -L
curl https://sites.google.com/site/linuxvtl2/mhvtl-utils-1.4-6.x86_64.rpm -O -L
yum -y install --enablerepo=centbase scsi-target-utils zlib-devel sg3_utils lsscsi mt-st mtx lzo lzo-devel make gcc kernel-devel
reboot

$sudo sh ./packages.sh



*CentOS6(64bit)であれば、Amazon Linuxでなくてもyum -y installの部分のパッケージ名は同じでいけると思います。


2.仮想テープライブラリ側にてmhvtlのmake&install
RedHat/CentOS/OracleLinuxであれば、elrepoというリポジトリを使えば、
mhvtl(カーネルモジュール)をyum経由でインストールできるのですが、
このリポジストリはカーネルバージョンに依存するため、
RedHat/CentOS/OracleLinuxと異なるカーネルバージョンであるAmazon Linuxでは、
mhvtlのサイトからtgzを落としてきてmakeする必要があります。


install_mhvtl.sh

#!/bin/bash
rpm -ivh mhvtl-utils-1.4-6.x86_64.rpm
tar zxvf mhvtl-2013-01-31.tgz
cd mhvtl-1.4
cd kernel
make
make install
/etc/init.d/mhvtl start
chkconfig mhvtl on

$sudo sh ./install_mhvtl.sh


このタイミングでAmazon Linux側では、仮想テープライブラリが使用できる状態になっています。

[ec2-user@ip-10-0-0-69 ~]$ lsscsi -g
[0:0:0:0]    mediumx STK      L700             0104  /dev/sch0  /dev/sg8
[0:0:1:0]    tape    IBM      ULT3580-TD5      0104  /dev/st0   /dev/sg0
[0:0:2:0]    tape    IBM      ULT3580-TD5      0104  /dev/st1   /dev/sg1
[0:0:3:0]    tape    IBM      ULT3580-TD4      0104  /dev/st2   /dev/sg2
[0:0:4:0]    tape    IBM      ULT3580-TD4      0104  /dev/st3   /dev/sg3
[0:0:8:0]    mediumx STK      L80              0104  /dev/sch1  /dev/sg9
[0:0:9:0]    tape    STK      T10000B          0104  /dev/st4   /dev/sg4
[0:0:10:0]   tape    STK      T10000B          0104  /dev/st5   /dev/sg5
[0:0:11:0]   tape    STK      T10000B          0104  /dev/st6   /dev/sg6
[0:0:12:0]   tape    STK      T10000B          0104  /dev/st7   /dev/sg7


mhvtl(1.4)ではデフォルトで二つのライブラリ(L700とL80)にそれぞれ、4つのテープドライブがぶら下がった状態
で設定されるようです。
この後、Amazon Linux側で認識している仮想テープライブラリをiSCSI経由で公開します。


3.仮想テープライブラリ側にてiSCSIターゲットの設定


scsi_target.sh

#!/bin/bash
cat > /etc/tgt/targets.conf <<'EOF'
<target iqn.2013-03.org.jpoug:vtl1-changer>
        <backing-store /dev/sg8>
                device-type pt
                bs-type sg
                lun 1
        </backing-store>

        <backing-store /dev/sg0>
                device-type pt
                bs-type sg
                lun 2
        </backing-store>

        <backing-store /dev/sg1>
                device-type pt
                bs-type sg
                lun 3
        </backing-store>

        <backing-store /dev/sg2>
                device-type pt
                bs-type sg
                lun 4
        </backing-store>

        <backing-store /dev/sg3>
                device-type pt
                bs-type sg
                lun 5
        </backing-store>

</target>

<target iqn.2013-03.org.jpoug:vtl2-changer>
        <backing-store /dev/sg9>
                device-type pt
                bs-type sg
                lun 1
        </backing-store>

        <backing-store /dev/sg4>
                device-type pt
                bs-type sg
                lun 2
        </backing-store>

        <backing-store /dev/sg5>
                device-type pt
                bs-type sg
                lun 3
        </backing-store>

        <backing-store /dev/sg6>
                device-type pt
                bs-type sg
                lun 4
        </backing-store>

        <backing-store /dev/sg7>
                device-type pt
                bs-type sg
                lun 5
        </backing-store>

</target>
EOF

/etc/init.d/tgtd start
chkconfig tgtd on

$sudo sh ./scsi_target.sh



scsiターゲットの状態は、tgt-admin --showで確認できます。
$sudo tgt-admin --show

[ec2-user@ip-10-0-0-69 ~]$ sudo tgt-admin --show
Target 1: iqn.2013-03.org.jpoug:vtl1-changer
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags: 
        LUN: 1
            Type: passthrough
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg8
            Backing store flags: 
        LUN: 2
            Type: passthrough
            SCSI ID: IET     00010002
            SCSI SN: beaf12
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg0
            Backing store flags: 
        LUN: 3
            Type: passthrough
            SCSI ID: IET     00010003
            SCSI SN: beaf13
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg1
            Backing store flags: 
        LUN: 4
            Type: passthrough
            SCSI ID: IET     00010004
            SCSI SN: beaf14
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg2
            Backing store flags: 
        LUN: 5
            Type: passthrough
            SCSI ID: IET     00010005
            SCSI SN: beaf15
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg3
            Backing store flags: 
    Account information:
    ACL information:
        ALL
Target 2: iqn.2013-03.org.jpoug:vtl2-changer
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00020000
            SCSI SN: beaf20
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags: 
        LUN: 1
            Type: passthrough
            SCSI ID: IET     00020001
            SCSI SN: beaf21
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg9
            Backing store flags: 
        LUN: 2
            Type: passthrough
            SCSI ID: IET     00020002
            SCSI SN: beaf22
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg4
            Backing store flags: 
        LUN: 3
            Type: passthrough
            SCSI ID: IET     00020003
            SCSI SN: beaf23
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg5
            Backing store flags: 
        LUN: 4
            Type: passthrough
            SCSI ID: IET     00020004
            SCSI SN: beaf24
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg6
            Backing store flags: 
        LUN: 5
            Type: passthrough
            SCSI ID: IET     00020005
            SCSI SN: beaf25
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: sg
            Backing store path: /dev/sg7
            Backing store flags: 
    Account information:
    ACL information:
        ALL

以上で、仮想テープライブラリ側の設定は完了です。



4.iSCSIイニシエータの設定
スタート→管理ツールiSCSIイニシエータ→Microsoft iSCSIサービスが〜と表示されるので、はいを押す→クイック接続のターゲットに仮想テープライブラリのIPを入力しクイック接続をクリックする。→iqn.xxxx-が2つ検出されるので、それぞれ接続をクリックした後、完了をクリックする


この段階でデバイスマネージャ(OS)からはこのように見えます。


5.Windows2008R2側でバックアップソフト&仮想CD/DVDドライブソフトのインストール
ARCserveの体験版はisoで公開されていたので、isoをマウント出来るソフトが必要です。
今回は、WinCDEmu(http://wincdemu.sysprogs.org/)を使いました。


ARCserveの体験版は以下のURLからダウンロード出来ます。
https://www.arcserve.com/us/register/forms/ca-arcserve-backup.aspx


*日本のサイトからもダウンロードできるみたいなんですが、日本のサイトの方がアンケート項目多くて面倒なので、
USのサイトにしています。


6.ARCserveのインストール
5でダウンロードしたisoをWinCDEmuでマウントします。


インストールはウィザードにしたがってできますので、こまかい手順は割愛します。


7.ARCserveからデバイスの認識状態を確認
スタート→すべてのプログラム→CA→マネージャ を選択するとARCserveのマネージャが起動します。
ナビゲーションバー→管理→デバイスにてデバイスの認識状態が確認できます


あとは、通常のテープライブラリと同じように使用できるはずです。



参考サイト
MHVTL関連
http://hi.baidu.com/imyerik/item/3ab8682fb209b08b9d63d116
http://mhvtl-linux-virtual-tape-library-community-forums.966029.n3.nabble.com/NBU-keep-mounting-tape-forever-td3787713.html


Amazon LinuxCentOSのリボジトリ追加
http://fdbklp.blogspot.jp/2012/05/amazon-linux-yum.html


iSCSI関連
http://www.asahi-net.or.jp/~aa4t-nngk/iscsi.html

RHEL 5/CentOS 5/Oracle Linux 5にawscliを入れる

awscliはpython2.6が前提だから、python2.4がデフォルトのRHEL 5/CentOS 5/Oracle Linux 5
にはインストールできないとお嘆きのアナタに朗報です。
epel(Extra Packages for Enterprise Linux)にはpython2.6が用意されているので、
awscliを使うことが出来ます。


確認環境
Oracle Linux 5.6 x86_64 - Amazon Xen (ami-72bf0873)


手順
#rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
#yum -y install python26 python26-devel python26-mod_wsgi python26-pygments
#easy_install-2.6 awscli




aws ec2 describe-instances --region ap-northeast-1
{
"Reservations": [
{
"OwnerId": "xxxxxxxxxx",
"ReservationId": "xxxxxxxxxx",
"Groups": [
{
"GroupName": "default",
"GroupId": "xxxxxxxxxxxx"
}
],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
・・・・・



参考 CentOS 5.7 に Python 2.6 を入れて pip で MoinMoin をインストール
http://d.hatena.ne.jp/cu39/20120110/1326209060



なお、Oracle RAC on EC2 8ノード版ですが、NFS版は完成しているんですが、
いまいち安定していません。。。。
iscsiでやれば安定することは分かっているのですが、Oracle Linux 5をベースにした
カスタムAMIの作成が必要になってしまうため、まだ公開に至ってません。


Oracle Linux 5のカスタムAMIの公開はライセンス上どうなのかよく分かっていないので、
カスタムAMIの作成まで含めて自動化できないか見当中です。

全文検索用のテストデータを用意する(twitter streaming api編)

全文検索Oracle TextやSolr)をちょっと試すだけならテスト用に一個、二個文章を入れて
検索出来たね。よかったねで終われるのですが、形態素解析N-gramを比較したい時や、
パフォーマンスを考慮したい等、テストデータの用意にとても困ります。


wikipediaのデータを加工して使うのも一つの手なんですが、
http://d.hatena.ne.jp/KNOPP/20120115/1326640025


今回はtechdb show caseで話題に挙がった twitter streaming apiを使いたいと思います。
twitter streaming apiを扱いやすいようにしたライブラリtwitter4Jが公開されているので
今回は、JavaOracle Databaseに入れます。
(全文検索はその後で)


今回、Javaプログラミング5年ぶりぐらいで随分手間取ったので健忘録も含めて詳しく書きます。


JDK/JDBCドライバの用意
Oracle Client を「ランタイム」もしくは、「管理者」でインストールするとJDK/JDBCともにインストールされているので
今回はそれを使用します。


・twitter4Jの用意
http://twitter4j.org/ja/index.html#download
からダウンロードして解凍しておきます。
(今回はC:\twitterに解凍します)


Oracleユーザ/テーブルの用意
今回はtwitterというユーザを用意し、streamというテーブルを作成します。

SQL>connect /as sysdba
SQL>create user twitter identified by twitter;
SQL>GRANT connect, resource TO twitter;
SQL>connect twitter/twitter
SQL>@create_table


create_table.sql

create table stream(
id number,
Name varchar2(100),
ScreenName varchar2(100),
text varchar2(300),
CreatedAt varchar2(100)
);


・プログラムの作成
twitter4jを使う部分については、ほぼ全面的に@teapipinさんの 「 【Twitter4J】Twitterの全ユーザーの公開ツイート(日本のみ)を表示する方法(その2、Streaming APIのsample)」を使わせて頂きました。
JDBCOracle)については、Oracleのマニュアルを適当に。
例外処理は垂れ流しですw


Twitter2DB.java

import twitter4j.*;
import twitter4j.auth.BasicAuthorization;
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.*;
import java.text.*;


public class Twitter2DB {
    public static void main(String[] args){
        try{
        	String AuthUser = args[0];
        	String AuthPass = args[1];
        	String JdbcUrl = "jdbc:oracle:thin:"+args[2];
            //TwitterStream twitterstream = new TwitterStreamFactory().getInstance(); 
            //何故かうまくいかないのでBasic認証に切り替え
            TwitterStream twitterstream = new TwitterStreamFactory().getInstance(new BasicAuthorization(AuthUser,AuthPass));
            twitterstream.addListener(new MyStatusAdapter(JdbcUrl));
            twitterstream.sample();

        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

//コンソール出力&テーブルにInsert
class MyStatusAdapter extends StatusAdapter {
	
	Connection conn;
	PreparedStatement pstmt;
	
	MyStatusAdapter(String Url){
		try{
			OracleDataSource ods = new OracleDataSource();
       		ods.setURL(Url);
        	conn = ods.getConnection();
			pstmt = conn.prepareStatement ("insert into stream (ID,NAME,SCREENNAME,TEXT,CREATEDAT) values (?, ?,?,?,?)");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	  public void onStatus(Status status){

        //ユーザの情報を取得
        User user = status.getUser();

		if (user.getTimeZone() != null && (user.getTimeZone().equals("Tokyo") || user.getTimeZone().equals("Osaka") ||user.getTimeZone().equals("Sapporo"))){
			DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
			try{
				pstmt.setLong   (1, status.getId() );
    			pstmt.setString (2, user.getName());
				pstmt.setString (3, user.getScreenName());
				pstmt.setString (4, status.getText());
                                //status.getCreatedAtがDate型でうまく変換できないのでStringでフォーマットしてしまう。
				pstmt.setString (5,df.format(status.getCreatedAt()));
				pstmt.execute ();
			}catch(Exception e){
				e.printStackTrace();
			}    			
		}
    }
}


・PATH/CLASSPATHの設定
IDEでやれば楽ちんなのですが、今回 notepad+javacでプログラム書いたので、
PATH/CLASSPATHの設定も行っておきます。
Oracle ClientはC:\app\Administrator\product\11.2.0\client_1にインストールされており、
twitter4jのライブラリはC:\twitter\libにある前提です。

JDBCプログラミングに必要なライブラリはojdbc5.jar*、orai18n.jar
twitter streaming apiに必要なtwitter4jライブラリはtwitter4j-core-3.0.1.jar、twitter4j-stream-3.0.1.jarです。


Oracle Client(11.2.0.1)に付属のjavacは1.5であるため、ojdbc5.jarを使用(javacが1.6だったらojdbc6.jar)

set PATH=%PATH%;C:\app\Administrator\product\11.2.0\client_1\jdk\bin
set CLASSPATH=.;C:\twitter\lib\twitter4j-stream-3.0.1.jar;C:\twitter\lib\twitter4j-core-3.0.1.jar;C:\app\Administrator\product\11.2.0\client_1\jdbc\lib\ojdbc5.jar;C:\app\Administrator\product\11.2.0\client_1\jlib\orai18n.jar


コンパイル

javac Twitter2DB.java


・プログラムの実行
こんな感じで実行します。
java Twitter2DB twitterのID twitterのパスワード dbuser/dbpass@ホスト:ポート:Oracleサービス名


実行例

java Twitter2DB twitterID twitterPASS twitter/twitter@192.168.1.22:1521:ORCL


あとは、日本語の公開ツイートがコンソール上に流れ、テーブルにもインサートされます。

だいたい10日ほどプログラム動かしっぱなしにすると、
230万ツイートぐらい集まって、
Oracleのデータファイルが300MB程になりました。

OpenVPNの証明書とキーをバッチモードで作成する

Oracle RAC on EC2をやるときに面倒なのが、OpenVPNの証明書とキーの作成。
なんで面倒なのかというと、コマンドの途中でキーの入力を求められるため、
シェルで自動化できないから。。。。


と思ってましたが、batchモードというのがあります。


How can I automate the ./build-ca and ./build-key scripts?
https://forums.openvpn.net/topic8849.html


具体的には各コマンドに--batchをつけるだけ。


<例>
build-ca --batch
build-dh --batch
build-key-server --batch server
build-key --batch public1

基本的には、varsスクリプトの内容がそのまま適用され、
common nameは--batchの後ろで指定した文字列となります(上記例ではserverとかpublic1)

これでOracle RAC on Amazon EC2の自動化に一歩近づきました


*12/11追記*
OpenVPN 2.1系では上記で良いのですが、
OpenVPN 2.2ではCommon Nameは--batchの引数になりません。
環境変数 KEY_CNで指定します。
export KEY_CN=changeme

csvってどうやって出力してますか?

このエントリは JPOUG Advent Calendar 参加ブログで一日目です。


Advent Calendarについては、このあたりを見ていただくとして、早速本題に入ります。


地味な話題ですが、みなさん、Oracle Databaseからcsvってどうやって出力していますか?
私は仕事柄結構csv出力する機会があり、こんな風にSQLPLUSから出力してました。


csv.sql

set lin 999 --1行の長さを999文字にする
set colsep ,--区切り文字を「,」にする
set feedback off -- xx行が表示されました のようなメッセージ(フィードバック)表示をOFFにする
set pages 0 --ページをOFF(ヘッダ、フッタ等を非表示にする)
set echo off -- スクリプト実行時にエコー表示しない

spool test2.csv
select 'EMPNO','ENAME','JOB','MGR','HIREDATE','SAL','COMM','DEPTNO' from dual;--列名表示
--colsepだけだと列が固定長で表示されてしまうため、||で各列を連結している表示
select EMPNO||','||ENAME||','||JOB||','||MGR||','||HIREDATE||','||SAL||','||COMM||','||DEPTNO from EMP;
spool off;

実行例

SQL>@csv.sql

出力例(test2.csv)

EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
7369,SMITH,CLERK,7902,80-12-17,800,,20
7499,ALLEN,SALESMAN,7698,81-02-20,1600,300,30
7521,WARD,SALESMAN,7698,81-02-22,1250,500,30
7566,JONES,MANAGER,7839,81-04-02,2975,,20
7654,MARTIN,SALESMAN,7698,81-09-28,1250,1400,30
7698,BLAKE,MANAGER,7839,81-05-01,2850,,30
7782,CLARK,MANAGER,7839,81-06-09,2450,,10
7788,SCOTT,ANALYST,7566,87-04-19,3000,,20
7839,KING,PRESIDENT,,81-11-17,5000,,10
7844,TURNER,SALESMAN,7698,81-09-08,1500,0,30
7876,ADAMS,CLERK,7788,87-05-23,1100,,20
7900,JAMES,CLERK,7698,81-12-03,950,,30
7902,FORD,ANALYST,7566,81-12-03,3000,,20
7934,MILLER,CLERK,7782,82-01-23,1300,,10


出力自体はこれでほとんど問題ないのですが、実行するSQLは毎回違うので、
その度に、csv.sqlみたいなものを毎回書き直すの面倒で仕方ないです。

そこで、csv出力のいい方法がないか調べてみました。


1. Oracle SQL Developer
Oracle 11g以降はOracle Clientインストール時に「ランタイム」もしくは、
「管理者」を選ぶともれなく、Oracle SQL Developerもインストールされます。
このSQL Developerがなかなか便利でPL/SQLの開発だけでなく、SQL文の実行も出来たりするのですが、
SQLの実行結果を様々なフォーマットでエクスポートする機能があり、
csv形式でエクスポートする事ができます。エクスポートされたcsvは各列が「"」で括ってあるため、
改行を含んだものでも綺麗な形でEXCEL等で取り込むことが出来ます。

なお、Oracle SQL Developerは初回起動時にJavaのパス入力を求められますが、Oracle Clientインストール時に
合わせてJDKもインストールされるため、Javaがインストールされていない環境でも「ORACLE_HOME\jdk\bin\java.exe」を指定すれば
Oracle SQL Developer を使うことが出来ます。



2. ちょっとperlスクリプト書いちゃう
Oracle Client(Windows版)インストール時に「ランタイム」もしくは、「管理者」を選ぶともれなく、perlもインストールされます。
このPerlですが、Oracle Databaseへ接続するためのライブラリ DBD::Oracleも含まれているため、
Oracle Clientをインストールしておけば、ちょっとしたOracle Database操作のスクリプトを書くことが出来ます。


DBD::Oracleの習作も含めて、任意のSQL文をcsv出力するperlスクリプトを書いてみます。
(にわかperlerなので、DBIの使い方はもろもろ、stackoverflow.comperlmonks.orgをベースにスクリプト書いてます。


db2csv.pl

#以下をほぼほぼ使用して、引数にOracle接続子、標準入力にSQL文を入れるようにしている
#http://stackoverflow.com/questions/65447/getting-data-from-an-oracle-database-as-a-csv-file-or-any-other-custom-text-for
#http://www.perlmonks.org/?node_id=264623


use DBI;
use DBD::Oracle;

#引数を/,@で区切ってそれぞれ、ユーザ名、パスワード、TNS名として取得
@args=split(/\/|@/,$ARGV[0]);
$user = $args[0];
$pass = $args[1];
$db = $args[2];

$dbh = DBI->connect( "dbi:Oracle:$db", $user, $pass );

print "SQL>";

$sql="";
while (<STDIN>){
  $sql=$sql.$_;
  last if($sql=~/;/);
}
#入力で「;」があったらSQLの終了と判定。本当は/でも判定したいけど、除算の/と区別つかないので断念
$sql =~ s/;//;

$dbh->{LongReadLen} = 65535;
$dbh->{PrintError} = 0;
$sth = $dbh->prepare($sql);

$sth->execute();


if ( $dbh->err() ) { die $dbh->errstr(); }

#列名の出力
$colnames = $sth->{NAME};
print "\"";
print join "\",\"", @$colnames;
print "\"\n";

#各列データの値に「"」と「,」を付与して(csv形式にして)出力
while ( $arrayref = $sth->fetchrow_arrayref ) {
    print "\"";
    print join "\",\"", @$arrayref;
    print "\"\n";
}

$dbh->disconnect();


実行例(Oracle Clientに付属のperlにPATHを通して実行)

C:\Documents and Settings\Administrator>set PATH=%PATH%;C:\app\Administrator\product\11.2.0\client_1\perl\bin
C:\Documents and Settings\Administrator>perl db2csv.pl scott/tiger@ora11g
SQL>select * from emp;
"EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO"
"7369","SMITH","CLERK","7902","80-12-17","800","","20"
"7499","ALLEN","SALESMAN","7698","81-02-20","1600","300","30"
"7521","WARD","SALESMAN","7698","81-02-22","1250","500","30"
"7566","JONES","MANAGER","7839","81-04-02","2975","","20"
"7654","MARTIN","SALESMAN","7698","81-09-28","1250","1400","30"
"7698","BLAKE","MANAGER","7839","81-05-01","2850","","30"
"7782","CLARK","MANAGER","7839","81-06-09","2450","","10"
"7788","SCOTT","ANALYST","7566","87-04-19","3000","","20"
"7839","KING","PRESIDENT","","81-11-17","5000","","10"
"7844","TURNER","SALESMAN","7698","81-09-08","1500","0","30"
"7876","ADAMS","CLERK","7788","87-05-23","1100","","20"
"7900","JAMES","CLERK","7698","81-12-03","950","","30"
"7902","FORD","ANALYST","7566","81-12-03","3000","","20"
"7934","MILLER","CLERK","7782","82-01-23","1300","","10"


まとめ
Oracle SQL Developer便利
Oracle Client入れるともれなくperlも使えるよ!


明日は
明日はRyota Watabe さんです。よろしくお願いします。

検証したいことリスト(2012/11/01)

環境の変化もあり、なかなか時間が取れませんが、
検証中の内容や今後やりたいことを備忘録の意味も含めて書きます。
(このエントリ見た誰かが、代わりに検証してくれたりすると嬉しいなぁ。。。)


Amazon EC2関連
Xen On Amazon EC2
        http://wiki.xen.org/wiki/Xen_FAQ_Nesting によると、
        HVMドメインにはXenがインストールできると記載があります。


        そして、カーネル3.0以降はXenが統合されているらしいので、
        理論上は、カーネル3.0以降のLinuxをHVMで動かしてやれば、
        Xen On EC2ができるはずです。


        <<試したこと>>
        ・HVMインスタンス(micro)なubuntu
        現状、EC2でのHVMインスタンスLinuxクラスタインスタンス用のものしかありませんが、
        rootディスクをWindowsインスタンスに付け替えてやることで、microインスタンスで起動することが出来ます。
        ・Xenのインストール
        https://help.ubuntu.com/community/Xen に従い、xen-hypervisor-amd64 をインストールし、
        Xenカーネルを起動しようとしていますが、eth0が有効化されず外部通信不可になってしまいます。
        (syslog上はOSまでは起動できてるみたいです)
        現状、これ以上の進展はできていません。



Oracle RAC on Amazon EC2Linux)
        EC2のAPIでなんとかする版 (未検証)
        http://aws.typepad.com/aws/2012/07/multiple-ip-addresses-for-ec2-instances-in-a-virtual-private-cloud.html
        によると、EC2のプライベートIPがAPI経由で複数割り当てられるようになりました。
        Oracle RACでは、仮想IPの割り当てをvipcaスクリプト(内部的にはifconfigたたいているみたい)
        で行っているようなので、vipcaスクリプトの延長でAPIたたいてやればなんとかなる気がします。


        ec2-assign-private-ip-addresses
        http://docs.amazonwebservices.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-AssignPrivateIpAddresses.html


        これが出来れば、OpenVPNや次のOpenFlow無しにOracle RACができるのかなぁと思っています。


        OpenFlow版 (未検証)
        http://gstanden.wordpress.com/2012/09/22/oracle-11gr2-rac-on-software-defined-network-sdn-openvswitch-and-floodlight/
        でOpenFlowを使って仮想ネットワークを構築してOracle RACを構築してるみたいです。
        Amazon EC2でできない理由は今のところ見当たらないので、時間が取れれば試してみたいと思います。
        (OpenVPNよりもメジャーなやり方になる気がします)



Oracle RAC on Amazon EC2/Windows Azure (Windows) 未検証
        Oracle Fail Safe(WSFC)では、一つの仮想NICを作成していましたが、Oracle RACでは、二つの仮想NICが必要です。
        二つの仮想NICを認識させる方法はまだ、試していませんが、
        この辺りを参考にすればいけそうな感じです。
        http://serverfault.com/questions/155299/how-to-connect-multiple-vpns-using-openvpn-on-windows-7-on-the-same-time



Linux tcコマンドで遅延を試す(未検証)
        Linuxのtcコマンドでは、帯域制限を行うことが出来ます。
        http://lost-and-found-narihiro.blogspot.jp/2010/10/linux-traffic-control.html


        帯域制限を行うことによって、なかなかシミュレートが難しい


        ・ネットワーク遅延
        ・I/O遅延(iSCSI経由)


        あたりを試せるかなーと。


以上、検証したいことリストでした。
次に時間がとれるのはいつかなー