Linux 自动备份 Mysql 数据库 Shell 脚本

释放双眼,带上耳机,听听看~!

作为一个后端开发人员,备份数据库是一个良好的习惯,虽然说数据库损坏或者数据丢失的概率很低,但是你不得不防,要不然出现问题了,都不知道怎么搞。

下面的这个 Shell 脚本就是能让你通过设定 Crontab 来每天备份 MySQL 数据库的方法。

准备工作

  • 你要备份的服务器要安装 Mysql 数据库,我这里使用的是 mariadb
  • 命名为:databak.sh

脚本

#!/bin/bash
# sql 备份脚本
# 保留最近100天备份

# 要删除的一百天前的日期
DEL_TEN_DAY=`date -d -100day +%F`

# Others vars
BIN_DIR="/usr/local/mariadb/bin"        # 数据库安装 /bin 路径
BACK_DIR="/home/databak"        # 要备份的目录
DATE_TODAY=`date +%F`       # 备份时间

# 用户名
DB_USER="root"
DB_PASS="123456"
# ip
DB_HOST="127.0.0.1"
# 要备份的数据库数组,可以多个,用空格分开,例如 (db1 db2)
DB_NAME=(zpcloud)


# 如果文件夹不存在则创建
if [ ! -d $BACK_DIR ]; 
then     
    mkdir -p $BACK_DIR; 
fi

cd /home/databak

echo "-----$DATE_TODAY-----" >> $BACK_DIR/BAK_LOG.txt
for DATA_BASE in ${DB_NAME[@]}
  do
    echo "开始备份 $DATA_BASE" >> $BACK_DIR/BAK_LOG.txt
    $BIN_DIR/mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS --default-character-set=utf8 -R --opt $DATA_BASE | gzip > db_${DATA_BASE}_${DATE_TODAY}.sql.gz
    # 写创建备份日志
    echo "成功备份 db_${DATA_BASE}_${DATE_TODAY} 到 $BACK_DIR" >> $BACK_DIR/BAK_LOG.txt
    if [ ! -f "$BACK_DIR/db_${DATA_BASE}_${DEL_TEN_DAY}.sql.gz" ]; then
      echo "100天前($DEL_TEN_DAY)备份不存在,无需删除" >> $BACK_DIR/BAK_LOG.txt
    else
        rm -f $BACK_DIR/db_${DATA_BASE}_${DEL_TEN_DAY}.sql.gz
        echo "删除100天前备份文件 $BACK_DIR/db_${DATA_BASE}_${DEL_TEN_DAY}.sql.gz" >> $BACK_DIR/BAK_LOG.txt
    fi
  done

赋予权限

  • 脚本是需要执行权限的
chmod 600 /home/databak.sh
chmod +x /home/databak.sh

说明

  • 上面的脚本是备份 100 天的数据库,我们可以每天导出一份 SQL 备份文件,文件的名称按 db_数据库名_当日日期 生成,然后进行打包压缩,最后再删除 100 天之前的数据库备份;

具体可以在备份目录的 BAK_LOG.txt 文件看备份日志;

具体日志输出

-----2019-03-20-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-20 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-10.sql.gz
-----2019-03-21-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-21 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-11.sql.gz
-----2019-03-22-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-22 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-12.sql.gz
-----2019-03-23-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-23 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-13.sql.gz
-----2019-03-24-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-24 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-14.sql.gz
-----2019-03-25-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-25 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-15.sql.gz
-----2019-03-26-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-26 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-16.sql.gz
-----2019-03-27-----
开始备份 zpcloud
成功备份 db_zpcloud_2019-03-27 到 /home/databak
删除100天前备份文件 /home/databak/db_zpcloud_2018-12-17.sql.gz

定时任务

  • 在 Linux 中,我们利用 Crontab 来针对 databak.sh 脚本进行定时执行
crontab -e 
  • 添加一个定时任务,每天凌晨 3 点执行一次脚本,然后开始 Mysql 的备份
0 3 * * * /home/databak/databak.sh

记着时常抽查数据库的备份情况,有条件的可以尝试将备份文件还原恢复测试,看下是否有异常问题。

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