Переключение с 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
против Postgresinterval
(по временным интервалам) - неявное переименование столбцов, 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 и т. д.), но ничто не работало так хорошо, как это.
этот подход также обеспечивает некоторую гибкость при изменении структуры по пути - просто напишите соответствующий выбор.