このページに記載の情報は、2005 年にリリースした PowerGres Plus V2 を対象としています。PowerGres Plus V2 の販売はすでに終了しています。
PowerGres Plus の最新バージョンに関する情報は、製品紹介ページまたは PowerGres 体験記ページを参照してください。
SRA OSS では、Oracle データベースなど他のデータベースから、PostgreSQL や PowerGres へのマイグレーションサービスを提供しています。
詳細は「データベースマイグレーションサービス」のページをご覧ください。
PowerGres Plus 体験記では、Oracle マイグレーションシリーズをすでにご紹介しました。 Oracle から PowerGres Plus へのデータベースの移行は、ora2pg というツールを利用して簡単に行うことができました。 SQL Server からの移行でも、このようなツールがないか探しましたが、なかなか見つかりませんでした。
しかし、灯台下暗し、PostgreSQL のコミュニティに以下の技術文書が登録されていました。 さらによく見ると、移行のためのスクリプトも添付されていました。
「Conversion of Microsoft SQL/ASP applications to PostgreSQL」
この資料は、以下のURLから参照できます。
https://www.postgresql.org/docs/techdocs.3
https://wiki.postgresql.org/wiki/File:5.pdf
または
https://techdocs.postgresql.org/
そこで、今回から 2 回に渡り、この移行資料を元に、SQL Server からのデータベースの移行と、アプリケーションの移行をご紹介します。 今回はデータベースの移行をご紹介します。
移行のモデルですが、SQL Server 2005 から PowerGres Plus (Windows 版) 2.0 にデータベースを移行します。 また、データは、「第 2 回 Visual Studio .NET を使ったアプリケーション開発」でご紹介したサンプルを使用します。
図 1: SQL Server からの移行
以下の手順で、SQL Server から PowerGres Plus へデータベースを移行します。
SQL Server を起動し、テーブル定義を移出します。
SQL Server では、テーブル定義はスクリプトとして出力されますので、スクリプト生成ウィザードを起動します。
オブジェクトエクスプローラから移行したいデータベースを選択し、右クリックします。 ポップアップメニューが表示されますので、タスク の中の スクリプトの生成 を選び、スクリプト生成ウィザードを起動します。 以降は、画面の説明に従って操作します。
図 2: スクリプト生成ウィザード
SQL Server 固有キーワードを出力しないようにするため、スクリプトオプションの選択画面では、以下の項目を False に変更します。
図 3: スクリプトオプションの選択
出力ファイルは、以下のような内容になります。
図 6: 出力ファイルの内容
SQL Server のデータを CSV ファイルとして出力します。
オブジェクトエクスプローラから移行したいデータベースを選択し、右クリックします。 ポップアップメニューが表示されますので、タスク の中の データのエクスポート を選び、インポートおよびエクスポートウィザードを起動します。 以降は、画面の説明に従って操作します。
図 7: エクスポートウィザード
出力ファイルは、以下のような内容になります。
図 10: 出力ファイルの内容
出力したテーブル定義を見てみると、SQL Server 固有キーワードが数多く含まれており、これらを手作業で修正するのは大変です。
移行資料には、テーブル定義を修正してくれるスクリプトが付録として添付されています。 このスクリプトは、SQL Server 固有キーワードの削除、データ型の変換などを行っています。 今回は、このスクリプトを使ってテーブル定義を修正します。
図 11: mssqltopgsql.sh
移行資料に添付されている以下の 3 つのファイルを用意します。
mssqltopgsql.sh | テーブル定義を修正するスクリプト |
---|---|
mssqltopgsqlawk.txt | mssqltopgsql.sh が呼び出すファイル |
mssqltopgsqlsed.txt | mssqltopgsql.sh が呼び出すファイル |
サンプル一覧 に、mssqltopgsql.sh、mssqltopgsqlawk.txt、mssqltopgsqlsed.txt というファイルで提供しておりますのでご使用ください。
以下のように入力します。
sh ./mssqltopgsql.sh SQL Server の SQL ファイル > PowerGres Plus の SQL ファイル
図 12: mssqltopgsql.sh の実行例
スクリプトを実行すると変換後の SQL ファイルが出力されます。
図 13: mssqltopgsql.sh で変換後の SQL ファイル
変換後の SQL ファイルを見ると、「SET QUOTED_IDENTIFIERS」というキーワードが削除されていたり、tinyint が smallint に変換されています。
変換後の SQL ファイルには、まだ SQL Server 固有のキーワードが残っています。 これらについては、エディタで修正を行います。 詳しくは、移行資料を参照してください。 また、移行資料から修正のポイントを抜粋し、付録として添付しましたので、こちらも参考にしてください。
psql コマンドを使って、テーブル定義を移入します。以下のように入力します。
psql -f SQL ファイル データベース名
-f は、ファイルに記述した SQL を実行するオプションです。
図 14: psql の実行例
PowerGres Plus には、大規模データベースの運用を支援するための高速コピー機能があります。 高速コピーは、インデックスを含む大規模データベースの構築で特に威力を発揮します。 詳細は、「性能チューニングのポイント 第 3 回 高速 COPY の活用」でご紹介していますので、こちらもご覧ください。
今回は、この高速コピーを使ってデータの移入を行います。
高速コピーを有効にするために、psql コマンドでデータベースに接続した後、以下のコマンドを入力します。
set ENABLE_DIRECT_COPY=on;
高速コピーを使ってデータを移入します。 以下のように入力します。
copy テーブル名 from データファイル using delimeters ','
データファイルは CSV 形式なので、delimiters にカンマを指定します。
図 15: 高速コピーの実行例
以上で、PowerGres Plus へのデータベースの移行は完了です。
今回は、SQL Server マイグレーションのデータベース移行手順をご紹介しました。 この記事の調査のために、SQL Server から PostgreSQL への移行手順をいろいろと調べてみましたが、なかなかまとまった情報がありませんでした。 そんな中で見つけたのがコミュニティで公開している移行資料でした。 この資料には、移行手順が詳細に記述されており、SQL Server からの移行を検討されている方には、大変参考になると思います。 移行資料は、SQL Server 7.0 を対象とした内容ですが、今回は、SQL Server 2005 で確認した移行手順でご紹介しました。
次回はアプリケーションの移行をご紹介する予定です。
今回ご紹介した移行資料「Conversion of Microsoft SQL/ASP applications to PostgreSQL」から、移行のポイントをご紹介します。
表 2: SQL Server 固有キーワード
dbo. ON PRIMARY TEXTIMAGE_ON CLUSTERED SET ANSI_NULLS SET QUOTED_IDENTIFIERS WITH NOCHECK GO
SQL Server と PowerGres Plus では、データ型の定義が異なります。 PowerGres Plus に移行するには、以下のように置き換える必要があります。
SQL Server | PowerGres Plus |
---|---|
bit | smallint |
datetime | timestamptz |
smalldatetime | timestamptz |
nvarchar | varchar |
ntext | text |
image | bytea |
tinyint | smallint |
SQL Server と PowerGres Plus では、SQL の記述方法が一部異なります。
表 4: ALTER TABLE を使って列の初期値を指定する際の書式
ALTER TABLE <tablename> ADD DEFAULT <value> FOR <columnname>;
ALTER TABLE <tablename> ALTER <columnname> SET DEFAULT <value>;
表 5: 問い合わせで取得する行数を指定する際の書式
SELECT TOP <n> <statement>;
SELECT <statement> LIMIT <n>;
PowerGres Plus は、VIEW を更新することができないので、RULE で置き換えます。 以下は、VIEWを更新するRULEの例です。
CREATE TABLE testtable (testvalue int); CREATE VIEW testview as select (testvalue) as presentvalue from testtable;
INSERT の RULE
CREATE RULE rule_testview_insert AS ON INSERT TO testview DO INSTEAD INSERT INTO testtable (testvalue) VALUES (NEW.presentvalue);
UPDATE の RULE
CREATE RULE rule_testview_update AS ON UPDATE TO testview DO INSTEAD UPDATE testtable SET testvalue = NEW.presentvalue where testvalue = OLD.presentvalue;
DELETE の RULE
CREATE RULE rule_testview_delete AS ON DELETE TO testview DO INSTEAD DELETE FROM testtable where testvalue = OLD.presentvalue;
PowerGres Plus は、CREATE PROCEDUR Eコマンドをサポートしていません。 SQL Server の CREATE PROCEDURE は、CREATE FUNCTION に置き換えます。
以下にストアドプロシジャを PL/pgSQL で作成するポイントを説明します。
PowerGres Plus へのストアドプロシジャの移行については、「Oracle マイグレーション 第 5 回 ストアドプロシジャの移行l」でもご紹介していますので、そちらもご覧ください。