版 | 改訂日 | 変更内容 |
---|---|---|
1.0 | 2019/03/25 | 新規作成 |
1.1 | 2019/05/20 | 「6.2.4 データベース・オブジェクトの違いについて」の、表6.2の内容を修正 |
1.2 | 2020/03/23 | 「6.2. アプリケーション移行」: 標準規格I/F対応の追加と全体構成の変更 |
本作品はCC-BYライセンスによって許諾されています。 ライセンスの内容を知りたい方は こちら でご確認ください。 文書の内容、表記に関する誤り、ご要望、感想等につきましては、PGEConsのサイト を通じてお寄せいただきますようお願いいたします。
本資料は異種DBMSからPostgreSQLへの移行を検討される方の参考にしていただくことを目的に、 PostgreSQLエンタープライズ・コンソーシアム(以下PGECons)が作成・公開をしています。
PGEConsは、PostgreSQL本体および各種ツールの情報収集と提供、整備などの活動を通じて、 ミッションクリティカル性の高いエンタープライズ領域へのPostgreSQLの普及を 推進することを目的として設立された団体です。
PGEConsの技術部会では、PostgreSQLの普及に対する課題の検討を通じて活動テーマを挙げ、 そのテーマごとにワーキンググループを立ち上げて活動しています。その中の一つである WG2(移行ワーキンググループ)では、「異種DBMSからPostgreSQLへの移行」をテーマとして 調査・検証を行い、収集した技術ノウハウを成果として取り纏めた資料を公開してきました。
しかし、WG2の活動でこれまでに積み上げてきた資料は膨大なページ数になっており、 移行の検討をする初期段階に参考にするのは難しいのではないかという課題が挙がりました。 そこで、PostgreSQLへの移行を検討する方がはじめに読むにあたり、移行の全体像を つかむことができるような資料として、これまでに公開した資料の要素に加え、あまり 触れられていなかった運用面でのポイントを整理し、移行ガイドブックという形でまとめました。
本資料が皆様のPostgreSQL採用検討の一助になれば幸いです。
本章ではPostgreSQLについて簡単にご紹介します。
PostgreSQL(Postgres)はオープンソースソフトウェア(OSS)として開発されているRDBMSです。 年1回のペースで新しいバージョンをリリースし、年々機能強化・性能改善を行い進化を続けています。 最近のバージョンでは、パーティショニングやパラレルクエリなど、大規模データベース向けの機能強化が進んでいます。 他にも多くの機能が実装されており、機能面では商用データベースに対しても遜色のないものになってきています。
PostgreSQLはThe PostgreSQL Global Development Group(PGDG)というコミュニティにより開発されています。 このコミュニティには世界各国の開発者が参加しており、メーリングリストなどで活発な議論が行われています。 コミュニティとしての活動のため、特定の企業に依存するものではなく、開発の方向性は開発者による議論の中で決められていきます。
また、PostgreSQLのコミュニティとしては、世界各国にユーザコミュニティが存在しています。 日本では早くから日本PostgreSQLユーザ会(JPUG)が設立され、PostgreSQL関連のセミナーを開催したり、 日本語版マニュアルの翻訳・公開、Let's Postgresというポータルの運営などの活動をしています。
日本語マニュアルをはじめ、PostgreSQLについては日本語の情報が多く公開されており、 日本では比較的PostgreSQLの普及が進んでいる傾向にありました。 近年、企業によるOSS採用が伸びていくにあたり、PostgreSQLの利用はさらに広がってきています。
PostgreSQLは「PostgreSQLライセンス」というライセンスの下に公開されています。 PostgreSQLライセンスはBSDやMITライセンスに似たオープンソース・ライセンスであり、単純に使用する分には無償であることはもちろん、 著作権や免責事項などのライセンス条件の表記の複製を添付することで再頒布・再利用をすることが可能です。 PostgreSQLを改造して組み込み利用するようなケースにおいても、ソースコードを公開する必要はありません。
開発コミュニティはライセンスについて、今後変更する予定はないことを明言しています。 ライセンス条件が変わる可能性を意識せずに、長期的に使用することができます。
また、PostgreSQLは無償で利用することができますが、商用データベースのように保守サポートが提供されるわけではありません。 安心して運用を続けるためには保守サポートについて別途検討する必要があります。 PostgreSQLに対しては、多くの企業が保守サポートをはじめとした様々なサービスを提供しています。
PostgreSQLのバージョンは X.Y 形式(※)で表記されます。 Xがメジャーバージョンを、Yがマイナーバージョンを表し、2019年4月現在の最新メジャーバージョンは11です。
※ バージョン10より前のバージョンでは X.Y.Z 形式で表記され、X.Yの部分がメジャーバージョンを示していました。
PostgreSQLでは概ね年に1回、新しいメジャーバージョンがリリースされます。 メジャーバージョンのリリースでは、新機能の追加や性能改善などが主に実施され、互換性に影響のある内容を含みます。 メジャーバージョンアップを行う際には、旧バージョンのデータをそのまま使用することはできません。 バックアップリストア、もしくはツール(pg_upgrade)を使用して移行をする必要があります。
また、PostgreSQLは3か月に1回、計画的に新しいマイナーバージョンのリリースをしています。 それ以外にも、脆弱性などの重大な問題があれば、スケジュール外のリリースが行われる可能性があります。 マイナーバージョンのリリースでは主にバグの修正が取り込まれており、原則として互換性に影響のある修正は行われません。
コミュニティでは各メジャーバージョンについて、リリースされてから約5年間サポートを継続しています。 5年後に最終リリースを迎えたバージョンについては、原則新しいリリースが行われることはありません。 (非常に影響の大きい問題の場合は対応される可能性はあります。) サポートの終了に合わせて、計画的にバージョンアップを行うことを推奨します。
PostgreSQLは主要なCPUアーキテクチャ、およびOSでの動作をサポートしています。 主なプラットフォームに関しては、ビルドファームという検証用のサーバ群にて日々動作検証が行われています。
PostgreSQLのソースおよびバイナリパッケージは、下記PostgreSQLのWebサイトから入手することができます。
Linuxディストリビューション向けには、RPMなどのインストール用パッケージが提供されています。 Yumなどのパッケージ管理システム用のリポジトリも提供されているため、そちらを指定してインストールすることも可能です。 Windowsについてもインストーラが提供されており、PostgreSQLのインストール方法は非常に簡単です。
また、PostgreSQLはOSSであり、ソースコードが公開されているため、自らビルドをして導入することができます。 各プラットフォームにおいてバイナリパッケージが用意されているため、そちらを使用するのがシンプルではありますが、 ブロックサイズなどビルド時のみ変更可能なパラメータも存在するため、そのようなケースではソースからの導入が必要になります。
PostgreSQL本体以外にも、PostgreSQLの機能を補完する周辺ツールがOSSとして開発・提供されています。 PostgreSQLに組み込んで機能を拡張するものや、PostgreSQLと連携して動作するものなど、多岐にわたるツールが存在しています。 RDBMSの移行という点では、Oracleと同じような機能や運用性を提供するツール、Oracleからの移行作業を補助するツールなどが有用です。
PostgreSQL向けに提供されている周辺ツールの一部について、下表にてご紹介します。 ただし、Windowsではサポートされていないものが多いためご注意ください。
分類 | ツール名 | 概要 |
---|---|---|
移行 | ora2pg | OracleからPostgreSQLへの移行ツール。移行評価レポート、定義・SQLの変換、データの移行などの機能を提供。 |
Orafce | Oracleが提供するパッケージや組み込み関数をPostgreSQL上で代替する拡張機能。 | |
性能 | pg_dbms_stats | PostgreSQLの統計情報を固定する拡張機能。通常ANALYZEで採取する統計情報をダミー情報で固定化することで、予期しない実行計画の変更を防ぐことが可能。 |
pg_hint_plan | PostgreSQLにヒントを実装する拡張機能。ヒント句を使用してスキャンや結合の方式を指定することで、SQLの実行計画を制御することが可能。 | |
運用・監視 | pgBadger | PostgreSQLのログファイルを解析して、SQL実行状況などのHTMLレポートを生成。 |
pg_monz | ZabbixによるPostgreSQL監視のためのテンプレートを提供。 | |
pg_repack | 通常は排他ロックを必要とするテーブルやインデックスの再編成を、排他ロックをかけずに実行可能とする拡張機能。 | |
pg_rman | PostgreSQLのバックアップ・リカバリ実行の簡易化、バックアップの世代管理など、バックアップ運用を補助するツール。 | |
pg_statsinfo | PostgreSQLの稼働統計情報のスナップショットを定期的に収集・蓄積し、データベースの処理状況、性能傾向などの確認に利用可能。レポート出力機能も提供。 | |
その他 | pg_bigm | PostgreSQLに日本語対応の全文検索機能を提供する拡張機能。 |
pg_bulkload | PostgreSQLに対して大量データの高速ロードを可能とするツール。 | |
pgpool-II | PostgreSQLのサーバ・クライアント間で動作するミドルウェア。コネクションプール、レプリケーション、負荷分散などの機能を提供。 | |
PostGIS | PostgreSQL上で地理情報データを取り扱うための拡張機能。 |
移行工程 | 目的 | 主要な作業項目 |
---|---|---|
アセスメント | 移行目的の達成可能性を確認し、データベース移行の可否を判断する | ・システム品質要求の適合性の把握
・移行難易度の把握
・移行コストの見積り
・移行可否判定
|
スキーマ移行 | テーブル、ビュー、インデックス、ストアド・プロシージャなどのデータベース・オブジェクトを移行する | ・データベースの構築
・データベースオブジェクトの定義移行
・他DB間の連携(データベースリンク)
|
アプリケーション移行 | データベース変更によるAPI、SQL文等の差異を解消する | ・データベース接続、ドライバの変更
・SQL、組み込み関数、ストアド・プロシージャの改修
・コマンド、API、ツールの付け替え
|
データ移行 | 移行元DB上のデータを移行する | ・データ型、文字コードの変換
・データクレンジング
・データの抽出、投入方法検討
|
移行検証 | データベース変更による影響確認を行う | ・機能テスト、非機能テスト
・パフォーマンスチューニング
|
運用 | データベース変更によるシステム運用保守を新たに構成する | ・運用保守設計の修正(運用処理、稼働監視)
|
アセスメントとは、現行環境のSQLやアプリケーションに対して、 移行が必要な個所がどこなのか、どういった非互換があるのかを調査し、 移行の作業量や難易度を算出する作業を指します。
次の観点でアセスメントを実施します。
また、調査対象の例は次のとおりです。
そして、ここで実施したアセスメントの結果を基に、データベース移行を実施するかどうかの判断を行います。
アーキテクチャは各RDBMSごとに異なっており、それぞれ特色があります。 移行にあたり、その差異を理解しておく必要があります。本節では主なものをピックアップして説明します。
■プロセス構成
■メモリ構成
■データ構成
PostgreSQL | Oracle | |
---|---|---|
データの構成 | ||
データファイルの構造 |
■スキーマの考え方
■オブジェクト作成時に割り当てられるスキーマ
■検索時のスキーマの優先順位
■ユーザの考え方
PostgreSQLとOracleではユーザの考え方が異なります。
PostgreSQLではユーザはロールの一種で、LOGIN属性を持つロールを指します。 Oracleと同様に、LOGIN属性を持つロール(ユーザ)を別のロールに所属させることも可能です。
■事前定義されるユーザ・アカウント
Oracleでは、インストール時に事前定義済のアカウントが複数作成されますが、 PostgreSQLではデータベース作成時に指定したアカウントのみが管理者として作成されます。 また、データベースサーバを監視するロールを簡単に設定できるデフォルトロールが定義されています。
PostgreSQLで管理者以外のユーザ・アカウントが必要な場合は、CREATE ROLE文またはCREATE USER文で作成します。
表や索引などの基本的なオブジェクトはPostgreSQLでも使用可能です。 一方、シノニムやデータベース・リンクなどのオブジェクトはPostgreSQLにありません。 これらのPostgreSQLにないオブジェクトを使用している場合は、移行方法の事前検討や移行工数を多く見積もるなどの対応を行う必要があります。
データベース・オブジェクトの対応については以下のとおりです。
Oracle | PostgreSQL | 補足 |
---|---|---|
テーブル | ○ | グローバル一時表は非対応。パーティショニングは、レンジ/リスト相当のみ。 |
インデックス | ○ | 逆キー索引、ビットマップ、ドメイン、クラスタ、索引構成表は非対応。 |
ビュー | ○ | |
マテリアライズドビュー | ○ | 参照のみ。自動リフレッシュ非対応。 |
シノニム | × | ビューで代用可能。 |
シーケンス | ○ | |
トリガー | ○ | |
データベースリンク | × | FDW(Foreign Data Wrapper)またはdblink関数で代替可能。 |
ストアドプロシージャ | ○ | 手続き型言語の仕様相違の対処が必要。バージョン11よりサポート。 |
ストアドファンクション | ○ | トランザクション制御と手続き型言語の仕様相違の対処が必要。 |
パッケージ | × | 代替方法はスキーマを使用して関数群をまとめる。パッケージレベルの変数はセッションごとの状態を一時テーブル内部に保存する。 |
ユーザ | ○ | ユーザはロールに包括されている。 |
ロール | ○ | ロール権限とオブジェクト権限があり、一部を除き非互換のために対処が必要。 |
PostgreSQLもOracleもどちらも標準SQL(Core SQL)に完全または部分的に準拠しています。 しかし、独自機能などの非互換があるため、調査を行う必要があります。
以降では詳細について説明します。
データ型についてはそのまま使用できるものもありますが、移行が必要なものも多くあります。 また、同じ名前のデータ型が存在する場合でも、有効桁数などに違いがある場合があるため注意が必要です。
主要なデータ型の対応については以下のとおりです。
属性 | Oracle | PostgreSQL | PostgreSQLのデータ型についての説明 |
---|---|---|---|
文字 | VARCHAR2 | varchar | 上限付き可変長 |
CHAR | char | 空白で埋められた固定長 | |
CLOB | text | 可変長(最大1GB) | |
真数 | NUMBER | decimal | 小数点前までは131072桁、小数点以降は16383桁 |
numeric | 小数点前までは131072桁、小数点以降は16383桁 | ||
integer | 整数(-2147483648~+2147483647) | ||
概数 | NUMBER | real | 6桁精度 |
double precision | 15桁精度 | ||
FLOAT | float | 精度(2進数53桁) | |
日時 | DATE | timestamp | 日付と時刻の両方(時間帯なし) 4713BC~294276AD(1μ秒、14桁) |
date | 日付のみの場合 | ||
TIMESTAMP | timestamp | 日付と時刻の両方(時間帯なし) 4713BC~294276AD(1μ秒、14桁) | |
TIMESTAMP WITH TIMEZONE | timestamp [ (p) ] with time zone | 日付と時刻の両方、時間帯付き、 4713BC~294276AD(1μ秒、14桁) | |
INTERVAL YEAR TO MONTH | interval [ fields ] [ (p) ] | -178000000年~+178000000年(1μ秒、14桁) | |
INTERVAL DAY TO SECOND | interval [ fields ] [ (p) ] | -178000000年~+178000000年(1μ秒、14桁) | |
バイナリ | BLOB | bytea | 可変長のバイナリ列(最大1GB) |
その他 | ROWID | 対応なし |
組み込み関数についてはそのまま使用できるものもありますが、移行が必要なものも多くあります。 また、同じ名前・機能の組み込み関数が存在する場合でも、 パラメータや結果のデータ型などに違いがある場合があるため注意が必要です。
以下に、主要な関数の対応例を示します。
Oracle | 互換性 | PostgreSQLでの対応方法 |
---|---|---|
ABS(n) | ○ | |
MOD(m,n) | ○ | |
ROUND(数値) | ○ | |
TRUNC(数値) | ○ | |
CHR(n) | ○ | |
CONCAT(char1,char2) | ○ | |
LOWER(char1) | ○ | |
REGEXP_REPLACE(string,pattern[,replace[,pos[,occurrence[,match]]]]) | △ | regexp_replace(string text,pattern text,replacement text[,flags text]) |
REGEXP_SUBSTR(source_char,pattern[,postion[,occurrence[,match_param[,subexpr]]]]) | △ | regexp_matches(string text,pattern text[,flags text]) |
REPLACE(char,search_string,replacement_string) | ○ | |
SUBSTR(char,m,n) | ○ | |
TRIM([LEADING|TRAILING|BOTH] [trim_character] FROM trim_source) | ○ | |
UPPER(char) | ○ | |
ASCII(char) | ○ | |
INSTR(string,substring) | △ | strpos(string,substring) |
LENGTH(char) | ○ | |
ADD_MONTHS(date,integer) | △ | +演算子を使って書換え可能 例: select date '2018-03-22' + interval '1 months' |
CURRENT_DATE | ○ | |
CURRENT_TIMESTAMP | ○ | |
SYSDATE | △ | current_date、current_timestamp、clock_timestamp |
SYSTIMESTAMP | △ | systimestamp current_timestamp、clock_timestamp |
CAST(expr AS type_name) | ○ | |
CONVERT(char,dest_char_set,source_char_set) | ○ | convert(string bytea,src_encoding name,dest_encoding name) |
TO_CHAR(d,fmt) | ○ | |
TO_CHAR(n,fmt) | ○ | |
TO_DATE(char,fmt) | ○ | |
TO_NUMBER(char,fmt) | ○ | |
TO_TIMESTAMP(char,fmt) | ○ | |
DECODE(expr,search,result) | △ | case式で置き換える |
NVL(expr1,expr2) | △ | coalesce(expr1,expr2) |
AVG(expr) | ○ | |
COUNT(expr) | ○ | |
MAX(expr) | ○ | |
MIN(expr) | ○ | |
RANK() OVER (ODER_BY_clause) | △ | rank() |
SUM(expr) | ○ |
○:あり、△:別の方法で代替可能
1.データ定義言語(DDL)
PostgreSQLにも存在するオブジェクトについては、 CREATE文やDROP文、ALTER文などを使用する点はOracleと同様です。 ただし、一部の構文やオプションに違いがあるため、 実際のシステムで使用している構文を確認し、非互換があるかどうか調査を行う必要があります。
Oracle | 文の有無 | 備考 |
---|---|---|
ALTER | ○ | PostgreSQLに存在するオブジェクトに対するもののみ |
ANALYZE | △ | 構文に違いあり |
ASSOCIATE STATISTICS | × | |
AUDIT | × | |
COMMENT | ○ | |
CREATE ... | ○ | PostgreSQLに存在するオブジェクトに対するもののみ |
DISASSOCIATE STATISTICS | × | |
DROP ... | ○ | PostgreSQLに存在するオブジェクトに対するもののみ |
FLASHBACK ... | × | |
GRANT | △ | システム権限が対象外など付与可能な権限に違いあり |
NOAUDIT | × | |
PURGE | × | |
RENAME | × | |
REVOKE | △ | システム権限が対象外など取り消し可能な権限に違いあり |
TRUNCATE | ○ | 省略可能な構文に違いあり |
○:あり、△:文はあるが書き換えが必要もしくは一部機能がない、×:なし
2.データ操作言語(DML)
基本的なSELECT文、INSERT文、UPDATE文、DELETE文はPostgreSQLでも使用可能です。 ただし、DDL同様に一部の構文やオプションに違いがあるため、 実際のシステムで使用している構文を確認し、非互換があるかどうか調査を行う必要があります。
Oracle | 文の有無 | 備考 |
---|---|---|
SELECT | ○ | UNIQUE句がないなど構文に違いあり |
INSERT | ○ | ALL INTO句がないなど構文に違いあり |
UPDATE | ○ | ONLY句がないなど構文に違いあり |
DELETE | ○ | FROM句の省略不可など構文に違いあり |
MERGE | × | INSERT ON CONFLICTで代替するなどの対処が必要 |
CALL | × | PostgreSQL11で追加 |
EXPLAIN PLAN | △ | EXPLAIN文を使用する |
LOCK TABLE | ○ | PostgreSQLではLOCK文 |
○:あり、△:文はあるが書き換えが必要もしくは一部機能がない、×:なし
3.その他制御文
■トランザクション制御文
COMMIT文、ROLLBACK文、SAVEPOINT文についてはPostgreSQLでも使用可能です。 ただし、使用できない句があるなど違いがあるため、調査が必要です。
Oracle | 文の有無 | 備考 |
---|---|---|
COMMIT | ○ | COMMENT句がないなど構文に違いあり |
ROLLBACK | ○ | FORCE句がないなど構文に違いあり |
SAVEPOINT | ○ | 同じ名前のセーブポイントを作成した場合の動作に違いあり |
SET TRANSACTION | △ | ISOLATION LEVEL句の場合のみ |
SET CONSTRAINT | ○ | SET CONSTRAINTSのみ使用可能 |
○:あり、△:文はあるが書き換えが必要もしくは一部機能がない、×:なし
■セッション制御文
そのままでは使用できません。そのため、実現したい処理に応じた移行法を検討する必要があります。
■システム制御文
そのままでは使用できません。そのため、実現したい処理に応じた移行法を検討する必要があります。
演算子や条件、結合、疑似列について説明します。
そのまま使用できる演算子や条件は多くありますが、 書き換えが必要なものや動作に違いのあるものも存在するため、 実際にどういったものを使用しているか調査を行います。
以下にそれぞれの例を示します。
■そのまま使用できる例
項目 | 例 |
---|---|
演算子 | +, -, *, / (算術演算子)
UNION, UNION ALL (集合演算子)
|
条件 | - =, <, >, <=, =>, !=, <>, ANY, SOME, ALL (比較条件)
NOT, AND, OR (論理条件)
LIKE (パターン一致条件)
IS NULL, IS NOT NULL (NULL条件)
BETWEEN, EXISTS, IN
|
結合 | JOIN, INNER JOIN, LEFT [OUTER] JOIN, RIGHT [OUTER] JOIN, FULL OUTER JOIN
|
■書き換えが必要な例
項目 | 例 | PostgreSQLでの書き換え例 |
---|---|---|
演算子 | MINUS (集合演算子) | EXCEPTに書き換え |
条件 | ^= (比較条件) | <>条件に書き換え |
結合 | (+) (外部結合演算子) | JOINに書き換え |
疑似列 | ROWNUM | LIMIT、OFFSETに書き換え |
■動作に違いのある例
項目 | 例 | 差異 |
---|---|---|
演算子 | || (連結演算子) | NULLが含まれる場合の結果に違いあり |
その他にもPostgreSQLとOracleには以下のような違いがあります。
1. NULLと空文字列
・空文字列をNULLとみなす検索例
SELECT * FROM staff WHERE NULLIF(name, '') IS NOT NULL;
2. REGEXP_LIKE条件による正規表現マッチング
演算子 | 説明 | 例 (結果はすべて真) |
---|---|---|
~ | 正規表現に一致、大文字小文字の区別あり | 'thomas' ~ '.*thomas.*' |
~* | 正規表現に一致、大文字小文字の区別なし | 'thomas' ~* '.*Thomas.*' |
!~ | 正規表現に一致しない、大文字小文字の区別あり | 'thomas' !~ '.*Thomas.*' |
!~* | 正規表現に一致しない、大文字小文字の区別なし | 'thomas' !~* '.*vadim.*' |
POSIX正規表現を使って p で始まるか e が2回現れる名前を検索する例は以下のとおりです。
・Oracleの例
SELECT * FROM staff WHERE REGEXP_LIKE(lower(name), '^p|(e.*){2}');
・PostgreSQLの例
SELECT * FROM staff WHERE lower(name) ~ '^p|(e.*){2}';
3. 除算を含む計算
・Oracleの例
SQL> SELECT 1/3*3 AS result FROM dual;
RESULT
----------
1
SQL> SELECT (1/3 + 1/3 +1/3) AS result FROM dual;
RESULT
----------
1
・PostgreSQLの例
postgres=# SELECT 1/3*3 AS result;
result
--------
0
postgres=# SELECT 1.0/3.0*3.0 AS result;
result
-------------------------
0.999999999999999999990
postgres=# SELECT (1/3 + 1/3 + 1/3) AS result;
result
--------
0
postgres=# SELECT (1.0/3.0 + 1.0/3.0 + 1.0/3.0) AS result;
result
------------------------
0.99999999999999999999
4. SEQUENCEキャッシュ動作
5. 複合一意制約のNULL動作
6. 暗黙的な型変換
PostgreSQLは基本的に暗黙的な型変換をしないので、明示的にCASTする必要があります。
以下にCASTが必要な例を示します。
・NGの例
postgres=# SELECT 1 + '1.0' AS result;
ERROR: invalid input syntax for integer: "1.0"
LINE 1: SELECT 1 + '1.0' AS result;
・OKの例
postgres=# SELECT 1 + CAST('1.0' AS numeric) AS result;
result
--------
2.0
■同時実行性
PostgreSQL・Oracleともに、複数ユーザがデータに対して同時アクセスすることを保証するために、MVCC(多版型同時実行制御)を使用して管理します。 そのため、表が同時に問合せおよび更新された際に、新旧の複数バージョンのデータを保持して、読み取り一貫性を保証します。
読み取り一貫性を維持する方法は、PostgreSQLとOracleで下記の通り異なります。
■COMMITの実行タイミング
PostgreSQL・Oracleともに、COMMITの実行により、トランザクションが実行したすべての更新を確定します。 COMMITの実行タイミングは、PostgreSQLとOracleで下記の通り異なります。
■トランザクション中のエラー処理
トランザクション中にエラーが発生した場合、破棄される処理の対象がPostgreSQLとOracleで異なります。
技術的に移行が可能であっても、莫大なコストがかかり移行を行うことが現実的ではない場合があります。 そのため、技術的な実現性だけではなく、移行コストを見積もり、移行の目的に見合うかどうか判断する必要があります。
主要な移行コストの例は以下のとおりです。 単純な移行費用だけでなく、PostgreSQLの開発・運用技術の教育費用などについても考慮することが必要です。
項目 | 例 | コスト大 |
---|---|---|
導入費用 | ・新DB基盤構築[開発/検証/本番]
・新DB開発/運用ツール導入[初期費用/ライセンス費用]
|
|
移行費用 | ・アセスメント
・スキーマ/アプリケーション/データ移行
・本番移行
・運用切替
|
○ |
運用費用 | ・ハードウェア、ソフトウェア保守費用
・サーバ/クラウド利用料やリース・レンタル料
・監視サービス費用
・障害対応
・チューニング
・定期メンテナンス
・OSアップデート
|
|
教育費用 | ・開発技術トレーニング[設計/SQL/DBA]
・運用技術トレーニング[導入/運用管理/クラスタ構築]
|
○ |
○:DB移行により特にコストが高くなる項目
オブジェクト | 依存オブジェクト |
---|---|
テーブル | 外部キー制約/シーケンス |
インデックス | テーブル |
ビュー | テーブル/ビュー |
トリガー | テーブル |
ストアドプロシージャ | テーブル/ビュー/ストアドプロシージャ/ストアドファンクション |
ストアドファンクション | テーブル/ビュー/ストアドプロシージャ/ストアドファンクション |
抽出情報 | データディクショナリ | システムカタログ | 情報スキーマ |
---|---|---|---|
テーブル | ALL_TABLES | pg_class、pg_tables | information_schema.tables |
ビュー | ALL_VIEWS | pg_class、pg_views | information_schema.tables |
列 | ALL_TAB_COLUMNS | pg_attribute | information_schema.columns |
制約定義 | ALL_CONSTRAINTS | pg_constraint | information_schema.table_constraints |
インデックス定義 | ALL_INDEXES | pg_class、pg_indexes | information_schema.key_column_usage |
インデックスの列情報 | ALL_IND_COLUMNS | pg_attribute | information_schema.key_column_usage |
シーケンス | ALL_SEQUENCES | pg_class、pg_sequences | information_schema.sequences |
プロシージャ・ファンクション | ALL_SOURCE | pg_proc | information_schema.routines |
トリガー | ALL_TRIGGERS | pg_trigger | information_schema.triggers |
マテリアライズドビュー | ALL_MVIEWS | pg_matviews | information_schema.tables |
言語 | Oracle | PostgreSQL |
---|---|---|
Java | JDBC -Type2 | - |
JDBC -Type4 | JDBC -Type4 | |
C | Oracle Call Interface (OCI) | libpq |
C++ | Oracle C++ Call Interface(OCCI) | libpq++/Pgfe |
.NET | Oracle Data Provider for .NET(ODP.NET) | Npgsql |
COM | Oracle Provider for OLE DB | PSQL OLE DB |
Oracle Objects for OLE(OO4O) | - | |
ODBC | Oracle ODBC | psqlODBC |
PHP | php-oci8 PHP Data Objects (PDO) | php-pgsql PHP Data Objects (PDO) |
Perl | DBI、DBD::Oracle | DBI、DBD::Pg |
Ruby | ruby-oci8 DBI | ruby-pg DBI |
Python | cx_Oracle DB-API2 | psycopg DB-API2 |
Oracle | PostgreSQL |
---|---|
SQL*Plus | psql |
SQL*Loader | copy/pg_bulkload |
exp | pg_dump |
imp | pg_restore |
Oracle | PostgreSQL |
---|---|
Pro*C/C++ | ECPG |
Pro*COBOL | Open Cobol ESQL |
データ移行とは、移行元DBに格納されているデータを、移行先DBに取込むことです。
異なるDB間では、データ型の仕様やサイズ、使用する文字コードなどに差異があります。 したがいまして、データ移行では必要に応じて移行先DBで取り込めるデータへの変換も行います。
データ移行で実施する作業について説明します。
標準的なデータ移行は、移行元DBからデータを抽出し、移行先DB用にデータの変換と、取込・確認を行うまでが基本的な作業フローとなります。
データ件数やデータサイズが非常に大きい場合、移行作業に時間がかかるうえ、既存システムへの影響も非常に大きくなる可能性あります。したがいまして、移行作業における要件に応じて、移行の手段を選択する必要があります。
- 一括移行
移行元のシステム停止から新システムの開始までに十分な移行期間を確保することが出来、データ移行に必要なリソースをを確保できる場合には、移行作業に入ってからデータの抽出、加工、投入で問題ありません。
- 一部データの事前移行
移行すべきデータを選別し、更新される可能性が無いデータは事前に移行し、更新がかかるデータの移行を移行作業期間中に行います。記事など蓄積型のデータは後で更新されることが少ないと考えられ、移行作業中に移行するデータ量を削減することにより作業を短期間で完了させることができます。ただし、事前にデータを抽出する際に既存システムへの負荷がかかる可能性があるため、性能への影響を考慮する必要があります。また、事前に移行するデータと移行作業期間中のデータが明確に分かれているか、何らかのチェックポイントを設定して未反映のデータが判断できるようにしておく必要があるため、移行作業における設計が重要となります。
- データ連携
移行元システムのDB と移行先のPostgreSQLを使用する新システムを並行運用したり、更新データを随時新システムに反映することにより、データの移行期間を最小限にすることができます。移行元システムのDBからデータを抽出、加工しPostgreSQLに投入するため、移行元のシステムにかかる負荷が課題となる可能性があるほか、ETL/データ連携ツールや専用アプリケーションを構築する必要があるため、移行費用が大きくなる可能性があります。
主なデータ抽出方法としては、以下のような方法があります。
抽出方式 | 形式 | 導入 | 説明 |
---|---|---|---|
SPOOLコマンド | CSV | 不要 | SQL*Plusで実行した問合せの結果をファイルに格納する |
ora2pg | テキスト(DML) | 必要 | psqlなどで実行できるDMLとして出力される |
データ変換では、移行元DBと移行先DBとの差異により、データ型や文字コードの変換や外字への対応などを行います。また、アプリケーションの変更などがあった場合は、データクレンジング(データの整形)が必要となる場合があります。主な変換に以下のようなものがあります。
項目 | 内容 |
---|---|
データ型 | 以下のようなものを適切な値に変換する。
・0バイト文字列のように、DBによって格納する値の意味が異なるもの
・同じデータ型でも格納可能な限界値に差異があるもの
|
文字コード | PostgreSQLへ投入するテキストファイルがPostgreSQLに対応していない場合や、
pg_bulkloadを用いてデータ投入を行う場合、文字エンコーディングの変換を行う必要がある。
|
外字 | 移行元DBで外字が使用されていた場合、その外字を移行先DBで使用できる文字に変換する。
もしくは、移行先DBで外字を使用できるようにシステムに登録する。
注意:外字が使用できるようにシステムに登録されており、かつ、クライアントエンコーディングと
データベースエンコーディングとが異なる場合、 自動エンコーディング変換を利用するためには、
外字のマッピングを定義し、マッピングを再登録する必要がある。
|
データクレンジング | 移行と同時にデータフォーマットが変わるようなアプリケーションの変更が発生している場合、
変更にあわせたデータの変換を行う。
|
主なデータ取込方法としては、以下のような方法があります。
取込方式 | データ形式 | 速度 | 導入 | 制限事項 |
---|---|---|---|---|
SQL | テキスト(DML) | 低 | 不要 | なし |
COPY | CSV | 中 | 不要 | なし |
pg_bulkload | CSV | 高 | 必要 | クラッシュ時にリカバリが必要。レプリケーション構成は再取得や再作成が必要。 |
データが正しく移行されたことを確認するために、以下のような作業を行います。
項目 | 内容 |
---|---|
データロード時のエラー等の確認 | 実行したコマンドのエラーメッセージの有無を確認する。
エラーが表示された場合は、その問題点を確認し、対処してから再度データをロードする。
pg_bulkloadではロールバックされないので、データロードを再実行する際は、一旦テーブルのTRUNCATEが必要。
|
移行対象オブジェクト数および各オブジェクトの行数の確認 | データロード後のPostgreSQLデータベースのオブジェクト数と各オブジェクトの行数が、
移行元データベースの状態と一致するかどうか確認する。
|
CSV出力の結果照合 | DBに登録されたデータをCSVファイルとして抽出し、データ取込において使用したCSVファイルと、
内容や行数が一致するかどうかを確認する。
|
アプリケーションテスト | 実際にアプリケーションから接続して一連の処理を行い、想定通りの動きをするかどうか、
文字化けが発生していないか等を確認する。
|
データ取り込み後には、その他に以下のような作業を行います。
方式 | 方法 | バックアップ対象 | リカバリ範囲 | DB停止 | 対応するOracleツール |
---|---|---|---|---|---|
SQLによるダンプ | pg_dumpツール | "データベースクラスタ,データベース, スキーマ, テーブル" | バックアップ取得時点 | 不要 | DataPump |
ファイルシステムレベルのバックアップ | OSコマンド | データベースクラスタ | バックアップ取得時点 | 要 | -(OSコマンド) |
継続的アーカイブ | ・ベースバックアップ(全体バックアップ)+アーカイブWAL+未アーカイブWAL
・pg_rman
|
データベースクラスタ | ベースバックアップ~最新状態 | 不要 | ・Begin BackupとEnd Backup+OSコマンドバックアップ+アーカイブログ
・RMAN(リカバリ・マネージャー)
|
要件 | 選択する方式 | 想定するユースケース |
---|---|---|
最新のトランザクションまたは任意の時点の状態まで復元 | 継続的アーカイブ | ディスク障害等不測の事態に対する対応 |
バックアップ時点に復元 | 全ての方式で可能 | 定期保守 |
異なるバージョンへの移行 | SQLによるダンプ | 移行 |
スキーマ単位、テーブル単位など部分的なバックアップアップと復元 | SQLによるダンプ | システム変更などの検証 |
NO | 方式 | メリット | デメリット |
---|---|---|---|
1 | reindex | コマンドが容易かつDB単位、スキーマ単位、テーブル単位で実行可能 | 処理中にテーブルの書き込みロックと対象の索引を使用する読み込みにブロックがかかる |
2 | drop index+create index | 1の方式よりロック影響は少ない | create indexでテーブルに書き込みロックがかかる |
3 | create index concurrentry+drop index+alter index rename | 運用中のDBへのロックの影響が最も小さい | 手順が多い。concurrentryオプションはテーブルを2回スキャンするため時間がかかる |
4 | pg_repack | 3の方式を1コマンドで実施可能 | 周辺ツールのインストールが必要。実行時に途中で停止した場合はリカバリ操作が必要 |
DBの規模 | 保守時間が確保できるか | 性能要求 | 推奨する方式(NO) |
---|---|---|---|
小 | できる | ― | 1(DBまたはスキーマ単位) |
小 | できない | 高い | 3or4 |
小 | できない | 低い | 再構築しない |
中 | できる | ― | 1(スキーマ単位またはテーブル単位) |
中 | できない | 高い | 3or4 |
大 | できるが全て再構築する時間はない | ― | 1(テーブル単位)で曜日毎に対象テーブルを分ける |
大 | できない | ― | 3or4で曜日毎に対象テーブルを分ける |
実行方法 | 実行範囲 | 備考 |
---|---|---|
自動VACUUM | VACUUM+ANALYZE | パラメタファイルで自動実行を指定する(デフォルトで自動実行)。ANALYZEの閾値は別に指定可能 |
手動VACUUM | コマンドで指定したパラメタによる | コマンドで実行 |
大規模テーブルの有無 | 全件更新 | 性能要求 | VACUUM処理 |
---|---|---|---|
なし | なし | 高い | 自動VACUUM(調整) |
なし | あり | 高い | 自動VACUUM(調整)+VACUUM FULLを検討 |
あり | なし | 高い | 自動VACUUM(調整)+テーブル毎の調整 or 手動VACUUM |
あり | あり | 高い | 自動VACUUM(調整)+テーブル毎の調整 or 手動VACUUM+VACUUM FULLを検討 |
上記以外 | ← | ← | 自動VACUUM(デフォルト) |
パラメタ名 | 設定例 | 備考 |
---|---|---|
log_destination | stderr | 標準エラーを指定 |
logging_collector | on | onを指定しログ収集を有効にする。offにするとログは出力されない |
log_directory | /var/log/postgresなど | 絶対パスで指定しない場合はデータベースディレクトリ以下に相対パスとして作成される |
log_filename | postgresql-%Y%m%d.log | ログのファイル名。日付毎の出力が運用しやすい |
log_rotation_age | 1d | 1日でログを切替え |
log_rotation_size | 0 | ログファイルの最大サイズ。0はサイズ指定無効 |
パラメタ名 | 設定例 | 性能 | 備考 |
---|---|---|---|
log_min_error_statement | ERROR | - | エラー条件の原因となったSQL文を記録するか制御する。ERRORがデフォルト |
log_min_duration_statement | 3s(値は例) | ○ | 指定した時間以上に時間のかかった処理を記録する。問題のある処理の特定に役立つ。0を指定すると全ての文を出力(大量に出力されるのでログの肥大化に注意が必要) |
log_checkpoints | on | ○ | checkpoint starting: xlogが頻発する場合はWAL関連のパラメタを見直す |
log_connections | on | ○ | onでクライアント認証の記録の残す。大量の接続が発生する場合、ログの肥大化に注意が必要 |
log_line_prefix | %t %u[%p:%l] | - | 各ログ行の先頭に出力する。%tの時刻と%pのプロセス番号は必須 |
log_lock_wait | on | ○ | ロック待ちが発生しているか確認できる。あわせてdeadlock_timeoutを指定する |
deadlock_timeout | 3s(値は例) | ○ | デッドロック検査前の待ち時間。ロック待ちログメッセージの待機時間にも使われる |
log_temp_files | 10MB(値は例) | ○ | 最初は0として一時ファイルを使ったら全て出力させてwork_memのサイズを調整する目安にする。調整後は例のような一定サイズに変更する。運用中は大量の一時ファイルを使うSQL(=遅い)を特定できる |
log_autovacuum_min_duration | 3s(値は例) | ○ | 実行頻度、時間帯、実行時間を確認し、autovacuumの実行を調整する目安にする。調整しても性能要件を満たせない場合は手動VACUUMを検討 |
監視項目 | リアルタイム監視 | 定期監視 | 定期監視での分析観点 |
---|---|---|---|
ログの監視 | ○ | - | - |
ディスクの空き領域監視 | ○ | ○ | 空き領域の減少具合から、いつ不足するか予測 |
接続数の監視 | ○ | ○ | 接続数の変動を経年変化で観測しパラメタ変更、チューニング、リソース増強などの対策要否の検討 |
プロセス監視 | ○ | - | - |
アクセス監査(必要に応じて) | - | ○ | 不正アクセスが発生していないか。pgauditを導入 |
周辺ツール等 | 対応OS | 診断情報 | 分析単位 | 分析方法 | 備考 |
---|---|---|---|---|---|
pg_statsinfo | linux | リポジトリDB | 任意の期間 | テキスト形式の性能レポート、HTML形式の性能レポート(別途pg_stats_reporterが必要) | 専用のログ設定が必要 |
pgBadger | linux | ログファイル | ログ全体、日単位、週単位のサマリ | HTML形式の性能レポート | 専用のログ設定が必要。運用によっては数十GB/日のログが出力される |
pg_stat_statements | linuxとWindows | pg_stat_statement_reset実行後からのSQLの実行統計を累積 | データベース単位 | pg_stat_statementsビューの参照。例)クエリ実行時間,実行回数のトップ10調査などSQLで取得 | データベースにエクステンションの追加とパラメタ:shared_preload_librariesにpg_stat_statemntを追加 |
情報スキーマの情報から分析の仕組みを自作 | linuxとWindows | 情報スキーマや上記のpg_stat_statementsなどの情報を一定間隔でテーブル等に蓄積 | 任意の期間 | 蓄積されたテーブルの任意の期間の差分で分析するクエリを自作 | 仕組みを自作する必要がある |
(企業・団体名順)
版 | 所属企業・団体名 | 部署名 | 氏名 |
---|---|---|---|
第1.0版
(2018年度WG2)
|
日本電気株式会社 | AIプラットフォーム事業部 | 黒澤 彰 |
日本電子計算株式会社 | 技術本部 | 毛塚 賢一 | |
日本電子計算株式会社 | 技術本部 | 高橋 泰之 | |
富士通株式会社 | ミドルウェア事業本部 | 陶山 香織 | |
富士通株式会社 | ミドルウェア事業本部 | 豊島 良美 | |
富士通エフ・アイ・ピー株式会社 | ソリューションサービス推進本部 | 多田 明弘 | |
三菱電機株式会社 | 情報技術総合研究所 | 田中 覚 | |
第1.1版 | 富士通株式会社 | ミドルウェア事業本部 | 豊島 良美 |
第1.2版
(2019年度WG2)
|
日本電子計算株式会社 | 技術本部 | 毛塚 賢一 |
日本電子計算株式会社 | 技術本部 | 高橋 泰之 |