在数据库的日常维护工作中,除了保证业务的正常运行以外,就是要对数据库进行备份,以免造成数据库的丢失,从而给企业带来重大经济损失。通常备份可以按照备份时数据库状态分为热备和冷备,按照备份数据库文件的大小分为增量备份、差异备份和全量备份。其中热备可以通过mysql replication主从复制进行实时备份,percona的xtrabackup以及mysql自带的mysqldump等,可以根据不同需求使用不同的备份方案。虽然在生产环境已经使用mysql replication主从复制,但是还需要在计划任务中添加运行shell脚本在夜间业务不繁忙时进行数据库的全量备份,以便在发生主从复制失败时,主从数据库大量数据不一致后的主从复制的重做,同时进行完全备份可以更加保证数据库的安全性。
以下是我在生产环境中使用的一个全备脚本,它的基本功能:
1.自动压缩备份mysql数据库.
2.自动删除近10天前的备份文件
3.删除时显示删除进度(可选).
#!/bin/bash #Author [email protected] MAXIMUM_BACKUP_FILES=10 #最大备份文件数 BACKUP_FOLDERNAME="database_backup" #数据库备份文件的主目录 DB_HOSTNAME="localhost" #mysql所在主机的主机名 DB_USERNAME="root" #mysql登录用户名 DB_PASSWORD="123456" #mysql登录密码 DATABASES=( "openfire" "csp" #备份的数据库名 ) #========= echo "Bash Database Backup Tool" #CURRENT_DATE=$(date +%F) CURRENT_DATE=$(date +%F) #定义当前日期为变量 BACKUP_FOLDER="${BACKUP_FOLDERNAME}_${CURRENT_DATE}" #存放数据库备份文件的目录 mkdir $BACKUP_FOLDER #创建数据库备份文件目录 #统计需要被备份的数据库 count=0 while [ "x${DATABASES[count]}" != "x" ];do count=$(( count + 1 )) done echo "[+] ${count} databases will be backuped..." #循环这个数据库名称列表然后逐个备份这些数据库 for DATABASE in ${DATABASES[@]};do echo "[+] Mysql-Dumping: ${DATABASE}" echo -n " Began: ";echo $(date) if $(mysqldump -h ${DB_HOSTNAME} -u${DB_USERNAME} -p${DB_PASSWORD} ${DATABASE} > "${BACKUP_FOLDER}/${DATABASE}.sql");then echo " Dumped successfully!" else echo " Failed dumping this database!" fi echo -n " Finished: ";echo $(date) done echo echo "[+] Packaging and compressing the backup folder..." tar -cv ${BACKUP_FOLDER} | bzip2 > ${BACKUP_FOLDER}.tar.bz2 && rm -rf $BACKUP_FOLDER BACKUP_FILES_MADE=$(ls -l ${BACKUP_FOLDERNAME}*.tar.bz2 | wc -l) BACKUP_FILES_MADE=$(( $BACKUP_FILES_MADE - 0 )) #把已经完成的备份文件数的结果转换成整数数字 echo echo "[+] There are ${BACKUP_FILES_MADE} backup files actually." #判断如果已经完成的备份文件数比最大备份文件数要大,那么用已经备份的文件数减去最大备份文件数,打印要删除旧的备份文件 if [ $BACKUP_FILES_MADE -gt $MAXIMUM_BACKUP_FILES ];then REMOVE_FILES=$(( $BACKUP_FILES_MADE - $MAXIMUM_BACKUP_FILES )) echo "[+] Remove ${REMOVE_FILES} old backup files." #统计所有备份文件,把最新备份的文件存放在一个临时文件里,然后删除旧的文件,循环出临时文件的备份文件从临时目录里移到当前目录 ALL_BACKUP_FILES=($(ls -t ${BACKUP_FOLDERNAME}*.tar.bz2)) SAFE_BACKUP_FILES=("${ALL_BACKUP_FILES[@]:0:${MAXIMUM_BACKUP_FILES}}") echo "[+] Safeting the newest backup files and removing old files..." FOLDER_SAFETY="_safety" if [ ! -d $FOLDER_SAFETY ] then mkdir $FOLDER_SAFETY fi for FILE in ${SAFE_BACKUP_FILES[@]};do mv -i ${FILE} ${FOLDER_SAFETY} done rm -rf ${BACKUP_FOLDERNAME}*.tar.bz2 mv -i ${FOLDER_SAFETY}/* ./ rm -rf ${FOLDER_SAFETY} #以下显示备份的数据文件删除进度,一般脚本都是放在crontab里,所以我这里只是为了显示效果,可以不选择这个效果。 CHAR='' for ((i=0;$i<=100;i+=2)) do printf "Removing:[%-50s]%d%%\r" $CHAR $i sleep 0.1 CHAR=#$CHAR done echo fi
第1天备份数据库功能测试如下
10天以后,会自动保留最近10天的备份,10天以上会自动删除
模拟测试脚本功能,创建31天的备份文件如下
每天计划任务定时执行脚本保留最近10天的备份
本文转载http://laoxu.blog.51cto.com/4120547/1353542
http://my.oschina.net/u/231017/blog/186447
http://bbs.linuxtone.org/thread-5813-1-1.html
MySQL分库备份shell脚本
#!/bin/bash MYUSER=root MYPASS=password SOCKET="/var/lib/mysql/mysql.sock" MYCMD="mysql -u $MYUSER -p$MYPASS" MYDUMP="mysqldump -u $MYUSER -p$MYPASS" BACKUP_DIR="/work/backup/mysql" for database in `$MYCMD -e "show databases;"|sed '1,2d' |egrep -v "mysql|schema"` do if [ ! -f $BACKUP_DIR/${database} ]; then mkdir -p $BACKUP_DIR/${database} fi $MYDUMP ${database} |gzip > $BACKUP_DIR/${database}/${database}_`date +%F`.tar.gz done
http://jin771998569.blog.51cto.com/2147853/1639712
记录保存mysql历史操作命令记录
在mysql配置文件中开启日志记录
# vim /etc/my.cnf
[mysqld]
log = /data/mysqldata/data/history_log
# service mysqld restart
2.查看mysql变量
mysql> show variables like '%log%';
+-----------------------------------------+------------------------------------+
| Variable_name | Value |
+-----------------------------------------+------------------------------------+
| back_log | 50 |
| binlog_cache_size | 32768 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
| binlog_stmt_cache_size | 32768 |
| expire_logs_days | 0 |
| general_log | ON |
| general_log_file | /data/mysqldata/data/history_log |
3.编写切割脚本内容如下:
# cat cut_mysql_history.sh #!/bin/bash #此脚本用于分割mysql历史操作记录。每隔4小时分割一次,防止文件过大. #访问日志存放目录 logs_path="/data/logs_mysql/" MAXDAYS=30 ###定义日志保存时间,这里定义保存5天时间,即30小时. find ${logs_path} -maxdepth 1 -type f -mtime +$(expr ${MAXDAYS} - 1) -exec echo "Delete {}" \; -exec rm "{}" \; #将访问日志进行迁移到指定目录 mv /data/mysqldata/data/history_log ${logs_path}/history_$(date -d "yesterday" +"%Y-%m-%d-%H").log #重新生成mysql记录的历史操作命令文件 /etc/init.d/mysqld reload >/dev/null 2>&1
4.编写计划任务
# crontab -l
* */4 * * * /bin/bash /data/scripts/cut_mysql_history.sh >/dev/null 2>&1
Linux下网站数据定期自动备份与删除脚本
vps是redhat,里面默认没有装crond的服务,网站文件和数据库需要每天自动备份,然后备份目录超过一定时间的删除,比如保留最近14天地备份”。
因为没有安装crond的服务,首先输入以下命令安装yum install cronie
创建备份脚本
vi /root/bakweb.sh
编辑并输入以下内容
#!/bin/bash #禅道及bbs论坛网页目录自动备份脚本 #禅道及bbs论坛数据库自动备份 #自动删除备份目录下面超过10天的文件 #脚本每天早上5点自动执行备份工作 BAKDIR=/home/bak MAXDAYS=10 mkdir -pv /home/bak find ${BAKDIR} -maxdepth 1 -type f -mtime +$(expr ${MAXDAYS} - 1) -exec echo "Delete {}" \; -exec rm "{}" \; tar zcvf /home/bak/www.penglei.name_$(date +%F).tar.gz /var/www/html mysqldump -uroot --password=123456 -B test > /home/bak/test_$(date +%F).sql mysqldump -uroot --password=123456 -B mysql --events > /home/bak/mysql_$(date +%F).sql mysqldump -uroot -p123456 -B shop|gzip > $BAKDIR/shop_$(date +%F).sql.gz exit 0
输入:wq保存退出。
该脚本的意思是首先选择/home/bak作为网站备份目录。
第一步,先删除/home/bak下超过10天的文件;
第二步,按www.dbfen.name_+日期为文件名备份网站目录/var/www/html;
第三步,按penglei.name_+日期为文件名导出数据库,PASSWORD和DBNAME替换为你自己的root密码和数据库名。
最后创建crond脚本,每天早上5点自动运行该脚本即可 创建crond文件
vi /etc/cron.d/bakweb 编辑并输入以下内容
0 5 * * * root /root/bakweb.sh
完成,这样Linux系统就可以对网站数据定期自动备份与删除了.
归档压缩文件(可排除)
web_backup.sh #!/bin/bash #Backup the web file and del old backup file GFINAME=`date +%F-%H` GFIFILE=/usr/local/data/www #需要备份的目录 GFIBACKUP=/usr/local/src/web_backup #备份保存的目录 tar -zPcf $GFIBACKUP/$GFINAME.tar.gz --exclude=$GFIFILE/logs --exclude=$GFIFILE/images $GFIFILE/* #--exclude=排除的文件或目录 #del old web_backup #删除10天之前的文件 find /usr/local/src/web_backup -atime +10 -exec rm -rf {} \;
Windows下备份网站目录和数据库
@echo off set date=%date:~0,4%-%date:~5,2%-%date:~8,2% mysqldump -uroot -poldboy -A -B > D:\bak\"%date%".sql rar.exe a -k -r -s -ml D:\bak\"%date".sql.rar D:\bak\"%date%.sql" del D:\bak\*.sql rar.exe a -k -r -s -ml D:\bak\"%date%"htdocs.rar D:\work\PHPnow\htdocs
一个备份上传到FTP服务器脚本
#!/bin/bash # http://www.vpser.net/security/linux-autobackup-ftp.html # date: 2015-10-05 # function MYSQL_USER="root" ###mysql用户 MYSQL_PASS="123456" ###mysql密码 BACK_DIR="/data/backup" # Create backup directory if [ -d $BACK_DIR ] ; then rm -rf ~/$BACK_DIR/* else mkdir -p "$BACK_DIR" fi # Enter the backup directory cd $BACK_DIR # Backup all database tables for db in $(mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | sed -e '/schema/d' -e '/mysql/d' -e '/test/d') do mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} | gzip -9 > ${db}.sql.gz done # Pack all database tables tar -zcf mysql_$(date +%Y%m%d).tar.gz *.sql.gz --remove-files # Packing site data for web in $(ls -1 /home/wwwroot | sed -e '/php/d') do tar -zcPf ${web}_$(date +%Y%m%d).tar.gz /home/wwwroot/$web/ done # Package the Nginx configuration file tar -zcPf nginx_$(date +%Y%m%d).tar.gz /usr/local/nginx/conf/vhost ##方法一: ######~Set FTP Information~######设置用来存放备份数据的FTP信息 FTP_HostName=184.168.192.43 //FTP服务器的IP或者域名 FTP_UserName=vpsernet //FTP服务器用户名 FTP_PassWord=yourftppassword //FTP服务器用户对应的密码 FTP_BackupDir=/data/backup/web //备份到FTP上的目录,需要提前创建好。 ###下面为自动上传部分#### lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF cd $FTP_BackupDir mput $TodayWWWBackup mput $TodayDBBackup bye EOF ##方法二: # Upload data for file in $(find *.tar.gz | grep $) do # scp -P 22 ${file} 123.456.789.012:/root/backup/${file} sh ~/dropbox_uploader.sh upload ${file} $(date +%Y%m%d)/${file} done exit 0