How To Backup Data in CentOS Using Bash Script

by admin on April 5, 2016

Today, I will show you simple bash script I’m using to backup data in CentOS server. Before We beginning, please ensure you have “rsync” package installed.

1. Setting up Backup script

Make a new directory with following command

# mkdir -p /bak
# chown root.root
# chmod 700 /bak

Create a bash script

# vi /bak/fbk.sh
# chmod +x /bak/fbk.sh

Add the following code

#!/bin/bash
# Full Backup Server 
# Support backup multiple directories, multiple databases and files configuration
# Copyright (c) 2010-2013 LongVNIT 
# This script is licensed under GNU GPL version 2.0 or above

### SERVER BACKUP
SERVER="1.1.1.1"
USERNAME="username"
IDENTITY="id_rsa"
SSH_PORT="22"

### MYSQL INFO
MHOST="localhost"
MUSER="root"
MPASS="password"

### BACKUP DIRECTORY
BAK="/bak"
DATA="/home"
MYSQL=$BAK"/db"
CONF=$BAK"/conf"
EXCLUDE=$BAK"/exclude.txt"
TEMP_DIR=$BAK"/tmp"

### BACKUP DATA TYPE: 1 FULL, 2: 1-3-5
TYPE=2
DAILY=$(date +"%u")

### MYSQL BACKUP FUNCTION
doMySQL() {
	DBS="$(mysql -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
	[ ! -d $MYSQL/$DAILY ] && mkdir -p $MYSQL/$DAILY || rm -f $MYSQL/$DAILY/mysql*
	for db in $DBS
	do
		mysqlcheck -or -u$MUSER -p$MPASS $db
		FILE=$MYSQL/$DAILY/mysql-$db.gz
		mysqldump -u $MUSER -h $MHOST -p$MPASS $db | gzip -9 > $FILE
	done
	
	### BACKUP
	rsync -av --delete -e "ssh -p $SSH_PORT -i $BAK/$IDENTITY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" $MYSQL/$DAILY/* $USERNAME@$SERVER:db/$DAILY
}

doConfig() {
	rm -rf $TEMP_DIR/*
	mkdir -p $TEMP_DIR/etc
	
	# Backup system configuration
	cp /etc/sysctl.conf $TEMP_DIR/etc

	# Backup iptables
	iptables-save > $TEMP_DIR/iptables.txt > /dev/null 2>&1

	# Backup my.cnf
	if [ -e /etc/my.cnf ]; then
		cp /etc/my.cnf $TEMP_DIR/etc
	fi

	if [ -d /etc/lcache ]; then
		cp -R /etc/lcache $TEMP_DIR/etc
	fi

	# Backup sshd
	cp -R /etc/ssh $TEMP_DIR/etc

	# Backup crontab
	crontab -l > $TEMP_DIR/crontab.txt > /dev/null 2>&1

	# Backup logrotate
	cp -R /etc/logrotate.d $TEMP_DIR/etc

	# Backup init.d
	cp -R /etc/init.d $TEMP_DIR/etc

	# Backup fstab
	cp /etc/fstab $TEMP_DIR/etc

	# Backup webserver configuration
	if [ -d /webserver ]; then
		mkdir -p $TEMP_DIR/webserver
	fi

	# Backup PHP
	if [ -d /webserver/php ]; then
		mkdir -p $TEMP_DIR/webserver/php
		cp -R /webserver/php/etc $TEMP_DIR/webserver/php
	fi

	# Backup Apache
	if [ -d /webserver/apache ]; then
		mkdir -p $TEMP_DIR/webserver/apache
		cp -R /webserver/apache/conf $TEMP_DIR/webserver/apache
	fi

	# Backup Lighttpd
	if [ -d /webserver/lighttpd ]; then
		mkdir -p $TEMP_DIR/webserver/lighttpd
		cp -R /webserver/lighttpd/conf $TEMP_DIR/webserver/lighttpd
	fi

	# Backup Nginx
	if [ -d /webserver/nginx ]; then
		mkdir -p $TEMP_DIR/webserver/nginx
		cp -R /webserver/nginx/conf $TEMP_DIR/webserver/nginx
	fi

	# Backup proftpd
	if [ -d /webserver/proftpd ]; then
		mkdir -p $TEMP_DIR/webserver/proftpd
		cp -R /webserver/proftpd/etc $TEMP_DIR/webserver/proftpd
	fi
	
	# Backup Pure-FTPD
	if [ -f /etc/pure-ftpd.conf ]; then
		mkdir -p $TEMP_DIR/pure-ftpd
		cp -R /etc/pure* $TEMP_DIR/pure-ftpd
	fi
	
	# Backup webserver etc
	if [ -d /webserver/etc ]; then
		cp -R /webserver/etc $TEMP_DIR/webserver/
	fi
	
	# BACKUP
	[ ! -d $CONF ] && mkdir -p $CONF || rm -f $CONF/conf-$DAILY.tar.gz
	tar cvfz $CONF/conf-$DAILY.tar.gz $TEMP_DIR/*
	### BACKUP
	rsync -av --delete -e "ssh -p $SSH_PORT -i $BAK/$IDENTITY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" $CONF/* $USERNAME@$SERVER:conf/
}

doData() {
	### BACKUP
	rsync -av --delete -e "ssh -p $SSH_PORT -i $BAK/$IDENTITY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --exclude-from $EXCLUDE $DATA/* $USERNAME@$SERVER:data/$DAILY
}

### PROCESS
doConfig;
doMySQL;
if [ $TYPE=="2" ]; then
	if [[ $DAILY=="1" || $DAILY=="3" || $DAILY=="5" ]]; then
		doData;
	fi
else
	doData;
fi

Setting up Crontab

Now I will show you how to schedule our backup process. In CentOS we use cron jobs in order to schedule task. For setting up cron jobs we use “crontab -e” command in command line.
Example: I want to run this backup process on daily at 3:00 PM.

01 03 * * * /bak/fbk.sh

Leave a Comment

Previous post:

Next post: