SlideShare a Scribd company logo
2
Most read
10
Most read
20
Most read
MySQLからPostgreSQLへの
マイグレーションのハマリ所
日本PostgreSQLユーザ会 加賀 誠人
@makotokaga

2012年2月24日
PostgreSQL Conference 2012
アジェンダ

• ゴール
• 情報の収集
• テーブル定義の移行
• データの移行
• 移行におけるハマりどころ
• まとめ
講演者について

• 加賀 誠人 (かが まこと)
 • @makotokaga
 • フリーランスWebエンジニア
 • 日本PostgreSQLユーザ会理事
 • 本日の基調講演のUstream担当
 • 物欲系Blogも書いています
   • http://blog.project92.com
ゴール

• MySQL+PHPで稼働していたとある
  Webアプリケーションを、PostgreSQL
 +PHPに移行する
 •ターゲットとなった旧システム
     •
   MySQL 5.0.x (InnoDB)
     •
   PHP 5.1.x
 •新システム
     •
   PostgreSQL 9.0.x
     •
   PHP 5.3.x
どこから手をつけるか?

• まずは、情報収集
 • Converting from other Databases to
   PostgreSQL
   •http://wiki.postgresql.org/wiki/
    Converting_from_other_Databases_to_Post
    greSQL
   •「MySQL PostgreSQL migration」で検索
Converting from other
Databases to PostgreSQL
dumpしてrestoreできるか?



• MySQLとPostgreSQLでは、型の違
  い、SQLの表記の違いがあるので、変
 換は必須
 •いくつか既存の変換ツールが公開さ
  れている
型の違い


• 多くのデータ型は、双方に存在するが
  名前が違うなど、異なっている
• バイナリ・ラージ・オブジェクトなど
  は扱い方も異なる
 • BLOG v.s. BYTEA
SERIAL型

• MySQLでは、auto_increment
• PostgreSQLでは、SEQUENCEが作られ、
  default値として「nextval()」が設定される
• 直前に使われた値を調べる方法が違う
 • MySQLにはAPIで提供される
    mysql_insert_id() があり、直前に使われ
     た値が簡単に取得できる
 •   PostgreSQLでは、currval()で得られる
     が、SEQUENCEの名前を知っている必要
     がある
SQL文の表記の違い

• コメント行の開始文字列の違い
 • MySQL : "#"
   • PostgreSQLは認識しない
 • PostgreSQL : "--"
   • MySQLは認識する
