在不使用Zextras的情况下配置完整和单独的Zimbra OSE备份和恢复

图片

1.从哪里开始


备份从哪里开始? 规划。 在备份任何系统时,您需要制定一个备份计划:确切地说,要存储多少时间,要存储多长时间,是否会有足够的可用空间? 从这些问题的答案中,主要问题的答案如下-如何备份?

如果有很多可用空间,则可以存储整个虚拟机。 按计划使用相同的Veeam进行备份,而不用考虑困难。 但是对于我来说,这是一种浪费,我习惯了尽可能简洁,经济地完成所有工作。 当然,我已经部署了Veeam,但我只为那些很长时间无法从备份中部署或存在问题的系统制作备份副本。

关于虚拟环境管理工具的脚本,我将仅保持有意义的沉默。

Zimbra有一个zmmailbox工具。 而且,在仔细检查了它的功能之后,我意识到这对我来说绰绰有余。 他甚至可以在实时系统上备份和还原邮箱。 我喜欢将关键邮箱与整个系统的备份分开备份的功能。 因此,备份所占用的空间将受到存档邮箱大小乘以“备份深度”天数的限制,而不是整个系统的容量乘以相同天数的限制。 此外,在Zimbra的情况下,从整个系统的备份中恢复非常困难。 设置系统后,立即使用Veeam或虚拟环境管理工具(Hyper-V,ESXI,输入所需的虚拟机)复制虚拟机,并将其“放在架子上”要容易得多,这样,在关键时刻,您可以快速部署几乎没有重量的VM并上传在它的箱子备份。 我认为,这在所有方面都是最便宜的方案。

2.源数据:


服务器操作系统 :CentOS 7

关于操作系统
实际上,CentOS7与任何其他系统之间的区别仅在于向服务器发送命令以安装软件包,并且可能还有一些文件的位置。 该工作主要是使用Zimbra cmdlet进行的,因此配置差异将最小。

Zimbra网域 :zimbramail.home.local
访问共享文件夹的用户名和密码 :ZimbraBackUp / 123123
共享文件夹的路径 :\\ BackUpServer1 \ ZM \
将球安装在Zimbra主机上的路径 :/ mnt / ZM /

3.设定


因此,让我们开始吧!

我们会将备份写入共享文件夹中运行Windows的服务器。 如果愿意,您可以在任何位置合并备份,但是一切都已设置好,以便大多数备份都写入BackUpServer1.home.local。 这样:

1)我们在用户域中创建访问此服务器上共享文件夹的文件夹,以便可以将其安装在Zimbramail.home.local服务器上。 用户名ZimbraBackUp,密码,条件为123123。

2)在BackUpServer1服务器上,在存储库中创建\ ZM \目录并共享它,为ZimbraBackUp用户提供更改权限。 球的路径将是:\\ BackUpServer1 \ ZM \

3)将球安装到Zimbramail.home.local服务器。 为了自动安装该文件夹,您需要通过添加以下行来修复/ etc / fstab文件:

//BackUpServer/ZM /mnt/ZM cifs user,uid=500,rw,suid,username=ZimbraBackUp,password=123123 0 0 

但是首先,您需要检查安装是否有效:

 $ mount -t cifs //BackUpServer/ZM /mnt/ZM -o user=ZimbraBackUp,password=123123 

通常会出现如下错误:

 mount: wrong fs type, bad option, bad superblock on //BackUpServer1/ZM/, missing codepage or helper program, or other error (for several filesystems (eg nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so. 

您可以通过安装cifs-utils来修复它:

 $ yum install cifs-utils 

设置后,建议重新启动服务器。

4)创建3个脚本文件:FullBackUp.sh HandBackUp.sh Restore.sh

第一个文件将用于自动创建计划的备份,第二个文件用于备份单个邮箱的功能,或者简单地手动启动“假设”。 第三个脚本是一次恢复一个或所有盒子。 我尝试了尽可能多地评论脚本和规定的日志记录的工作。

