RDS(PostgreSQL)の利用前に確認すること

RDS(PostgreSQL) で利用できる copy コマンドは Not "copy" である "\copy" になる。
これは RDS では管理者権限がないからである。
この管理者権限がないという状況は、オンプレミスで出来ていたことができなくなるので、事前に確認することをお勧めする。
これは例えば、上記の copy コマンドや共有カタログに対する操作ができない(手動で VACUUM などが実行できないなど)などがある。
　
RDS(PostgreSQL) で注意すること

・\copy コマンドは利用できる
--
通常の copy コマンドは利用できない。
copy * from stdin は利用できるが、大量データの copy には向かないので利用価値は低い。

[Using COPY]
(http://www.postgresql.org/docs/9.2/static/sql-copy.html)

[Using the \copy Command to Import Data to a Table on a PostgreSQL DB Instance](http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html)

--

注意点
大量データをクライアント側から psql-c で copy する場合、正常に終了しないことが稀にある。
これはプロンプトの反応が無くなってしまったり、"SSL error: sslv3 alert handshake failure"　と表示されて接続が切断されることが原因のよう。
ただし上記エラーが出ることは稀で、主にクライアントの画面が固まることが多い。
この場合、"ssl_renegotiation_limit " を使用しないことで問題を回避することができる場合がある。

[ssl_renegotiation_limit]
(http://www.postgresql.org/docs/9.1/static/runtime-config-connection.html)

この機能は名前の通り、どれぐらいで既に SSL で接続されたセッションを再ネゴシエーションするか設定するパラメータである。

・Parameter Group の effective_cache_size の計算
--
ドキュメントには以下の内容が記載してある。

If you set the memory settings too large for max_connections, shared_buffers, or effective_cache_size, you will prevent the PostgreSQL instance from starting up. Note that some parameters use units that you might not be familiar with; for example, shared_buffers sets the number of 8 KB shared memory buffers used by the server. 

わかり難い。

[Working with PostgreSQL Parameters]
(http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html)

実際の計算式は

Memory 15GB の db.r3.large では 

effective_cache_size
{DBInstanceClassMemory/16384}
1-2147483647 Allow Values
(8kB) Sets the planners assumption about the size of the disk cache.

15GB memory
15000000000/16384 = 915527 *8 = 7324216 /  (1024 * 1024) =  約7GB

--


・dblink の使用
--

[PostgreSQL on Amazon RDS]
(http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html)

1.RDS とオンプレミスの DBLINK による利用  →　可能はず(検証はしていない)
RDS から、オンプレミス環境の DB サーバへは、 オンプレミス環境の DB サーバの IP アドレスを指定。
オンプレミス環境から、RDS へは、DNS 名で接続を行なう。（この場合 DNS 名はプライベート IP に解決）


2.EC2 上 PostgreSQL と RDS の DBLINK による利用  →　可能
ただし、RDS から EC2(PostgreSQL)へ dblink を行なう場合は、EC2(PostgreSQL) の認証方式は_MD5_ 。

・EC2 → RDS
local ec2-**-**-**-**.us-west-2.compute.amazonaws.com
remote test22.c9s7xcs7qwj5.us-west-2.rds.amazonaws.com

test=> create extension dblink;
test=> select dblink_connect('conn1','host=test22.c9s7xcs7qwj5.us-west-2.rds.amazonaws.com port=5432 dbname=test user=test password=*****'); 

test=> select * from dblink('conn1','select * from t_test') AS t(a int, b int);

 a | b
---+----
 1 | 20
 2 | 25
(2 rows)

・RDS → EC2
local  test22.c9s7xcs7qwj5.us-west-2.rds.amazonaws.com
remote ec2-**-**-**-**.us-west-2.compute.amazonaws.com

t_test=> create extension dblink;
t_test=> select dblink_connect('conn2','host=ec2-**-**-**-**.us-west-2.compute.amazonaws.com port=5432 dbname=t_test user=postgres password=*******'); 
t_test=> select * from dblink('conn2','select * from t_test') AS t(a int, b int);

 a | b
---+----
 1 | 20
 2 | 25
(2 rows)


*EC2側
pg_hba.conf
host    all             all            0.0.0.0/0 　←適時VPCのsubnetで		md5

3.RDS 同士の DBLINK による利用　→　可能

local test0616.c9s7xcs7qwj5.us-west-2.rds.amazonaws.com  us-west-2a
remote DB test22.c9s7xcs7qwj5.us-west-2.rds.amazonaws.com  us-west-2c

test=> create extension dblink;
test=> select dblink_connect('conn1','host=test23.c9s7xcs7qwj5.us-west-2.rds.amazonaws.com port=5432 dbname=test user=test password=****'); 
test=> select * from dblink('conn1','select * from t_test') AS t(a int, b int);

 a | b
---+----
 1 | 20
 2 | 25
(2 rows)

--

注意点
"dblink_connect_u" は_NG_

test=> select dblink_connect_u('conn1','host=test23.c9s7xcs7qwj5.us-west-2.rds.a
mazonaws.com port=5432 dbname=test user=test password=******');
ERROR:  permission denied for function dblink_connect_u

これは非スーパーユーザでの「ユーザ／パス」省略については、 dblink_connect_u の EXECUTE 権限がないからだと思われる。

実際に確認
test=>  SELECT proname,proacl FROM pg_proc WHERE proname = 'dblink_connect_u';
     proname      |        proacl
------------------+-----------------------
 dblink_connect_u | {rdsadmin=X/rdsadmin}
 dblink_connect_u | {rdsadmin=X/rdsadmin}
 
確かにない

通常の可能なもの。
test=>  SELECT proname,proacl FROM pg_proc WHERE proname = 'dblink_connect';
    proname     | proacl
----------------+--------
 dblink_connect |
 dblink_connect |
(2 rows)

[dblink_connect_u]
(http://www.postgresql.jp/document/8.4/html/contrib-dblink-connect-u.html)


まあ他にもあるが、あとは適時検証で。