Перенос работающего сайта WordPress с Mysql на PostgreeSQL
Задача: перенести рабочий, наполненный постами, сайт на движке WordPress с БД MySQL на PostgreeSQL
Инструментарий:
1) pgloader — утилита для переноса данных из баз данных MySQL в PostgreeSQL
Особенности о которые спотыкался:
- для успешного переноса необходимо чтобы пользователь в терминале под которым осуществляется перенос имел максимальные права в БД и имел доступ «без пароля» для входа в консоль pgsql
- при переносе создается схема с именем БД, а не заливается по умолчанию в схему public. Что в принципе для нашей ситуации даже будет плюсом.
- Перед переносом, БД уже должна быть создана в PostgreeSQL
Синтаксис:
1 |
pgloader mysql://login:password@host/db_name pgsql:///db_name |
2) Плагин PG4WP который на «лету» исправляет запросы к MySQL на PostgreeSQL
Особенности:
- работает только при «чистой» установке. Т.е. WordPress должен быть штатно проинсталлирован с нуля
- Инсталляция корректно работает только до версии WordPress 5.9
- Плагин заброшен, последнее обновление — 3 года назад
Итак, общий алгоритм переноса рабочего WordPress получается такой:
- Переносим при помощи pgloader БД в отдельную схему
- Заново устанавливаем WordPress 5.9 с плагином PG4WP
- Удаляем из схемы public wp_posts (это если только статьи переносим) и переносим её из схемы созданной pgloader в public
- Пробуем обновить штатно WordPress
Точно понадобится:
1 2 3 |
-- перенос таблицы из отдной схемы в другую ALTER TABLE wp_base.wp_users SET SCHEMA public |
Удаление всех таблиц в схеме:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- удаляем таблицы DO $$ DECLARE r RECORD; BEGIN FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP EXECUTE 'DROP TABLE ' || quote_ident(r.tablename) || ' CASCADE'; END LOOP; END $$; -- удаляем последовательности DO $$ DECLARE r RECORD; BEGIN FOR r IN (SELECT relname FROM pg_class where relkind = 'S') LOOP EXECUTE 'DROP SEQUENCE IF EXISTS ' || quote_ident(r.relname) || ' CASCADE'; END LOOP; END $$; |
Поменять схему всех таблиц:
1 2 3 4 5 6 7 |
DO $$ DECLARE r RECORD; BEGIN FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'старая_схема') LOOP EXECUTE 'ALTER TABLE старая_схема.' || quote_ident(r.tablename) || ' SET SCHEMA новая_схема '; END LOOP; END $$; |
В принципе пока вполне рабочая схема