FullBackUp.sh文件的内容:
 #!/bin/bash #   Path="/mnt/ZM/BackUps" #    ArchPath="/mnt/ZM/Archive" #    MPath="/mnt/ZM/Mounthly" #  Zimbra ZDomain="zimbramail.home.local" #  MBoxes="/mnt/ZM/MBoxesList" #  CDate=$(date +%d-%m-%Y) #   MDay=$(date +%d) #   log="/mnt/ZM/BackUpLog.txt" echo -en "BackUp ALL MailBoxes started in $(date +%T)\n" >> $log #       if [ ! -d $Path ]; then #     echo "    ..." mkdir -p $Path if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "BackUp dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "BackUp dirctory was NOT created in $(date +%T)\n" >> $log fi else echo "    ,      ..." fi #       if [ ! -d $Path/$CDate ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo #        echo "       ..." mkdir -p $Path/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "BackUp CDate dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "BackUp CDate dirctory was NOT created in $(date +%T)\n" >> $log fi else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo "    ,     ..." fi #     /opt/zimbra/bin/zmprov -l gaa $ZDomain > $MBoxes #    if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Boxes list created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box list is NOT created! in $(date +%T)\n" >> $log exit fi #       for MailBox in $( cat $MBoxes); do echo "    $MailBox..." /opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBox if [ $? -eq 0 ]; then #        echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $log fi done #     echo "    ..." echo -n > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "File $MBoxes clear\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "File $MBoxes can NOT be cleared\n" >> $log fi #      #      if [ ! -d $ArchPath ]; then #    echo "   ..." mkdir -p $ArchPath if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive dirctory was NOT created in $(date +%T)\n" >> $log fi else echo "   , ..." fi tar -czf $ArchPath/$CDate.tar $Path/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive created in $(date +%T)\n" >> $log #         if [ "$MDay" = 1 ]; then #      if [ ! -d $MPath ]; then #     echo "    ..." mkdir -p $MPath if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Long saving dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Long saving dirctory was NOT created in $(date +%T)\n" >> $log fi else #  echo "    ,     ..." fi cp $ArchPath/$CDate.tgz $MPath/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive is copied in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT copied in $(date +%T)\n" >> $log fi echo "    ( 1 )..." # ,   ,   find $Path -atime +7 | xargs rm -d if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Old BackUps files was deleted\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Old BackUps files is NOT deleted in $(date +%T)\n" >> $log fi #    ( 2 ) echo "     ( 2 )..." find $ArchPath -atime +61 | xargs rm -f if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Old BackUps archives was deleted\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Old BackUps archives is NOT deleted in $(date +%T)\n" >> $log fi fi else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT created in $(date +%T)\n" >> $log fi echo "BackUp job finished in $(date +%T)" #  -     echo -en "BackUp job finished in $(date +%T) $(date +%T)\n" >> $log echo -en "_____________________________________________\n" >> $log 

HandBackUp.sh的文件内容:
 #!/bin/bash #   Path="/mnt/ZM/BackUps" #    ArchPath="/mnt/ZM/Archive" #  Zimbra ZDomain="zimbramail.home.local" #  MBoxes="/mnt/ZM/MBoxesList" #  CDate=$(date +%d-%m-%Y) #   log="/mnt/ZM/BackUpLog.txt" read -p "    (  ),  ALL      : " A if [[ "$A" = "ALL" || "$A" = "all" ]]; then echo -en "BackUp started in $(date +%T)\n" >> $log #     echo "    ..." /opt/zimbra/bin/zmprov -l gaa $ZDomain > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Boxes list created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box list is NOT created! in $(date +%T)\n" >> $log exit fi if ! [ -d $Path/$Date ]; then #    mkdir -p $Path/$CDate/ echo -en "BackUp directory created in $(date +%T)\n" >> $log fi #       echo "      " for MailBox in $( cat $MBoxes); do echo "    $MailBox..." /opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBox if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $log fi done else MailBox="$A@$ZDomain" #    echo "   ..." Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox) if [ $? -eq 0 ]; then #   echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo "  $MailBox ,  ..." echo -en "Required Mail Box $MailBox exist $(date +%T)\n" >> $log #      if ! [ -d $Path/$Date ]; then #    mkdir -p $Path/$CDate/ echo -en "BackUp directory created in $(date +%T)\n" >> $log fi #    $MailBox /opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBox if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $log fi else #    -  echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo "  $MailBox  .   " echo -en "Required Mail Box $MailBox is not exist\n" >> $log exit fi fi read -p "      $MailBox? [N]: " F if [[ "$F" = "Y" || "$F" = "y" ]]; then #      if [ ! -d $ArchPath ]; then #     echo "   ..." mkdir -p $ArchPath if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive dirctory was NOT created in $(date +%T)\n" >> $log fi else echo "   , ..." fi #    echo "  ..." if [[ "$A" = "ALL" || "$A" = "all" ]]; then tar -czf $ArchPath/$CDate.tar $Path/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT created in $(date +%T)\n" >> $log fi else tar -czf $ArchPath/$MailBox.tar $Path/$CDate/$MailBox if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT created in $(date +%T)\n" >> $log fi fi else echo "   " echo -en "User decline archive creating\n" >> $log fi #     echo "    ..." echo -n > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo fi echo "BackUp job finished in $(date +%T) $(date +%T)" #  -     echo -en "BackUp job finished in $(date +%T) $(date +%T)\n" >> $log echo -en "_____________________________________________\n" >> $log 

