最近需要对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/f及默认配置文件 导出函数、存储过程、事件,刷新binlog#,binlog加注释同时全局锁表,根据自身实际情况进行配置mysqldump --defaults-extra-file=/data/backup/f -R -E --flush-logs --master-data=2 $db_name | gzip > $filepathecho '导出成功,文件名为: '$filepath
chmod +x ./mysql_backup.sh
3.新建配置文件
vim f
#mysql 配置导入参数[mysql]host=127.0.0.1user=rootpassword='root'#mysqldump 配置导出参数[mysqldump]#允许导出的文件大小上限#max_allowed_packet = 400Mhost=127.0.0.1user=rootpassword='root'
4.开启binlog
查找f
find / -name f
vim /etc/f
加入
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/bashif [ -z $1 ] || [ ! -f $1 ]then echo "请输入sql压缩文件(*.sql.gz)" exit 1fidb_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 1fisql_file=${gz_sql_file%.*}echo '解压文件中...'gzip -dc $base_dir$gz_sql_file > $base_dir$sql_fileecho '解压完成.'echo '开始导入数据库...'mysql --defaults-extra-file=/data/backup/f $db_name < $base_dir$sql_fileif [ -f $base_dir$sql_file ]then echo '删除临时文件.' rm -f $base_dir$sql_filefiecho '导入完成.'
chmod +x ./mysql_restore.sh
7.导入测试
sh ./mysql_restore.sh ./mysql/-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/bashbackupDir=/data/backup/increment_backup#备份时复制mysql-bin.00000*的目标目录mysqlDir=/var/lib/mysql#mysql的数据目录logFile=/data/backup/log_file/backup.logBinFile=/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 fidoneecho `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