fc2ブログ

2011-11-17(Thu)

postgreSQLでクエリー結果をcsvファイル出力する方法

copyコマンドはDBデータをCSVファイルに落とすことができるがクエリー結果は難しい。
と思ってたらこんな方法があったのでメモる。


まず、dbへ入る。
$ psql hoge
hogedb=#\encoding UTF-8 (エンコーディング方法を設定)
hogedb=# \a (アライメントをオフする)
Output format is unaligned.
hogedb=# \f , (セパレータをカンマに設定)
Field separator is ",".
hogedb=# \o /Users/hogehoge/result.csv

以上、これ以降はクエリ結果を上記ファイルに保存する。
うれしいのはローカルPCからクラウドサーバーへpsqlを使って5432ポートでアクセスすると
アウトプットファイルがローカルPCへ直接吐き出されることだ。
普段はめんどくさくSCPでファイル転送するのでこれは便利。

参考:
PostgreSQL徹底入門 第3版
新標準PostgreSQL (オープンソースRDBMSシリーズ)

2011-11-10(Thu)

Amazon EC2 + CentOS6でrootからアクセスできなくする

すること。
CentOSでインスタンスを生成するとデフォルトでrootからアクセスするようになっている。
セキュリティーが脆弱なのでrootからのアクセスを禁止したとえばpostgresユーザーを作成
してpostgresユーザーからのみ公開鍵を使ってsshログインできるようにしたい。

SSH
(1).postgresユーザーを作る。

$ su (ルートに入る)
$ adduser postgres
$ passwd postgres (postgresユーザーのパスワードを生成)
$ passwd (ついでにrootでパスワード生成->デフォルトではパスワードない)


(2).SSHの設定
キーを作る。

$ su postgres
$ ssh-keygen -b 1024 -t rsa


~/.sshに以下の2ファイルが生成される。
id_rsa (private key:秘密鍵)
id_rsa.pub (public key:公開鍵)
ローカルPCに公開鍵をおく。


ローカルPCで
$ cd ~/.ssh
$ vim authorized_keys
でid_rsa.pubの内容をコピペする、もしくは
ローカルPCにid_rsa.pubをコピーして以下を実行する。
$ cat id_rsa.pub >> authorized_keys


SSHの変更

$ vim /etc/ssh/sshd_config


変更点

# PermitRootLogin without-password (デフォルトではrootユーザーに対してパスワードなしでのログインが可能)
PermitRootLogin no (rootのログインを禁止する)
# PermitEmptyPasswords yes (デフォルトではパスワードなしのユーザーログインを許可する)
PermitEmptyPasswords no (パスワードなしのユーザーログインを禁止する)
# PasswordAuthentication yes (デフォルトではパスワード認証によるログインを許可している)
PasswordAuthentication no (パスワード認証ではなく鍵認証によるログイン)
最後に再起動する。
$ /etc/init.d/sshd restart


rootでログインできないことを確認する。

$ ssh -i xxxxxxx.pem root@ec2-xxx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

できなくなりました。

$ ssh postgres@ec2-xxx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
[postgres@ip-xx-xxx-x-xxx ~]$

ログインできました。

2011-11-08(Tue)

postgreSQL9.1で非同期レプリケーションを構築する(4)

(1).pgpool管理サーバーを作る。

pgpoolサーバーにてDBの初期化をする。
$ initdb --no-locale -E UTF8 -D data
pgpool roleを作成する。
$psql
# postgres=# create role pgpool superuser createdb login password 'pgpool';
# \q


(2). ~/.bashrcの設定
以下を追加する。

$ vim ~/.bashrc
PGPOOL_HOME=/usr/local/pgpool
PGPOOLENGINE=$PGPOOL_HOME/bin
PGPOOLDAEMON=$PGPOOLENGINE/pgpool
PGPOOLCONF=$PGPOOL_HOME/etc/pgpool.conf
PGPOOLLOG=$PGPOOL_HOME/log/pgpool.log
export PATH="$PATH":$PGPOOLENGIN
$ source ~/.bashrc


(3). system_db.sqlを入れる。

