PostgreSQLからMySQLへマイグレーション。そしてハマるw
2017-03-10
このREDPEPPERSは某高額専用サーバー(を間借りして)動かしてました。が、諸事情により低額共有サーバーに引越しすることに。低額ってもサーバー性能的にはかなり良いです。たまに一発目のレスポンスが遅い時がある感じだけど画像の送信とかはだいぶ速い!ちなみにHETEMLっていうレンタルサーバーです。
でREDPEPPERSは20年前から動いてるサイトなのでなんとなく当時の流れでDBはPostgresでした。けど、いつの間にやら世の中はMySQLな時代になってた。HETEMLもMySQLです。
サーバー移転は何度も行ってきたけどDBのマイグレーションは過去に1~2回しか経験なし。だって面倒なんだもん。
でも、そんなことも言ってられないので重い腰を上げて実行することに(-ω☆)
今後のマイ備忘メモ的にここに書いておきます。
まずはDB/テーブルのコピー
参考 PostgreSQLのデータをMySQLに移行する - Qiita
$ pg_dump --data-only --no-owner --no-privileges --disable-dollar-quoting DB名 > /var/tmp/ファイル名 $ pg_dump --schema-only --no-owner --no-privileges --disable-dollar-quoting DB名 > /var/tmp/ファイル名
参考ページのスクリプトは動かず(´・ω・`)
なのでスキーマのファイルを開いてphpMyAdminのSQLにコピペ生打ち。
データのコピーもphpMyAdminのインポート機能で。HTMLソースはタグのダブルクォーテーション周りでハマるので注意。EXCELのCSV書き出しで発狂しないように←
PHP周り pg_をmysql_に一発置換
1.Dreamweaverの置換機能でpg_をmysql_にサイトごと変換!
2.pg_exec($con,$sql)はハマる。pg_query($sql)に一発変換!
SQL周り Offsetでハマる
MySQLにはSQLのoffsetが存在しない
Postgres : offset 開始位置 limit 件数 → MySQL limit 件数,開始位置 になる
SQL周り 日付関数がまーまー違う
代表例 Postgres: date_part('Y',日付) → MySQL YEAR(日付)
「オレの釣り」とかでよく使うやつ
Postgres:select * from table where date >= date('$theday') - 379 and date(date) < date('$theday') - 351
MySQL:select * from table where date between (date('$theday') - interval 379 day) and (date('$theday') - interval 351 day)
日付まわりはPostgresもバージョンごとにだいぶ違う気がする。intervalを使ったこともあるな。
SQL周り MySQLはinsertに厳しい
insert valueに全カラム入れないとダメっぽい(""やnullで)。Postgresは10カラムあっても冒頭の1個だけあれば通る気がする。
なによりもphpMyAdminが神!
phpMyAdminは本当にすげーわぁ。めっちゃ親切。こんなユーザーに優しいシステムはちょっと見たことないくらい親切丁寧。アプリの鏡です。MySQLド素人のオレでもすごく簡単に使える。SSHのpsqlでコマンド入れるのアホらしくなるし、phpPgAdminの不親切さが腹立たしいw
その他・将来のオレへ
DBと関係ないけどサーバーが変わると各地で使うパスが変わりまくるので個々のスクリプト内にいちいち絶対パスを記入しないこと!同じくmysql_connectも。一つのconfigファイルに留めるべし。って頭ではわかっているけど面倒でついつい書いちゃうのよねぇ。そしてサーバー移転時に後悔するw
HETEMLで403エラーがよくでる
HETEMLのWAF(Webアプリケーションファイアウォール)をONにしてるとブログ書くプログラムでやたら403エラーが出る。この記事のように本文にSQL文書いたり、ツィッターをembedするとソースにscriptって入るからSQLインジェクションだのクロスサイトスクリプティングだのに引っかかるw
HETEML管理画面のWAFのログみて「.htaccessによる除外記述」をいちいち設定しないとダメ。これがけっこうメンドう・・・けどWAFのオフは怖い。
カテゴリ:日記・携帯更新