Восстановление поврежденной базы данных Zimbra
У меня огромная проблема с Zimbra. ibdata
Файл поврежден, и я не могу открыть почтовые ящики. У меня есть все msg
файлы внутри store/0/*
, но у меня есть резервная копия базы данных только неделю назад. Я пытался восстановить файлы с прошлой недели, но он не показывает электронные письма, которые мы получили на этой неделе. Добавить их по одному невозможно, так как у нас есть сотни писем в неделю и множество папок mboxgroup.
Есть ли способ проверить все почтовые ящики и позволить Zimbra восстановить базу данных? Если мне нужно создать сценарий, как мы можем различить почту между резервной копией и сбой сервера?
Мы используем общественное издание Zimbra.
1 ответ
Хорошо.. так как никто не ответил, у меня это получилось..
Так как у нас много писем и они распределены по нескольким папкам, нам нужно разделить те, что в базе данных, и те, которые не являются..
Убедитесь, что вы скопировали эти... э... поврежденные папки с данными в другую папку. Так что, если что-то пойдет не так, вы всегда можете собрать их вместе.
Итак, первый шаг, это, конечно, отключение Zimbra
service zimbra stop
затем скопируйте старую рабочую базу данных mysql в нерабочую зимбру.
cp /mnt/mail/db/* /opt/zimbra/db -R
Теперь нам нужно сравнить эти письма в ~/store при резервном копировании в июле с письмами в ~/store при работающем zimbra. Затем я переместил каждое письмо не в июле в другую соответствующую папку в /opt/backup. Приведенный ниже сценарий предназначен для сканирования всех доступных.msg во всех магазинах и томах и перемещения в другую папку. Сохраните этот скрипт ниже, т.е.
compare.sh
SOURCE=/opt/zimbra/store/0 DESTINATION=/opt/backup COMPARE=/mnt/mail/store/0 for f in $SOURCE/*; do echo "scanning folder ${f##*/}"; for v in $f/msg/*; do comp=$COMPARE/${f##*/}/msg/${v##*/} dst=$DESTINATION/${f##*/} if [ ! -d $dst ]; then echo "create $dst" mkdir $dst; fi echo "comparing volume $v to $comp" if [ -d $comp ] ; then for m in $v/*; do if [ ! -f $comp/${m##*/} ]; then echo "move $m to $dst" mv -b $m $dst fi done else echo "move $v/* to $dst" mv -b $v/* $dst fi done; done;
Убедитесь, что вы изменили переменные SOURCE, COMPARE dan DESTINATION для зеркалирования ваших собственных папок.
ИСТОЧНИК: Текущая текущая папка в хранилище Zimbra DESTINATION: куда вы хотите переместить отсутствующие файлы СРАВНИТЕ: Где находится ваша старая рабочая резервная копия zimbra, та, которую вы используете в своей базе данных.
затем
chmod a+x compare.sh
чтобы сделать его исполняемым тогда./compare.sh
выполнить это.Результатом будет /opt/backup/1 в /opt/backup/xx, где xx - хранилища почтовых ящиков. Все сообщения, которые были перемещены в / opt / backup / x, не находятся в исходном почтовом ящике и будут добавлены.
Итак, теперь у нас есть 2 папки.
/opt/backup/xx
который содержит файлы не в базе данных, и/opt/zimbra/
который должен быть в значительной степени идентичен/mnt/mail/
Запустить Zimbra назад
service zimbra start
Теперь нам нужно получить все почтовые ящики
mysql "zimbra" -e"select id,comment from mailbox"
Остальное легко, нам нужно только вызвать CreateFolder и addMessage, как эти, чтобы повторно прикрепить эти пропущенные письма:
zmmailbox -z -m <user@domain.net> cf "/Inbox/Recovered" zmmailbox -z -m <user@domain.net> am "/Inbox/Recovered" "/opt/backup/<xx>"
например:
Допустим, у нас есть от шага 2 выше
+----+----------------------------------------------------+ | id | комментарий | +----+----------------------------------------------------+ | 1 | mymailbox@bogusmail.xcom | | 2 | awesome@bogusmail.xcom | +----+----------------------------------------------------+
Мы должны добавить эти сообщения как:
zmmailbox -z -m mymailbox@bogusmail.xcom cf "/Inbox/Recovered"
zmmailbox -z -m mymailbox@bogusmail.xcom am "/Inbox/Recovered" "/opt/backup/1"
zmmailbox -z -m awesome@bogusmail.xcom cf "/Inbox/Recovered"
zmmailbox -z -m awesome@bogusmail.xcom am "/Inbox/Recovered" "/opt/backup/2"
Не стесняйтесь изменить это / Входящие / Восстановлено на что угодно.