Restore.sh文件的内容:
 #!/bin/bash #   Path="/mnt/ZM/BackUps" #  Zimbra ZDomain="zimbramail.home.local" #  MBoxes="/mnt/ZM/MBoxesList" #   log="/mnt/ZM/RestoreLog.txt" read -p "  ,      02-09-2001: " Date if ! [ -d $Path/$Date ]; then echo "     ." echo -en "No BackUp file at $Date $(date +%T)\n" > $log exit fi read -p "    (  ),  ALL        : " A if [[ "$A" = "ALL" || "$A" = "all" ]]; then echo -en "Restore started in $(date +%T)\n" >> $log #     ls "$Path/$Date" > $MBoxes for MailBox in $( cat $MBoxes); do #   echo "   $MailBox" Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Start restore job for $MailBox $(date +%T)\n" >> $log echo " $MailBox . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Mail Box $MailBox does not exist, creating Mail Box $MailBox $(date +%T)\n" >> $log echo " $MailBox  .   $MailBox..." #   Result=$(/opt/zimbra/bin/zmprov ca $MailBox 12345678 displayName "$MailBox") if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Mail Box $MailBox is created, starting restore $(date +%T)\n" >> $log echo " $MailBox  . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Can NOT create Mail Box $MailBox ! $(date +%T)\n" >> $log echo " $MailBox   ." fi fi #  Result=$(/opt/zimbra/bin/zmmailbox -z -m $MailBox postRestURL "//?fmt=tgz&resolve=replace" $Path/$Date/$MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en " $MailBox   $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en " $MailBox  ! $(date +%T)\n" >> $log fi done else #     MailBox="$A@$ZDomain" if [ -a $Path/$Date/$MailBox ]; then #   echo "   $MailBox..." Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Start restore job for $MailBox $(date +%T)\n" >> $log echo " $MailBox . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Mail Box $MailBox does not exist $(date +%T)\n" >> $log echo " $MailBox  ." read -p "            ? [N]: " B if [[ "$B" = "Y" || "$B" = "y" ]]; then echo "   $MailBox..." Result=$(/opt/zimbra/bin/zmprov ca $MailBox 12345678 displayName "$MailBox") #   if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Mail Box $MailBox is created, starting restore $(date +%T)\n" >> $log echo " $MailBox  . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Can NOT create Mail Box $MailBox ! $(date +%T)\n" >> $log echo " $MailBox   .   ..." exit fi else #   ,  .  echo "   .   " exit fi fi #  Result=$(/opt/zimbra/bin/zmmailbox -z -m $MailBox postRestURL "//?fmt=tgz&resolve=replace" $Path/$Date/$MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en " $MailBox   $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en " $MailBox  ! $(date +%T)\n" >> $log fi else #     echo "    .   " echo -en "Required BackUp file is not exist\n" >> $log exit fi fi #     echo "    ..." echo -n > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo fi echo "BackUp job finished in $(date +%T) $(date +%T)" #  -     echo -en "Restore job complete in $(date +%T)\n" >> $log echo -en "____________________________________\n" >> $log 

有一个微妙之处。 如果在Windows下为bash创建和编辑脚本文件,那么当您尝试运行脚本时,将出现错误: / bin / sh ^ M:错误的解释器:没有这样的文件或目录 ,即在Windows下运行的编辑器添加到该行的末尾是回车符“ CR \ LF”,Linux上的编辑器不会显示。 但是这个符号在那里,并没有消失。 为了摆脱错误并删除多余的字符,我们执行以下操作:

 $ cat your-script.sh | tr -d '\r' > corrected-your-script.sh 

好了,或者您可以使用dos2unix实用程序,但是仍然需要安装它:

 $ yum install dos2unix $ dos2unix your-script.sh 

5)我们使脚本可执行:

 $ chmod 0740 /opt/zimbra/BkUpRestScripts/FullBackUp.sh $ chmod 0740 /opt/zimbra/BkUpRestScripts/HandBackUp.sh $ chmod 0740 /opt/zimbra/BkUpRestScripts/Restore.sh 

6)我建议您用手运行脚本,并检查它们是否有效以及如何工作。

7)在CRON中创建一个邮箱的每日备份任务:

 10 0 * * * root /opt/zimbra/ BkUpRestScripts/FullBackUp.sh 

8)享受

4.脚本编写


如果脚本本身的注释没有帮助。

1)脚本FullBaclUp.sh:
首先,确定变量,由哪个变量负责-注释所有内容。

以下是检查是否缺少要备份的目录;如果不存在该目录,则会创建该目录。 对于日志文件和屏幕(如果是手动启动),可以得出有关创建目录成功与否的结论。

用今天的日期检查缺少的目录。 如果不存在,则会创建它,并生成屏幕输出和创建目录结果的日志。

将所有现有的Zimbra邮箱写入文件。 顺序保留每个框需要它。 显示命令的结果。

从收到的列表中为每个邮箱创建备份。 将执行输出输出到屏幕和日志文件。

