Переезд с MySQL на PostgreSQL

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
TolicH
phpBB 1.0.0
Сообщения: 6
Зарегистрирован: 21.07.2009 22:21
Поблагодарили: 1 раз

Переезд с MySQL на PostgreSQL

Сообщение TolicH » 22.07.2009 16:57

Недавно столкнулся с задачей сабж. Гугл, как ни странно, ничего толковее чем "переносите всё вручную" не рассказывает.

Приведу алгоритм действий, которые при хорошей погоде могут привести к успешному результату.

1. Создаем PgSQL базу данных и юзером под неё

Код: Выделить всё

# CREATE USER forum;
# CREATE DATABASE forum OWNER forum ENCODING 'UTF-8';
2. Ставим чистый phpBB3 на новую базу данных. Как это сделать, думаю все знают.
3. Дампаем структуру новой БД

Код: Выделить всё

# pg_dump --schema-only -U forum -d forum > schema.sql
3.1. Правим схему с учётом установленных модов, если необходимо. Тут ничего кроме как править вручную я не придумал.
3.2. Убиваем новую БД и создаем заново :)

Код: Выделить всё

# DROP DATABASE forum;
# CREATE DATABASE forum OWNER forum ENCODING 'UTF-8';
4. Дампаем старую MySQL базу phpBB3 особым, шаманским образом:

Код: Выделить всё

# mysqldump -u forum --compatible=postgresql --skip-extended-insert --no-create-info --skip-add-locks --skip-lock-tables forum > data.sql
5. Импортим чистую структуру в новую БД:

Код: Выделить всё

# psql -U forum -d forum < schema.sql
6. Импортим данные в новую БД:

Код: Выделить всё

# psql -U forum -d forum < dump.sql
7. Данные-то мы импортнули, но значения сиквенсов остались нетронутыми (т.е. равными 1), любая попытка что-либо сделать на конференции приведет к fatal error'у БД. Поэтому пришлось написать скрипт, который выставляет корректные значения сиквенсов. 100% работает на PgSQL 8.1.11, для других версий возможно придется изменить.

Код: Выделить всё

<?php

pg_connect('host=localhost user=forum');

$sql = "SELECT pg_class.oid, pg_class.relname
          FROM pg_class
          JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid AND pg_namespace.nspname = 'public'
        WHERE
          pg_class.relkind = 'r'
        ORDER BY pg_class.relname ASC";
$tables_h = pg_query($sql);
while($table = pg_fetch_assoc($tables_h))
{
        $sql = "SELECT pg_attribute.attname, pg_attrdef.adsrc FROM pg_attrdef
                JOIN pg_attribute ON pg_attribute.attrelid = " . $table['oid'] . " AND pg_attribute.attnum = pg_attrdef.adnum AND pg_attrdef.adrelid = pg_attribute.attrelid";
        $cols_h = pg_query($sql);
        while($column = pg_fetch_assoc($cols_h))
        {
                if(preg_match('/nextval\(\'([^\']+)\'::regclass\)/i', $column['adsrc'], $matches))
                {
                        $seq_name = $matches[1];
                        $sql = "SELECT MAX(" . $column['attname'] . ") AS maxvalue FROM " . $table['relname'];
                        $seq_h = pg_query($sql);
                        $seq = pg_fetch_assoc($seq_h);
                        if($seq['maxvalue'] > 0)
                        {
                                $sql = "SELECT SETVAL('$seq_name', " . $seq['maxvalue'] . ")";
                                pg_query($sql);
                                echo($sql . "\n");
                        }
                        else
                        {
                                echo("Skipped " . $column['adsrc'] . "\n");
                        }
                }
        }
}

?>
8. Правим config.inc, переключаем форум на новую БД
9. Смотрим код сторонних модов - их разработчики зачастую не заботятся о совместимости с другими СУБД, помимо MySQL. Меняем mysql-специфичные конструкции типа LIMIT 0, 10 на корректные.
A. Профит.

Аватара пользователя
Rayden
Former team member
Сообщения: 3739
Зарегистрирован: 27.06.2005 1:07
Поблагодарили: 44 раза
Контактная информация:

Re: Переезд с MySQL на PostgreSQL

Сообщение Rayden » 22.07.2009 17:17

Закрепляю тему
phpBB2 FAQ
phpBB3 FAQ

icemar
phpBB 1.0.0
Сообщения: 2
Зарегистрирован: 25.04.2016 15:35

Re: Переезд с MySQL на PostgreSQL

Сообщение icemar » 25.04.2016 15:38

Для конвертации базы phpbb 3.1 данный рецепт не помог. Использовал вот эту тулзу - https://github.com/AnatolyUss/FromMySqlToPostgreSql - все прошло на "ура".

Аватара пользователя
Мусоропровод
phpBB 1.4.1
Сообщения: 40
Зарегистрирован: 17.11.2014 19:08
Откуда: Берлин, Бункер, ковёр
Благодарил (а): 27 раз
Поблагодарили: 2 раза

Re: Переезд с MySQL на PostgreSQL

Сообщение Мусоропровод » 25.04.2016 15:52

А профит?

icemar
phpBB 1.0.0
Сообщения: 2
Зарегистрирован: 25.04.2016 15:35

Re: Переезд с MySQL на PostgreSQL

Сообщение icemar » 25.04.2016 15:57

А профит?
Нужно для корпоративного форума. Мигрируем с mysql везде, где только можно, поскольку в будущем планируем совсем отказаться от поддержки баз этой СУБД.

Аватара пользователя
Sumanai
phpBB 3.0.0 RC5
Сообщения: 1664
Зарегистрирован: 02.11.2014 13:57
Благодарил (а): 267 раз
Поблагодарили: 219 раз
Контактная информация:

Re: Переезд с MySQL на PostgreSQL

Сообщение Sumanai » 25.04.2016 17:56

А смысл?

Аватара пользователя
Мусоропровод
phpBB 1.4.1
Сообщения: 40
Зарегистрирован: 17.11.2014 19:08
Откуда: Берлин, Бункер, ковёр
Благодарил (а): 27 раз
Поблагодарили: 2 раза

Re: Переезд с MySQL на PostgreSQL

Сообщение Мусоропровод » 25.04.2016 22:28

Веб-сектантство :lol:
Сдается мне, что это затея самого главного сектанта.

Закрыто

Вернуться в «Поддержка phpBB 3.0.х»