公司使用的是Mysql数据库,之前数据库备份一直采用bacula网络备份软件。前一段时间出现了一些问题,所以一直想写一个Shell脚本实现对Mysql的异地备份。今天抽出了点儿时间写了一个Mysql数据库的异地完整备份,赶紧拿出来分享一下,希望对从事运维工作的朋友有所帮助。
1.准备一台FTP备份服务器
如果公司有存储,直接可以将MYSQL数据库备份到存储上。但有些企业没有存储,所以只能通过FTP方式将MYSQL数据库通过FTP备份到FTP备份服务器上。我此次写的SHELL脚本主要针对企业没有存储的用户,通过FTP服务器实现MYSQL数据库备份,首先安装和配置ftp服务器。
##安装vsftpd软件包 yum -y install vsftpd db4 db4-utils ##创建vsftpd 用户 useradd -s /sbin/nologin -d /opt/data mysqlbak //创建备份用户并指定用户家目录 passwd mysqlbak //设置密码 ##配置管理vsftpd vim /etc/vsftpd/vsftpd.conf 开启如下选项 local_enable=YES //允许本地用户登入 write_enable=YES //允许本地用户写 local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES chroot_local_user=YES //所有的本地用户限制在自己的家目录 listen=YES pam_service_name=vsftpd userlist_enable=YES userlist_deny=NO //只有/etc/vsftpd/user_list文件下用户可以登入ftp服务器 guest_enable=YES //开启虚拟用户 guest_username=mysqlbak //虚拟用户对应本地用户 tcp_wrappers=YES virtual_use_local_privs=YES ##创建虚拟用户文件 touch /etc/vsftpd/vuser.txt echo "webbak" > /etc/vsftpd/vuser.txt echo "webbak" >> /etc/vsftpd/vuser.txt ##添加允许登入ftp服务器用户到/etc/vsftpd/user_list文件 echo "mysqlbak" >> /etc/vsftpd/user_list ##最后启动vsftpd服务 service vsftpd start
2.创建MYSQL备份脚本
根据需求,Mysql数据库备份数据在数据库本地保存10天,在备份服务器保存20天。具体脚本如下:
#!/bin/bash ################################# # Athor:DAVID # # Date:15/5/2013 # # About:mysql_bakup # ################################# USER=mysql //备份数据库实用的用户名 PASSWD=mysql //备份数据库实用的密码 DATE=`date +%Y-%m-%d` //当前时间 OLDDATE=`date +%Y-%m-%d -d '-10 days'` //本地备份保留时间 FTPOLDDATE=`date +%Y-%m-%d -d '-20 days'` //备份服务器备份保留时间 MYSQLDUMP=/usr/local/mysql/bin/mysqldump //mysql备份执行命令文件路径 SOCKET=/tmp/mysql.sock //进程文件存放目录 BACKDIR=/opt/data/db //本地备份目录 FTPHOST=132.96.77.123 //FTP主机 FTPUSER=webbak //用户名 FTPPASS=webbak //密码 [ -d ${BACKDIR} ] || mkdir -p ${BACKDIR} //判断备份目录是否存在,如果不存在则创建 [ -d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE} //判断当前时间目录是否存在,如果不存在则创建 [ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE} //判断10天前旧目录是否存在,存在则删除 for DBNAME in mysql cms manager //要进行备份的数据库名称 do ${MYSQLDUMP} -S ${SOCKET} -u ${USER} -p${PASSWD} --opt ${DBNAME} | gzip > ${BACKDIR}/${DATE}/${DBNAME}-backup-${DATE}.sql.gz //进行备份 echo "${DBNAME} has been backup successful." sleep 5 done cd ${BACKDIR}/${DATE} ftp -i -n -v <<EOF //将备份数据数据备份到FTP备份服务器 open ${FTPHOST} user ${FTPUSER} ${FTPPASS} bin cd ${FTPOLDDATE} mdelete * cd .. rmdir ${FTPOLDDATE} mkdir ${DATE} cd ${DATE} mput * bye EOF
3.执行代码
./mysql_bak.sh > mysqlbak.log
执行完成之后,登入到备份服务器查看是否已经有备份的数据,如果已经产生备份压缩文件,说明备份成功。
转载于:https://blog.51cto.com/davidbj/1200783