Pull to refresh

ejabberd: мигрируем с mnesia на mysql

Reading time3 min
Views12K
По мере использования xmpp сервера ejabberd наблюдаю крайний дефицит документации. Каждый чих чуть отклоняющийся от стандартных потребностей приходится придумывать самому, либо собирать по кусочкам из конференций, списков рассылки, комментариев в svn и непосредственно исходников.

С выходом ejabberd 2.1.11, в котором разработчики добавили поддержку ODBC в новых модулях, я столкнулся с проблемой переноса данных из штатной БД mnesia в более подходящую под мои задачи mysql. Когда-то я ее уже решал для других модулей, но лишь отдаленно помню как. Сейчас попробую вспомнить и задокументировать процесс для будущего себя и всех кому это может быть интересно.



Итак у Вас есть ejabberd 2.1.11, использующий в качестве хранилища свою стандартную БД mnesia, а Вы не хотите ничего решатьхотите mysql.

Сначала создадим базу данных. Структуру для нее берем тут или в файле /src/odbc/mysql.sql в пакете с исходниками.

После этого надо экспортировать данные из mnesia. Нам понадобится модуль mod_admin_extra, входящий в состав ejabberd-modules.

Качаем:
svn co svn.process-one.net/ejabberd-modules

Так как mod_admin_extra давно не обновлялся, то про новые модули и следовательно новые таблицы он ничего не знает. Я решил вопрос топорно: открыл исходник ejabberd-modules/mod_admin_extra/trunk/src/mod_admin_extra.erl и кусок
 
              {export_last, last},
              {export_offline, offline},
              {export_passwd, passwd},
              {export_private_storage, private_storage},
              {export_roster, roster},
              {export_vcard, vcard},
              {export_vcard_search, vcard_search}],


заменил на

              {export_last, last},
              {export_offline, offline},
              {export_passwd, passwd},
              {export_private_storage, private_storage},
              {export_roster, roster},
              {export_vcard, vcard},
                {export_motd, motd},
                {export_motd_users, motd_users},
                {export_muc_registered, muc_registered},
                {export_muc_room, muc_room},
                {export_sr_group, sr_group},
                {export_sr_user, sr_user},
              {export_vcard_search, vcard_search}],


Примечание: Я не использую irc-транспорт, так как предпочитаю теплые ламповые irc-клиенты, и mod_irc у меня выключен. Если же Вы его используете, вероятно, Вам надо будет добавить в список что-то типа '{export_irc, irc},'. Точно можно узнать, сделав ls /var/spool/jabber/*.DCD и получив на выходе имена таблиц в mnesia.

Собираем (нужен erlang):

cd ejabberd-modules/mod_admin_extra/trunk
./build.sh


Примечание: более подробную инструкцию по сборке можно посмотреть на домашней странице ejabberd-modules.

Аналогично собираем ejabberd-modules/mysql.

Кидаем получившийся ejabberd-modules/mod_admin_extra/trunk/ebin/mod_admin_extra.beam и ejabberd-modules/mysql/trunk/ebin/*.beam в ebin в установке ejabberd (у меня это /usr/lib/erlang/lib/ejabberd-2.1.11/ebin/).

Отрубаем сервер ejabberd от сети для надежности и перезапускаем (но не останаваливаем!).

Создаем папку доступную на запись пользователю, из-под которого запущен ejabberd (у меня это jabber:jabber, но я просто сделал mkdir /tmp/temp; chmod 777 /tmp/temp).

Экспортируем данные из mnesia ( - домен Вашего jabber-сервера):
ejabberdctl export2odbc /tmp/test/
на выходе получаем txt файлы с sql-запросами, готовые для выполнения в mysql. Выполняем их (я использовал попсовый phpMyAdmin). Дампы после этого лучше сразу удалить, так как в них явки-пароли в явном виде.
Почему-то создаются файлы для всех таблиц в mnesia, но не прописанные нами имеют нулевую длину. Прописанные, но пустые у меня - 14 байт.

Повторяем последний абзац для каждого домена, если их несколько.

Итак, база готова!

Сегодня пятница и я позволю себе схалявить и не расписывать непосредственно настройку ejabberd для mysql. Благо это много где описано (да хоть в официальной документации) и легко гуглится.

Если очень вкратце, то в конфиге должны быть
{auth_method, odbc}

{odbc_server, {mysql, "host", "db", "user", "pass"}}.
если не один домен, то
{host_config, "domain2", [{odbc_server, {mysql, "host2", "db2", "user2", "pass2"}}]}.

а так же меняем имена модулей тех модулей, которые хотим в мускуль XXX->XXX_odbc, у меня это:
mod_announce_odbc
mod_blocking_odbc
mod_last_odbc
mod_muc_odbc
mod_offline_odbc
mod_privacy_odbc
mod_private_odbc
mod_pubsub_odbc
mod_roster_odbc
mod_shared_roster
mod_vcard_odbc
mod_vcard_xupdate_odbc




Уже дописывая, нашел статью про то же самое, но от 2009 года, там некоторые вещи устарели, так что надеюсь кому-то моя статья будет полезной. Всем приятных выходных. Не забывайте, что сообщения об ошибках и неточностях в статье приветствуются, но в личку.
Tags:
Hubs:
+14
Comments7

Articles