备份文件命名应符合合同中规定的备份文件命名规范《系统名称+介质编号+备份内容+备份日期》的要求
数据库全备脚本(供参考):
#!/bin/bash
# 全备方式
# 一般在备份机使用mysqldump远程备份数据库服务器中的mysql数据库数据
# 适用于小中型mysql数据库
source /etc/profile #加载系统环境变量
source ~/.bash_profile #加载用户环境变量
set -o nounset #引用未初始化变量时退出
# mysqldump命令使用的用户和密码存放于/etc/my.cnf中
# 同时设置/etc/my.cnf权限600,防止普通用户看到
# cat /etc/my.cnf
# [mysqldump]
# user=root
# password=Abc123!!!
# 远程数据库IP和端口号
host="127.0.0.1"
port="3306"
# binlog日志前缀名
binlog_prefix="binlog"
# 产生备份路径、备份文件名、日志路径和日志文件名
backup_path="/backup/mysql/data"
# 如果不存在备份目录就创建
if [ ! -e $backup_path ];then
mkdir -p $backup_path/archive
# 备份数据目录只能root进入
# 防止备份被普通用户copy
chmod 700 $backup_path
fi
# 产生备份序号
last_sn=$(ls -t $backup_path/*.tar.gz 2>/dev/null|head -1|cut -d "_" -f2)
if [ $? -ne 0 ];then
#如果目录中无全备,序号从0001开始
last_sn="0001"
else
#如果目录中有之前全备,新备份序号为当前最大序号加1
#去掉序号前导0字符
last_sn=$(echo $last_sn|sed -e 's/^[0]*//')
#字符转为10进制数后加1
let last_sn=$[10#${last_sn}+1]
#序号前继续加上前导0
last_sn=$(printf %04d $last_sn)
fi
# 产生备份时间戳
let begin_timestamp=$(date +%s)
# 时间戳转成年月日时分秒可读格式作为备份起始时间
begin_time=$(date -d @${begin_timestamp} '+%Y_%m_%d_%H_%M_%S')
# 生成备份文件名
backup_name="hr_${last_sn}_dbfull_${begin_time}.sql"
# 设置备份日志路径和日志文件名
backup_log="${backup_path}/backup.log"
# 恢复起始日志附加到备份文件名方便恢复
start_binlog=""
echo "正在备份中......"
# 函数用于备份并压缩
backup_mysql(){
# -R备份存储过程,函数,触发器
# 如有报错信息记录到备份日志中
mysqldump -h$host -P$port --single-transaction --flush-logs --master-data=2 --all-databases -R>$backup_path/$backup_name 2>>$backup_log
if [ $? -eq 0 ];then
# 如果备份成功
cd $backup_path
# 获取备份文件中记录的日志编号,即:恢复起始日志
start_binlog=$(grep "^-- CHANGE MASTER TO MASTER_LOG_FILE=" $backup_name|grep -E -o "$binlog_prefix.[0-9]{6}")
# 压缩归档同时删除源文件
tar zcpf $backup_name.$start_binlog.tar.gz $backup_name --remove-files&>/dev/null
return 0
else
# 如果备份失败
cd $backup_path
rm -f $backup_name
return 1
fi
}
# 调用备份和压缩函数
# 错误输出和标准输出记录到日志中
backup_mysql>>$backup_log 2>&1
if [ $? -eq 0 ];then
# 如果函数执行成功,显示输出同时用tee将输出附加到日志中
# 计算备份时长
let end_timestamp=$(date +%s)
let backup_interval=$[end_timestamp-begin_timestamp]
echo "-------------------------------------------------------------------------------------------"|tee -a $backup_log
echo "全部备份记录请查看: $backup_log"
echo "备份状态: 成功!"|tee -a $backup_log
echo "备份序号: $last_sn"|tee -a $backup_log
echo "备份时间: $(date -d @${begin_timestamp} '+%Y-%m-%d %H:%M:%S')"|tee -a $backup_log
du -sh $backup_path/$backup_name.$start_binlog.tar.gz | awk '{print "备份文件: " $2 "\n备份大小: " $1}'|tee -a $backup_log
echo "备份时长: ${backup_interval}秒"|tee -a $backup_log
echo "起始日志: $start_binlog,注意:从该日志开始恢复"|tee -a $backup_log
echo -e "-------------------------------------------------------------------------------------------\n\n"|tee -a $backup_log
else
# 如果函数执行失败,显示输出同时用tee将输出附加到日志中
echo "----------------------------------------------------------------------"|tee -a $backup_log
echo "备份结束,详细信息请查看 $backup_log"
echo "备份时间: $(date -d @${begin_timestamp} '+%Y-%m-%d %H:%M:%S')"|tee -a $backup_log
echo "备份失败"|tee -a $backup_log
echo -e "-------------------------------------------------------------------------------------------\n\n"|tee -a $backup_log
fi
#设置归档天数
days_to_archive=15
#移动2周前的备份到归档目录
find $backup_path -type f -iname "*.tar.gz" -mtime +$days_to_archive -exec mv {} $backup_path/archive \;>/dev/null 2>&1
脚本日志输出格式(备份文件名加入了起始恢复的日志文件编号用于提高恢复效率,供参考)
按照备份策略设定备份计划任务
crontab -e
[root@bakserver ~]# crontab -l 0 2 * * 0 bash /root/mysql_backup_data.sh&>/dev/null 0 2 * * 1 bash /root/mysql_backup_log.sh&>/dev/null 0 2 * * 2 bash /root/mysql_backup_log.sh&>/dev/null 0 2 * * 3 bash /root/mysql_backup_log.sh&>/dev/null 0 2 * * 4 bash /root/mysql_backup_log.sh&>/dev/null 0 2 * * 5 bash /root/mysql_backup_log.sh&>/dev/null 0 2 * * 6 bash /root/mysql_backup_log.sh&>/dev/null
产生备份后的目录结构
以上后三种情况会致使硬盘故障灯变成红色:
上面第一种情况遇到的情景更加复杂,为了测试方便,可以采用直接删除数据文件的方式,在数据库服务器上执行以下操作:
rm -rf /data/*
直接把数据文件删掉,用不了多久测试业务系统就会报错:
由于采用了将数据库数据文件和日志文件分磁盘存储的策略,数据库日志完好无损,而且数据库备份单独保存在备份服务器中同样完整,因此符合做数据恢复的条件,当前要做的数据恢复属于完全恢复,恢复流程可以参考下面流程图:
由于不是真实而是以删除数据文件方式的模拟场景,恢复从上图第4步开始:
scp 192.168.2.12:/backup/xxx.tar.gz /root
mysqlbinlog mysql-bin.xxxx{x..y}>/root/recover.sql
恢复过程不允许业务人员通过业务系统连接刚刚初始化的数据库
pkill -9 mysqld (多执行几次,因为默认mysqld服务停止后会马上自启)
rm /data/* -rf
systemctl restart mysqld
grep -i "temporary password" /var/log/mysqld.log (获得临时登录密码)
mysql -uroot -p (使用临时密码登录)
mysql> set password='新密码';
mysql> source /路径/备份文件名
mysql> show databases;
mysql> source /root/recover.sql
mysql> show databases;
mysql> use hr
mysql> show tables;
mysql> select * from emp; (检查新进录入的人员信息是否存在)
在备份机直接运行备份脚本即可