在一家公司做开发时,在修改bug时,一不小心把数据库中的两张关联表中的数据全部删除了,当时数据还不是特别多,毕竟项目刚上线不久,以前也听说过这种类似的事情,没想到竟然发生在了自己身上,简直太蠢了。后来才编写了shell脚本,每天自动备份数据库中的数据。
一、编写resman.sh脚本内容(这格式备份一个数据库的内容):
#!/bin/bash
#保存的备份数
number=3
#备份保存路径
backup_dir=/root/mysqlbackup
#日期
dd=`date +%Y%m%d`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=ZTEzdh
#将要备份的数据库
database_name=res_man
$tool -u $username -p$password $database_name > $backup_dir/$database_name-$dd.sql
#写创建备份日志
echo "create $backup_dir/$database_name-$dd.sql" >> $backup_dir/log.txt
#找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9}' | head -1`
#判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.sql | awk '{print $9}' | wc -l`
if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo "delete $delfile" >> $backup_dir/log.txt
fi
二、测试脚本
2.1、进入到该脚本文件目录 chmod +x sqlAutoBak.sh 添加执行权限,否则会报错 Permission denied
三、添加权限之后设置定时任务(两种方式)
3.1、第一种编辑进入/etc/crontab文件中,添加以下内容
上图表示中午十一点30开始进行数据库的备份。
3.2、 第二种方式:直接通过crontab命令进行操作
crontab -e 进行定编辑。其中crontab的参数如下:
- -e 编辑该用户的计时器设置。
- -l 列出该用户的计时器设置。
- -r 删除该用户的计时器设置。
- -u<用户名称> 指定要设定计时器的用户名称。
crontab的格式:
分钟 小时 日 月 星期 命令
* * * * * *
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列 表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
记住几个特殊符号的含义:
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字
四、resman.sh执行结果:
优化:当我们的表数据特别大的时候,mysqldump还提供了gzip压缩文件的参数 。修改如下:
#!/bin/bash
#保存的备份数
number=3
#备份保存路径
backup_dir=/root/mysqlbackup
#日期
dd=`date +%Y%m%d`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=ZTEzdh
#将要备份的数据库
database_name=res_man
$tool -u $username -p$password $database_name | gzip > $backup_dir/$database_name-$dd.zip
#写创建备份日志
echo "create $backup_dir/$database_name-$dd.zip" >> $backup_dir/log.txt
#找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.zip | awk '{print $9}' | head -1`
#判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.zip | awk '{print $9}' | wc -l`
if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo "delete $delfile" >> $backup_dir/log.txt
fi
~
五、备份多个数据库
脚本内容如下:
#!/bin/sh
#Database info
DB_USER="root"
DB_PASS="ZTEzdh"
DB_HOST="10.85.153.34"
# Database array
DB_NAME=("st_db" "res_man")
# Others vars
BIN_DIR="/usr/bin" #the mysql bin path
BCK_DIR="/home/mysql-backups" #the backup file directory
DATE=`date +%F`
# create file
mkdir $BCK_DIR/$DATE
# TODO
# /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql
for var in ${DB_NAME[@]};
do
$BIN_DIR/mysqldump -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/$DATE/db_$var.sql
done
~
~
执行结果如下:
补充:
补充
1、如果该数据库的用户没有分配 锁表 的权限,则备份会报错 when using LOCK TABLES 。那是因为mysqldump命令默认在导出时是要锁定表的,所以解决方式有两个。一个是给该用户开放 锁表 的权限;另一个是在命令中加上 --skip-lock-tables 这个参数。即是:
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME --skip-lock-tables| gzip > $BCK_DIR/db_$DATE.sql.gz
希望可以帮助到哪些刚入门写shell脚本的程序猿,有不足之处欢迎留言。谢谢!!!!