お問い合わせ
03-5979-2701
PowerGres
on Windows PowerGres on Linux PowerGres Plus PowerGres HA
製品 TOP

PowerGres Plus V5 から V9.1 への移行

PowerGres Plus V5 のサポートは 2014 年 9 月末に終了します。 PowerGres Plus V5 をまだ使用されている方は PowerGres Plus V9.1 への移行を検討してください。 PowerGres ファミリーのサポート期間については「並売期間とサポート期間について」を参照してください。

サポートを契約されている方は PowerGres Plus V5 から V9.1 に無償でアップグレードできます。 PowerGres Plus V9.1 へのアップグレードの依頼や移行時の技術的な質問はサポート窓口で承っています。

ここでは PowerGres Plus V5 から V9.1 への移行時に発生しやすい問題の回避方法と移行手順について説明します。

PowerGres Plus V5 と V9.1 とのおもな違いは以下のとおりです。

PostgreSQL のバージョン

PowerGres Plus V5 は PostgreSQL 8.2 をベースにしているのに対して、PowerGres Plus V9.1 は PostgreSQL 9.1 をベースにしています。 PostgreSQL 8.2 と 9.1 とではメジャーバージョンが異なります。

異なるメジャーバージョン間の PostgreSQL の移行では、移行元のバージョンからデータをダンプし、移行先のバージョンにデータをリストアする必要があります。 また、互換性のない変更点がアプリケーションに影響がないか動作を検証する必要もあります。

対応 OS
PowerGres Plus V5 PowerGres Plus V9.1
Red Hat Enterprise Linux 5 (x64)
Red Hat Enterprise Linux 4 (x86)
Red Hat Enterprise Linux 6 (x64)
Red Hat Enterprise Linux 5 (x64)
CentOS 6 (x64)
CentOS 5 (x64)

PowerGres Plus V5 と V9.1 の対応 OS は右に示すとおりです。

PowerGres Plus V9.1 では Red Hat Enterprise Linux 4 には対応していないため、Red Hat Enterprise Linux 4 を使用されている場合には OS も移行する必要があります。

GUI 管理ツール

PowerGres Plus V5 の PostgreSQL Plus Administrator はウェブアプリケーションであるのに対して、PowerGres Plus V9.1 の PowerGres Plus Manager はクライアントアプリケーションです。 PowerGres Plus Manager の動作には X Window System が必要です。

移行時に発生しやすい問題と回避方法

PowerGres Plus V5 から V9.1 への移行時に問題になるのは PostgreSQL の互換性のない変更点です。 互換性のない変更点は PostgreSQL のリリースノートに記述されています。 SRA OSS では PostgreSQL のリリースノートをもとに実行例などを交えた技術情報を公開しています。

ここではPowerGres Plus V5 から V9.1 への移行時に発生しやすい問題について説明します。

文字データ型への暗黙的なキャスト削除

PostgreSQL 8.3 で文字データ型への暗黙的なキャストが削除されました。 これにより、PostgreSQL 8.2 以前では明示的にキャストしなくてもエラーにならなかった SQL 文が PostgreSQL 8.3 以降ではエラーになる場合があります。 このエラーを回避するには SQL 文を修正して明示的にキャストするか、暗黙的なキャストを作成する必要があります。

例えば、substr 関数で文字列から一部を取得するとき、PostgreSQL 8.2 以前の場合には substr 関数の第一引数として date 型を渡しても暗黙的に text 型に変換されるためエラーになりません。 それに対して PostgreSQL 8.3 以降の場合には text 型に変換されずに対象の関数が存在しないためエラーになります。

PostgreSQL 8.2 以前の場合
=# SELECT substr(birthdate, 1, 4) AS year FROM customers WHERE id = 1;
 year
------
 2005
(1 row)
PostgreSQL 8.3 以降の場合
=# SELECT substr(birthdate, 1, 4) AS year FROM customers WHERE id = 1;
ERROR:  function substr(date, integer, integer) does not exist
行 1: SELECT substr(birthdate, 1, 4) AS year FROM customers WHERE ...
             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

このエラーを回避するには明示的に対象のデータ型にキャストするように修正します。 上記の場合には substr 関数の第一引数を明示的に text 型にキャストします。 なお、date 型などの日付・時刻データ型から特定のフィールドを取得する場合には、substr 関数より extract 関数や to_char 関数のほうがより適切です。

=# SELECT substr(birthdate::text, 1, 4) AS year FROM customers WHERE id = 1;
 year
------
 2005
(1 行)

また、例えば、Java などのプログラミング言語でプリペアードステートメントを使用するとき、PostgreSQL 8.2 以前の場合には integer 型を setString メソッドで文字データ型として指定しても暗黙的に text 型に変換されるためエラーになりません。 それに対して PostgreSQL 8.3 以降の場合には text 型に変換されずに対象の演算子が存在しないためエラーになります。

import java.sql.*;

public class Test {

