Linux MySQL定时自动备份

需求分析

  • 备份数据
  • 恢复数据
  • 删除一段时间以前的备份文件

解决方案

Prepare

准备3个脚本:

  • mysql_backup.sh -> 备份数据
  • mysql_restore.sh -> 恢复数据
  • mysql_remove_backup.sh -> 删除一段时间以前的备份文件
  • 创建备份目录,暂定位置/data/backup/mysql

    mkdir -pv /data/backup/mysql/
    
  • 创建脚本存放目录,,暂定位置/data/script

    mkdir -pv /data/script
    

1. 备份MySQL指定数据库

  • 创建脚本mysql_backup.sh

    cd /data/script
    vi mysql_backup.sh
    
  • 指定数据库、用户名、密码进行备份,这里为DBXXX,root,AAAAAA

    • 脚本内容

      #!/bin/bash
      # 需要的话,自己改这里
      db_user='root'
      db_password='AAAAAA'
      db_name='DBXXX'
      backup_dir='/data/backup/mysql/'
      current_time=$(date +'%Y-%m-%d_%H%M%S')
      filepath=$backup_dir$db_name'_'$current_time'.sql.gz'
      echo '开始导出数据库...'
      mysqldump -p$db_password -u$db_user $db_name | gzip > $filepath
      echo '导出成功,文件名为: '$filepath
      
  • 指定MySQL配置文件进行备份

    • 创建mysqldump配置

      cd /data/script
      vi mysql_mysqldump.cnf
      
    • mysql_mysqldump.cnf配置mysqldump,写入用户名和密码,这里为rootAAAAAA,可以设置一下允许导出的文件大小上限

      [mysql]
      host=127.0.0.1
      user=root
      password='AAAAAA'
      [mysqldump]
      max_allowed_packet=400M
      host=127.0.0.1
      user=root
      password='AAAAAA'
      
    • 脚本内容

        #!/bin/bash
        # 需要的话,自己改这里
        db_name='baizhan'
        backup_dir='/data/backup/mysql/'
        current_time=$(date +'%Y-%m-%d_%H%M%S')
        filepath=$backup_dir$db_name'_'$current_time'.sql.gz'
        #此处没有使用 $db_password $db_user, 已经写入到配置文件中
        echo '开始导出数据库...'
        mysqldump --defaults-extra-file=/data/script/mysql_mysqldump.cnf  $db_name | gzip > $filepath
        echo '导出成功,文件名为: '$filepath
      
  • 赋予脚本运行权限

    chmod +x /data/script/mysql_backup.sh
    
  • 运行

    sh ./data/script/mysql_backup.sh
    

2.恢复数据库备份

  • 创建脚本mysql_restore.sh

    cd /data/script
    vi mysql_restore.sh
    
  • 脚本内容

    #!/bin/bash
    
    if [ -z $1 ] || [ ! -f $1 ]
    then
        echo "请输入sql压缩文件(*.sql.gz)"
        exit 1
    fi
    
    db_name='baizhan'
    base_dir='/data/backup/mysql/'
    gz_sql_file=`basename $1`
    
    file_ext=${gz_sql_file##*.}
    if [ $file_ext != 'gz' ]
    then
        echo '文件格式不正确,请输入 .sql.gz 文件'
        exit 1
    fi
    
    sql_file=${gz_sql_file%.*}
    echo '解压文件中...'
    gzip -dc $base_dir$gz_sql_file > $base_dir$sql_file
    echo '解压完成.'
    echo '开始导入数据库...'
    
    mysql --defaults-extra-file=/data/script/mysql_mysqldump.cnf $db_name < $base_dir$sql_file
    
    if [ -f $base_dir$sql_file ]
    then
        echo '删除临时文件.'
        rm -f $base_dir$sql_file
    fi
    echo '导入完成.'
    
  • 赋予脚本运行权限

    chmod +x /data/script/mysql_restore.sh
    
  • 运行

    sh ./data/script/mysql_restore.sh ./data/backup/mysql/baizhan_2022-10-28_440561.sql.gz
    

3. 删除一段时间以前的备份

  • 创建脚本mysql_remove_backup.sh

    cd /data/script
    vi mysql_remove_backup.sh
    
  • 脚本内容,只保留最近30天的

    #!/bin/sh
    
    backup_dir='/data/backup/mysql/'
    # 删除30天前的备份
    find $backup_dir -type f -mtime +30 | xargs rm -f
    
  • 赋予脚本运行权限

    chmod +x /data/script/mysql_remove_backup.sh
    

4. 定时执行

  • 定时备份配置

    crontab -e
    # 粘贴下面的内容, 大家根据自己的需要更改就可以了
    0 1,12 * * * /data/script/mysql_backup.sh # 每天凌晨1点,中午12点备份一次数据
    
    # 大家可以先使用下面这条做为测试哦,1分钟跑一次,我们只需要查看 ll /data/backup/mysql 这个文件夹就好了
    */1 * * * * /data/script/mysql_backup.sh
    
  • 定时清理备份配置

    crontab -e
    # 下面这个就是脚本内容哦,添加这一句
    0 1 * * * /data/script/remove_backup.sh # 每天凌晨1点,自动删除30天前的备份