数据库备份---Shell脚本


在一家公司做开发时,在修改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脚本的程序猿,有不足之处欢迎留言。谢谢!!!!

发布了23 篇原创文章 · 获赞 12 · 访问量 9555

猜你喜欢

转载自blog.csdn.net/geng2568/article/details/88648661