Переключение с MySQL на PostgreSQL-советы, рекомендации и gotchas?

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

каковы Ваши советы, приемы и gotchas для работы с PostgreSQL?

Что должен MySQLer высматривать?

Читайте также: насколько отличается PostgreSQL от MySQL?
См. также: миграция из MySQL в PostgreSQL

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

6 ответов


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

  • регистр текста
  • отсутствие INSERT IGNORE и REPLACE
  • явное литье необходимо почти везде
  • нет backticks
  • LOAD DATA INFILE (COPY - это близко, но недостаточно близко)
  • изменить autoincrement до SERIAL
  • хотя плохая форма в MySQL, в Postgres, an INNER JOIN без ON статья не может произойти, используйте CROSS JOIN или как
  • COUNT(*) может быть сумасшедшим медленно
  • базы данных кодируются наборами символов, а не таблицами
  • вы можете иметь несколько баз данных с несколькими схемами (MySQL действительно имеет только одну базу данных и несколько схем)
  • разделение отличается
  • в MySQL interval против Postgres interval (по временным интервалам)
  • неявное переименование столбцов, Postgres требует AS
  • не удается обновить несколько столы в то же время в Postgres
  • функции Postgres являются мощными. Так что нет CALL proc();; переписать proc() как функция и SELECT proc();.

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

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

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

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

вы обязательно перед рассмотрением такого шага необходимо провести тестирование производительности.

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

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


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

и преобразование из MySQL в PostgreSQL на вики pgsql.


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

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

установлен

$ pip install py-mysql2pgsql

Run

$ py-mysql2pgsql

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

мне пришлось установите argparse для его работы.

$ pip install argparse

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

$ py-mysql2pgsql

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


перед преобразованием установите MySQL в ANSI-strictness, запустив сервер с: --transaction-isolation=SERIALIZABLE --sql-mode=ANSI

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

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

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

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

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

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


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

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

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 и т. д.), но ничто не работало так хорошо, как это.

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