1/22
OSC2016 Okinawa 2016.7.2(Sat)
商用データベースからPostgreSQLへの移行入門
まず知っておいて欲しいまとめ
日本PostgreSQLユーザ会
喜田 紘介
2/22
自己紹介
3/22
自己紹介
ブログはじめました!
「kkida-galaxy postgres」で
検索してね☆
おススメ投稿はこちら
(だってそれしか無いから・・・)
4/22
本日のテーマ
異種DBからPostgreSQLへ
良い資料ある?
ポスグレ
どれぐらい使えるの?
なにが違うの?
移行時の大変なところ
まずやってみよう!
ポスグレ
どれぐらい使えるの?
なにが違うの?
5/22
ポスグレどれぐらい使えるの?
軽量なトランザクションを捌く
● 同時1000~程度のセッション
✔ シングルノードやHA構成で稼動するシステムとしては十分
✔ H/WスペックではCPU 16~32core、メモリ数十GB程度はスケール可能
● 商用パッケージの大部分が置き換え可能?
✔ 商用パッケージユーザの約9割がPostgreSQLで十分
– 弊社にPostgreSQL対応で相談いただいた商用パッケージ
– 約9割のエンドユーザでは有償オプションを
あてにしない基本機能
– 残る1割程度のエンドーユーザ環境で
– 更新負荷分散・無停止を期待
6/22
商用DBの高速化オプション
ーーーーーーーーーーーーーー
 ・パーティショニング
 ・パラレルクエリ
 ・インメモリ
 ・カラムストア
 ・ビットマップインデックス
 ・MVIEWの差分更新
ポスグレどれぐらい使えるの?
集計・分析を気軽に行いたい
● 夜間バッチで集計、日中は結果を参照
✔ 大量データを検索、集計する機能は数年ここで大幅向上
✔ ただし制限事項も多く、リアルタイム性の高い分析は実用的でない
✔ データ量で数100GB~TB、集計の鮮度が1日単位ぐらい
● 期待を集めるパラレルクエリ、MVIEWの差分更新など
✔ ビッグデータ対応が最近のキーワード
✔ 今秋リリース予定のVer9.6~パラレルクエリが可能に?
ぽすぐれ
開発中!
7/22
ポスグレどれぐらい使えるの?
負荷分散・可用性
● 参照負荷分散と高可用構成は可能
✔ マスター/スレーブ型、ログ転送方式によるレプリケーション
✔ スレーブ側は参照のみ可能、複数スレーブで効果UP
✔ マスター障害時はスレーブに切り替え
8/22
何が似てるの?何が違うの?
RDBMSとしての基本は備えている
● ACIDを守る、標準SQLに準拠、メンテナンス性・・などなど
✔ A:原始性 C:一貫性 I:独立性 D:永続性
✔ 標準SQLに準拠し、そのための追加要素も常時検討されている
✔ メンテナンス性
豊富な管理ビュー
パラメータチューニング
SQLチューニング
SQLクエリでがんばる
各種イベントの
ロギング
オブジェクトの
メンテナンス
9/22
何が似てるの?何が違うの?
全体のアーキテクチャ
● 用語の違いはあるものの、ほぼ同じ図でイメージできる
Oracle Database
SGA
データベース
バッファキャッシュ
共有プール
ログバッファ
LGWR
DBWR
CKPT
SMON
PMON
ARCH専用サーバプロセス
専用サーバプロセス
専用サーバプロセス
PGA
データベース
表領域
データファイル
データファイル
REDO
ログファイル
表 索引
各種
設定ファイル
etc…
PostgreSQL
共有メモリ
共有バッファ WALバッファ
writer
wal writer
stats collector
archiver
logger
autovacuum launcher
バックエンドプロセス
バックエンドプロセス
バックエンドプロセス
デーモンプロセス
データベースクラスタ
データベース
表 索引
データベース
表 VM索引
FSM
WALファイル
各種
設定ファイル
システム
カタログ
各種状態
管理ファイル
10/22
何が似てるの?何が違うの?
MVCCの実現
● 異なるアーキテクチャでは、異なる運用課題もある
Oracle DatabasePostgreSQL
EMPNO=20 ENAME=TIGER
UNDOセグメント
EMPNO=10 ENAME=SCOTT
EMPNO=20 ENAME=NEW
EMPNO=30 ENAME=KING
EMPNO=40 ENAME=ALLEN
時間の流れ
変更前情報 表データ
EMPNO=10 ENAME=SCOTT
EMPNO=20 ENAME=TIGER
EMPNO=30 ENAME=KING
EMPNO=40 ENAME=ALLEN
EMPNO=20 ENAME=NEW
時間の流れ
変更前情報 表データ
変更前情報を必要とするSQL変更前情報を必要とするSQL
追記方式のため
変更前の行は表
に保持する
ORA-1555?VACUUM?
11/22
本日のテーマ
異種DBからPostgreSQLへ
ポスグレ
どれぐらい使えるの?
なにが違うの?
良い資料ある?
まずやってみよう!
良い資料ある?
移行時の大変なところ移行時の大変なところ
12/22
PostgreSQLへの移行を考えるなら
PGEConsで移行をテーマに研究成果を発表
● 3年にわたる成果が公開中
✔ 2012年度:異種DBからの移行ノウハウ・ツール等整理
✔ 2013年度:移行元として対象にするDB製品を追加
✔ 2014年度:DBを移行した場合にクリアしておくべき試験項目を整理
✔ 2015年度:継続中。現在成果発表に向けて鋭意対応中
13/22
PostgreSQLへの移行を考えるなら
PGEConsで移行をテーマに研究成果を発表
● 移行の行程を定義し、各工程での検討ポイントを調査
✔ 注目されがちなSQLやストアドの移行以外ももれなく調査
14/22
DB移行フレームワーク編
後続の各ステップで収集する情報と、成果物を整理
● 移行作業全体の工程を知る
15/22
構成検討・データ連携検討
ここで決断が必要!決めるのは「あなた自身」ですよ!
● PostgreSQLで本当に大丈夫なのか
● ポイントは、本日冒頭の話
✔ OLTP系のシングル構成であれば、性能を実現できる(可能性が高い)
✔ 複数台構成も可能、だが、サービスレベルの見直しは避けられない
✔ DWH用途では、どこまで期待するか判断基準を誤らないこと
● データ連携の選択肢
✔ 複数DBで連携しているものを一部だけPostgreSQLに置き換える?
✔ 手段はいくつか提供されている
– 各種FDW(Foreign Data Wrapper:Database Link的な使い方)
– OSSツール(トリガベースのテーブル単位レプリケーション)
16/22
定義移行、データ移行
OSSツールOra2Pgが有用
● 定義移行
✔ 使用できないオブジェクトの扱いが悩ましい
✔ Ora2Pgの使い方に慣れ、それがハードルにならないように頑張る
✔ PostgreSQLのほうがデータ型を細かく使い分ける
(例:NUMBER → numeric?integer?real?)
● データ移行
✔ Ora2Pgで中間ファイル生成
✔ 文字コード変換を行う
✔ 移行にかかる時間に縛りがある場合、ハードルが高いので注意
17/22
SQL修正
OSSツールdb_syntaxdiffを利用
● 修正箇所を確認
✔ 数が多いことがほとんどなので、なるべくツールでカバー
✔ ただし、修正箇所のピックアップ精度は高くない
● SQL修正
✔ 対応が決まっているものがほとんど、でも人手が必要
Oracleの独自構文 PostgreSQLでの対応
・外部結合演算子(+)
・ROWNUM
・集合演算子 minus
・FROM句内サブクエリの別名不要
・MERGE
・NULLを検索するクエリ
 (NULLと空文字を考える)
