I. Tạo thư mục backup, ví dụ, với quyền root:
mkdir /backup
Thư mục /backup này sẽ chứa các folder backup được đặt tên theo ngày, đồng thời chứa các script và file userlist.
II. Tạo danh sách user cần backup
cd /backup
touch backup-userlist.txt

Liệt kê email các user cần sao lưu mailbox. Bạn cũng có thể lấy danh sách user bằng lệnh zmprov -l gaa > /backup/backup-userlist.txt.
user1@zimilab.com
user2@zimilab.com
user3@zimilab.com
III. Tạo script full backup
touch full-backup-mailbox.sh
chmod +x full-backup-mailbox.sh
Nội dung script như sau: Ta sẽ backup dữ liệu 365 ngày kể từ thời điểm chạy script. Bạn có thể thay đổi theo nhu cầu.
##!/bin/bash
clear

## Backup Format
FORMAT=tgz

## Backup location
ZBACKUP=/backup

## Folder name for backup and using date
DATE=`date +"%d%m%y"`

## Backup location separate by date
ZDUMPDIR=$ZBACKUP/full-$DATE

## zmmailbox location
ZMBOX=/opt/zimbra/bin/zmmailbox

### Backup Option ###

## Based on few day ago until today, example 365 days ago

HARI=`date --date='365 days ago' +"%m/%d/%Y"`
query="&query=after:$HARI"

## Based on certain date , example 21 Jan 2015.

#query="&query=date:01/21/2015"

## Based from/to certain date. Example Backup Mailbox before 21 Jan 2015 and after 10 Jan 2015

#query="&query=after:01/10/2015 before:01/21/2015"

if [ ! -d $ZDUMPDIR ]; then
mkdir -p $ZDUMPDIR
fi

## Looping Account Zimbra
#for account in `su - zimbra -c 'zmprov -l gaa | sort'`
for account in `cat $ZBACKUP/backup-userlist.txt`
do
echo "Processing mailbox $account full backup..."
$ZMBOX -z -m $account getRestURL "//?fmt=${FORMAT}$query" > $ZDUMPDIR/$account.${FORMAT}
done

echo "Zimbra Mailbox backup has been completed successfully."

IV. Tạo script incremental backup (tùy chọn)
touch inc-backup-mailbox.sh
chmod +x inc-backup-mailbox.sh
Nội dung script như sau: Nếu cho chạy mỗi ngày thì sẽ backup dữ liệu 1 ngày kể từ thời điểm chạy script.
##!/bin/bash
clear

## Backup Format
FORMAT=tgz

## Backup location
ZBACKUP=/backup

## Folder name for backup and using date
DATE=`date +"%d%m%y"`

## Backup location separate by date
ZDUMPDIR=$ZBACKUP/inc-$DATE

## zmmailbox location
ZMBOX=/opt/zimbra/bin/zmmailbox

### Backup Option ###

## Based on few day ago until today, example 1 days ago

#HARI=`date --date='1 days ago' +"%m/%d/%Y"`
#query="&query=after:$HARI"

## Based on certain date , example 21 Jan 2015.

#query="&query=date:01/21/2015"

## Based from/to certain date. Example Backup Mailbox before 21 Jan 2015 and after 10 Jan 2015

#query="&query=after:01/10/2015 before:01/21/2015"

if [ ! -d $ZDUMPDIR ]; then
mkdir -p $ZDUMPDIR
fi

## Looping Account Zimbra
#for account in `su - zimbra -c 'zmprov -l gaa | sort'`
for account in `cat $ZBACKUP/backup-userlist.txt`
do
echo "Processing mailbox $account incremental backup..."
$ZMBOX -z -m $account getRestURL "//?fmt=${FORMAT}$query" > $ZDUMPDIR/$account.${FORMAT}
done

echo "Zimbra Mailbox backup has been completed successfully."

