Mysql数据库备份脚本
库备份
备份mysql数据库,除了一些系统库,其他全部备份,备份目录可自己指定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #!/bin/bash DATE=$(date +%F_%H-%M-%S) HOST=localhost USER=backup PASS=123.com BACKUP_DIR=/home/db_backup
retention_days=30
DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys") for DB in $DB_LIST; do BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB > $BACKUP_NAME 2>/dev/null; then echo "$BACKUP_NAME 备份失败!" fi done
find $BACKUP_DIR -type f -mtime +$retention_days -exec rm {} \; echo "备份结束"
|
表备份
备份mysql数据库的每张表,每张表单独sql。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #!/bin/bash DATE=$(date +%F_%H-%M-%S) HOST=localhost USER=backup PASS=123.com BACKUP_DIR=/home/db_backup
retention_days=30
DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys") for DB in $DB_LIST; do BACKUP_DB_DIR=$BACKUP_DIR/${DB}_${DATE} [ ! -d $BACKUP_DB_DIR ] && mkdir -p $BACKUP_DB_DIR &>/dev/null TABLE_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "use $DB;show tables;" 2>/dev/null) for TABLE in $TABLE_LIST; do BACKUP_NAME=$BACKUP_DB_DIR/${TABLE}.sql if ! mysqldump -h$HOST -u$USER -p$PASS $DB $TABLE > $BACKUP_NAME 2>/dev/null; then echo "$BACKUP_NAME 备份失败!" fi done done
find $BACKUP_DIR -type f -mtime +$retention_days -exec rm {} \; echo "备份结束"
|
异地备份
使用mkdir -p命令创建以当前日期为名的目录,存放数据库备份文件。
使用mysqldump命令备份所有数据库,并将输出重定向至mysql_backup_$DATE.sql文件中。
使用tar命令将备份文件压缩为:.tar.gz格式的文件内,并附加日志到备份文件中,然后删除原始的备份文件。
使用rm -rf命令删除 7 天前的备份文件,删除的是以 7 天前日期为名的目录和目录下的所有文件。
使用scp命令将本地备份文件传到远程备份服务器上。
远程备份需要做免密,在MySQL数据库所在服务器与需要远程备份的服务器做免密,并进行ssh验证登录是否正常。
1 2 3
| ssh-keygen cd ~/.ssh/ scp id_rsa.pub 目标主机IP:~/.ssh/authorized_keys
|
执行脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #!/bin/bash
DB_USER="root" DB_PASS="1Q!2W@3E#" DB_HOST="192.168.1.100" DBBACK_IP="192.168.1.200" BCK_DIR="/bigdata/mysql" DBBACK_PATH=/bigdata/mysqlbackup DATE=`date +%F` yestoday=$(date -d '-7 day' +%Y-%m-%d)
mkdir -p $BCK_DIR/$DATE echo "开始本地备份中..."
mysqldump -u$DB_USER -p$DB_PASS -h$DB_HOST --all-databases > $BCK_DIR/$DATE/mysql_backup_$DATE.sql cd $BCK_DIR/$DATE && tar -zcvf mysql_backup_$DATE.sql.tar.gz mysql_backup_$DATE.sql >>/$BCK_DIR/$DATE/$DATE.log && rm -fr mysql_backup_$DATE.sql echo "$DATE db bakcup success!" >>/$BCK_DIR/$DATE/$DATE.log
echo "开始删除 7 天前的数据库备份文件..." rm -rf $BCK_DIR/$yestoday echo "7 天前的数据库备份文件删除完毕!"
echo "开始远程备份中..." scp -r $BCK_DIR/$DATE/mysql_backup_$DATE.sql.tar.gz root@$DBBACK_IP:$DBBACK_PATH echo "远程备份完毕!"
|