2011年4月30日土曜日

CentOS(5.6)に"cryptsetup 1.3.0"をインストール

スズキです。

CentOS(5.6)には、すでにパッケージ(cryptsetup-luks)として
下記のように、バージョンは1.0.3の"cryptsetup"がインストールされているのですが、

# /sbin/cryptsetup --version
cryptsetup-luks 1.0.3

とある事情で最新のものをインストールする必要があり、
下記のように、いつものパターンでインストールしました。

# yum install bzip2 -y
# yum install libgcrypt-devel -y
# cd /usr/local/src/
# curl -OL http://cryptsetup.googlecode.com/files/cryptsetup-1.3.0.tar.bz2
# bunzip2 cryptsetup-1.3.0.tar.bz2
# tar xvf cryptsetup-1.3.0.tar
# cd cryptsetup-1.3.0
# ./configure
# make
# make install

注意点は、上記でインストールされた"cryptsetup"は、
下記のように"/usr/sbin/"にあることです。

# /usr/sbin/cryptsetup --version
cryptsetup 1.3.0

ちなみに"cryptsetup"とは、暗号化ファイルシステムの設定・管理を行うツールです。

"2.6.16-xenU"だと、カーネルモジュールまわりが大変だった...
--------
http://www.suz-lab.com

SUZ-LAB謹製 CentOS AMI (5.6.1 64bit ap-northeast-1)

スズキです。

こちらの32bit版に続き、64bit版も作成しました。

--------
AMI ID: ami-8abd178b
Source: 811118151095/suz-lab_ebs_centos-core-x86_64-5.6.1
Kernel ID: aki-ea09a2eb
RAM Disk ID: ari-bc09a2bd
Block Devices: /dev/sda1=snap-2555314d:10:true
--------

変更内容は基本的に32bit版と同じですが、
下記のようにAKIやARIは、64bit版のものを当然、利用しています。

Name: aki-ea09a2eb
Description:
ec2-public-images-ap-northeast-1/vmlinuz-2.6.18-xenU-ec2-v1.5-x86_64.aki.manifest.xml

Name: ari-bc09a2bd
Description:
ec2-public-images-ap-northeast-1/initrd-2.6.18-xenU-ec2-v1.5-x86_64.ari.manifest.xml

下記のように、該当カーネルであることも確認できています。

# uname -a
Linux ip-10-148-45-82 2.6.18-xenU-ec2-v1.5 #1 SMP
Tue Sep 21 21:13:44 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux

Enjoy!

このAMIで、"cryptsetup"に再チャレンジ!
--------
http://www.suzz-lab.com

SUZ-LAB謹製 CentOS AMI (5.6.1 32bit ap-northeast-1)

スズキです。

ちょくちょくアップデートはしていたのですが、
ブログでアナウンスするのは久しぶりです...

--------
AMI ID: ami-64bd1765
Source: 811118151095/suz-lab_ebs_centos-core-i386-5.6.1
Kernel ID: aki-e809a2e9
RAM Disk ID: ari-ba09a2bb
Block Devices: /dev/sda1=snap-1d1b7f75:10:true
--------

といった感じでリリースしました。(東京リージョン)
("AWS Management Console"などで"suz-lab"で検索すれば見つかります)

アップデートのポイントは下記となります。

- CentOSのバージョンを"5.6"に
- カーネルを"2.6.18-xenU-ec2-v1.5"に
- Swap領域を2G用意
- "s3fs"をインストール済みに
- "rsync","xinetd"をインストール済みに

▼ CentOSのバージョンを"5.6"に

下記で気づいたら勝手に"5.6"になってました...

# yum update -y
# cat /etc/redhat-release
CentOS release 5.6 (Final)

▼ カーネルを"2.6.18-xenU-ec2-v1.5"に

こちらで紹介した内容をAMIに反映した形になります。
(下記のように確認できます)

# uname -a
Linux ip-10-150-187-77 2.6.18-xenU-ec2-v1.5 #1 SMP
Fri Sep 24 01:03:38 EDT 2010 i686 i686 i386 GNU/Linux

▼ Swap領域を2G用意

こちらで紹介した内容をAMIに反映した形になります。
(下記のように確認できます)

# swapon -s
Filename         Type  Size     Used  Priority
/mnt/swap/0.img  file  2097144  0     -1

▼ "s3fs"をインストール済みに

そろそろ、実績が出始めているのでインストール済みにしておきました。
こちらで紹介した内容をAMIに反映した形になります。

上記カーネル(&カーネルモジュール)ですと、
こちらの"fuse"モジュールまわりの作業が要らなくなります。

▼ "rsync","xinetd"をインストール済みに

今後"rsyncd"は、ひんぱんに使うことになるはずなので、インストール済みとしておきました。

Enjoy!

"64 bit"版も作らないと...
--------
http://www.suz-lab.com

AMI(Linux)のカーネルを"2.6.18-xenU-ec2-v1.5"にしてみた

スズキです。

今まで、ずっとデフォルトカーネル(2.6.16-xenU)を利用していたのですが、
近頃、"s3fs"や"cryptsetup"、そして"openswan"などカーネルモジュールに依存する
ソフトウェアをEC2で扱っていて、どうにもこうにも、デフォルトカーネルじゃ厳しくなってきたので、
他のカーネル(2.6.18-xenU-ec2-v1.5)を試してみました。

"2.6.18-xenU-ec2-v1.5"を選択した理由は、
こちらに、カーネルモジュールアーカイブが置かれていたからです。
つまり、カーネルモジュールアーカイブがあり、その中の最新のものを選んだことになります。

カーネルを変更するってことは、AMIからインスタンス起動時に指定する
AKIとARIを変更するってことですが、上記のものは東京リージョンだと下記となります。

▼ AKI
Name: aki-e809a2e9
Description:
ec2-public-images-ap-northeast-1/vmlinuz-2.6.18-xenU-ec2-v1.5-i686.aki.manifest.xml

▼ ARI
Name: ari-ba09a2bb
Description:
ec2-public-images-ap-northeast-1/initrd-2.6.18-xenU-ec2-v1.5-i686.ari.manifest.xml

"AWS Management Console"などでインスタンス起動時に、
下記のように指定するだけでOKです。


インスタンスが起動したら、ログインして下記コマンドで、
該当カーネルが適用されていることを確認することができます。

# uname -a
Linux ip-10-150-181-26 2.6.18-xenU-ec2-v1.5 #1 SMP
Fri Sep 24 01:03:38 EDT 2010 i686 i686 i386 GNU/Linux

カーネルモジュールは、下記のようにダウンロードして展開しておきます。

# cd /
# curl -OL http://s3.amazonaws.com/ec2-downloads/ec2-modules-2.6.18-xenU-ec2-v1.5-i686.tgz
# tar xvzf ec2-modules-2.6.18-xenU-ec2-v1.5-i686.tgz
# rm ec2-modules-2.6.18-xenU-ec2-v1.5-i686.tgz
※ "64 bit"の場合は"ec2-modules-2.6.18-xenU-ec2-v1.5-x86_64.tgz"です。

展開したファイル群にシンボリックリンク切れがあったので、削除しておきます。

# cd /lib/modules/2.6.18-xenU-ec2-v1.5
# rm -f source
# rm -f build

この状態でリブートして"/var/log/messages"を確認すると、
下記のようなエラーが出力されていました。

...
Apr 30 00:48:02 ip-10-150-181-26 modprobe: FATAL:
Could not load /lib/modules/2.6.18-xenU-ec2-v1.5/modules.dep:
No such file or directory
...

"modules.dep"がないってことなので、下記のように"depmod"を実行することで解決しておきます。

# depmod

この状態でリブートすると、"/var/log/messages"にも特に気持ち悪いメッセージは出なくなりました。

ちなみに、"SUZ-LAB謹製AMI"では、最後に"2.6.16-xenU"の残骸を
下記のように削除しておきました。

# rm -f /boot/vmlinux-syms-2.6.16-xenU
# rm -f /boot/System.map-2.6.16-xenU
# rm -f /boot/message
# rm -f /lib/modules/2.6.16-xenU

これ以上ってなると、カスタムカーネルか...
--------
http://www.suz-lab.com

2011年4月28日木曜日

EC2(CentOS 5.6)で"fuse-2.8.5"と"s3fs-1.40"を利用するために

スズキです。

こちらでインストールまで行ったのですが、
いざ、"s3fs"を利用してみようとしたら、かなり難航してしまいました。

まず、こんなエラーが出てしまいました。