$ cd pgpool-II-3.0.5/sql
$ psql -f system_db.sql pgpool
$ psql -f pgpool-II-3.0.5/sql/pgpool-recovery/pgpool-recovery.sql
$ psql -f pgpool-II-3.0.5/sql/pgpool-regclass/pgpool-regclass.sql
$ psql -f pgpool-walrecrunning/pgpool-walrecrunning.sql


(4). pgpool起動

$ pgpool -n -f /usr/local/pgpool/etc/pgpool.conf > /mnt/pgpool/log/pgpool.log 2>&1 &


(5). Status確認

$ pcp_node_info 100 192.168.11.100 9898 postgres postgres 0
192.168.11.200 5432 2 0.166667
$ pcp_node_info 100 192.168.11.100 9898 postgres postgres 1
192.168.11.201 5432 2 0.166667


5432のあとが、[2]ならばOK
それ以外はエラー。

2011-11-07(Mon)

postgreSQL9.1で非同期レプリケーションを構築する(3)

pgpoolを構築してみる。

(1). pgpoolのダウンロード、インストール

$ wget http://pgfoundry.org/frs/download.php/3164/pgpool-II-3.0.5.tar.gz
$ tar xzvf pgpool-II-3.0.5.tar.gz
$ cd pgpool-II-3.0.5
$ ./configure --prefix=/usr/local/pgpool --with-pgsql=/usr/local/pgsql
$ make
$ sudo make install


(2). ~/.bashrcの設定

$ vim ~/.bashrc
# 以下を追加する
PGPOOL_HOME=/usr/local/pgpool
PGPOOLENGINE=$PGPOOL_HOME/bin
PGPOOLDAEMON=$PGPOOLENGINE/pgpool
PGPOOLCONF=$PGPOOL_HOME/etc/pgpool.conf
PGPOOLLOG=$PGPOOL_HOME/log/pgpool.log
export PATH="$PATH":$PGPOOLENGIN
$ source ~/.bashrc


(3). 必要ライブラリーのインストール

-- pgpool-recovery
$ cd pgpool-II-3.0.5/sql/pgpool-recovery
$ make
$ sudo make install

-- pgpool-regclass

$ cd pgpool-II-3.0.5/sql/pgpool-walrecrunning
$ make
するとこんなエラーが。。。。
$ pgpool-regclass.c:55:1: error: static declaration of ‘get_namespace_oid’ follows non-static declaration
$ /usr/local/pgsql/include/server/catalog/namespace.h:99:12: note: previous declaration of ‘get_namespace_oid’ was here
$ make: *** [pgpool-regclass.o] Error 1


これはバグらしい。。
ここに対処方法が書いてあるのでそのまま適用する。()

diffをのせておく。

53a54,55
> /*
> #if !defined(PG_VERSION_NUM) || (PG_VERSION_NUM < 90100)
54a57
> #endif
55a59
> */
175a180
> #if !defined(PG_VERSION_NUM) || (PG_VERSION_NUM < 90100)
197a203
> #endif

で再度makeする。

$ make
$ sudo make install

-- pgpool-walrecrunning

$ cd ../pgpool-walrecrunning/
$ make
$ sudo make install


(4). ライブラリーをMaster / Slaveサーバーへコピーする。

$ scp /usr/local/pgsql/lib/pgpool-recovery.so 192.168.11.200 :/usr/local/pgsql/lib
$ scp /usr/local/pgsql/lib/pgpool-regclass.so 192.168.11.200 :/usr/local/pgsql/lib
$ scp /usr/local/pgsql/lib/pgpool-walrecrunning.so 192.168.11.200 :/usr/local/pgsql/lib

上記3ライブラリーを各Slaveにもコピーすること。

(5). 各SQLファイルを各サーバーへ入れる。

