恢复 Zimbra 损坏的数据库

恢复 Zimbra 损坏的数据库

我遇到了 Zimbra 的大问题。文件ibdata已损坏,我无法打开邮箱。我有msg里面的所有文件store/0/*,但我只有一周前的数据库备份。我试图恢复上周的文件,但它没有显示我们本周收到的电子邮件。逐个添加它们是不可能的,因为我们一周有数百封电子邮件,还有大量的 mboxgroup 文件夹。

有没有办法扫描所有邮箱并让 Zimbra 重建数据库?如果我必须编写脚本,我们如何区分备份邮件和服务器崩溃的邮件?

我们正在使用 Zimbra 的社区版。

答案1

好的..因为没有人回答,所以我已经解决了..

由于我们有很多电子邮件,并且分布在多个文件夹中,因此我们需要将数据库中的电子邮件与数据库中的电子邮件分开。

确保将这些...呃...损坏的数据文件夹复制到另一个文件夹中。这样如果出现问题,您可以随时将它们恢复原状。

  1. 所以第一步当然是关闭 zimbra

    service zimbra stop
    
  2. 然后将旧的工作mysql数据库复制到不工作的zimbra。

    cp /mnt/mail/db/* /opt/zimbra/db -R
    
  3. 现在,我们需要比较 7 月备份中 ~/store 中的邮件与运行 zimbra 时 ~/store 中的邮件。然后我将不是 7 月的每封邮件移动到 /opt/backup 的另一个相应文件夹。下面的脚本用于扫描所有存储和卷中的所有可用 .msg,然后移动到另一个文件夹。将下面的脚本保存到 iecompare.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 和 DESTINATION 变量以镜像您自己的文件夹。

    来源:当前正在运行的 zimbra 存储文件夹
    目的地:你想将丢失的文件移动到哪里
    比较:您的旧的工作 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/

  4. 重新启动 Zimbra

    service zimbra start
    
  5. 现在,我们需要获取所有邮箱

     mysql "zimbra" -e"select id,comment from mailbox"
    
  6. 剩下的就简单了,我们只需要像这样调用 CreateFolder 和 addMessage 来重新附加那些丢失的邮件:

    zmmailbox -z -m <[email protected]> cf "/Inbox/Recovered"
    zmmailbox -z -m <[email protected]> am "/Inbox/Recovered" "/opt/backup/<xx>"
    

例如:

假设我们从上面的第 2 步得到

+----+----------------------------------------------------+
| 编号 | 评论 |
+----+----------------------------------------------------+
| 1 |[电子邮件保护]                           |
| 2 |[电子邮件保护]                             |
+----+----------------------------------------------------+

我们应该将这些消息添加为:

zmmailbox -z -m [email protected] cf "/Inbox/Recovered"
zmmailbox -z -m [email protected] am "/Inbox/Recovered" "/opt/backup/1"

zmmailbox -z -m [email protected] cf "/Inbox/Recovered"
zmmailbox -z -m [email protected] am "/Inbox/Recovered" "/opt/backup/2"

您可以随意将 /Inbox/Recovered 更改为您喜欢的任何内容。

相关内容