# s3fs static.cloudpack.jp /mnt/s3/static_cloudpack_jp
s3fs: error while loading shared libraries: libfuse.so.2:
cannot open shared object file: No such file or directory

これは、"fuse"を"/usr/local"にインストールしていたので、
そこにライブラリパスが通っていないことが原因です。

ですので、"/etc/ld.so.conf"を下記のように調整して解決しました。
(反映には"ldconfig"を実行する必要あり)

/usr/local/lib
include ld.so.conf.d/*.conf

すると今度は、下記のようなエラーに変わりました。

# ldconfig
# s3fs static.cloudpack.jp /mnt/s3/static_cloudpack_jp
s3fs: credentials file /etc/passwd-s3fs
should not have others permissions

これは単に、"/etc/passwd-s3fs"が適切に作成されてない、
ということなので、下記のように作成しておきます。
※"Access Key:Secret Key"の形式で"chmod 600"しておきます。
--------
AAAAAAAAAAAAAAAAAAAA:SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

すると今度は、下記のようなエラーとなりました。
これは、デバイスが無いから"modprobe fuse"してくれって言われて、
実際"modprobe fuse"したら、そもそもモジュールが無いよって言われた形となります。

# s3fs static.cloudpack.jp /mnt/s3/static_cloudpack_jp
fuse: device not found, try 'modprobe fuse' first
# modprobe fuse
FATAL: Module fuse not found.

ということで、"fuse"モジュールを作成しなければいけないのですが、
今回は、こちらのフォーラムで提供されているファイルを利用しました。

手順は下記となります。

# cd /
# curl -OL https://forums.aws.amazon.com/servlet/JiveServlet/download/30-11544-42641-670/modules-added-to-ami-6bae4b02.tgz
# tar xvzf modules-added-to-ami-6bae4b02.tgz
lib/modules/2.6.16-xenU/kernel/fs/binfmt_aout.ko
lib/modules/2.6.16-xenU/kernel/fs/fuse/fuse.ko
lib/modules/2.6.16-xenU/kernel/fs/relayfs/relayfs.ko
lib/modules/2.6.16-xenU/kernel/net/xfrm/xfrm_user.ko
# /sbin/depmod
# modprobe fuse
# s3fs static.cloudpack.jp /mnt/s3/static_cloudpack_jp

これで、ようやく"s3fs"が利用出来るようになりました。

そろそろ、デフォルトカーネル(2.6.16-xenU)を卒業しないといけないのかなー...
--------
http://www.suz-lab.com

2011年4月27日水曜日

"rsync(d)"の"include"と"exclude"

スズキです。

"rsync"を使うとき、特定のファイルのみ対象にしたい場合が多々あると思いますが、
そういう場合は、"include"オプションを利用します。
ただし、"include"オプションだけでは効果がなく、

下記のように「--exclude="*"」も一緒に付ける必要があります。

# rsync -av \
> --include="access_log*" \
> --exclude="*" \
> xxx.xxx.xxx.xxx::httpd_log/ \
> /opt/cloudpack/var/anr/awstats/

"rsyncd"側で同様の事を行う場合は、"/etc/rsyncd.conf"を下記のようにします。

[httpd_log]
path        = /var/log/httpd
hosts allow = 10.0.0.0/8
read only   = true
uid         = root
gid         = root
include     = access_log*
exclude     = *

やはりこちらも「--exclude="*"」が必要になります。

"awstats & s3fs"、構築中...
--------
http://www.suz-lab.com

"CentOS 5.6"に"fuse-2.8.5"と"s3fs-1.40"のインストール

スズキです。

"CentOS 5.6"ていうか、"SUZ-LAB謹製AMI"へのインストールです。

まずは必要なパッケージをインストールします。
※このあたりは環境によって異なると思います。

# yum -y install gcc-c++
# yum -y install pkgconfig
# yum -y install make
# yum -y install curl-devel
# yum -y install libxml2-devel

次に"fuse"をインストールします。
※"/usr/local"にインストールされます。

# cd /usr/local/src
# curl -OL http://sourceforge.net/projects/fuse/files/fuse-2.X/2.8.5/fuse-2.8.5.tar.gz
# tar xvzf fuse-2.8.5.tar.gz
# cd fuse-2.8.5
# ./configure
# make
# make install

最後に"s3fs"をインストールします。
※ポイントは"export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig"です。

# cd ../
# curl -OL http://s3fs.googlecode.com/files/s3fs-1.40.tar.gz
# tar xvzf s3fs-1.40.tar.gz
# cd s3fs-1.40
# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
# ./configure
# make
# make install

次は実際に"s3fs"を利用してみます。
もう、いろんな人がやってるトピックなんだけど...
--------
http://www.suz-lab.com

2011年4月26日火曜日

EBSのスナップショットを他のAWSアカウントと共有

スズキです。

"Amazon Management Console"から簡単にできます。

まず、共有したいスナップショットを指定して、下記の"Permission"ボタンを押します。


すると、下記ウィンドウが現れるので、"Private"を選択して、
共有させたい口座番号(Account Number)を入力します。


口座番号(Account Number)は、AWSのページから、
「アカウント」→「アカウントアクティビティ」で、
下記のように確認することができます。


処理が成功すると、以下のような画面となります。


共有先のアカウントで"AWS Management Console"に入りなおして、
スナップショットを確認すると、共有したスナップショットが確認できます。
※ Viewingを"Private Snapshots"にする必要があります。


ただ注意点として、AMIを作成するためにスナップショットを共有したのですが、
自分所有のスナップショットじゃないと、AMIは作成できないようです。

ですので、このスナップショットからAMIを作成する場合は、
一旦、スナップショットをEBSにして、そのEBSのスナップショットを取ることで、
同じ内容の自分所有のスナップショットを作成し、AMIをつくることになります。

ちなみに、スナップショットからAMIを作成する方法は、こちらで紹介しています。

テストアカウントで構築した環境から、簡単に本番環境ができてしまう...
--------
http://www.suz-lab.com

2011年4月25日月曜日

RDSで"Restore To Point In Time"

スズキです。

RDSは"Restore To Point In Time"ができます。

"Restore To Point In Time"とは、ある時点のDBを復元する機能です。

"Amazon Management Console"なら下記のように実行できます。


すると、下記のような画面となり、"Use Custom Restore Time"で
指定した時刻のDBを復元することができます。

ちなみに、最寄りの復元可能な時刻は"Use Latest Restorable Time"となり、
5分単位で現時刻にもっとも近いものとなっています。
(ですので、最悪でも5分前のDBは復元できるということになります)


とりあえず、適当に(古い)時刻を設定すると、エラー(赤文字)となりました。
これは、RDS作成時に設定した"Backup Retention Period"(バックアップ保持期間)
より昔の時刻には戻れないというエラーです。


"Backup Retention Period"は1日に設定していたので、上記のように
1日以内の時刻を設定すれば、その時点のDBを作成することが可能です。

ただし、上記のように作成すると、パラメータグループとセキュリティーグループが
デフォルトのままのRDSが作成されています。


ですので、上記のようなRDSの編集機能から、
望むパラメータグループやセキュリティーグループを設定しなおす必要があります。

RDS、早くタイムゾーンの件(init_connect)、解決しないかなー...
--------
http://www.suz-lab.com

Oracleで(一時)表領域の作成(とりあえず版)

スズキです。

いろいろパラメータはありますが、とりあえず簡単に作成してみます。

CREATE TABLESPACE DATA0 DATAFILE
    '/u01/app/oracle/oradata/suzlab/data00.dbf' SIZE 8192M;

データファイルを複数指定することもできます。

CREATE TABLESPACE DATAN DATAFILE
    '/u01/app/oracle/oradata/suzlab/data01.dbf' SIZE 8192M,
    '/u01/app/oracle/oradata/suzlab/data02.dbf' SIZE 8192M,
    '/u01/app/oracle/oradata/suzlab/data03.dbf' SIZE 8192M,
    '/u01/app/oracle/oradata/suzlab/data04.dbf' SIZE 8192M;

一時表領域は下記のように作成します。

CREATE TEMPORARY TABLESPACE TEMP0 TEMPFILE
    '/u01/app/oracle/oradata/suzlab/temp01.dbf' SIZE 8192M;

表領域の確認は下記でできます。

select * from sys.dba_tablespaces;

パラメータの細かいところは、また後日...
--------
http://www.suz-lab.com

Oracleでレスポンスファイルを利用したCUIでのDB削除

スズキです。

こちらでDB作成を紹介したので、今回はDBの削除です。

まずは、DB作成に利用した"dbca.rsp"をDB削除用に下記のように調整します。

--------【dbca-del.rsp】--------
...
OPERATION_TYPE = "deleteDatabase"
...
SOURCEDB = "suzlab"
...
--------

そして、次のように実行すれば、DBが削除されます。
※パスなどの調整はされているものとします。

# su - oracle

$ dbca -silent -responseFile /home/oracle/dbca-del.rsp
--------
データベースへ接続しています。
4%完了
9%完了
14%完了
19%完了
23%完了
28%完了
47%完了
ネットワーク構成ファイルを更新しています
48%完了
52%完了
インスタンスおよびデータファイルを削除中
76%完了
100%完了
詳細はログ・ファイル"/u01/app/oracle/cfgtoollogs/dbca/suzlab.log"を参照してください。

これで、"X"いらず!?
--------
http://www.suz-lab.com

2011年4月21日木曜日

PHPでディレクトリ以下の一覧を取得

スズキです。

こんな感じです。

$dirs = scandir("/opt/cloudpack/etc");
foreach($dirs as $dir) {
    if($dir != "." && $dir != "..") {
        print($dir . "¥n");
    }
}

自分メモです...
--------
http://www.suz-lab.com

2011年4月19日火曜日

AWSアカウントのRDSをスナップショット作成&世代管理

スズキです。

こちらで特定のAWSアカウントのRDSすべてのスナップショットを作成する、
PHPスクリプトを作ったのですが、さらに強化してみました。

強化した点は、

- すべてのリージョンを対象
- JSONにアカウント情報を記述
- 世代管理
- スキップするRDSが指定可能(JSONに記述)
- RDS毎にスナップショットの世代を指定(JSONに記述)

といった感じです。

かなり長くなってしまいましたが、PHPスクリプトはこんな感じです。

require_once("./sdk.class.php");
define("CP_SNAPSHOT_PREFIX"    , "cp");
define("CP_SNAPSHOT_GENERATION", 2);

// 設定情報
$json = <<< JSON
{
    "key"        : {
        "access": "AAAAAAAA",
        "secret": "SSSSSSSS"
    },
    "default"    : {
        "generation": 3
    },
    "ignore"     : {
        "rds.us-east-1.amazonaws.com"     : [
        ],
        "rds.us-west-1.amazonaws.com"     : [
        ],
        "rds.eu-west-1.amazonaws.com"     : [
        ],
        "rds.ap-southeast-1.amazonaws.com": [
        ],
        "rds.ap-northeast-1.amazonaws.com": [
            "suzlab"
        ]
    },
    "generation" : {
        "rds.us-east-1.amazonaws.com": {
        },
        "rds.us-west-1.amazonaws.com": {
        },
        "rds.eu-west-1.amazonaws.com": {
        },
        "rds.ap-southeast-1.amazonaws.com": {
            "suzlab3": 4
        },
        "rds.ap-northeast-1.amazonaws.com": {
        }
    }
}
JSON;

// 設定情報の読み込み
$config = json_decode($json, true);
if(json_last_error() != JSON_ERROR_NONE) {
    fputs(STDERR, json_last_error() . "\n");
    exit(1);
}

// 初期設定
define("AWS_KEY"       , $config["key"]["access"]);
define("AWS_SECRET_KEY", $config["key"]["secret"]);
$rds = new AmazonRDS();
$regions = array(
    AmazonRDS::REGION_US_E1,
    AmazonRDS::REGION_US_W1,
    AmazonRDS::REGION_EU_W1,
    AmazonRDS::REGION_APAC_SE1,
    AmazonRDS::REGION_APAC_NE1
);

foreach($regions as $region) {
    // RDS一覧の取得
    $rds->set_region($region);
    $ins_rsp = $rds->describe_db_instances();
    if(!$ins_rsp->isOK()) {
        fputs(STDERR, $ins_rsp->body->Error->Message . "\n");
    }
    $instances = $ins_rsp->body->DescribeDBInstancesResult->DBInstances->DBInstance;
    
    // スキップRDSリストの作成
    $ignore = array();
    if(isset($config["ignore"][$region])) {
        $ignore = $config["ignore"][$region];
    }
    
    foreach($instances as $instance){
        $name = $instance->DBInstanceIdentifier->to_string();
        if(!in_array($name, $ignore)) {
            // スナップショットの作成
            $snp_rsp = $rds->create_db_snapshot(CP_SNAPSHOT_PREFIX . "-" . date("YmdHis") . "-" . $name, $name);
            if(!$snp_rsp->isOK()) {
                fputs(STDERR, $snp_rsp->body->Error->Message . "\n");
            }
            
            // スナップショット一覧の作成
            $snp_rsp = $rds->describe_db_snapshots(array(
                "DBInstanceIdentifier" => $name
            ));
            if(!$snp_rsp->isOK()) {
                fputs(STDERR, $snp_rsp->body->Error->Message . "\n");
            }

            // スナップショット一覧のフィルターとソート
            $snapshots = $snp_rsp->body->DescribeDBSnapshotsResult->DBSnapshots->DBSnapshot;
            $snapshotnames = array();
            foreach($snapshots as $snapshot) {
                if(strpos($snapshot->DBSnapshotIdentifier, CP_SNAPSHOT_PREFIX) === 0) {
                    array_push($snapshotnames, $snapshot->DBSnapshotIdentifier);
                }
            }
            sort($snapshotnames, SORT_STRING);
            
            // 残す世代の決定
            if(isset($config["generation"][$region][$name])) {
                $generation = $config["generation"][$region][$name];
            } elseif($config["default"]["generation"]) {
                $generation = $config["default"]["generation"];
            } else {
                $generation = CP_SNAPSHOT_GENERATION;
            }

            // 古いスナップショットを削除
            $count = count($snapshotnames) - $generation;
            if($count > 0) {
                for($i = 0; $i < $count; $i++) {
                    $snp_rsp = $rds->delete_db_snapshot($snapshotnames[$i]);
                    if(!$snp_rsp->isOK()) {
                        fputs(STDERR, $snp_rsp->body->Error->Message . "\n");
                    }
                }
            }
        }
    }
}

exit(0);

JSONを設定ファイル化すれば、引き継げるぞ...
--------
http://www.suz-lab.com

AWSアカウントのRDS一覧を取得&スナップショット作成

スズキです。

PHPで作成してみました。

require_once("./sdk.class.php");
define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "SSSSSSSS");

$rds = new AmazonRDS();
$rds->set_region(AmazonRDS::REGION_APAC_NE1);

$ins_rsp = $rds->describe_db_instances();
$instances = $ins_rsp->body->DescribeDBInstancesResult->DBInstances->DBInstance;
if(!$ins_rsp->isOK()) {
    fputs(STDERR, $ins_rsp->body->Error->Message . "\n");
    exit(1);
}

foreach($instances as $instance){
    $name = $instance->DBInstanceIdentifier;
    $snp_rsp = $rds->create_db_snapshot("a-" . date("YmdHis") . "-" . $name, $name);
    if(!$snp_rsp->isOK()) {
        fputs(STDERR, $snp_rsp->body->Error->Message . "\n");
    }
}

これからAWSのメンテナンスツールはPHPでつくろう。
--------
http://www.suz-lab.com

2011年4月18日月曜日

Oracleリスナーをすべてのインターフェースにバインド

スズキです。

EC2は起動するたびにIPアドレスが変わってしまうので、
(リブートは変わりませんが)
Oracleリスナーをすべてのインターフェースにバインドしておくと、
使い勝手がよくなります。

やり方はこちらで紹介されていますが、
/u01/app/oracle/product/11.1.0/db_1/network/admin/listener.ora
に下記のように"0.0.0.0"を指定すれば、OKです。

--------【listener.ora】--------
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
--------

"netstat"でも下記のようにOracleリスナー(1521)が
すべてのインターフェースにバインドされていることが確認できます。

$ netstat -tln
--------
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
...
tcp        0      0 0.0.0.0:1521                0.0.0.0:*                   LISTEN      
...
--------

AMI取る前にやっておけばよかった...
--------
http://www.suz-lab.com

"fdisk"で"Oracle AMI"のディスクの使い方を調整

スズキです。

こちらで東京リージョンの"Oracle AMI"を試したのですが、
ディスクの使い方が気持ち悪かったので、"suz-lab"好みの状態にしてみました。

主な気持ち悪かった点は下記となります。

- "/dev/sda3"がSWAP領域
→ SWAPはもっと容量が欲しい
- "/dev/sda"は10Gあるはずだが、すべて使われて無い(/dev/sda1,sda2,sda3)
→ 論外
- "/dev/sdb"が3つ以上のパーティションに分割されている
→ 多くても二つ(システム領域とデータ領域)でいい
→ でもデータ領域は別EBSになるはず

これを下記のように変更しようと思います。

- "/dev/sda3"は"/dev/sda"のサイズをすべて利用する形で作り直す
- "/dev/sda3"にOracleのシステムを置く
- "/dev/sdb"は外す

※ SWAP領域は別にEBSをアタッチして用途に合ったサイズを割り当てる。
※ Oracleのデータ領域も別にEBSをアタッチして用途に合ったサイズにする。

ということで、Oracle系のプロセスは終了済みという前提で作業していきます。

まずは、"/dev/sda"の整理です。

下記のように、"/dev/sda3"がSWAPで使われていることがわかります。

# fdisk /dev/sda
...
Command (m for help): p
---
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1           4       32098+  83  Linux
/dev/sda2               5         413     3285292+  83  Linux
/dev/sda3             414         805     3148740   82  Linux swap / Solaris
---

なので、SWAPを外して、一旦、"/dev/sda3"を削除します。

# swapoff -a
# fdisk /dev/sda
...
Command (m for help): d
Partition number (1-4): 3
Command (m for help): p
--------
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1           4       32098+  83  Linux
/dev/sda2               5         413     3285292+  83  Linux
--------

削除したら、新たに"/dev/sda3"を作りなおします。

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (414-1305, default 414):
Using default value 414
Last cylinder or +size or +sizeM or +sizeK (414-1305, default 1305):
Using default value 1305
Command (m for help): p
--------
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1           4       32098+  83  Linux
/dev/sda2               5         413     3285292+  83  Linux
/dev/sda3             414        1305     7164990   83  Linux
--------
Command (m for help): w
Command (m for help): q
# reboot

※ "w"コマンドで変更情報を書き込むのを忘れずに!
※ リブートするまで変更情報は反映されません!

次に、新しく作成しなおした"/dev/sda3"にラベルを付けてマウントします。

# yes | mkfs -t ext3 /dev/sda3
# e2label /dev/sda3 /u01
# mkdir /u02
# mount /dev/sda3 /u02

Oracleシステム(/u01/*)を"/dev/sda3"(/u02/*)に移動します。

# cd /u02/
# mv /u01/db* ./
# mv /u01/config ./
# mv /u01/app ./

移動したら"/u02"をアンマウントして削除します。

# umount /u02
# rmdir /u02

最後に"/etc/fstab"を下記のように調整してリブートすれば、作業完了です。

--------【fstab】--------
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=/u01              /u01                    ext3    defaults        1 2
--------
※ SWAPの部分は削除しています。
※ "/u01"のラベルを"/dev/sda3"(/u01)に変更しています。

"/dev/sdb"のデタッチも忘れずに...

こんなことなら、Oracleは自分でインストールしたほうがいいかも...
--------
http://www.suz-lab.com

オフセットごとのタイムゾーン一覧

スズキです。

"Asia/Tokyo"と同じオフセットのタイムゾーンが知りたくて、以下のようなPerlスクリプトで、
オフセットごとのタイムゾーン一覧を作成してみました。

--------【Perl】--------
use DateTime;
use DateTime::TimeZone;

my @tz_names = DateTime::TimeZone->all_names;
my %results  = ();

foreach(@tz_names) {
    my $tz = DateTime::TimeZone->new(name =>$_);
    $results{$_} = $tz->offset_for_datetime(DateTime->now());
}

my $offset = 0;
foreach(sort{$results{$a} <=> $results{$b}}(keys(%results))) {
    if($offset != $results{$_}) {
        $offset =  $results{$_};
        print("\n[");
        print(DateTime::TimeZone->offset_as_string($results{$_}));
        print("]\n");
    }
    print("$_, ");
}
--------
※事前に"yum install perl-DateTime"を実行しています。

出力結果は以下となります。([オフセット]です)

--------
[-1100]
Pacific/Niue, Pacific/Pago_Pago, Pacific/Midway, Pacific/Apia,
[-1000]
Pacific/Tahiti, HST, Pacific/Rarotonga, Pacific/Fakaofo, Pacific/Johnston, Pacific/Honolulu,
[-0930]
Pacific/Marquesas,
[-0900]
America/Adak, Pacific/Gambier,
[-0800]
America/Juneau, America/Yakutat, Pacific/Pitcairn, America/Nome, America/Anchorage,
[-0700]
America/Whitehorse, America/Los_Angeles, America/Hermosillo, America/Dawson_Creek, America/Tijuana, America/Dawson, PST8PDT, MST, America/Vancouver, America/Phoenix,
[-0600]
America/Mazatlan, America/Inuvik, America/El_Salvador, America/Yellowknife, MST7MDT, America/Boise, America/Costa_Rica, America/Regina, America/Swift_Current, America/Belize, Pacific/Galapagos, America/Chihuahua, America/Edmonton, Pacific/Easter, America/Cambridge_Bay, America/Tegucigalpa, America/Guatemala, America/Managua, America/Denver,
[-0500]
America/Bogota, America/Indiana/Knox, America/Cayman, America/North_Dakota/New_Salem, America/Atikokan, EST, America/Rainy_River, America/Jamaica, CST6CDT, America/Monterrey, America/Menominee, America/Merida, America/Cancun, America/North_Dakota/Center, America/Resolute, America/Rankin_Inlet, America/Winnipeg, America/Port-au-Prince, America/Mexico_City, America/Lima, America/Guayaquil, America/Chicago, America/Indiana/Tell_City, America/Panama,
[-0430]
America/Caracas,
[-0400]
Antarctica/Palmer, America/Indiana/Vincennes, America/Nassau, America/St_Kitts, America/Grenada, America/Indiana/Vevay, America/Guyana, America/Antigua, America/New_York, America/Blanc-Sablon, America/Havana, America/Guadeloupe, America/Barbados, Atlantic/Stanley, America/St_Thomas, America/Cuiaba, America/Manaus, America/Kentucky/Louisville, America/La_Paz, America/Nipigon, America/Porto_Velho, America/Kentucky/Monticello, America/Iqaluit, America/Thunder_Bay, America/Toronto, America/Martinique, America/Detroit, America/Asuncion, America/Indiana/Petersburg, America/Montreal, America/Anguilla, America/Indiana/Indianapolis, America/St_Vincent, America/Indiana/Winamac, America/Dominica, America/Eirunepe, America/St_Lucia, America/Pangnirtung, America/Indiana/Marengo, EST5EDT, America/Curacao, America/Rio_Branco, America/Argentina/San_Luis, America/Santiago, America/Campo_Grande, America/Boa_Vista, America/Santo_Domingo, America/Grand_Turk, America/Aruba, America/Port_of_Spain, America/Montserrat, America/Tortola, America/Puerto_Rico,
[-0300]
America/Halifax, America/Bahia, America/Santarem, America/Argentina/Mendoza, America/Argentina/Cordoba, America/Glace_Bay, America/Argentina/Rio_Gallegos, America/Cayenne, America/Recife, America/Argentina/La_Rioja, America/Argentina/Salta, America/Montevideo, America/Argentina/San_Juan, America/Moncton, America/Goose_Bay, America/Thule, America/Maceio, America/Araguaina, America/Argentina/Jujuy, America/Argentina/Tucuman, America/Sao_Paulo, America/Fortaleza, America/Belem, America/Argentina/Catamarca, America/Argentina/Buenos_Aires, America/Argentina/Ushuaia, America/Paramaribo, Antarctica/Rothera, Atlantic/Bermuda,
[-0230]
America/St_Johns,
[-0200]
America/Miquelon, Atlantic/South_Georgia, America/Godthab, America/Noronha,
[-0100]
Atlantic/Cape_Verde,
[+0000]
Africa/Conakry, Atlantic/Reykjavik, Africa/Ouagadougou, Africa/Abidjan, Africa/Sao_Tome, Africa/Monrovia, America/Danmarkshavn, Africa/Bissau, Africa/El_Aaiun, Africa/Banjul, Africa/Lome, Atlantic/St_Helena, Africa/Dakar, Africa/Bamako, Africa/Casablanca, Africa/Nouakchott, Atlantic/Azores, America/Scoresbysund, Africa/Accra, Africa/Freetown,
[+0100]
Africa/Kinshasa, Africa/Porto-Novo, Africa/Luanda, Africa/Algiers, Atlantic/Canary, Africa/Libreville, Africa/Malabo, Africa/Brazzaville, Europe/London, Africa/Douala, Africa/Windhoek, Africa/Bangui, Africa/Lagos, WET, Africa/Niamey, Europe/Lisbon, Atlantic/Faroe, Africa/Ndjamena, Europe/Dublin, Atlantic/Madeira,
[+0200]
Europe/Belgrade, Europe/Vaduz, Africa/Bujumbura, Africa/Blantyre, Africa/Harare, Europe/Warsaw, Europe/Brussels, MET, Africa/Lusaka, Europe/Madrid, Africa/Tunis, Europe/Amsterdam, Europe/Malta, Africa/Tripoli, Europe/Paris, Europe/Berlin, Africa/Mbabane, Africa/Lubumbashi, Europe/Rome, Europe/Budapest, Africa/Maseru, Europe/Oslo, Europe/Prague, Africa/Johannesburg, Africa/Gaborone, Africa/Cairo, Africa/Kigali, Europe/Gibraltar, Europe/Andorra, Europe/Copenhagen, Europe/Tirane, Africa/Ceuta, Africa/Maputo, CET, Europe/Luxembourg, Europe/Monaco, Europe/Vienna, Europe/Zurich, Europe/Stockholm,
[+0300]
Asia/Baghdad, Asia/Beirut, Africa/Nairobi, Asia/Bahrain, Africa/Addis_Ababa, Asia/Jerusalem, Europe/Chisinau, Asia/Kuwait, Europe/Bucharest, Europe/Istanbul, Indian/Comoro, Europe/Kaliningrad, Africa/Mogadishu, Indian/Antananarivo, Europe/Riga, Europe/Vilnius, Africa/Kampala, Europe/Uzhgorod, Africa/Dar_es_Salaam, Asia/Amman, Europe/Simferopol, Europe/Minsk, Europe/Helsinki, Africa/Khartoum, Indian/Mayotte, Africa/Djibouti, Asia/Aden, Africa/Asmara, Asia/Nicosia, Asia/Riyadh, Europe/Athens, Asia/Gaza, Antarctica/Syowa, Asia/Damascus, Asia/Qatar, Europe/Sofia, Europe/Kiev, Europe/Zaporozhye, Europe/Tallinn, EET,
[+0400]
Asia/Muscat, Indian/Mauritius, Asia/Dubai, Asia/Tbilisi, Europe/Moscow, Europe/Volgograd, Indian/Reunion, Indian/Mahe,
[+0430]
Asia/Kabul, Asia/Tehran,
[+0500]
Asia/Aqtau, Asia/Dushanbe, Asia/Samarkand, Indian/Kerguelen, Indian/Maldives, Asia/Tashkent, Asia/Yerevan, Asia/Aqtobe, Asia/Oral, Asia/Ashgabat, Antarctica/Davis, Asia/Baku, Antarctica/Mawson, Europe/Samara,
[+0530]
Asia/Colombo, Asia/Kolkata,
[+0545]
Asia/Kathmandu,
[+0600]
Antarctica/Vostok, Asia/Bishkek, Asia/Qyzylorda, Asia/Thimphu, Indian/Chagos, Asia/Yekaterinburg, Asia/Almaty, Asia/Karachi,
[+0630]
Indian/Cocos, Asia/Rangoon,
[+0700]
Asia/Dhaka, Asia/Pontianak, Asia/Ho_Chi_Minh, Indian/Christmas, Asia/Phnom_Penh, Asia/Novosibirsk, Asia/Hovd, Asia/Novokuznetsk, Asia/Vientiane, Asia/Omsk, Asia/Bangkok, Asia/Jakarta,
[+0800]
Asia/Manila, Asia/Ulaanbaatar, Asia/Krasnoyarsk, Asia/Shanghai, Asia/Makassar, Asia/Kashgar, Australia/Perth, Asia/Urumqi, Asia/Choibalsan, Asia/Harbin, Asia/Brunei, Asia/Macau, Asia/Singapore, Asia/Chongqing, Asia/Hong_Kong, Asia/Kuala_Lumpur, Asia/Kuching, Asia/Taipei,
[+0845]
Australia/Eucla,
[+0900]
Asia/Pyongyang, Asia/Irkutsk, Pacific/Palau, Asia/Tokyo, Asia/Jayapura, Asia/Dili, Asia/Seoul,
[+0930]
Australia/Broken_Hill, Australia/Adelaide, Australia/Darwin,
[+1000]
Pacific/Guam, Australia/Currie, Pacific/Truk, Antarctica/DumontDUrville, Australia/Melbourne, Australia/Sydney, Australia/Lindeman, Pacific/Saipan, Asia/Yakutsk, Australia/Brisbane, Pacific/Port_Moresby, Australia/Hobart,
[+1030]
Australia/Lord_Howe,
[+1100]
Antarctica/Casey, Asia/Vladivostok, Asia/Sakhalin, Pacific/Guadalcanal, Pacific/Ponape, Pacific/Noumea, Pacific/Efate, Pacific/Kosrae,
[+1130]
Pacific/Norfolk,
[+1200]
Pacific/Wake, Pacific/Fiji, Pacific/Nauru, Pacific/Kwajalein, Pacific/Majuro, Asia/Magadan, Pacific/Funafuti, Pacific/Tarawa, Antarctica/McMurdo, Pacific/Wallis, Pacific/Auckland,
[+1245]
Pacific/Chatham,
[+1300]
Asia/Anadyr, Pacific/Tongatapu, Pacific/Enderbury, Asia/Kamchatka,
[+1400]
Pacific/Kiritimati,
--------

"Asia/Tokyo"と同じオフセットのものは

"Asia/Pyongyang"
"Asia/Irkutsk"
"Pacific/Palau"
"Asia/Jayapura"
"Asia/Dili"
"Asia/Seoul"

でした。

RDSの"init_connect"が調子悪いなー...
--------
http://www.suz-lab.com

2011年4月14日木曜日

東京リージョンの"Oracle AMI"を試してみた

スズキです。

今まで、こんな感じで東京リージョンにOracleインストールをしていたのですが、
なんと、こんなAMIが、いつの間にか利用出来るようになってました...
(11gR2が無いのが残念ですが...)

AMI ID: ami-dadd77db
Name: Oracle Database 10gR2 x86_64 - OVM

AMI ID: ami-d8dd77d9
Name: Oracle Database 11gR1 x86_64 - OVM

ということで、早速、11gR1の方を起動してログイン(root)してみました。

まず、キレイにしておいたほうがいいと思い、
下記コマンドを実行してみました。

# cd /u01
# /u01/db-cleanup.sh

すると、ネットワークの再起動がかかり、
さらにログイン出来なくなってしまいました...

仕方ないので、インスタンスをリブートしたら、
ログインできるようになりました...
(多分、実行しなくてもいいコマンドだったような気がしています...)

次は、下記の設定系のコマンドがあったので、実行してみました。
すると対話形式で設定が進み、Oracleが利用できるようになりました。
↓↓↓↓↓↓↓↓
↑↑↑↑↑↑↑↑がユーザー入力部分です。

# cd /u01
# /u01/db-reconfig.sh 
--------
Configuring network.
↓↓↓↓↓↓↓↓
Use DHCP? y/n [n] y
↑↑↑↑↑↑↑↑
Stopping network...
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Configuring DHCP.
Starting network...
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:
Determining IP information for eth0... done.
                                                           [  OK  ]
Starting Oracle database reconfiguration.
Oracle Database Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database.
The following questions will determine whether the database
should be starting upon system boot, the ports it will use,
and the passwords that will be used for database accounts.
Press to accept the defaults. 
↓↓↓↓↓↓↓↓
Do you want to relink binaries? (y/n) [n] y
↑↑↑↑↑↑↑↑
↓↓↓↓↓↓↓↓
Specify the HTTP port that will be used for Oracle Application Express [8080]:
↑↑↑↑↑↑↑↑
↓↓↓↓↓↓↓↓
Specify a port that will be used for the database listener [1521]:
↑↑↑↑↑↑↑↑
Specify a password to be used for database accounts.
Note that the samepassword will be used for SYS, SYSTEM
and ADMIN for APEX.  Oracle recommendsthe use of different passwords
for each database account.
↓↓↓↓↓↓↓↓
This can be doneafter initial configuration:
↑↑↑↑↑↑↑↑
Confirm the password:
↓↓↓↓↓↓↓↓
Do you want Oracle Database to be started on boot (y/n) [y]:
↑↑↑↑↑↑↑↑

Relinking Oracle Binaries...
Oracle Relinking Completed Successfully
Logs: /home/oracle/relink.log

Running orainstRoot.sh and root.sh...
Changing permissions of /u01/app/oraInventory to 770.
Changing groupname of /u01/app/oraInventory to dba.
The execution of the script is complete
Running Oracle 11g root.sh script...
The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/oracle/product/11.1.0/db_1
↓↓↓↓↓↓↓↓
Enter the full pathname of the local bin directory: [/usr/local/bin]:
↑↑↑↑↑↑↑↑
Copying dbhome to /usr/local/bin ...
   Copying oraenv to /usr/local/bin ...
   Copying coraenv to /usr/local/bin ...
Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specific root actions.

Starting CSS.
Waiting for CSS available.

ASM instance started
Total System Global Area  283930624 bytes
Fixed Size    2143704 bytes
Variable Size  256621096 bytes
ASM Cache   25165824 bytes
ASM diskgroups mounted

ORACLE instance started.
Total System Global Area  839282688 bytes
Fixed Size    2149040 bytes
Variable Size  482346320 bytes
Database Buffers  348127232 bytes
Redo Buffers    6660096 bytes
File created.
Database altered.
Database altered.
Database closed.
Database dismounted.
ORACLE instance shut down.

ORACLE instance started.
Total System Global Area  839282688 bytes
Fixed Size    2149040 bytes
Variable Size  482346320 bytes
Database Buffers  348127232 bytes
Redo Buffers    6660096 bytes
Database mounted.
Database opened.

User altered.
User altered.
User altered.
System altered.
Session altered.
...changing password for ADMIN
PL/SQL procedure successfully completed.
Commit complete.
PL/SQL procedure successfully completed.
Commit complete.
PL/SQL procedure successfully completed.
Configuration Completed Successfully.

To access the Oracle Application Express go to "http://xxx.xxx:8080/apex"
Press any key to continue...
--------

設定が終わると、

# /etc/init.d/init.cssd start
# /etc/init.d/dbstart start

でデータベース&リスナーが起動し、

# /etc/init.d/dbstart stop
# /etc/init.d/init.cssd stop

で停止します。

でも"CSS"や"ASM"はよくわかっていません...
--------
http://www.suz-lab.com

2011年4月13日水曜日

EC2にSWAP領域を作成

スズキです。

今更ですが、業務用にまとめておきます。

前提として、スワップ領域用のイメージファイルは下記に作成することにします。

# pwd
--------
/mnt/ebs/0

まず、スワップ領域用のイメージファイル(32G)を作成します。

# dd if=/dev/zero of=swap.img bs=1M count=32768
--------
32768+0 records in
32768+0 records out
34359738368 bytes (34 GB) copied, 1057.62 seconds, 32.5 MB/s

次に、そのイメージファイルをSWAP領域にします。

# mkswap swap.img
--------
Setting up swapspace version 1, size = 34359734 kB

そして、SWAPをアクティブにします。

# swapon swap.img
# swapon -s
--------
/mnt/ebs/0/swap.img                     file 33554424 0 -2

上記のように出力されればOKです。

起動時にアクティブにしたい場合は、"/etc/fstab"に追加しておきます。

--------【fstab】--------
...
/mnt/ebs/0/swap.img     swap                    swap    defaults        0 0
--------

簡単です。
--------
http://www.suz-lab.com

Oracleの起動スクリプト(dbora)

スズキです。

起動スクリプト"/etc/init.d/dbora"は下記でうまくいきます。

基本的には、こちらで紹介されているものなのですが、
リスナーの起動/停止の部分を削除し、そのかわり、"dbstart/dbshut"実行時に、
$ORACLE_HOMEを引数で渡すようにしています。

--------【dbora】--------
#!/bin/bash
#
# chkconfig: - 99 10
# description: Oracle Database Server
# processname: ora_

SUBSYS=/var/lock/subsys/dbora
ORACLE_HOME=/opt/oracle/product/11.2
ORACLE_OWNER=oracle

if [ "`id -un`" != "root" ]; then
    MSG="ERROR Executing user isn't super-user."
    echo "[ORA-CONTROL] $MSG"
    logger -p user.warn -t "[ORA-CONTROL]" "$MSG"
    exit 1
fi

case "$1" in
start)
    if [ -f "$SUBSYS" ]; then
      echo $0 already started.
      exit 1
    fi
      echo -n $"Starting Oracle database: "
      su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
      touch $SUBSYS
    ;;
stop)
    if [ ! -f "$SUBSYS" ]; then
      echo $0 already stopped.
      exit 1
    fi
      echo -n $"Stopping Oracle database: "
      su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
      rm -f $SUBSYS
    ;;
restart)
    $0 stop
    $0 start
    ;;
status)
    if [ -f "$SUBSYS" ]; then
      echo $0 started.
    else
      echo $0 stopped.
    fi
    ;;
 *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac

exit 0
--------
※ 下記は、"/etc/sysconfig/dbora"に記述した方がいいかもしれません
ORACLE_HOME=/opt/oracle/product/11.2

ORACLE_OWNER=oracle

そして、起動したいOracleインスタンスは
"/etc/oratab"に次のように記述しておきます。

--------【oratab】--------
suzlab:/opt/oracle/product/11.2:Y
--------
※ 最後を"Y"にします。

Oracleインストール済みのAMIって公開してもいいのかなー?
--------
http://www.suz-lab.com

".bash_profile"にOracleの環境変数(最低限)

スズキです。

こんな感じになると思います。

--------【.bash_profile】--------
ORACLE_HOME=/opt/oracle/product/11.2
ORACLE_SID=suzlab
PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
export ORACLE_HOME ORACLE_SID PATH
--------

多分、実際にはNLS_LANGも適宜指定しておかないと不便だと思います...

initスクリプト用意したら、Oracle環境構築編は終わり...
(すぐにチューニング編があるけど...)
--------
http://www.suz-lab.com

".bash_profile"と".bashrc"の違い

スズキです。

必要に応じて、いつもググってるので、自分のブログに一旦まとめときます。

まず、".bash_profile"はログイン時に読み込まれます。
(Ex. $ su - suzuki)

そして、".bash_profile"のソースを見ると、下記のように".bash_profile"を
読み込んでいるのでログインすると、".bash_profile"と同時に".bashrc"も
読み込まれることになります。

--------【.bash_profile】--------
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
--------

また、".bashrc"のみ読み込まれるパターンもあります。
それは、例えば"bash"などを実行したときです。
(Ex. $ bash)

実際に実験してみます。

まず、"suzuki"ユーザーの".bash_profile"と".bashrc"に

下記のように記述しておきます。

--------【.bash_profile】--------
...
export HOGE1=hoge1
--------【.bashrc】--------
...
export HOGE2=hoge2
--------

そして、suzukiユーザーにスイッチすると、
以下のように".bash_profile"と".bashrc"が読み込まれていることを確認できます。

# su - suzuki
$ echo $HOGE1
hoge1
$ echo $HOGE2
hoge2

次に一旦、下記のように値を変更して、

$ export HOGE1=hoge3
$ export HOGE2=hoge3

"bash"コマンドを実行すると、下記のような結果になりました。

$ bash
$ echo $HOGE1
hoge3
$ echo $HOGE2
hoge2

つまり、".bashrc"のみ読み込まれていることになります。

ということで、Oracleの環境変数を設定しよう...
--------
http://www.suz-lab.com

2011年4月12日火曜日

Oracleでレスポンスファイルを利用したCUIでのリスナー作成

スズキです。

こちらでDBの作成までできたので、次はリスナーの作成です。

リスナーの作成はnetcaコマンドで行うのですが、
これに対するレスポンスファイルは、
"/opt/oracle/src/database/response/netca.rsp"
となります。

と言っても、今回はパラメータの調整なしに、下記のコマンドを実行します。

# su - oracle
$ /opt/oracle/product/11.2/bin/netca /silent \
> /responsefile /opt/oracle/src/database/response/netca.rsp
--------
Parsing command line arguments:
    Parameter "silent" = true
    Parameter "responsefile" = /opt/oracle/src/database/response/netca.rsp
Done parsing command line arguments.
Oracle Net Services Configuration:
Profile configuration complete.
Oracle Net Listener Startup:
    Running Listener Control:
      /opt/oracle/product/11.2/bin/lsnrctl start LISTENER
    Listener Control complete.
    Listener started successfully.
Listener configuration complete.
Oracle Net Services configuration successful. The exit code is 0
--------

プロセス(ps)を確認すると、下記のようなリスナーが確認でき、

oracle ... /opt/oracle/product/11.2/bin/tnslsnr LISTENER -inherit

また、TCPのリッスンポート(netstat)も下記のように
リスナーの確認が出来ています。

tcp 0 0 :::1521 :::* LISTEN 4429/tnslsnr

リスナーの動作確認は下記のようにtnspingコマンドでできます。

# su - oracle
$ export ORACLE_HOME=/opt/oracle/product/11.2
$ /opt/oracle/product/11.2/bin/tnsping localhost
--------
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 12-APR-2011 19:22:43
Copyright (c) 1997, 2009, Oracle.  All rights reserved.
Used parameter files:
/opt/oracle/product/11.2/network/admin/sqlnet.ora
Used EZCONNECT adapter to resolve the alias
Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))
OK (0 msec)
--------

下記のように
/opt/oracle/product/11.2/network/admin/tnsnames.ora
を設定しておけば、

--------【tnsnames.ora】--------
SUZLAB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = suzlab.suzlab)
      (INSTANCE_NAME = suzlab)
    )
  )
--------

# su - oracle
$ export ORACLE_HOME=/opt/oracle/product/11.2
$ /opt/oracle/product/11.2/bin/sqlplus sys/xxxxxxxx@SUZLAB \
> as sysdba
--------
SQL*Plus: Release 11.2.0.1.0 Production on Tue Apr 12 21:24:54 2011
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
SQL> 
--------

といった感じでSQL*Plusでも接続確認できます。

ちなみに"netca"で作成した
/opt/oracle/product/11.2/network/admin/tnsnames.ora
は、以下となります。

--------【listener.ora】--------
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /opt/oracle
--------

Oracleマスター、11gで取り直そう...
--------
http://www.suz-lab.com

Oracleでレスポンスファイルを利用したCUIでのDB作成

スズキです。

こちらでOracleがインストールできたので次はDBの作成です。

DBの作成はdbcaコマンドで行うのですが、これに対するレスポンスファイルは、
"/opt/oracle/src/database/response/dbca.rsp"となります。

今回は下記のようにしました。(他のパラメータはそのままです)

--------【dbca.rsp】--------
GDBNAME = "suzlab.suzlab"
SID = "suzlab"
SYSPASSWORD = "xxxxxxxx"
SYSTEMPASSWORD = "yyyyyyyy"
CHARACTERSET = "AL32UTF8"
NATIONALCHARACTERSET= "AL16UTF16"
--------

そして下記コマンドで作成します。

# su - oracle
$ /opt/oracle/product/11.2/bin/dbca -silent \
> -responseFile /opt/oracle/src/database/response/dbca.rsp

無事作成が終わると、下記のようなプロセスが起動していると思います。

oracle ... ora_pmon_suzlab
oracle ... ora_vktm_suzlab
oracle ... ora_gen0_suzlab
oracle ... ora_diag_suzlab
oracle ... ora_dbrm_suzlab
oracle ... ora_psp0_suzlab
oracle ... ora_dia0_suzlab
oracle ... ora_mman_suzlab
oracle ... ora_dbw0_suzlab
oracle ... ora_lgwr_suzlab
oracle ... ora_ckpt_suzlab
oracle ... ora_smon_suzlab
oracle ... ora_reco_suzlab
oracle ... ora_mmon_suzlab
oracle ... ora_mmnl_suzlab
oracle ... ora_d000_suzlab
oracle ... ora_s000_suzlab
oracle ... ora_qmnc_suzlab
oracle ... ora_cjq0_suzlab
oracle ... ora_q000_suzlab
oracle ... ora_q001_suzlab
oracle ... ora_smco_suzlab
oracle ... ora_w000_suzlab

最後に下記コマンドで接続確認しておきます。

# su - oracle
# export ORACLE_HOME=/opt/oracle/product/11.2
# export ORACLE_SID=suzlab
# /opt/oracle/product/11.2/bin/sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Tue Apr 12 18:26:45 2011
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
SQL> connect / as sysdba
Connected.

次はネットワーク関係か...
--------
http://www.suz-lab.com

2011年4月11日月曜日

PHPでCloudFrontのInvalidation(CDNのキャッシュクリア)

スズキです。

まず下記プログラムで、キャッシュクリア(Invalidation)したい
CDN(Distribution)のIDを探します。

--------【PHP】--------
require_once("./sdk.class.php");
$cf = new AmazonCloudFront();
$response = $cf->list_distributions();
var_dump($response);
--------

次に下記プログラムで、その"Distribution ID"(XXXXXXXXXXXXXX)に対して、
指定したパス("/index1.txt", "/index2.txt")の
キャッシュクリア(Invalidation)を行います。

--------【PHP】--------
require_once("./sdk.class.php");
$cf = new AmazonCloudFront();
$response = $cf->create_invalidation("XXXXXXXXXXXXXX", time(), array(
    "/index1.txt",
    "/index2.txt"
));
var_dump($response);
--------

最後に下記のプログラムで、"Distribution ID"(XXXXXXXXXXXXXX)と
上記の実行結果の"Invalidation ID"(YYYYYYYYYYYYYY)を指定して、
キャッシュクリア(Invalidation)の状況を確認します。

--------【PHP】--------
require_once("./sdk.class.php");
$cf = new AmazonCloudFront();
$response = $cf->get_invalidation("XXXXXXXXXXXXXX", "YYYYYYYYYYYYYY");
var_dump($response);
--------

そして、これらのプログラムを実行するには、
下記アクションを許可するポリシーを与える必要があります。
(IAMユーザーの場合)

cloudfront:ListDistributions
cloudfront:CreateInvalidation
cloudfront:GetInvalidation

ポリシーの付与は、例えば以下のようなコマンド(IAM Command Line Toolkit)
で実現できます。

# ./iam-groupaddpolicy --aws-credential-file credentials.txt \
> -a cloudfront:ListDistributions \
> -e Allow \
> -g suz-lab \
> -p policy1 \
> -r "*"

# ./iam-groupaddpolicy --aws-credential-file credentials.txt \
> -a cloudfront:CreateInvalidation \
> -e Allow \
> -g suz-lab \
> -p policy2 \
> -r "*"

# ./iam-groupaddpolicy --aws-credential-file credentials.txt \
> -a cloudfront:GetInvalidation \
> -e Allow \
> -g suz-lab \
> -p policy3 \
> -r "*"

一つのAWSアカウントに、複数の会社が関わるときは、IAMが必須ですね...
--------
http://www.suz-lab.com

EC2上でのOracle(Standard Edition)のライセンス(再び)

スズキです。

以前、「EC2上でのOracle(Standard Edition)のライセンス
っていうので簡単にまとめたのですが、もっと具体的にまとめておきます。

Oracleが出しているPDFは下記のようなことが書かれています。

> 製品名称にStandard Edition OneもしくはStandard Editionが付くプログラムが許諾される場合、
> EC2コンピュータのサイズに基づく価格設定がなされます。
>
> EC2コンピュータが4バーチャル・コア以下の場合は、1ソケットとしてカウントされます。
>
> EC2コンピュータが4バーチャル・コアを超える場合は、
> EC2コンピュータのバーチャル・コア数を4で割り、小数点以下を切上げてカウントします。
> (例: 5バーチャル・コアは、5÷4=1.25、小数点以下0.25を切上げて2ソケットとしてカウントします。)

> クラウド・コンピューティング環境では、
> Oracle Database Standard Editionを使用できるEC2コンピュータは、
> 保有するバーチャル・コア数が16以下であることが条件となります。

> クラウド・コンピューティング環境では、
> Oracle Database Standard Edition Oneを使用できるEC2コンピュータは、
> 保有するバーチャル・コア数が8以下であることが条件となります。

> 計算例. Amazon EC2環境でOracle Database Standard Edition (Processorライセンス)を許諾:
>
> 1台のEC2コンピュータ(バーチャル・コア数1以上4以下を保有)の環境では、
> 1ソケットとしてカウントされるため、1Processorライセンスが必要となります。   
>
> 1台のEC2 コンピュータ(バーチャル・コア数5以上8以下を保有)の環境では、
> 2ソケットとしてカウントされるため、2Processorライセンスが必要となります。
>
> 1台のEC2 コンピュータ(4バーチャル・コア保有)、
> および4台のEC2コンピュータ(各 1 バーチャル・コア保有)の環境では、
> それぞれ4バーチャル・コアは 1 ソケット、1バーチャル・コアは1ソケットとしてカウントされます。
> 5台のコンピュータ合計では、5Processorのライセンスが必要となります。

ということで、インスタンスタイプ別の必要ライセンスは下記となります。

▼スモール 1インスタンス
1バーチャルコア → 1Processorライセンス

▼ラージ 1インスタンス
2バーチャルコア → 1Processorライセンス

▼エクストララージ 1インスタンス
4バーチャルコア → 1Processorライセンス

▼ハイメモリ エクストララージ 1インスタンス
2バーチャルコア → 1Processorライセンス

▼ハイメモリ ダブル エクストララージ 1インスタンス
4バーチャルコア → 1Processorライセンス

▼ハイメモリ クアドラプル エクストララージ 1インスタンス
8バーチャルコア → 2Processorライセンス

▼ハイCPU ミディアム インスタンス 1インスタンス
2バーチャルコア → 1Processorライセンス

▼ハイCPU エクストララージ 1インスタンス
8バーチャルコア → 2Processorライセンス

※ 上記、すべてバーチャルコア数が8以下なので

間違ってたら、どなたか指摘していただけると嬉しいです...
--------
http://www.suz-lab.com

東京リージョンのEC2にOracleをインストール

スズキです。

AMIはもちろん、@nkjmさんの下記です。

EC2のTokyo RegionでOracle Linux AMIを公開しました
AMI ID: ami-6ac2686b
Name: Oracle Linux 5.6 64bit customized by nkjm
Region: AP North East (Tokyo)

そしてOracleのインストールは、こちらの記事を非常に参考にさせてもらいました。

レスポンスファイルを利用したCUIでのインストールです。

(1) "/etc/oraInst.loc"の作成

--------【oraInst.loc】--------
inventory_loc=/opt/oracle/oraInventory
inst_group=oinstall
--------

# chown oracle.oinstall /etc/oraInst.loc
# chmod 644 /etc/oraInst.loc

(2) ORACLE_BASEディレクトリの作成

# mkdir /opt/oracle
# chown oracle:oinstall /opt/oracle
# chmod 755 /opt/oracle

(3) インストールファイルのダウンロードと展開

# su - oracle
$ mkdir /opt/oracle/src
$ cd /opt/oracle/src

OTNなどから下記のようなインストールファイルをダウンロード
linux.x64_11gR2_database_1of2.zip
linux.x64_11gR2_database_2of2.zip

# unzip linux.x64_11gR2_database_1of2.zip
# unzip linux.x64_11gR2_database_2of2.zip

"database"というディレクトリに展開されます。

(4) レスポンスファイルの編集

"/opt/oracle/src/database/response/db_install.rsp"を編集します。
今回は下記のようにしました。(他のパラメータはそのままです)

--------【db_install.rsp】--------
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=localhost.localdomain
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/opt/oracle/oraInventory
SELECTED_LANGUAGES=ja,en
ORACLE_HOME=/opt/oracle/product/11.2
ORACLE_BASE=/opt/oracle
oracle.install.db.InstallEdition=SE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=dba
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
--------

(5) インストール

$ export ORACLE_BASE=/opt/oracle
$ export ORACLE_HOME=/opt/oracle/product/11.2

$ cd /opt/oracle/src/database
$ ./runInstaller -silent -responseFile /opt/oracle/src/database/response/db_install.rsp

(6) ログの確認と"root.sh"の実行

ログは下記のように出力されます。

/opt/oracle/oraInventory/logs/installActions2011-04-11_08-23-33AM.log
/opt/oracle/oraInventory/logs/oraInstall2011-04-11_08-23-33AM.err
/opt/oracle/oraInventory/logs/oraInstall2011-04-11_08-23-33AM.out

ログに下記が出力されたら、

--------【oraInstall2011-04-11_08-23-33AM.out】--------
The following configuration scripts need to be executed as the "root" user.
 #!/bin/sh
 #Root scripts to run

/opt/oracle/product/11.2/root.sh
To execute the configuration scripts:
         1. Open a terminal window
         2. Log in as "root"
         3. Run the scripts
         4. Return to this window and hit "Enter" key to continue
--------

以下のようにroot権限で"root.sh"を実行します。

# /opt/oracle/product/11.2/root.sh

これでOracleデータベースのインストールが完了しました。
次はデータベースの作成です。

Oracleインストール済みのAMIが欲しい...
--------
http://www.suz-lab.com

2011年4月8日金曜日

IAMユーザーにポリシーを設定して確認

スズキです。

ポリシーの確認は、APIレベルで行う必要がある場合があるので、
その場合は、言語のSDK(AWS SDK for PHP)で確認する必要があります。

前提として、"suzuki"っていうユーザーが"suz-lab"グループに属しているとします。

まずは、アクション"ec2:DescribeInstances"を許可するポリシーを適用します。

(Macで実行)
$ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
$ export AWS_IAM_HOME=/opt/aws/iam
$ cd /opt/aws/iam/bin
$ ./iam-groupaddpolicy --aws-credential-file /credentials.txt \
> -a ec2:DescribeInstances \
> -e Allow \
> -g suz-lab \
> -p policy01 \
> -r "*"

そして、下記のようなコードで確認します。
("ACCESS KEY/SECRET KEY"はこちらで発行するような"suzuki"のものを利用)


--------【PHP】--------
require_once("./sdk.class.php");
$ec2 = new AmazonEC2();
$ec2->set_region(AmazonEC2::REGION_US_E1);
$response = $ec2->describe_instances(array(
    'InstanceId' => 'i-XXXXXXXX'
));
var_dump($response);
--------

これで"status"が200で返ってくれば成功です。

必要なポリシーを調査するのがたいへん...
--------
http://www.suz-lab.com

2011年4月1日金曜日

Googleドキュメントで"Route 53"を管理

スズキです。

"cloudpack"ではDNSサービスを可能なかぎり"Route 53"を使うようにしています。
そして、その管理は下記ツールでGoogleドキュメントで行っています。


"cloudpack"では情報共有や資料作成をGoogleドキュメントで行っている場合が多いので、
その一環でDNSレコードが管理できることは、業務的に非常に嬉しいです。

ということで導入方法です。

まず、適当にスプレッドシートを作成して、"ツール → スクリプト → 挿入"を選択します。


そして、"Amazon Route 53"を探してインストールします。


インストールが終了するとHelpページが表示されます。


すると、メニューに"Route53"が追加されているので、
まずは"Settings"を選択します。


そして、承認をOKします。


もう一度"Settings"を選ぶと、今度は、いつものキーを入力するようになります。


初期設定が終わったら、"suz-lab.com"を管理するために
"Create new zone"を選択します。


管理したいドメイン(suz-lab.com)を入力します。


すると、下記のようにゾーン情報がスプレッドシートに表示され、
レコード管理できるようになります。


CloudFrontのInvalidateインターフェースも欲しいなー...
--------
http://www.suz-lab.com

RDSの文字化け&タイムゾーン系パラメータの設定

スズキです。

下記のように、今まで五月雨式で書いてきたのですが、
今回はそれをまとめて形です。

"AWS SDK for PHP"の利用

RDSの"character_set_*"を"utf8"に

RDSに"skip-character-set-client-handshake"を設定

RDSでタイムゾーン(UTC)を変更

設定スクリプトはこんな感じです。

--------【PHP】--------

require_once("./sdk.class.php");

$rds = new AmazonRDS();
$rds->set_region(AmazonRDS::REGION_APAC_NE1);

$response = $rds->modify_db_parameter_group('suz-lab', array(
    array(
        "ParameterName"  => "skip-character-set-client-handshake",
        "ParameterValue" => "true",
        "ApplyMethod"    => "pending-reboot"
    ),
    array(
        "ParameterName"  => "init_connect",
        "ParameterValue" => "SET time_zone = 'Asia/Tokyo';",
        "ApplyMethod"    => "immediate"
    ),
    array(
        "ParameterName"  => "character_set_client",
        "ParameterValue" => "utf8",
        "ApplyMethod"    => "immediate"
    ),
    array(
        "ParameterName"  => "character_set_connection",
        "ParameterValue" => "utf8",
        "ApplyMethod"    => "immediate"
    ),
    array(
        "ParameterName"  => "character_set_database",
        "ParameterValue" => "utf8",
        "ApplyMethod"    => "immediate"
    ),
    array(
        "ParameterName"  => "character_set_filesystem",
        "ParameterValue" => "utf8",
        "ApplyMethod"    => "immediate"
    ),
    array(
        "ParameterName"  => "character_set_results",
        "ParameterValue" => "utf8",
        "ApplyMethod"    => "immediate"
    ),
    array(
        "ParameterName"  => "character_set_server",
        "ParameterValue" => "utf8",
        "ApplyMethod"    => "immediate"
    )
));

var_dump($response);

--------

RDS立ち上げたら、取り合えず、これやっとく感じかな?
--------
http://www.suz-lab.com