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
--
注意点
大量データをクライアント側から 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)
まあ他にもあるが、あとは適時検証で。