ejabberd: переход с mnesia на mysql
Итак, предыстория: Стояли ejabberd-2.0.5-r3, mysql-5.0.70-r1.
Первое что нужно сделать – это установить модуль ejabberd, дающий возможность получить из mnesia таблицы mysql. Называется он mod_ctlextra.
Проще всего сделать это установив ejabberd-modules из SVN репазитория Process-One.
svn co https://svn.process-one.net/ejabberd-modules cd ejabberd-modules/mod_ctlextra/trunk ./build.sh cp ebin/*.beam /usr/lib/erlang/lib/ejabberd-2.0.5/ebin
Теперь в конфиге ejabberd (/etc/jabberd/ejabberd.cfg) добавим строчку, благодаря которой сервер подхватит новый модуль. Добавьте эту строчку в секцию Modules, где-нибудь в середине перечня модулей.
{mod_ctlextra, []},
Перезапустим сервер.
/etc/init.d/ejabberd stop /etc/init.d/ejabberd start
Я намеренно не использовал /etc/init.d/ejabberd restart, потому что команда очень глючная, после команды остановки, сервер не успевает остановиться, в то время как init-скрипт уже пытается его запустить. Это может привести к тому что придётся руками убивать pid-файл и процесс epmd, чего делать по понятным причинам не рекомендуется.
Подготовим директории для экспорта.
mkdir /tmp/base chmod 777 -R /tmp/base
Наконец начнём экспорт.
ejabberdctl export2odbc <домен> /tmp/base
После завершения операции вы увидите примерно следующее.
ls /tmp/base last.txt offline.txt passwd.txt roster.txt vcard_search.txt vcard.txt
Это дампы таблиц MySQL, которые вполне можно загрузить через PHPMyAdmin или mysql < file.txt.
Соотношение к структуре MySQL такое (текстовый файл -> таблица):
last.txt -> last offline.txt -> spool passwd.txt -> users roster.txt -> rostetusers vcard_search.txt -> vcard_search vcard.txt -> vcard
После того как структура готова, все домены Ejabberd загружены в MySQL, можно настраивать сервер на работу с БД MySQL. Как это сделать, описанно, например здесь. Только мне пришлось сделать ещё такое телодвижение.
cd ejabberd-modules/mysql/trunk ./build.sh cp ebin/*.beam /usr/lib/erlang/lib/ejabberd-2.0.5/ebin
Вот и всё
Если ставить ejabberd не из пакетов, а инсталятором с оф. сайта, то все компоненты располагаются в /opt/ejabberd-x.x.x/
где x.x.x – версия приложения.
В этом случае откомпеллированный модуль нужно скопировать в /opt/ejabberd-x.x.x/lib/ejabberd-x.x.x/ebin и сделать его исполняемым:
chmod +x mod_ctlextra.beam
Хм, а зачем же может понадобится ставить ejabberd инсталятором, когда есть репазитории?
Кстати он бинарную сборку ставит или компилирует?