2015年6月16日火曜日

Amazon Relational Database Service(Amazon RDS)へのデータ移行(3)番外:PostgreSQL編+Oracle情報

こんにちは。大須賀です。



RDS移行顛末記(笑)、最終回は、PostgreSQLと、オマケにOracle情報です。

■PostgreSQL

Windowsで稼働中のPostgreSQLからRDSのPostgreSQLへデータを渡すのには非常に苦労します。
まず、PosygreSQLは共通仕様として、DBがシフトJISをサポートしていません。




MySQLと同様に、PostgreSQLもINSERT文の入ったエクスポートを生成するのですが、Windowsでエクスポートすると、エクスポートファイルはシフトJISで生成されます。
しかし、スクリプト内の書かれたコードはUTF8です?

この時点で???なのですが、EC2上のWindowsクライアントからRDSのLinuxサーバーのPostgreSQLへデータを入れようとすると、エラーになってしまいます。
実際、ファイルをUTF8に変換しても、スクリプト上のコード指定をSJISに変更しても、どの組み合わせでも動作しません。




MySQLの時も同様な悩みがあったのですが、我々のテストしたい製品はETLなので、製品を使えばもちろん移行は可能です。
しかし、そのETLを検証するテストDBなので、バイナリ的にエラーになるデータとか、文字コードとして微妙なデータも含んでいますから(それが原因かもしれませんが)そのまま移送できなければテストにならないのです。

結局あきらめて、Windows上にPostgreSQLサーバーを立てました。

所詮PostgreSQLはLinux/Unixの世界のDBということですね。

ちょっと悔しいですが、仕方ありません。時間ができたらもう少し突っ込んで検証したいと思います。


■RDS Oracle

RDS上でのOracleは、何の問題もなく移行できたと前のブログに書きました。
しかし、実際には大ハマリしてしましました。

ODBCはAPI上からINSERTやUPDATEのレコードデータを配列で渡すことができます。我々の製品はこのような配列渡しをしています。
JDBCだと常識のようですが、ODBCでこれをやっているユーザーは少ないのでしょうか。

SQLExecuteのたびに配列サイズが増えてゆくようなコールをすると、ODBC内でメモリ破壊があるようで、INSERTやUPDATEのデータが途中で切れたり、全く反映されなかったりするのです。

この現象は12.1.0.1以前で発生し、12.1.0.2では修正されており、11g以前では発生していなかったのですが、Windows Server 2012で11gを動作させると必ず発生するという事がわかりました。

ところが、よく調べてみると、OracleはWindows Server 2012上での11gの動作をサポートしていません。

要は、私がWindows Server 2012にOracle 11g Clientをインストールしたのが悪かったのです。

でも、2012 Server上で11gをインストールしても「それはダメ」と言ってくれなかったのに・・・

・・・教訓、Windows Server 2012でOracle 11gを動作させると酷い目にあうと言うことです。




追加情報:Oracle 12.1.0.2で修正された障害は、11gでは直っていないようです。Windows Server 2008では出にくいのですが、Windows Server 2012ではOS側の動作変更で出やすくなっているようです。
これからプログラムを作って障害報告しますが、承認されて直るのはかなり先になるでしょう。



0 件のコメント:

コメントを投稿