把 MySQL 数据库定时备份并上传备份的解决方案

N年前写过一篇定时备份的笔记《linux 制作自动备份脚本,并通过 crontab 命令定时执行》,这里的方案是在当初的基础上,加上通过scp把备份保存到另一台服务器,视个人情况,你也可以把备份通过一些云API上传到云盘。

MySQL的主从功能可以很简单地帮我们实现实时备份,但是定时备份始终是不可或缺的,为什么?因为在程序漏洞、恶意攻击、管理员误操作这样的情况发生时,从表=主表。。。

主从备份针对的更多是硬件问题,而定时备份虽然备份的不是实时数据,但可以在遇到非硬件问题时提供一定程度的数据保障。


需求拆解

  1. 对数据库进行定时备份
  2. 自动把备份存放到另一台服务器上

知识点

  • shell 脚本文件编程
  • crontab 定时任务设置
  • ssh 通过密钥实现免密码登录/传输
  • scp 文件传输

最终实现

  1. 创建ssh密钥+公钥

    执行指令:

     ssh-keygen
     // 或 ssh-keygen -t rsa
    

    后续配置都不需要设置,可以直接按回车即可,然后系统会输出类似这样的结果:

     Generating a public/private rsa key pair.
     Enter the file in which you wish to save they key (i.e., /home/username/.ssh/id_rsa).
     Enter a passphrase (leave empty for no passphrase).
     Enter same passphrase again:
     
     Your identification has been saved in /home/username/.ssh/id_rsa
     Your public key has been saved in /home/username/.ssh/id_sra.pub
     
     The key fingerprint is:
     ar:bc:d3:9e:g3:1f:63:6f:6b:32:2e:97:ee:42:e1:be root@0.0.0.0
     
     The key’s randomart image is:
     
     +--[ RSA 2048]----+
     | ..+**B.o++o     |
     |  . o+==o. o     |
     |    . .oo.=      |
     |      . +E+ .    |
     |        S .      |
     |                 |
     |                 |
     |                 |
     |                 |
     +-----------------+
    
  2. 把公钥放到存储备份的服务器上,实现免密码登录/传输

    执行指令**(请修改 root@0.0.0.0 为你存储备份的服务器)**:

     ssh-copy-id -i ~/.ssh/id_rsa.pub root@0.0.0.0
    

    你会看到如下提示:

     /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
     /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed == if you are prompted now it is to install the new keys
     root@0.0.0.0's password:
    

    只要你需要输入一次你存储备份的服务器的密码,就可以成功看到:

     Number of key(s) added: 1
     Now try logging into the machine, with:   "ssh 'root@0.0.0.0'"
     and check to make sure that only the key(s) you wanted were added.
    
  3. 编写数据库备份脚本,包括mysqldumpzipscp三步

    下面是这我的脚本文件 auto_backup.sh :

     #!/bin/sh
     today=`date +%Y%m%d`
     dbname="db1,db2"
     for i in $dbname
     do
     echo {"$i"} is backuping...
     mysqldump -uroot --password=dbpassword "$i">/backup/"$i"_"$today".sql
     echo {"$i"} is backuped.
     echo {"$i"} is ziping...
     zip /backup/"$i"_"$today".zip /backup/"$i"_"$today".sql
     echo {"$i"} is ziped.
     echo {"$i"} is uploading...
     scp /backup/"$i"_"$today".zip root@0.0.0.0:/db_backup/
     echo {"$i"} is uploaded.
     done
    
    • 修改dbname="db1,db2"为你要备份的数据库名,逗号分隔
    • 修改-uroot --password=dbpassword为你的数据库用户及密码
    • 修改root@0.0.0.0:/db_backup/为你存储备份的服务器及文件夹
  4. 测试脚本

    万事俱备,测试执行

     ./auto_backup.sh
    

    理想结果:

     {db1} is backuping...
     {db1} is backuped.
     {db1} is ziping...
     updating: backup/db1_20180201.sql (deflated 86%)
     {db1} is ziped.
     {db1} is uploading...
     db1_20180202.zip           100%  586KB 586.5KB/s   00:00
     {db1} is uploaded.
    
  5. 设置定时任务

    先复习一下 crontab 命令:

    • crontab -e : 修改 crontab 文件,如果文件不存在会自动创建。
    • crontab -l : 显示 crontab 文件。
    • crontab -r : 删除 crontab 文件。
    • crontab -ir : 删除 crontab 文件前提醒用户。

    用crontab -e命令创建crontab文件,其文件格式如下:

     {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
    

    以下代码设置了一个每天凌晨三点执行备份脚本的定时任务:

     0 3 * * * /root/auto_backup.sh
    
若您觉得我的博文对您有帮助,欢迎点击下方按钮对我打赏
打赏