Переход с MySQL на PostgreSQL - советы, хитрости и хитрости? - PullRequest
35 голосов
/ 21 апреля 2009

Я рассматриваю переход с MySQL на PostgreSQL.

Каковы ваши советы, хитрости и рекомендации по работе с PostgreSQL?

На что должен обращать внимание MySQLer?

См. Также: Насколько PostgreSQL отличается от MySQL?
Смотрите также: Миграция с MySQL на PostgreSQL

Примечание. Я не думаю, что это дубликат. В частности, типы ответов весьма различны, и ответы здесь содержат гораздо больше деталей реализации, что я и искал

Ответы [ 6 ]

51 голосов
/ 21 апреля 2009

Просто сам прошел через это, ну, я все еще ...

  • Текст с учетом регистра
  • Отсутствие INSERT IGNORE и REPLACE
  • Явное приведение необходимо почти везде
  • Без обратной помехи
  • LOAD DATA INFILE (COPY близко, но недостаточно близко)
  • Изменить autoincrement на SERIAL
  • Несмотря на то, что в MySQL, в Postgres, имеется неправильная форма, INNER JOIN без предложения ON не может произойти, используйте CROSS JOIN или подобное
  • COUNT(*) может быть сумасшедшим медленным
  • Базы данных кодируются с помощью наборов символов, а не таблиц
  • Вы можете иметь несколько баз данных с несколькими схемами (на самом деле MySQL имеет только одну базу данных и несколько схем)
  • Различение разделов
  • MySQL interval против Postgres interval (для временных интервалов)
  • Неявное переименование столбца, Postgres требует AS
  • Невозможно обновить несколько таблиц одновременно в Postgres
  • Функции Postgres являются мощными. Так что нет CALL proc();; переписать proc() как функцию и SELECT proc();.
9 голосов
/ 21 апреля 2009

Это будет серьезная задача, так как вам придется тестировать всю кодовую базу - каждый отдельный запрос, где угодно, для

  • Синтаксис
  • Правильное поведение (т.е. возвращает те же результаты)
  • Производительность - например, Существуют ли какие-либо регрессии / улучшения производительности, и можете ли вы справиться с ними?
  • Обработка ошибок - они не ведут себя одинаково в условиях ошибки, возможно, ваш код полагался на конкретные коды ошибок

В оперативном режиме вам нужно будет посмотреть:

  • Резервное копирование / восстановление
  • Использование дискового пространства
  • Использование памяти
  • Однократная миграция данных - может быть большой и трудоемкой задачей
  • План отката на случай неудачи
  • Мониторинг - как вы отслеживаете MySQL и могут ли эти методы быть адаптированы
  • (при необходимости) - тиражирование

Вам, безусловно, придется провести серьезное тестирование производительности, прежде чем подумать о таком шаге.

Эти затраты делают перемещение в другую базу данных слишком дорогим для большинства нетривиальных приложений. Подумайте о преимуществах ОЧЕНЬ тщательно против огромных, огромных затрат на выполнение всего перечисленного.

Я был бы удивлен, если бы вам потребовалось менее трех месяцев в нетривиальном приложении, в течение которого вы не сможете продолжить обычную разработку.

8 голосов
/ 21 апреля 2009

Вы можете попробовать PostgreSQL gotchas , который содержит наиболее распространенные проблемы. Как правило, документация по PostgreSQL тоже довольно хорошая, так что держите ее под подушкой.

Кроме того, Преобразование из MySQL в PostgreSQL в вики pgsql.

6 голосов
/ 05 апреля 2012

Я нашел этот скрипт, который будет подключаться к вашей базе данных MySQL и вашей базе данных PostgreSQL и просто передавать содержимое. Это сработало для меня как шарм.

https://github.com/philipsoutham/py-mysql2pgsql

Установлено

$ pip install py-mysql2pgsql

Run

$ py-mysql2pgsql

в любой папке, и он создаст для вас файл настроек шаблона (mysql2pgsql.yml), который вы можете редактировать и вводить данные вашей базы данных.

Мне пришлось установить argparse, чтобы он работал.

$ pip install argparse

Когда ваша база данных заполнена, просто запустите ее снова

$ py-mysql2pgsql

в той же папке, что и файл настроек, и ничего, все готово. На экране ничего не печаталось, но моя база данных была полностью скопирована.

5 голосов
/ 21 апреля 2009

Перед преобразованием установите MySQL в ANSI-строгость, запустив сервер с: --transaction-изоляцией = SERIALIZABLE --sql-mode = ANSI

Убедитесь, что вы не используете таблицы MyIsam.

MySQL допускает много преобразований, которых он не должен; pg потребует приведение.

Ваши сохраненные процедуры, функции и триггеры должны быть переписаны. pg предоставляет вам выбор языков для них, но вы должны установить языки; это не так удобно для пользователя, как MySQL.

pg будет разрешать только в списке выбора столбцы, которые находятся в группе или являются агрегатами; MySQL обманет, выбрав первое значение в группе, если вы сделаете это.

MySQL добавляет несколько расширений: оператор неравенства может быть !=, как в C, он допускает использование & & в качестве синонима для 'and', '||' для 'или' и т. д. В частности, pg использует '||' означать цепочку строк.

По сути, pg довольно строго ANSI, а MySQL нет. Я настоятельно рекомендую, чтобы ваш MySQL как можно более строго соответствовал ANSI, прежде чем переходить на pg, а затем проверять наличие любых предупреждений при запуске приложений.

1 голос
/ 05 марта 2013

Помимо движущейся структуры базы данных, где вы не можете избежать ручных настроек ...

Самый надежный метод передачи данных (таблица за таблицей при условии, что структуры одинаковы):

mysql --default-character-set=utf8 -e "SELECT * FROM mytable" > mytable.txt

psql
\copy mytable from '/path/to/mytable.txt' WITH NULL AS 'NULL';

В последнее время пробовал любой другой подход (например, mysqldump с кучей опций + sed и т. Д.), Но ничего не получилось так хорошо, как этот.

Этот подход также обеспечивает некоторую гибкость при изменении структуры по пути - просто напишите соответствующий SELECT.

...