今天特分享一款实用的脚本,数据库备份和恢复,也可用于生产每天同步数据到测试环境。互联网上什么最重要?无疑是数据。无论是程序员还是运维都不希望误操作数据丢失,或一些意想不到因素导致数据损坏或丢失。所以数据备份和恢复至关重要,我们都不希望删库跑路。

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_full2.添加定时备份,每天凌晨2点开始自动备份。

crontab -e00 02 * bash /opt/xtrabackup_scripts/backup_mysql_full.sh

说明:前提需安装xtrabackup备份工具,一款物理备份,速度相比mysqldump的逻辑备份快很多。

1.属于物理热备,速度快,不影响业务。

2.定时自动备份

3.自动保留7天的备份,并删除旧备份,防止磁盘占满

4.备份日志记录,备份失败或没有备份方便查找原因

5.全库备份

#!/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不大的情况挺实用。当然,如果数据量很大,300G以上则需要用到otter,数据的消费和订阅,后面会讲到此方案,强大到能实时同步跨国家、跨地区的数据实时同步。

很多时候我们数据出了问题,并不想直接还原到原先的库,毕竟数据缺少一天的。还原直接损失一天的数据,因此我们想还原到别的地方做对比看看,现准备好新搭建的一台数据库。

1.恢复数据前的准备(合并xtabackup_log_file和备份的物理文件),应用备份文件innobackupex —apply-log /backup/mysql/full/2019-01-02_02-00-02

2.删除原先数据库里的数据

service mysqld stop

cd /var/lib/mysql/rm -rf *

3.恢复innobackupex —copy-back /backup/mysql/full/2019-01-02_02-00-02chown -R mysql.mysql /var/lib/mysql/service mysqld restart

最后查看新数据库已有原来的数据。