【问题标题】:Linux shell script for database backup用于数据库备份的 Linux shell 脚本
【发布时间】:2013-11-09 00:02:42
【问题描述】:

我尝试了许多用于数据库备份的脚本,但我做不到。我想每小时备份一次我的数据库。
我将文件添加到“/etc/cron.hourly/”文件夹,将其 chmod 更改为 755,但它没有运行。 至少我写了我的伪代码。

如果您能为此操作编写一个脚本并告诉我应该怎么做,我会很高兴? 将此脚本文件添加到/etc/cron.hourly/ 文件夹后。

  • 获取当前日期并创建变量date=date(d_m_y_H_M_S)
  • 为文件名创建一个变量filename="$date".gz
  • 像这样mysqldump --user=my_user --password=my_pass --default-character-set=utf8 my_database | gzip > "/var/www/vhosts/system/example.com/httpdocs/backups/$("filename") 获取我的数据库的转储
  • 删除文件夹 /var/www/vhosts/system/example.com/httpdocs/backups/ 中所有超过 8 天的文件
  • 到文件"/var/www/vhosts/system/example.com/httpdocs/backup_log.txt",此文本将被写入:Backup is created at $("date")
  • 将文件所有者 (chown) 从 root 更改为“my_user”。因为我想从“my_user”FTP 帐户打开备份和日志文件。
  • 我不想在每个 cron 之后发送电子邮件。 >/dev/null 2>&1 将被添加。

