自动备份多个MySQL或MariaDB数据库

・4 分钟阅读

介绍

在本文中,我们会介绍如何使用自定义bash脚本在同一台机器上备份多个MySQL或MariaDB数据库。

数据库备份

我们假设在我们的实例上有三个MySQL数据库,名为dbsite、dbblog、dbapp,不要创建这些数据库,在下面的步骤2的脚本中,在使用它们之前你可以用自己的名称替换它们。

  1. 登录到MySQL或MariaDB数据库,并且运行以下查询以创建数据库用户db_user_backups以处理备份

    
    GRANT LOCK TABLES, SELECT, SHOW VIEW, REPLICATION CLIENT ON *.* TO 'db_user_backups'@'%' IDENTIFIED BY '{COMPLEX-PASSWORD}';
    
    

    同时运行下面这个,以确保MySQL配置为正确还原存储过程,

    
    SET GLOBAL log_bin_trust_function_creators = 1;
    
    
  2. 设置必需的目录结构和文件

    
    # create backup directory with environment and log file
    sudo mkdir /backups && cd /backups
    sudo touch .env db-backup.sh db-backup.log
    sudo chmod -R 775 /backups
    sudo chmod -R g+s /backups
    sudo chmod +x db-backup.sh
    
    # add mysql backup user credentials into environment file
    echo"export MYSQL_USER=db_user_backups" > /backups/.env
    echo"export MYSQL_PASS={COMPLEX-PASSWORD}" >> /backups/.env
    
    
  3. 打开db-backup.sh nano/backups/db-backup.sh,并将下面的代码粘贴到其中,然后保存文件(Ctrl X -

    
    DB_NAMES=( 'db-vultr-site' 'db-vultr-blog' 'db-vultr-app' ) #replace with your own database name(s)
    BKUP_NAMES=()
    BKUP_DIR="/backups"
    
    # get total number of directories
    total_dbs=${#DB_NAMES[@]}
    
    # create backup file names
    for (( i=0; i<${total_dbs}; i++ )); do
     BKUP_NAMES[$i]="`date +%Y%m%d%H%M`-backup-$${DB_NAMES[$i]}.sql.gz"
    done
    
    # get backup users credentials
    source $BKUP_DIR/.env
    
    # create backups
    for (( i=0; i<${total_dbs}; i++ )); do
     # NOTE: --routines flag makes sure stored procedures are also backed up
     mysqldump --routines -u ${MYSQL_USER} -p${MYSQL_PASS} | gzip > ${BKUP_DIR}/${BKUP_NAMES[$i]}
    done
    
    

    上面的代码通过一个数组循环,使用你想要备份的数据库的名称,然后执行。

Cronjob设置

会cronjob设置为每个午夜运行一次,运行备份脚本,并将结果/输出保存到备份日志。

  1. 打开crontab

     
    crontab -e
    
     
  2. 将以下项添加到crontab

    
    0 0 * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
    
    

    注意在测试时可以将cronjob设置为每1分钟运行一次,如下所示,

    
    * * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
    
    

    - 或 - 每5分钟(用你想要的分钟数替换5)

    
    */5 * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
    
    

Huangzhongbang profile image