Перенос работающего сайта 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 $$; | 
В принципе пока вполне рабочая схема