【问题讨论】:

    标签: mysql linux shell cron


    【解决方案1】:

    经过数小时的工作,我创建了一个如下所示的解决方案。我为其他可以受益的人复制粘贴。

    首先创建一个脚本文件,并赋予该文件可执行权限。

    # cd /etc/cron.daily/
    # touch /etc/cron.daily/dbbackup-daily.sh
    # chmod 755 /etc/cron.daily/dbbackup-daily.sh
    # vi /etc/cron.daily/dbbackup-daily.sh
    

    然后使用 Shift+Ins 将以下行复制到文件中

    #!/bin/sh
    now="$(date +'%d_%m_%Y_%H_%M_%S')"
    filename="db_backup_$now".gz
    backupfolder="/var/www/vhosts/example.com/httpdocs/backups"
    fullpathbackupfile="$backupfolder/$filename"
    logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
    echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
    mysqldump --user=mydbuser --password=mypass --default-character-set=utf8 mydatabase | gzip > "$fullpathbackupfile"
    echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
    chown myuser "$fullpathbackupfile"
    chown myuser "$logfile"
    echo "file permission changed" >> "$logfile"
    find "$backupfolder" -name db_backup_* -mtime +8 -exec rm {} \;
    echo "old files deleted" >> "$logfile"
    echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
    echo "*****************" >> "$logfile"
    exit 0
    

    编辑:
    如果您使用 InnoDB 并且备份需要太多时间,您可以添加“single-transaction”参数以防止锁定。所以mysqldump行会是这样的:

    mysqldump --user=mydbuser --password=mypass --default-character-set=utf8
              --single-transaction mydatabase | gzip > "$fullpathbackupfile"
    

    【讨论】:

    • 很好——但是对于新手来说,你要么需要明确地创建日志文件(因为你不能附加到一个不存在的文件)或者检查它并创建它
    • 这个轮换是什么样的,它每天保留多少备份?
    • 安全警告:使用 --password 参数可以通过在 /proc 中查找进程命令行来发现您的密码。请勿在多用户系统上使用,除非您已应用各种内核安全补丁以防止用户查看其他用户的进程信息。
    • stackoverflow.com/questions/20751352/… 你可以使用“mysql --login-path=local -e”
    • 找到 . -name sql_backup_* -mtime +8 必须更改为 'db_backup_*' 以包含引号或查找命令失败
    【解决方案2】:

    创建一个类似这样的脚本:

    #!/bin/sh -e
    
    location=~/`date +%Y%m%d_%H%M%S`.db
    
    mysqldump -u root --password=<your password> database_name > $location
    
    gzip $location
    

    然后您可以编辑脚本将要运行的用户的crontab

    $> crontab -e
    

    并追加条目

    01 * * * * ~/script_path.sh
    

    这将使它在每天每小时的第一分钟运行。

    然后你只需要添加你的卷和其他功能就可以了。

    【讨论】:

    • 如何将输出通过管道传输到 gzip 以节省磁盘空间?
    • 在我的 Mac 上将此脚本作为 cron 作业运行时遇到问题。添加了 mysqldump 和 gzip 二进制文件的完整路径。这很好用。没有它,我得到一个大小为 0 的文件 ($location)。 gzip 从未运行过。由于我使用 gzip 作为附加功能,我真正的问题是 crontab 无法识别 mysqldump 路径 (/usr/local/bin)。希望这可以帮助任何人解决这个问题。并没有像我在这里写的那样完全找到它。
    【解决方案3】:

    我遇到了同样的问题。 但我设法写了一个脚本。 希望这会有所帮助。

    #!/bin/bash
    # Database credentials
    user="username"
    password="password"
    host="localhost"
    db_name="dbname"
    # Other options
    backup_path="/DB/DB_Backup"
    date=$(date +"%d-%b-%Y")
    # Set default file permissions
    umask 177
    # Dump database into SQL file
    mysqldump --user=$user --password=$password --host=$host $db_name >$backup_path/$db_name-$date.sql
    
    # Delete files older than 30 days
    find $backup_path/* -mtime +30 -exec rm {} \;
    
    
    #DB backup log
    echo -e "$(date +'%d-%b-%y  %r '):ALERT:Database has been Backuped"    >>/var/log/DB_Backup.log
    

    【讨论】:

    • 我得到以下错误 mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) 尝试连接时
    • 可能是您的用户名不正确。能不能直接试试用户名和密码看看。
    • 我修好了。谢谢。问题是密码包含特殊字符。
    【解决方案4】:
    #!/bin/sh
    #Procedures = For DB Backup
    #Scheduled at : Every Day 22:00
    
    v_path=/etc/database_jobs/db_backup
    logfile_path=/etc/database_jobs
    v_file_name=DB_Production
    v_cnt=0
    
    MAILTO="abc@as.in"
    touch "$logfile_path/kaka_db_log.log"
    
    #DB Backup
    mysqldump -uusername -ppassword -h111.111.111.111 ddbname > $v_path/$v_file_name`date +%Y-%m-%d`.sql 
    if [ "$?" -eq 0 ]
      then
       v_cnt=`expr $v_cnt + 1`
      mail -s "DB Backup has been done successfully" $MAILTO < $logfile_path/db_log.log
     else
       mail -s "Alert : kaka DB Backup has been failed" $MAILTO < $logfile_path/db_log.log
       exit
    fi
    

    【讨论】:

      【解决方案5】:

      这是我的 ubuntu mysql 备份脚本,以防它对某人有所帮助。

      #Mysql back up script
      
      start_time="$(date -u +%s)"
      
      now(){
      date +%d-%B-%Y_%H-%M-%S
      }
      
      ip(){
      /sbin/ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'
      }
      
      filename="`now`".zip
      backupfolder=/path/to/any/folder
      fullpathbackupfile=$backupfolder/$filename
      db_user=xxx
      db_password=xxx
      db_name=xxx
      
      printf "\n\n"
      printf "******************************\n"
      printf "Started Automatic Mysql Backup\n"
      printf "******************************\n"
      printf "TIME: `now`\n"
      printf "IP_ADDRESS: `ip` \n"
      printf "DB_SERVER_NAME: DB-SERVER-1\n"
      
      printf "%sBACKUP_FILE_PATH $fullpathbackupfile\n"
      
      printf "Starting Mysql Dump \n"
      
      mysqldump -u $db_user -p$db_password $db_name| pv | zip > $fullpathbackupfile
      
      end_time="$(date -u +%s)"
      
      elapsed=$(($end_time-$start_time))
      
      printf "%sMysql Dump Completed In $elapsed seconds\n"
      
      printf "******************************\n"
      

      PS:记得在你的ubuntu中安装pv和zip

      sudo apt install pv
      sudo apt install zip
      

      这是我如何在 ubuntu 中使用 crontab -e 设置 crontab 以每 6 小时运行一次

      0 */6 * * * sh /path/to/shfile/backup-mysql.sh >> /path/to/logs/backup-mysql.log 2>&1
      

      很酷的是它会创建一个更容易从任何地方解压缩的 zip 文件

      【讨论】:

        【解决方案6】:

        现在,将以下内容复制到脚本文件中(例如:/backup/mysql-backup.sh)并保存在您的 Linux 系统上。

            #!/bin/bash
        
            export PATH=/bin:/usr/bin:/usr/local/bin
            TODAY=`date +"%d%b%Y"`
        
            DB_BACKUP_PATH='/backup/dbbackup'
            MYSQL_HOST='localhost'
            MYSQL_PORT='3306'
            MYSQL_USER='root'
            MYSQL_PASSWORD='mysecret'
            DATABASE_NAME='mydb'
            BACKUP_RETAIN_DAYS=30   
        
            mkdir -p ${DB_BACKUP_PATH}/${TODAY}
            echo "Backup started for database - ${DATABASE_NAME}"
        
            mysqldump -h ${MYSQL_HOST} \
           -P ${MYSQL_PORT} \
           -u ${MYSQL_USER} \
           -p${MYSQL_PASSWORD} \
           ${DATABASE_NAME} | gzip > ${DB_BACKUP_PATH}/${TODAY}/${DATABASE_NAME}-${TODAY}.sql.gz
        
        if [ $? -eq 0 ]; then
          echo "Database backup successfully completed"
        else
          echo "Error found during backup"
          exit 1
        fi
        
        
        ##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####
        
        DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`
        
        if [ ! -z ${DB_BACKUP_PATH} ]; then
              cd ${DB_BACKUP_PATH}
              if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
                    rm -rf ${DBDELDATE}
              fi
        fi
        

        创建或下载脚本后确保设置执行权限以正常运行。

        $ chmod +x /backup/mysql-backup.sh
        

        使用 crontab -e 命令在您的系统上编辑 crontab。添加以下设置以启用凌晨 3 点的备份。

        0 3 * * * root /backup/mysql-backup.sh
        

        【讨论】:

          【解决方案7】:
          #!/bin/bash
          
          # Add your backup dir location, password, mysql location and mysqldump        location
          DATE=$(date +%d-%m-%Y)
          BACKUP_DIR="/var/www/back"
          MYSQL_USER="root"
          MYSQL_PASSWORD=""
          MYSQL='/usr/bin/mysql'
          MYSQLDUMP='/usr/bin/mysqldump'
          DB='demo'
          
          #to empty the backup directory and delete all previous backups
          rm -r $BACKUP_DIR/*  
          
          mysqldump -u root -p'' demo | gzip -9 > $BACKUP_DIR/demo$date_format.sql.$DATE.gz
          
          #changing permissions of directory 
          chmod -R 777 $BACKUP_DIR
          

          【讨论】:

            【解决方案8】:

            您可以考虑使用这个开源工具 matiri,https://github.com/AAFC-MBB/matiri,它是一个在 Sqlite3 中包含元数据的并发 mysql 备份脚本。特点:

            • 多服务器:支持多个 MySQL 服务器,无论它们位于同一物理服务器还是单独的物理服务器上。
            • 并行:要备份的服务器上的每个数据库单独完成,并行(并发可设置:默认:3)
            • 已压缩:每个数据库备份都已压缩
            • 校验和:存储的每个压缩备份文件的 SHA256 和所有文件的存档
            • 已归档:所有数据库备份都打包到单个文件中
            • 记录:Sqlite3 数据库中存储的备份信息

            完全披露:原始 matiri 作者。

            【讨论】:

              【解决方案9】:

              作为 DBA,您必须安排 MySQL 数据库的备份以防出现任何问题,以便您可以从当前备份中恢复您的数据库。

              这里,我们使用 mysqldump 来备份 mysql 数据库,您可以将其放入脚本中。

              [orahow@oradbdb DB_Backup]$ cat .backup_script.sh

              #!/bin/bash
              # Database credentials
              user="root"
              password="1Loginxx"
              db_name="orahowdb"
              v_cnt=0
              logfile_path=/DB_Backup
              touch "$logfile_path/orahowdb_backup.log"
              # Other options
              backup_path="/DB_Backup"
              date=$(date +"%d-%b-%Y-%H-%M-%p")
              # Set default file permissions
              

              继续阅读 .... MySQL Backup

              【讨论】:

                【解决方案10】:

                我已经准备了一个 Shell 脚本来创建一个 MYSQL 数据库的备份。 您可以使用它来备份我们的数据库。

                    #!/bin/bash
                    export PATH=/bin:/usr/bin:/usr/local/bin
                    TODAY=`date +"%d%b%Y_%I:%M:%S%p"`
                
                    ################################################################
                    ################## Update below values  ########################
                    DB_BACKUP_PATH='/backup/dbbackup'
                    MYSQL_HOST='localhost'
                    MYSQL_PORT='3306'
                    MYSQL_USER='auriga'
                    MYSQL_PASSWORD='auriga@123'
                    DATABASE_NAME=( Project_O2 o2)
                    BACKUP_RETAIN_DAYS=30   ## Number of days to keep local backup copy; Enable script code in end of th script
                
                    #################################################################
                    { mkdir -p ${DB_BACKUP_PATH}/${TODAY}
                        echo "
                                                ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
                    } || {
                        echo "Can not make Directry"
                        echo "Possibly Path is wrong"
                    }
                    { if ! mysql -u ${MYSQL_USER} -p${MYSQL_PASSWORD} -e 'exit'; then
                        echo 'Failed! You may have Incorrect PASSWORD/USER ' >> ${DB_BACKUP_PATH}/Backup-Report.txt
                        exit 1
                    fi
                
                        for DB in "${DATABASE_NAME[@]}"; do
                            if ! mysql -u ${MYSQL_USER} -p${MYSQL_PASSWORD} -e "use "${DB}; then
                                echo "Failed! Database ${DB} Not Found on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
                
                            else
                                # echo "Backup started for database - ${DB}"            
                                # mysqldump -h localhost -P 3306 -u auriga -pauriga@123 Project_O2      # use gzip..
                
                                mysqldump -h ${MYSQL_HOST} -P ${MYSQL_PORT} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} \
                                          --databases ${DB} | gzip > ${DB_BACKUP_PATH}/${TODAY}/${DB}-${TODAY}.sql.gz
                
                                if [ $? -eq 0 ]; then
                                    touch ${DB_BACKUP_PATH}/Backup-Report.txt
                                    echo "successfully backed-up of ${DB} on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
                                    # echo "Database backup successfully completed"
                
                                else
                                    touch ${DB_BACKUP_PATH}/Backup-Report.txt
                                    echo "Failed to backup of ${DB} on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
                                    # echo "Error found during backup"
                                    exit 1
                                fi
                            fi
                        done
                    } || {
                        echo "Failed during backup"
                        echo "Failed to backup on ${TODAY}" >> ${DB_BACKUP_PATH}/Backup-Report.txt
                        # ./myshellsc.sh 2> ${DB_BACKUP_PATH}/Backup-Report.txt
                    }
                
                    ##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####
                
                    # DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`
                
                    # if [ ! -z ${DB_BACKUP_PATH} ]; then
                    #       cd ${DB_BACKUP_PATH}
                    #       if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
                    #             rm -rf ${DBDELDATE}
                    #       fi
                    # fi
                
                    ### End of script ####
                

                在脚本中,我们只需要提供我们的用户名、密码、数据库名称(或多个数据库,如果有多个),如果不同,还需要提供端口号。

                要运行脚本,请使用以下命令:

                sudo ./script.sc
                

                我还建议,如果您想在文件中查看结果,例如: 备份失败或成功, 然后使用如下命令:

                sudo ./myshellsc.sh 2>> Backup-Report.log
                

                谢谢。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-17
                  • 1970-01-01
                  • 2015-10-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多