More Related Content
Similar to MySQLからPostgreSQLへのマイグレーションのハマリ所 (20)
More from Makoto Kaga (6)
MySQLからPostgreSQLへのマイグレーションのハマリ所
- 3. 講演者について
• 加賀 誠人 (かが まこと)
• @makotokaga
• フリーランスWebエンジニア
• 日本PostgreSQLユーザ会理事
• 本日の基調講演のUstream担当
• 物欲系Blogも書いています
• http://blog.project92.com
- 4. ゴール
• MySQL+PHPで稼働していたとある
Webアプリケーションを、PostgreSQL
+PHPに移行する
•ターゲットとなった旧システム
•
MySQL 5.0.x (InnoDB)
•
PHP 5.1.x
•新システム
•
PostgreSQL 9.0.x
•
PHP 5.3.x
- 5. どこから手をつけるか?
• まずは、情報収集
• Converting from other Databases to
PostgreSQL
•http://wiki.postgresql.org/wiki/
Converting_from_other_Databases_to_Post
greSQL
•「MySQL PostgreSQL migration」で検索
- 10. SQL文の表記の違い
• コメント行の開始文字列の違い
• MySQL : "#"
• PostgreSQLは認識しない
• PostgreSQL : "--"
• MySQLは認識する
• 引用符の違い
• MySQLは「"」も「'」も使える
• 識別子の場合もMySQLは「`」
• などなど……
- 11. テーブル定義の移行
• 今回選択した方法
• Mac OS X用ER図作成ツール「SQL
Editor」を使用
• MySQLのテーブル定義を読込み
• ターゲットをPostgreSQLに変更
• 一部データ型を修正
• SQLをエクスポート(し、さらに修
正)
• PostgreSQLに読み込み
- 12. SQLEditorについて
• Mac OS X版のER図作成ツール
• http://www.malcolmhardie.com/sqleditor/
• MalcolmHardie Solutions社製
• 79USD
- 13. データの移行①
• 移行前後、双方のDBに接続し、データを
移行するPHPのプログラムを作成し移行
した
• 移行先のPostgreSQLのシステムカタ
ログから、移行後のテーブル定義を取得
• MySQLのテーブルを順次SELECT
• 各カラムの型に応じて、必要な変換をし
て、PostgreSQL側にINSERT
•
NULL値を適切に処理しないとハマる
- 14. データの移行②
② 各テーブルの ① pg_catalogから、変換後の
データを順次取得 変換プログラム テーブル定義を取得
(PHPで記述)
③ データを変換して
順次投入
MySQL PostgreSQL
- 17. 移行でのハマりどころ②
• CHARACTER(n)型の違い
• 長さを指定した場合、n文字(バイト)
の長さになるまで、空白が追加される
• char(4)のカラムに「foo」が入って
いた場合に、PHPからアクセスする
と以下の値が取得される
•MySQL : "foo"
•PostgreSQL : "foo "
- 19. 移行でのハマりどころ③
• BOOLEANの値の違い
• MySQL: "1" or "0"
• 実体は tinyint(1)
• "TRUE" or "FALSE"で比較はできる
• if ($results) { ... }
• PostgreSQL: "t" or "f"
• if ($results === 't') { ... }
- 22. ORマッパがあっても
• 今回ターゲットとなったシステムは、
symfony 0.6.3を利用しており、OR
マッパとしてPropelを採用
•謳い文句上は設定を変えれば、簡単
にDBMSの変更が可能というが……
•
実際にはORマッパでは吸収しきれ
ていない
• アプリの書き換えは避けられない
- 23. まとめ
• マイグレーションは可能だが、高コスト
• ここで紹介しきれてない非互換性も多
い
• 中途半端に動いてしまうものもあるの
で、仕様が不明確なシステムの移行だ
と危険をともなう
• PostgreSQLでないといけない理由
や利点とのトレードオフで判断したい
•GIS、ライセンス、などなど