psql -h 192.168.11.200 -f /mnt/download/pgpool-II-3.0.5/sql/pgpool-recovery/pgpool-recovery.sql template1
psql -h 192.168.11.200 -f /mnt/download/pgpool-II-3.0.5/sql/pgpool-recovery/pgpool-recovery.sql postgres
psql -h 192.168.11.200 -f /mnt/download/pgpool-II-3.0.5/sql/pgpool-regclass/pgpool-regclass.sql template1
psql -h 192.168.11.200 -f /mnt/download/pgpool-II-3.0.5/sql/pgpool-regclass/pgpool-regclass.sql postgres
psql -h 192.168.11.200 -f /mnt/download/pgpool-II-3.0.5/sql/pgpool-walrecrunning/pgpool-walrecrunning.sql template1
psql -h 192.168.11.200 -f /mnt/download/pgpool-II-3.0.5/sql/pgpool-walrecrunning/pgpool-walrecrunning.sql postgres

上記3ライブラリーを各Slaveにも適用すること。

疲れた。。つづくで。。。

2011-11-06(Sun)

postgreSQL9.1で非同期レプリケーションを構築する(2)

$PGDATA=/mnt/pgsqlとします。
Master Server / Slave Serverの設定
(1).各サーバーでDBを初期化する。
コマンドは以下の通り。

$ cd /mnt
$ initdb --no-locale -E UTF8 -D data


(2).適当にテーブルを作成する
テーブルはMasterサーバーだけでよい。
SlaveはMasterからrsyncでコピーする。

$ createdb testdb
$ psql -c "CREATE TABLE hoge_table (
aa integer,
bb integer,
);"


(3).postgresql.confの設定
このファイルを$PGDATAにおきます。
これは、Master / Slave両方設定します。

archive_mode = on
archive_command = 'cp %p /mnt/pgsql/data/archive_log/%f'
wal_level = hot_standby
wal_buffers = 1MB
wal_writer_delay = 200ms
max_wal_senders = 2

hot_standby = on (slaveのみ)


(4).pg_hba.confの設定
このファイルを$PGDATAにおきます。
これは、Master / Slave両方設定します。
replicationとしてSlave2台を指定します。

host all all 192.168.0.0/16 trust
host replication all 192.168.11.201/32 trust
host replication all 192.168.11.202/32 trust


(5).slaveにrecovery.confを設定する
Slaveは起動時にMasterからデータリカバリーするためrecovery.confを使います。
このファイルを$PGDATAにおきます。

restore_command = 'cp /mnt/pgsql/data/archive_log/%f %p'
archive_cleanup_command = 'pg_archivecleanup /mnt/pgsql/data/archive_log %r'
standby_mode = 'on'
primary_conninfo = 'host=192.168.11.200 user=postgres port=5432'
trigger_file = '/tmp/trigger_file0'


(6).データコーピー
設定が終わったので、MaterサーバーのデータをSlaveへコピーします。
まず、Masterサーバーだけ起動します。

$ cd /mnt
$ pg_ctl -D data start


データ転送準備
転送用スクリプト
trans.shを作ります。以下のままコピー。

#!/bin/sh
psql -c "SELECT pg_start_backup('replication backup', true)" postgres
rsync -C -a --delete -e ssh --exclude postgresql.conf --exclude pg_hba.conf --exclude postmaster.pid \
--exclude postmaster.opts --exclude pg_log \
--exclude recovery.conf --exclude recovery.done \
/mnt/pgsql/data $1:/mnt/pgsql
psql -c "SELECT pg_stop_backup()" postgres

長ったらしいrsyncオプションに見えるがpostgresql.confとか、 pg_hba.confとか上書きしたくないものを指定しているたけである。
では転送を開始する。

$ ./trans.sh 192.168.11.201
$ ./trans.sh 192.168.11.202

実はpostgreSQL9.1からpg_basebackupというコマンドが追加されこの作業が楽になったらしいがまだ試してない。。。

これで転送完了。
では、Slaveを2つとも起動してみよう。
これでMaster/Slaveによるレプリケーションが構築できた。
次はpgpoolによる非同期レプリケーションだ。 つづく。


プロフィール

kumagonjp2

Author:kumagonjp2
Python,Django,R,Mongo,MySQL,Struts,Spring,データマイニングなどサーバー関係のメモを残していきます。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
雪が3Dで降るブログパーツ ver2

マウスで見る方向変えられます

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR