背景
是在清理某服务器无用数据时发现的,某系统里面,发现新的sql数据。为什么会有人定期备份成sql数据。后面查了下,发现是使用了shell脚本操作,在此记录下,因为感觉很有用。
过程
使用cronab每天凌晨3点备份数据。
bash
00 03 * * * /home/xxx/xxx/xxx.sh
备份脚本内容:
bash
#!/bin/bash
number=3
backup_dir=/home/xxx/xxx
dd=`date +%Y-%m-%d-%H-%M-%S`
username=xxxx
password=xxxx
mysqldump -u $username -p$password -A > $backup_dir/$dd.sql
delfile=`ls -lcrt $backup_dir/*.sql | awk '{print $9}' | head -1`
count=`ls -lcrt $backup_dir/*.sql | awk '{print $9}' | wc -l`
if [ $count -gt $number]
rm $delfile
fi
说明:
mysqldump -A:中的-A意思是 --all-databases,包含所有库、所有用户权限、所有系统配置
ls -lcrt中:
- -l:long长格式显示;
- -t:time-sort按时间排序,默认最新的排前面;
- -c:--time=ctime --sort=time,与-t搭配,表明按变更时间进行排序。
- -r:--severse,反转,和-t搭配时,原本是默认最新的排前面,有了-r后,最新的就放最后面了了。
| awk '{print $9}' | head -1命令:
- 将刚刚ls查到的数据输入给awk命令,按字段处理文本。
- awk '{print $9}' 提取第9段的信息(ls -lcrt中第9段是文件名),将文件名输入到head命令中。
- head -1:只留下第一行输出,业务逻辑就是输出,当前sql中,最老的备份文件。
wc -l:
- wc:word count统计
- -l:指--lines代码只统计行数。
-gt:Greater Than:大于
优化
这个脚本,搭配crontab在凌晨3点备份整库,能实现功能,但存在一些问题,需要优化和整改。
① 数据太大,可加压缩功能:
bash
mysqldump -A | gzip > $backup_dir/$dd.sql.gz
② 权限问题,使用crontab最好是root权限,并且除了root本身有读写执行权限,其他用户和组都只放执行权限:
711:rwx--x--x
防止密码泄露。
