最近需要对mysql进行定时备份,写一篇备忘

1. 创建备份目录

目录说明:

  • /data/backup/mysql : 备份文件存放目录
  • /data/backup : 脚本存放目录

mkdir -p /data/backup/mysql
cd /data/backup

2.创建全量备份脚本文件

vim mysql_backup.sh
mysqldump 语法说明:

  • mysqldump [options] –u 用户名 -p 密码 数据库名 > 备份的文件
  • -R 导出 函数和存储过程
  • -E 导出事件
  • -A 备份所有数据库
  • -d 备份表结构
  • -t 备份表数据
  • -B 同时备份多个数据库,例如:-B db1 db2 db3
  • -l 指定表上锁
  • -x 所有表上锁
  • –single-transaction 不锁表备份,只支持innodb 优先级大于–master-data
  • –master-data 记录binlog同时锁表 –master-data = 1 binlog 记录不加注释 =2 加注释
  • –defaults-extra-file 加载指定配置文件和所有默认需要加载配置文件
  • –defaults-file 加载指定配置文件
  • –flush-logs 刷新binlog日志,增量备份必要条件
#!/bin/bash

#用户、密码写在配置文件中所以此处不配置
#db_user='root'
#db_password=`cat /data/www/mysql_password`
db_name='数据库名称'
backup_dir='/data/backup/mysql/'
current_time=$(date +'%Y-%m-%d_%H:%M:%S')
filepath=$backup_dir$current_time'.sql.gz'
echo '开始导出数据库...'
# 下面的意思是 加载/data/backup/my_mysql.cnf及默认配置文件 导出函数、存储过程、事件,刷新binlog
#,binlog加注释同时全局锁表,根据自身实际情况进行配置
mysqldump  --defaults-extra-file=/data/backup/my_mysql.cnf -R -E --flush-logs --master-data=2 $db_name | gzip > $filepath
echo '导出成功,文件名为: '$filepath

chmod +x ./mysql_backup.sh

3.新建配置文件

vim my_mysql.cnf

#mysql 配置导入参数
[mysql]
host=127.0.0.1
user=root
password='root'
#mysqldump 配置导出参数
[mysqldump]
#允许导出的文件大小上限
#max_allowed_packet    = 400M
host=127.0.0.1
user=root
password='root'

4.开启binlog

查找my.cnf
find / -name my.cnf
vim /etc/my.cnf
加入
server_id = 2
log_bin = mysql-bin
重启mysql服务
systemctl restart mysqld
查看是否开启
show variables like ‘log_bin%’;

5.导出测试

sh ./mysql_backup.sh
ll ./mysql

6.创建导入脚本文件

cd /data/backup
vim mysql_restore.sh

#!/bin/bash
if [ -z $1 ] || [ ! -f $1 ]
then    
	echo "请输入sql压缩文件(*.sql.gz)"    
	exit 1
fi

db_name='test_backup'
base_dir='/data/backup/mysql/'
gz_sql_file=`basename $1`
file_ext=${gz_sql_file##*.}
if [ $file_ext != 'gz' ]
then    
	echo '文件格式不正确,请输入 .sql.gz 文件'    
	exit 1
fi
sql_file=${gz_sql_file%.*}
echo '解压文件中...'
gzip -dc $base_dir$gz_sql_file > $base_dir$sql_file
echo '解压完成.'
echo '开始导入数据库...'
mysql --defaults-extra-file=/data/backup/my_mysql.cnf $db_name < $base_dir$sql_file

if [ -f $base_dir$sql_file ]
then    
	echo '删除临时文件.'    
	rm -f $base_dir$sql_file
fi
echo '导入完成.'

chmod +x ./mysql_restore.sh

7.导入测试

sh ./mysql_restore.sh ./mysql/2020-06-04_091700.sql.gz
出现This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
set global log_bin_trust_function_creators=TRUE;

8.创建增量备份脚本文件

cd /data/backup
vim mysql_increment_backup.sh
注意下面用到的文件和目录不能为空

#!/bin/bash
backupDir=/data/backup/increment_backup
#备份时复制mysql-bin.00000*的目标目录
mysqlDir=/var/lib/mysql
#mysql的数据目录
logFile=/data/backup/log_file/backup.log
BinFile=/var/lib/mysql/mysql-bin.index
#mysql的index文件路径,放在数据目录下的
mysqladmin -uroot -proot  flush-logs
#这个是用于产生新的mysql-bin.00000*文件
# wc -l 统计行数
# awk 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
for file in `cat $BinFile`
do   
	base=`basename $file`   
	echo $base   
	#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./   
	NextNum=`expr $NextNum + 1`   
	if [ $NextNum -eq $Counter ]   
	then       
		echo $base skip! >> $logFile   
	else       
		dest=$backupDir/$base       
		if(test -e $dest)       
		#test -e用于检测目标文件是否存在,存在就写exist!到$logFile去       
		then           
			echo $base exist! >> $logFile       
		else           
			cp $mysqlDir/$base $backupDir           
			echo $base copying >> $logFile        
		fi    
	fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup success! >> $logFile

chmod +x ./mysql_increment_backup.sh

9.创建清理备份脚本

vim remove_backup.sh

#/bin/bash

# 删除30天前的全量备份
find /data/backup/mysql -type f -mtime +30 | xargs rm -f

chmod +x ./remove_backup.sh

10.定时任务介绍

crontab 语法说明:

  • -e 编辑内容
  • -l 查看内容

定时配置格式为 ******
代表任何时间段,5个*,从左至右分别是:

  • 分 取值范围0-59
  • 时 取值范围0-23
  • 天 取值范围1-31
  • 年 取值范围1-12
  • 周 取值范围0-6

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
查看crontab服务状态:service crond status
启动crontab服务:service crond start
停止crontab服务:service crond stop
查看crontab服务是否已设置为开机启动,执行命令:ntsysv
加入开机自动启动:chkconfig crond on

11.配置定时任务

crontab -e

#每周日凌晨1点进行全量备份
0 1 * * 0  /data/backup/mysql_backup.sh
#每天凌晨2点进行增量备份
0 2 * * *  /data/backup/mysql_increment_backup.sh
# 每天凌晨3点,自动删除30天前的备份
0 3 * * * /data/backup/remove_backup.sh

service crond start
ntsysv
chkconfig crond on