清除带有列表框的文件。 由于所有3个脚本均与此文件一起使用,因此建议在每次运行后对其进行清理,以免出现意外。 您可以在脚本开始之前对其进行清理,但是对于我来说,某种程度上来说,我不熟悉在工作完成后不存储不必要的数据,而是在脚本工作之前和之后进行相同的操作会导致精神分裂症。

接下来是创建压缩存档的块。

检查档案存储目录的不存在,在不存在的情况下创建它,并在屏幕和日志中显示创建结果。

存档

选中“今天不是第一天吗?” 我宁愿长时间存储所有第一天的备份,这足以让我工作。 它可以存储数周,但是通常这是多余的。 但是在整个邮件服务器运行期间存储备份的条件设置为最高,因此它们将永远存在。 如果数字是第一个,则将生成的存档复制到单独的“ Mounthly”目录中。 要将其复制到该目录,您需要检查是否存在该目录,如果没有,请创建该目录,该目录应报告到屏幕和日志文件中。

接下来,清理存储-删除所有超过2周的备份以及超过61天的存档。 删除的结果显示在屏幕和日志文件中。

之后,脚本将完成时间写入日志文件和屏幕,并结束其工作。

2)脚本HandBackUp.sh:
在开始时,还定义了变量,并对需要变量的原因进行了评论。

接下来,提示用户输入需要备份的邮箱的名称,而无需指定Zimbra域。 (将其写在邀请函中),或通过写ALL或all来选择所有邮箱的备份。

如果您选择备份所有邮箱,则该脚本的工作原理几乎与上面列出的第一个相同,只是在创建每个邮箱的备份后,它会询问-我是否需要存档它们?

如果写入了特定邮箱,则在Zimbra中检查其存在。 如果存在具有指定名称的框,则该框的备份过程开始,并且相应的信息将显示在屏幕上和日志文件中。 如果指定的框不存在,则将通知用户此信息,脚本将完成其工作。

盒子的备份完成后,将提示您存档副本。 如果用户同意-如第一个脚本中所示,检查是否缺少用于存储档案的目录,并进一步查找列表。

归档完成后,带有邮箱列表的文件将被清除。 以防万一。

最后,有关脚本完成时间的信息将显示在屏幕上和日志文件中。

3)脚本Restore.sh:
与之前的文件一样,第一个-带注释的变量的定义。

提示用户选择要还原的备份日期。 如果指定的日期不在备份中,则通过报告此脚本来终止该脚本。

如果存在指定日期的备份-提示用户输入需要恢复的框的名称。 要还原所有框,您需要写ALL或ALL。

如果选择ALL选项,则脚本将在文件的备份文件夹中创建文件列表,并通知创建结果。

接下来是每个盒子的分步恢复。 首先,检查系统中是否存在一个框,如果没有,则创建该框,然后将其还原。 有关每个操作的信息显示在日志文件和屏幕上。

如果选择一个特定的框,则几乎相同。 检查是否存在具有所请求名称的文件。 输出到屏幕和结果日志文件。

检查系统中是否存在盒子。 输出到屏幕和结果日志文件。
邀请用户同意在系统中不存在框的情况下创建框。 输出到屏幕和结果日志文件。

如果同意,请创建一个框。 输出到屏幕和结果日志文件。
邮箱恢复。 输出到屏幕和结果日志文件。

清除带有恢复框列表的文件。

最后,有关脚本完成时间的信息将显示在屏幕上和日志文件中。

5.关于恢复


如果您稍加修改这些脚本,那么它们非常适合于在服务器之间移动邮件,只需在新位置创建包含所有内容的邮箱即可。 您也可以从头开始还原系统,由于某种原因,重新启动Zimbra服务器要比尝试恢复旧服务器容易。 如上所述,您可以通过在必要时展开配置的虚拟机的映像来保存映像,并用所有数据填充该映像。 从一台Zimbra服务器移动到另一台Zimbra服务器的算法相同。 不需要像Zextras这样的付费实用程序。

6.结论


通常,我编写的脚本没有什么复杂的。是的,其中有很多条件,因为我试图预测他们工作中尽可能多的问题和错误,但是我也尝试尽可能清晰地对脚本进行评论。开箱即用,它们很可能不会对每个人都起作用。也许某人根本没有这种备份方法。但我希望许多人会发现它有用。

7. PS:


这是“我如何实现Zimbra”系列的第二篇文章。第一个是关于实现,LDAP授权和为AD用户自动创建邮箱的信息,就在这里
在Zimbra OSE中有关自动生成和更新基于AD的邮件列表的第三篇文章在这里

而且我还想指出,这是我第一次在bash上编写脚本,因此,脚本如此庞大且“特别聪明”,正如他们所说。

Source: https://habr.com/ru/post/zh-CN439728/


All Articles