• 引用符の違い
 • MySQLは「"」も「'」も使える
 • 識別子の場合もMySQLは「`」
• などなど……
テーブル定義の移行

• 今回選択した方法
 • Mac OS X用ER図作成ツール「SQL
   Editor」を使用
   • MySQLのテーブル定義を読込み
   • ターゲットをPostgreSQLに変更
   • 一部データ型を修正
   • SQLをエクスポート(し、さらに修
     正)
   • PostgreSQLに読み込み
SQLEditorについて

• Mac OS X版のER図作成ツール
 • http://www.malcolmhardie.com/sqleditor/
 • MalcolmHardie Solutions社製
 • 79USD
データの移行①

• 移行前後、双方のDBに接続し、データを
  移行するPHPのプログラムを作成し移行
 した
• 移行先のPostgreSQLのシステムカタ
  ログから、移行後のテーブル定義を取得
• MySQLのテーブルを順次SELECT
• 各カラムの型に応じて、必要な変換をし
  て、PostgreSQL側にINSERT
    •
   NULL値を適切に処理しないとハマる
データの移行②
② 各テーブルの               ① pg_catalogから、変換後の
データを順次取得    変換プログラム    テーブル定義を取得
            (PHPで記述)



                ③ データを変換して
                順次投入


    MySQL              PostgreSQL
データ移行自体の問題


• 移行そのものに相当の時間を要するた
  め、一定の時間止められないサービス
    だと辛い
•   実データで変換を検証する必要がある
    が、検証そのものにも時間がかかる
移行でのハマりどころ①


• timestamp型のふるまい
 • MySQLでは「0000-00-00
    00:00:00」が許容される
 • PostgreSQLでは、上記は投入でき
    ない
移行でのハマりどころ②

• CHARACTER(n)型の違い
 • 長さを指定した場合、n文字(バイト)
   の長さになるまで、空白が追加される
 • char(4)のカラムに「foo」が入って
   いた場合に、PHPからアクセスする
  と以下の値が取得される
  •MySQL : "foo"
  •PostgreSQL : "foo "
移行でのハマりどころ②−2

• psqlでやると……
test=# SELECT '"' || test || '"' from bar;
 ?column?
----------
 "12"
 "123"
 "1"
 "1234"
(4 rows)
移行でのハマりどころ③

• BOOLEANの値の違い
 • MySQL: "1" or "0"
   • 実体は tinyint(1)
   • "TRUE" or "FALSE"で比較はできる
  • if ($results) { ... }
 • PostgreSQL: "t" or "f"
  • if   ($results === 't') { ... }
移行でのハマりどころ④

• ORDER BY句のないクエリー
 • PostgreSQLはもちろん、SQLで
   は、ORDER BY句がない場合は、取
     得されるレコードの順番は不定
 •   MySQLでは、レコードの投入順に出
     力されるよう
     •当然保証されているわけではない?
移行でのハマりどころ⑤



• ORDER BY句でのNULLの扱い
 • MySQLは、NULLが先頭に
 • PostgreSQLは、NULLは末尾に
ORマッパがあっても

• 今回ターゲットとなったシステムは、
  symfony 0.6.3を利用しており、OR
    マッパとしてPropelを採用
    •謳い文句上は設定を変えれば、簡単
     にDBMSの変更が可能というが……
        •
      実際にはORマッパでは吸収しきれ
      ていない
•   アプリの書き換えは避けられない
まとめ

• マイグレーションは可能だが、高コスト
 • ここで紹介しきれてない非互換性も多
   い
 • 中途半端に動いてしまうものもあるの
   で、仕様が不明確なシステムの移行だ
    と危険をともなう
•   PostgreSQLでないといけない理由
    や利点とのトレードオフで判断したい
    •GIS、ライセンス、などなど

More Related Content

What's hot (20)

PDF
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
ksk_ha
 
PDF
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Atsushi KOMIYA
 
PDF
MQTTとAMQPと.NET
terurou
 
PDF
Webアプリを並行開発する際のマイグレーション戦略
Takayuki Shimizukawa
 
PDF
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
PDF
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
PDF
インメモリーデータグリッドの選択肢
Masaki Yamakawa
 
PPT
インフラエンジニアのためのcassandra入門
Akihiro Kuwano
 
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
 
PPTX
RDB開発者のためのApache Cassandra データモデリング入門
Yuki Morishita
 
PDF
DBスキーマもバージョン管理したい!
kwatch
 
PDF
Akkaで分散システム入門
Shingo Omura
 
PDF
MySQLで論理削除と正しく付き合う方法
yoku0825
 
PPTX
コンテナネットワーキング(CNI)最前線
Motonori Shindo
 
PDF
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
Takeshi HASEGAWA
 
PDF
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Masahito Zembutsu
 
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
ksk_ha
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Atsushi KOMIYA
 
MQTTとAMQPと.NET
terurou
 
Webアプリを並行開発する際のマイグレーション戦略
Takayuki Shimizukawa
 
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
インメモリーデータグリッドの選択肢
Masaki Yamakawa
 
インフラエンジニアのためのcassandra入門
Akihiro Kuwano
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
 
RDB開発者のためのApache Cassandra データモデリング入門
Yuki Morishita
 
DBスキーマもバージョン管理したい!
kwatch
 
Akkaで分散システム入門
Shingo Omura
 
MySQLで論理削除と正しく付き合う方法
yoku0825
 
コンテナネットワーキング(CNI)最前線
Motonori Shindo
 
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
Takeshi HASEGAWA
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Masahito Zembutsu
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 

Similar to MySQLからPostgreSQLへのマイグレーションのハマリ所 (20)

PDF
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
Takahiro Okumura
 
PDF
Oratopostgres-hiroshima
Kosuke Kida
 
PDF
MariaDB migration from commercial database
GOTO Satoru
 
PPT
MySQL最新情報と、データベースのお勉強のススメ-第68回PHP勉強会
sakaik
 
PPTX
MySQLのソース・ターゲットエンドポイントとしての利用
QlikPresalesJapan
 
KEY
My sql casual_in_fukuoka_vol1
Makoto Haruyama
 
PDF
20120824 PHP+MySQL勉強会LT
Koichiro Nishijima
 
PPTX
PostgreSQL使いのエンジニアから見たMySQL
toshihiro_kitagawa
 
PDF
オープンソース・データベースの最新事情
Meiji Kimura
 
PDF
ついにリリース!! MySQL 8.0 最新情報
yoyamasaki
 
PDF
Enter the-dolphine
Mikiya Okuno
 
PDF
MySQL最新情報
yoyamasaki
 
KEY
1台から500台までのMySQL運用(YAPC::Asia編)
Masahiro Nagano
 
PDF
my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方
Toshi Harada
 
PDF
MySQL 5.5 Update #denatech
Mikiya Okuno
 
PPTX
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
Ryusuke Kajiyama
 
PPTX
MySQL clients
yoku0825
 
ODP
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
Mikiya Okuno
 
PPTX
いまいまMySQL@OSC2016長岡
sakaik
 
PDF
Maria db
nekogeruge_987
 
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
Takahiro Okumura
 
Oratopostgres-hiroshima
Kosuke Kida
 
MariaDB migration from commercial database
GOTO Satoru
 
MySQL最新情報と、データベースのお勉強のススメ-第68回PHP勉強会
sakaik
 
MySQLのソース・ターゲットエンドポイントとしての利用
QlikPresalesJapan
 
My sql casual_in_fukuoka_vol1
Makoto Haruyama
 
20120824 PHP+MySQL勉強会LT
Koichiro Nishijima
 
PostgreSQL使いのエンジニアから見たMySQL
toshihiro_kitagawa
 
オープンソース・データベースの最新事情
Meiji Kimura
 
ついにリリース!! MySQL 8.0 最新情報
yoyamasaki
 
Enter the-dolphine
Mikiya Okuno
 
MySQL最新情報
yoyamasaki
 
1台から500台までのMySQL運用(YAPC::Asia編)
Masahiro Nagano
 
my sql-postgresql勉強会#6 LT 私的なPostgreSQLの楽しみ方
Toshi Harada
 
MySQL 5.5 Update #denatech
Mikiya Okuno
 
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
Ryusuke Kajiyama
 
MySQL clients
yoku0825
 
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
Mikiya Okuno
 
いまいまMySQL@OSC2016長岡
sakaik
 
Maria db
nekogeruge_987
 
Ad

More from Makoto Kaga (6)

PDF
ワンオペ向け! フットペダルでのスイッチング装置を試作してみた(某プロダクトのマネっこ)【改訂版】
Makoto Kaga
 
PDF
ワンオペ向け! フットペダルでのスイッチング装置を試作してみた(某プロダクトのマネっこ)
Makoto Kaga
 
PDF
配信現場のアレコレなければ作る!
Makoto Kaga
 
PDF
電動雲台無線化への道
Makoto Kaga
 
PDF
「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜
Makoto Kaga
 
PDF
Plagger。みんなで使えば恐くない。
Makoto Kaga
 
ワンオペ向け! フットペダルでのスイッチング装置を試作してみた(某プロダクトのマネっこ)【改訂版】
Makoto Kaga
 
ワンオペ向け! フットペダルでのスイッチング装置を試作してみた(某プロダクトのマネっこ)
Makoto Kaga
 
配信現場のアレコレなければ作る!
Makoto Kaga
 
電動雲台無線化への道
Makoto Kaga
 
「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜
Makoto Kaga
 
Plagger。みんなで使えば恐くない。
Makoto Kaga
 
Ad

Recently uploaded (9)

PPTX
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
iPride Co., Ltd.
 
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
PDF
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
 
PPTX
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
PPTX
色について.pptx .
iPride Co., Ltd.
 
勉強会_ターミナルコマンド入力迅速化_20250620. pptx. .
iPride Co., Ltd.
 
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
 
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
色について.pptx .
iPride Co., Ltd.
 

MySQLからPostgreSQLへのマイグレーションのハマリ所