SlideShare a Scribd company logo
2
Most read
10
Most read
15
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

PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PPTX
RLSを用いたマルチテナント実装 for Django
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PPTX
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
RLSを用いたマルチテナント実装 for Django
ヤフー社内でやってるMySQLチューニングセミナー大公開
爆速クエリエンジン”Presto”を使いたくなる話
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24

What's hot (20)

PDF
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PDF
初心者向けWebinar AWSで開発環境を構築しよう
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
PDF
Go入門
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
PostgreSQLアーキテクチャ入門
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
PDF
SQL大量発行処理をいかにして高速化するか
PDF
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PDF
MySQLレプリケーションあれやこれや
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
Hadoop入門
PDF
AWSではじめるDNSSEC
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
MongoDB〜その性質と利用場面〜
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
初心者向けWebinar AWSで開発環境を構築しよう
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
コンテナ未経験新人が学ぶコンテナ技術入門
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
Go入門
コンテナの作り方「Dockerは裏方で何をしているのか?」
PostgreSQLアーキテクチャ入門
Dockerfileを改善するためのBest Practice 2019年版
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
SQL大量発行処理をいかにして高速化するか
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
MySQLレプリケーションあれやこれや
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Hadoop入門
AWSではじめるDNSSEC
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
MongoDB〜その性質と利用場面〜
Ad

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

PDF
PostgreSQL10徹底解説
PPT
MySQL最新情報と、データベースのお勉強のススメ-第68回PHP勉強会
PDF
最近のストリーム処理事情振り返り
PDF
IT Pro のための PowerShell スクリプティング
PPTX
第51回NDS PostgreSQLのデータ型 #nds51
PDF
Yesod(at FPM2012)
PDF
利用者主体で行う分析のための分析基盤
PDF
Dat009 クラウドでビック
PDF
オブジェクト指向開発におけるObject-Functional Programming
PDF
Firefoxの開発プロセス
PDF
SQL Beginners Day #1 - SQL Server および Azure SQL のインストールと管理
PPTX
20140628 AWSの2014前半のアップデートまとめ
PDF
PHP開発者のためのNoSQL入門
PDF
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
PDF
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PPTX
Qlik ReplicateでApache Kafkaをターゲットとして使用する
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
PDF
Dat004 開発者に捧ぐ「sql server_2016_
PDF
WordPress アジュール部 ハンズオン
PDF
2019年度 若手技術者向け講座 実行計画
PostgreSQL10徹底解説
MySQL最新情報と、データベースのお勉強のススメ-第68回PHP勉強会
最近のストリーム処理事情振り返り
IT Pro のための PowerShell スクリプティング
第51回NDS PostgreSQLのデータ型 #nds51
Yesod(at FPM2012)
利用者主体で行う分析のための分析基盤
Dat009 クラウドでビック
オブジェクト指向開発におけるObject-Functional Programming
Firefoxの開発プロセス
SQL Beginners Day #1 - SQL Server および Azure SQL のインストールと管理
20140628 AWSの2014前半のアップデートまとめ
PHP開発者のためのNoSQL入門
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
Qlik ReplicateでApache Kafkaをターゲットとして使用する
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Dat004 開発者に捧ぐ「sql server_2016_
WordPress アジュール部 ハンズオン
2019年度 若手技術者向け講座 実行計画
Ad

More from Makoto Kaga (6)

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

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