    public static void main(String[] args) throws Exception {
        Class.forName("org.postgresql.Driver");
        Connection conn = DriverManager.getConnection("jdbc:postgresql:test");
        PreparedStatement st = conn.prepareStatement("SELECT name FROM customers WHERE id = ?");
        st.setString(1, "1");
        ResultSet rs = st.executeQuery();
        if (rs.next()) {
            System.out.println(rs.getString(1));
        }
        rs.close();
        st.close();
        conn.close();
    }
}
PostgreSQL 8.2 以前の場合
$ java Test
SRA OSS
PostgreSQL 8.3 以降の場合
$ java Test
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying
  ヒント: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  ポジション: 37
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:510)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:386)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271)
        at Test.main(Test.java:10)

このエラーを回避するには、データ型に対応したメソッドを使用するように修正するか、

PreparedStatement st = conn.prepareStatement("SELECT name FROM customers WHERE id = ?");
st.setInt(1, 1);

明示的に対象のデータ型にキャストするように修正します。

PreparedStatement st = conn.prepareStatement("SELECT name FROM customers WHERE id = ?::integer");
st.setString(1, "1");

このエラーを SQL 文を修正せずに回避するには暗黙的なキャストを作成します。 なお、暗黙的なキャストによってインデックスが使用されなくなる場合もあるため、可能であれば SQL 文を修正して明示的にキャストすることを推奨します。

キャストの作成は CREATE CAST 文で行います。 CREARE CAST 文では CREATE CAST の後のカッコ内に変換元と変換先のデータ型を AS ではさんで指定します。 CREATE CAST 文の詳細については PostgreSQL 9.1 文書 の「CREATE CAST」を参照してください。

以下の例では date 型から text 型への暗黙的なキャストを作成しています。 ほかのデータ型についても必要であれば暗黙的なキャストを作成します。

=# CREATE CAST (date AS text) WITH INOUT AS IMPLICIT;
CREATE CAST
=# SELECT substr(birthdate, 1, 4) AS year FROM customers WHERE id = 1;
 year
------
 2005
(1 行)

暗黙的なキャストの作成については Let's Postgres の「キャストを追加してバージョン互換性を保つには」も参照してください。

文字列内の「\ (バックスラッシュ)」の取り扱い変更

PostgreSQL 9.1 で standard_conforming_strings パラメータのデフォルト値が off から on に変更されました。 これにより、PostgreSQL 9.0 以前ではエスケープ文字として取り扱われていた文字列内の「\ (バックスラッシュ)」が PostgreSQL 9.1 以降では通常の文字として取り扱われるようになりました。 なお、「\」が含まれる文字列をエスケープ構文 (E'...') で記述している場合には影響はありません。

例えば、PostgreSQL 9.0 以前の場合には文字列内に「\n」が含まれると警告が出力されつつも改行文字として取り扱われます。 それに対して PostgreSQL 9.1 以降の場合には「\」と「n」という通常の 2 つの文字として取り扱われます。

PostgreSQL 9.0 以前の場合
=# INSERT INTO comments (body) VALUES ('1行目\n2行目\n3行目');
WARNING:  nonstandard use of escape in a string literal
LINE 1: INSERT INTO comments (body) VALUES ('1行目\n2行目\n3行目');
                                            ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT 0 1
=# SELECT body FROM comments WHERE id = 1;
 body
-------
 1行目
 2行目
 3行目
(1 row)
PostgreSQL 9.1 以降の場合
=# INSERT INTO comments (body) VALUES ('1行目\n2行目\n3行目');
INSERT 0 1
=# SELECT body FROM comments WHERE id = 1;
        body
---------------------
 1行目\n2行目\n3行目
(1 行)

\」をエスケープ文字として取り扱うには文字列をエスケープ構文で記述するように修正するか、

=# INSERT INTO comments (body) VALUES (E'1行目\n2行目\n3行目');
INSERT 0 1
=# SELECT body FROM comments WHERE id = 2;
 body
-------
 1行目+
 2行目+
 3行目
(1 行)

設定ファイル postgresql.conf 内の standard_conforming_strings パラメータを off に設定します。 ただ、文字列内の「\」を通常の文字として取り扱うことは SQL 標準に準拠した動作になります。 そのため、可能であればエスケープ文字が必要な文字列のみをエスケープ構文で記述することを推奨します。

#------------------------------------------------------------------------------
# VERSION/PLATFORM COMPATIBILITY
#------------------------------------------------------------------------------

# - Previous PostgreSQL Versions -

#array_nulls = on
#backslash_quote = safe_encoding        # on, off, or safe_encoding
#default_with_oids = off
#escape_string_warning = on
#lo_compat_privileges = off
#quote_all_identifiers = off
#sql_inheritance = on
standard_conforming_strings = off
#synchronize_seqscans = on

# - Other Platforms and Clients -

#transform_null_equals = off

移行手順

PowerGres Plus V5 から V9.1 の移行は、異なるメジャーバージョン間の PostgreSQL の移行と同じく、PowerGres Plus V5 からデータをダンプし、V9.1 にデータをリストアすることで行います。 PowerGres Plus V5 のインストールされたサーバに V9.1 をインストールして移行したり、PowerGres Plus V5 とは異なるサーバに V9.1 をインストールしてネットワークを通じて移行したりすることもできます。

移行手順の詳細については PowerGres Plus (Linux 版) マニュアル の「旧バージョンからの移行」を参照してください。

そのほか、PowerGres Plus V5 から V9.1 への移行にあたって不明なことはサポート窓口で承っています。