今天特分享一款实用的脚本,数据库备份和恢复,对新手运维适用。互联网上什么最重要?无疑是数据。无论是程序员还是运维都不希望误操作数据丢失,或一些意想不到因素导致数据损坏或丢失。所以数据备份和恢复至关重要,也是运维的首要任务,也是标配。我们都不希望删库跑路。
一、mysql备份:
1.备份脚本如下:
#!/bin/bash
#备份存放的路径
backup_dir="/backup/mysql/full"
#备份用户
mysql_user="root"
#备份密码
mysql_passwd="password"
#备份记录日志
log="./mysql_backup.log"
[ -d $backup_dir ] || mkdir -p $backup_dir
function backup_mysql_full(){
#1.全量备份,在full目录生成一个以日期命名的备份文件夹
echo "Start to backup at `date +"%Y-%m-%d %H:%M:%S"`">>$log
innobackupex --user=$mysql_user --password=$mysql_passwd $backup_dir
if [ $? -eq 0 ];then
echo "Backup success at "`date +"%Y-%m-%d %H:%M:%S"`>>$log
#删除1天前的备份
find $backup_dir -type d -mtime +7|xargs rm -rf >>$log
else
echo "Backup fail at "`date +"%Y-%m-%d %H:%M:%S"`>>$log
fi
}
backup_mysql_full
2.添加定时备份,每天凌晨2点开始自动备份,运行crontab -e
00 02 * bash /opt/xtrabackup_scripts/backup_mysql_full.sh
说明:前提需安装xtrabackup备份工具,一款物理备份,速度相比mysqldump的逻辑备份快很多。
脚本的特点:
1.属于物理热备,速度快,不影响业务。
2.定时自动备份
3.自动保留7天的备份,并删除旧备份,防止磁盘占满
4.备份日志记录,备份失败或没有备份方便查找原因
5.全库备份
二、mysql数据库的恢复
#!/bin/bash
# 使用方法 先删除数据rm -rf /data/mysqldata/, 然后 sh recover_mysql_full.sh 2018-08-08_16-33-07
#恢复的目标库的用户名
mysql_user="root"
#恢复的目标库的密码
mysql_passwd="password"
#备份文件存放的目录
mysql_recover_dir="/backup/mysql/full"
#恢复的目标库数据库文件路径
mysql_dir="/data/mysqldata/"
#目标库的数据配置文件
my_cnf="/etc/my.cnf"
#日志记录
log="./mysql_recover.log"
#自动创建恢复目录
[ -d $mysql_recover_dir ] || mkdir -p $mysql_recover_dir
#备份数据数据中可能包含未提交的事务或已经提交但未同步至数据文件中的事务,此时数据还处于不一致状态。因此需要通过回滚未提交的事务及已经提交的事务至数据文件,使得数据文件
处于一致性状态
innobackupex --defaults-file=$my_cnf --user=$mysql_user --password=$mysql_passwd --apply-log $mysql_recover_dir/$1
#开始真正的恢复数据
service mysqld stop
rm -rf $mysql_dir/* >>$log
innobackupex --defaults-file=$my_cnf --user=$mysql_user --password=$mysql_passwd --copy-back $mysql_recover_dir/$1>>$log
chown mysql.mysql -R $mysql_dir >>$log
service mysqld start
[ $? -ne 0 ] && service mysqld start
脚本说明:
此恢复脚本可以和备份脚本组合在一起,加个定时任务,就可以做每天定时同步生产数据自动同步到测试环境。对于数据量几十上百G不大的情况也挺实用,当然如果数据量很大,200G以上
则可考虑阿里的otter数据的消费和订阅,后面会讲到此方案的用法。
三、恢复到一台新的数据库
很多时候我们数据出了问题,并不想直接还原到原先的库,毕竟数据缺少一天的。还原直接损失一天的数据,因此我们想还原到别的地方做对比看看。
准备好新搭建的一台数据库
1.恢复数据前的准备(合并xtabackup_log_file和备份的物理文件),应用备份文件
innobackupex —apply-log /backup/mysql/full/2019-01-02_02-00-02
删除原先数据库里的数据
service mysqld stop
cd /var/lib/mysql/
rm -rf *
3.恢复
innobackupex —copy-back /backup/mysql/full/2019-01-02_02-00-02
chown -R mysql.mysql /var/lib/mysql/
service mysqld restart
最后查看新数据库已有原来的数据。
更多精彩,关注公众号
原文地址:http://blog.51cto.com/jin544642965/2342077