・トランザクションの違い
・外部結合OUTER JOIN
・Window関数 row_number()
・集合演算子 except
・FROM句内サブクエリの別名必須
・INSERT ・・・ON CONFRICT
18/22
ストアド・プログラムの修正
全面書き換えになるので覚悟が必要
● PL/SQLのプロシージャ、ファンクション、パッケージ
→すべてPL/pgSQLファンクションで書き換え
✔ 実は公式のマニュアルに対応が書かれている
✔ https://www.postgresql.jp/document/current/html/plpgsql-porting.html
プロシージャ
ーーーーーー
トランザクション制御をアプリケーション側で
実装し、PostgreSQLに担当させる部分は
トランザクション制御を排除
プロシージャ内でのトランザクション制御が
必須でなければそのままファンクション化
パッケージ
ーーーーーー
ファンクションで代替し、スキーマでまとめる
スキーマ名.ファンクション として、
パッケージ名.サブプログラム
と同じように呼び出すことができる。
パッケージ内で保持される定数・変数の
考慮が必要
 パッケージ定数:一時テーブルに格納
 パッケージ変数:ファンクションで代替
19/22
本日のテーマ
異種DBからPostgreSQLへ
ポスグレ
どれぐらい使えるの?
なにが違うの?
良い資料ある?
移行時の大変なところ
早急に
なんとかしたい!
まずやってみよう!
20/22
そんなDB移行、やってみませんか
ブログはじめました!
「kkida-galaxy postgres」で
検索してね☆
おススメ投稿はこちら
(だってそれしか無いから・・・)
今回用に投稿した二つの記事で、PostgreSQLを触った事の無い方が、とりあえず環境構築~
移行のとっかかり的なステップまでを体験できます。
  ・CentOS 7上でのPostgreSQL構築手順(RPM編)
  ・Ora2Pgでやってみよう!テーブル定義移行編
21/22
困った時は
PostgreSQL周辺幅広くなら、今だとSlackが活発
● コミュニティ
✔ postgresql-jp.slack.com
– 2015年頃から アクティブな人数も結構増えてきて、いろいろなバック
グラウンドの方が発言してくれます。
✔ 日本PostgreSQLユーザ会 メーリングリスト
– PostgreSQLの直接的な質問は、昔ながらのMLでもかなり詳細なやりと
りが行われていることがあります。
● サービス提供企業
✔ サポート提供社は10社前後あると思われる
– http://lets.postgresql.jp/documents/tutorial/UserSurvey/Postgresql_Usage
_Report_2#commercial-support
✔ データベース移行サービス
– 「Postgres Oracle 移行」などで検索
22/22
まとめ
異種DBからPostgreSQLへ
ポスグレ
どれぐらい使えるの?
なにが違うの?
良い資料ある?
移行時の大変なところ
まずやってみよう!
OLTP系ならかなり広範囲に使える
リアルタイム集計は苦手だがゆくゆくは!
アーキテクチャは似ているので理解しやすい
移行を本気で考えている方は、PGEConsの資料を
読んでみましょう。
どこが大変か、外せないところはどこか、明確にしておくことで
失敗を回避しやすくなるのではないでしょうか。
PostgreSQLやOra2Pgの使い始め、それなりに情報が
世に出ています。現時点の各最新版で試してみた記事を
書きましたので、是非みなさまもトライしてみてください。

[OSC2016沖縄]商用DBからPostgreSQLへの移行入門