.
5 марта 2011

Перенос базы форума с Postgres на MySQL

posted in Полезности |

postgresql-to-mysql
Один из текущих проектиков на старом хостинге стал совсем плох — сервак еле еле тянет казалось бы простейшие запросы. Какое там железо узнать так и не удалось ... хостинг добывался клиентом по какому великому «знакомству» :)

В общем «разруливать» ситуацию доверили мне.
Думать тут особо не пришлось — первым же делом наметил переезд сайта на свой выделенный сервачек.
Как ни странно для нашего времени весь кроме форума сайт был свёрстан в чистом html (сам не верил пока лично не увидел !!! около 20к html файлов) — тут без проблем.

А вот форум оказался на Postgres SQL !

Решений пришло в голову сразу 2  первый очень простой — поднять Postgres и вуаля.
Но одновременно в памяти крутить 2 SQL сервера, причём Postgres только из за одного форума мне показалось не правильным, поэтому решил делать по второму варианту — это перенос данных с Postgres на MySQL. К тому же для форума фичи Postgres, которых нет в MySQL (хранимы процедуры и пр.) абсолютно не нужны.

Кроме ftp доступа клиент мне ещё пару бинарных архива полумесячной давности зачем-то предоставил, которые я сразу же покилял :)

Не долго погуглив я никаких готовых конвертеров к сожалению не нашел (может плохо искал), поэтому для выгрузки в SQL формате решил использовать phpPgAdmin (ранее с ним не работал, но предположил, что у него функционал аналогичный phpMyAdmin).

Выгрузки делать с лёту не стал — ругался на пути к pg_dump и pg_dumpall

Проанализировав сервак — выяснил, что он на unix системе, поэтому попробовал поменять в конфиге пути с '/usr/bin/...' на '/usr/local/bin/' — и угадал :)

Далее выгрузил структуру и данные в формате SQL (тут тоже не без камней — пока не запретил доступ к сайту и форуму выгрузки никак не могли докачаться — сессия постоянно обрывалась).

Структуру для MySQL взял в дистрибутиве форума — создал базу и залил данные полученные на предыдущем этапе.

Вроде бы всё должно заработать, а нет :(
Около десятка полей в данных почему то оказались NULL, хотя по структуре созданных таблиц они были NOT NULL.
Одной таблички из мода антиспам защиты вообще не оказалось, пришлось структуру переделывать вручную.
И самое неприятное — порядок полей в INSERTе Postgres на некоторых таблицах не соотвествовал структуре созданной под MySQL — опять же пришлось править в ручную.

Тем не менее всё успешно завершилось (вроде жалоб пока нет) и форум щас «летает» — юзера довольны.

P.S.
Отмечу один подводный камень с которым я довольно долго провозился — это кодировка и чувствительность к регистру !

Во первых из PG выгрузилось всё в кодировке latin1, соответственно хоть форум отображался нормально, но нормально работать в том же PHPMyAdmin не представлялось возможным, поэтому было решено всё «перезалить» правильно.

  • Выгрузил дамп
  • Создал БД по новой DEFAULT CHARSET=cp1251 COLLATE cp1251_BIN;
  • Заменил все вхождения в дампе latin1 на cp1251
  • Добавил после коннекта к БД 2 запроса «SET NAMES CP1251» и «SET COLLATION_CONNECTION=CP1251_GENERAL_CI»;
  • В таблицу юзеров ещё добавил регистрочувствительность  добавив DEFAULT CHARSET=cp1251  COLLATE=cp1251_bin (именно bin указывает СУБД о регистрозависимости)
  • Залил получившийся дамп назад

Всего несколько строчек — а как я утомился пока понял в чём косяк, когда юзер не мог залогиниться на форум.

Яндекс.Метрика