Миграция с MySQL на PostgreSQL

В настоящее время мы используем MySQL для продукта, который мы создаем, и стремимся как можно скорее перейти на PostgreSQL, в первую очередь по причинам лицензирования.

Кто-нибудь еще делал такой ход? Наша база данных является источником жизненной силы приложения и в конечном итоге будет хранить ТБ данных, поэтому мне интересно узнать об опыте улучшения/ухудшения производительности, основных препятствиях при преобразовании SQL и хранимых процедур и т. д.

Изменить: Просто чтобы уточнить для тех, кто спрашивал, почему нам не нравится лицензирование MySQL. Мы разрабатываем коммерческий продукт, который (в настоящее время) зависит от MySQL в качестве серверной части базы данных. В их лицензии указано, что мы должны платить им процент от нашей прейскурантной цены за установку, а не фиксированную плату. Для стартапа это менее чем привлекательно.


person Steve M    schedule 20.08.2008    source источник
comment
На эту тему есть несколько хороших технических статей: wiki.postgresql.org/wiki/   -  person user13550    schedule 17.09.2008
comment
Воспроизведение может быть проблемой для вас. MySQL поддерживает его из коробки.   -  person l_39217_l    schedule 17.09.2008


Ответы (3)


Стив, мне пришлось перенести мое старое приложение наоборот, то есть PgSQL->MySQL. Должен сказать, вы должны считать себя счастливчиком ;-) Общие ошибки:

  • SQL на самом деле довольно близок к языковому стандарту, поэтому вы можете страдать от диалекта MySQL, который вы уже знаете.
  • MySQL незаметно усекает varchars, которые превышают максимальную длину, тогда как Pg жалуется - быстрый обходной путь - иметь эти столбцы как «текст» вместо «varchar» и использовать триггеры для усечения длинных строк.
  • двойные кавычки используются вместо обратных апострофов
  • логические поля сравниваются с использованием операторов IS и IS NOT, однако MySQL-совместимый INT(1) с = и ‹> по-прежнему возможен
  • REPLACE отсутствует, используйте комбинацию DELETE/INSERT
  • Pg довольно строго следит за целостностью внешних ключей, поэтому не забывайте использовать ON DELETE CASCADE для ссылок.
  • если вы используете PHP с PDO, не забудьте передать методу lastInsertId() параметр - это должно быть имя последовательности, которое обычно создается так: [tablename]_[primarykeyname]_seq

Я надеюсь, что это поможет хотя бы немного. Удачи, играя с Postgres!

person Michał Niedźwiedzki    schedule 21.08.2008

Я сделал подобное преобразование, но по другим причинам. Это было связано с тем, что нам нужна была лучшая поддержка ACID и возможность предоставить веб-пользователям возможность видеть те же данные, что и с помощью других инструментов БД (один идентификатор для обоих).

Вот что нас укусило:

  1. MySQL не применяет ограничения так строго, как PostgreSQL.
  2. Существуют различные процедуры обработки даты. Их нужно будет конвертировать вручную.
  3. Любой код, который не предполагает соответствия ACID, может быть проблемой.

Тем не менее, как только он был на месте и протестирован, он был намного лучше. При правильной блокировке из соображений безопасности и интенсивном параллельном использовании PostgreSQL работал лучше, чем MySQL. В тех случаях, когда блокировка не требовалась (только чтение), производительность была не такой хорошей, но все же она была быстрее, чем сетевая карта, так что это не было проблемой.

Советы:

  • Автоматизированные скрипты в каталоге contrib являются хорошей отправной точкой для вашего преобразования, но обычно к ним нужно прикасаться.
  • Я настоятельно рекомендую использовать сериализуемый уровень изоляции по умолчанию.
  • Инструмент pg_autodoc удобен для того, чтобы действительно увидеть ваши структуры данных и помочь найти любые отношения, которые вы забыли определить и применить.
person Grant Johnson    schedule 16.09.2008

Мы перешли с MySQL3 на PostgreSQL 8.2, а затем на 8.3. PostgreSQL имеет основы SQL и многое другое, поэтому, если ваш MYSQL не использует причудливые вещи MySQL, все будет в порядке.

По моему опыту, наша база данных MySQL (версия 3) не имеет внешнего ключа... PostgreSQL позволяет вам их иметь, поэтому нам пришлось это изменить... и это было хорошо, и мы нашли ошибку.

Еще одна вещь, которую нам пришлось изменить, — это коннектор кодирования (C#), который не был таким же в MySQL. Версия MySQL была более стабильной, чем версия PostgreSQL. У нас все еще есть несколько проблем с PostgreSQL.

person Patrick Desjardins    schedule 17.09.2008
comment
Postgresql, PostGreSql, PostGresql => PostgreSQL ;-) - person Patryk Kordylewski; 27.11.2008
comment
Вздох. Девять голосов за комментарий, но никто не пошел и не внес правок. Расширьте возможности честных пользователей StackOverflow! - person mlissner; 07.05.2012