Shell Script untuk membackup database MySQL

Menurut saya cara membackup MySQL yang paling baik yaitu dengan membuat mirrornya yang selalu di-sync. Tetapi ini bukan bahasan tentang itu kali ini. Cara yang lebih cepat adalah dengan menggunakan perintah mysqldump. Lalu bagaimana kalo membackup banyak database secara rutin? Gampang saja, buat shell scriptnya.

Sebagai catatan saya, shell script ini sangat membantu untuk membackup database MySQL. Selain praktis untuk di-cron, juga ada fitur untuk merotasi backup, contoh di bawah, menyimpan 7 backup yang terakhir, sehingga bisa menghemat space juga. Scriptnya cukup mudah untuk newbi seperti saya.

Sebelum membuat shell scriptnya, buat dulu satu user di MySQL yang nanti akan digunakan untuk membackup dari script shell ini. Privilegenya ga perlu dihantam semua, lebih baik dibatasi minimal seperti ini:

SELECT, INDEX, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, SHOW VIEW

Berikut contoh shell scriptnya:

#!/bin/bash
#config
NOW=$(date +"%Y%m%d-%H%M%S")
#mysql
MYSQLUSER="user"
MYSQLPASS="password"
MYSQLHOST="localhost"
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
#local backup
FOLDER="/mysql"
DIRBAK="/home/backup/backup_files"$FOLDER
DIRBAKTEMP="/temp"
BAKFILENAME="backup_mysql.gz"
#compression
GZIP="$(which gzip)"
TAR="/bin/tar"

echo ""
echo "ROTATING FOLDERS..."
echo "--------------------------------------------------------"
rm -rf $DIRBAK/07_old
[ -d $DIRBAK/06 ] && mv $DIRBAK/06 $DIRBAK/07_old
[ -d $DIRBAK/05 ] && mv $DIRBAK/05 $DIRBAK/06
[ -d $DIRBAK/04 ] && mv $DIRBAK/04 $DIRBAK/05
[ -d $DIRBAK/03 ] && mv $DIRBAK/03 $DIRBAK/04
[ -d $DIRBAK/02 ] && mv $DIRBAK/02 $DIRBAK/03
[ -d $DIRBAK/01 ] && mv $DIRBAK/01 $DIRBAK/02
mkdir -p $DIRBAK/01/
mkdir -p $DIRBAK$DIRBAKTEMP/
echo "Done."

echo ""
echo "PERFORMING MYSQL BACKUP..."
echo "--------------------------------------------------------"
DBS="$($MYSQL -u $MYSQLUSER -h $MYSQLHOST -p$MYSQLPASS -Bse 'show databases')"
SKIPDBS="test test01 "

for db in $DBS
do
	skipdb=-1
	if [ "$SKIPDBS" != "" ]; then
		for i in $SKIPDBS
		do
			[ "$db" == "$i" ] && skipdb=1 || :
		done
	fi

	if [ "$skipdb" == "-1" ] ; then
		DIRMYSQL=$DIRBAK/01/$db.$NOW.gz
		echo "DB Backup:" $db $DIRMYSQL
		$MYSQLDUMP -u $MYSQLUSER -h $MYSQLHOST -p$MYSQLPASS $db | $GZIP -9 > $DIRMYSQL
	fi

	if [ "$skipdb" == "1" ] ; then
		echo "DB Backup Skipped:" $db
	fi
done
echo "Done."

echo ""
echo "PERFORMING COMPRESSION..."
echo "--------------------------------------------------------"
DIRS2="$DIRBAK/01/"
cd $DIRS2
DIRFILES2=$DIRBAK$DIRBAKTEMP/$BAKFILENAME
echo "Backup:" $DIRFILES2
$TAR cvf $DIRFILES2 *.*
echo "Done."

Tinggalkan komentar

Alamat email Anda tidak akan dipublikasikan.