お手軽バックアップ検証環境構築(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 LinuxにCentOSのリボジトリ追加
http://fdbklp.blogspot.jp/2012/05/amazon-linux-yum.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の作成まで含めて自動化できないか見当中です。
Oracle RAC on EC2 8ノード版
今回、CloudFormation使って、
インストールの事前構成を自動化してみました。
(インストールそのものは、普通にメディアからOUI起動してやりました)
*お金が掛かるので、ケチってspotインスタンスにしました。
詳細やテンプレートは後日公開します。
全文検索用のテストデータを用意する(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が公開されているので
今回は、JavaでOracle 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)」を使わせて頂きました。
JDBC(Oracle)については、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から出力してました。
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.comとperlmonks.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 EC2(Linux)
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経由)
あたりを試せるかなーと。
以上、検証したいことリストでした。
次に時間がとれるのはいつかなー