#!/bin/bash # sources # https://wiki.zimbra.com/wiki/LDAP_data_import_export # http://wiki.zimbra.com/wiki/Mysql_Crash_Recovery # http://wiki.zimbra.com/wiki/CLI_zmvolume set -e # set limits as per zmslapadd ulimit -n 32768 ulimit -c unlimited ulimit -v unlimited # utility functions run_as_zimbra() { chroot --userspec zimbra:zimbra / "${@}" } export PATH=/opt/zimbra/bin:$PATH:/opt/zimbra/libexec source ~zimbra/bin/zmshutil ; zmsetvars # global variables we'll use... store_backup=/opt/zimbra.restorable/store index_backup=/opt/zimbra.restorable/store config_backup=/opt/zimbra.restorable mysql_backup=/opt/zldapbackup ldap_backup=/opt/zldapbackup zimbra_path=/opt/zimbra configs=( conf .saveconfig jdk-1.7.0_45/jre/lib/security/cacerts jetty-distribution-7.6.12.v20130726/etc/keystore ) # Parse options... case $1 in -v|--verbose|--debug) verbose=--verbose esac cp="rsync ${verbose} -HaS" ### step one, stop the world. /etc/init.d/zimbra stop ## restore mysql mkdir -p ~zimbra/backup/mysql_binlog/ run_as_zimbra mysql.server restart databases=( $( run_as_zimbra mysql --batch --skip-column-names -u root --password=${mysql_root_password} -e "show databases" \ | awk '!/(information|performance)_schema/{print $1}' ) ) for db in "${databases[@]}" ; do run_as_zimbra mysql ${verbose} --batch --skip-column-names -u root --password=${mysql_root_password} -e "drop database ${db};" sleep 0.1; done run_as_zimbra mysql ${verbose} --batch -u root --password=${mysql_root_password} < "${mysql_backup}/mysql_dbs.sql" run_as_zimbra mysql.server stop # restore ldap.. rm ${verbose} -rf ~zimbra/data/ldap/config rm ${verbose} -rf ~zimbra/data/ldap/mdb run_as_zimbra mkdir -p ~zimbra/data/ldap/config ~zimbra/data/ldap/mdb/db ~zimbra/data/ldap/accesslog/db run_as_zimbra zmslapadd -c ${ldap_backup}/ldap-config.bak run_as_zimbra zmslapadd ${ldap_backup}/ldap.bak # Restore configurations.. for item in ${configs[@]} ; do rm ${verbose} -rf ${zimbra_path}/${item} ${cp} ${config_backup}/${item} ${zimbra_path}/${item} done zmlocalconfig -e zimbra_uid=$( id -u zimbra) zmlocalconfig -e mailboxd_keystore_password=1sGyXAm3j # Restore mail store rm ${verbose} -rf ${zimbra_path}/store ${cp} ${store_backup} ${zimbra_path}/. ${cp} ${index_backup} ${zimbra_path}/. zmfixperms ${verbose} --extended ## start /etc/init.d/zimbra restart # make sure compression is on for id in $( run_as_zimbra zmvolume -l | awk '/Volume id:/{print $3}' ) ; do run_as_zimbra zmvolume -e -id "${id}" -c true done