V. Đưa vào crontab.
Chaỵ full backup mỗi 1:10am chủ nhật, chạy incremental backup mỗi 1:10am từ thứ 2 đến thứ 7. Xóa các thư mục backup cũ hơn 30 ngày hằng tuần
crontab -e
10 1 * * 0 /bin/sh /backup/full-backup-mailbox.sh > /dev/null 2>&1
10 1 * * 1-6 /bin/sh /backup/inc-backup-mailbox.sh > /dev/null 2>&1
1 1 * * * find /backup/* -type d -mtime +30 -exec rm -rf {} +

VI. Tạo script phục hồi
touch restore-userlist.txt
Nội dung:
user1@zimilab.com
user2@zimilab.com
Tạo script:
touch restore-mailbox.sh
chmod +x restore-mailbox.sh
Nội dung:
#!/bin/bash

##Usage: ./restore-mailbox.sh <backup folder name>
##Example: ./restore-mailbox.sh full-050522

ZBACKUP=/backup
BACKUPDIR="$ZBACKUP/$1";

clear

echo "Retrieve all zimbra user name..."

USERS="$ZBACKUP/restore-userlist.txt"

for ACCOUNT in `cat $USERS`; do
NAME=`echo $ACCOUNT`
echo "Restoring $NAME mailbox..."
su - zimbra -c "zmmailbox -z -m $NAME postRestURL '//?fmt=tgz&resolve=skip' $BACKUPDIR/$NAME.tgz";
done
echo "All mailbox has been restored sucessfully"

Để chạy script này, bạn gọi script kèm tham số tên thư mục backup muốn restore.
./restore-mailbox.sh full-050522

Bonus: bạn nên backup ldap và mariadb để phòng trường hợp cần xây dựng lại server từ đầu.
###########################
Backup ldap và mysql. Với quyền root.
mkdir /backupzimbra
cd /backupzimbra

Tạo script như sau:
touch ldap-mysql-backup.sh
chmod +x ldap-mysql-backup.sh
Nội dung script:

#!/bin/bash

## Backup location
ZBACKUP=/backupzimbra
ZBACKUPLDAP=${ZBACKUP}/ldap
ZBACKUPMYSQL=${ZBACKUP}/db_backup

## Folder name for backup and using date
DATE=`date +"%d%m%y"`

## Ldap Backup location separate by date
ZLDAPDUMPDIR=$ZBACKUPLDAP/$DATE
ZMYSQLDUMPDIR=$ZBACKUPMYSQL/$DATE

if [ ! -d $ZLDAPDUMPDIR ]; then
mkdir -p $ZLDAPDUMPDIR
fi

if [ ! -d $ZMYSQLDUMPDIR ]; then
mkdir -p $ZMYSQLDUMPDIR
fi

#Rsync Zimbra while still online...reduces downtime
rsync -avHK --delete --exclude 'data.mdb' /opt/zimbra ${ZBACKUP}/

#Backup ldap database
#This line is necessary after the first database backup because mdb_copy won't delete existing file
mv $ZLDAPDUMPDIR/data.mdb $ZLDAPDUMPDIR/data.mdb.bak

su - zimbra -c "/opt/zimbra/common/bin/mdb_copy /opt/zimbra/data/ldap/mdb/db $ZLDAPDUMPDIR"
su - zimbra -c "/opt/zimbra/libexec/zmslapcat $ZLDAPDUMPDIR"
su - zimbra -c "/opt/zimbra/libexec/zmslapcat -c $ZLDAPDUMPDIR"
su - zimbra -c "/opt/zimbra/libexec/zmslapcat -a $ZLDAPDUMPDIR"

#Backup mariadatabase FULL
su - zimbra -c "mariabackup --backup -S /opt/zimbra/data/tmp/mysql/mysql.sock --target-dir=$ZLDAPDUMPDIR --user=root --password=`zmlocalconfig -s -m nokey mysql_root_password`"

#Stop Zimbra Services
su - zimbra -c 'zmcontrol stop'

sleep 30

#Rsync again while zimbra services are stopped
rsync -avHK --delete --exclude 'data.mdb' /opt/zimbra ${ZBACKUP}/

#Start zimbra services
su - zimbra -c 'zmcontrol start'

exit