Пропустить

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

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

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).

Переезд с 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. Профит.

TolicH
phpBB 1.0.0
 
Сообщения: 6
Зарегистрирован: 21.07.2009 22:21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

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

Закрепляю тему
phpBB2 FAQ
phpBB3 FAQ
Аватара пользователя
Rayden
Former team member
 
Сообщения: 3795
Зарегистрирован: 27.06.2005 1:07
Благодарил (а): 0 раз.
Поблагодарили: 29 раз.


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

 

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Бессрочный конкурс phpBB-ориентированных материалов
FastVPS — надёжный и доступный хостинг для phpBB
Место для вашей рекламы