【问题标题】:Bash mysql / public_html only backup scriptbash mysql / public_html 仅备份脚本
【发布时间】:2012-08-08 09:26:35
【问题描述】:

在我的专用设备上,有一个我想备份到的 5gig NAS。 最终对每个 cPanel 的 MySQL 表和 public_html 进行备份,

如何读取 MySQL 表文件夹 (/var/lib/mysql) 的内容,如果找到子文件夹,则将找到的这些子文件夹的 tar.gz 文件复制到 /mnt/ mysql_backup/日期/数据库名称。

然后去 /home/ 遍历每个文件夹以备份 /public_html/ 文件夹所在的位置,然后将文件复制到 /mnt/files_backup/date/cpanelfoler

如果脚本成功完成。 删除旧备份并仅保留刚刚创建的最后一个备份。

任何帮助将不胜感激

【问题讨论】:

  • 您对哪一点特别有困难?
  • 使用mysqldump 会比备份/var/lib/mysql 更好/更容易。

标签: linux bash backup


【解决方案1】:

使用mysqldump:

$ mysqldump my_database > my_database_dump.sql

【讨论】:

    【解决方案2】:

    要备份mysql,我会考虑使用mysqldump。但请记住,mysqldump 在运行时会锁定表。如果您的数据库中有大量数据,则此过程可能需要相当长的时间。

    如果您不能长时间锁定数据库,我会做一个镜像并在该镜像上运行备份脚本。 (在这里找到详细的分步过程:http://www.howtoforge.com/mysql_database_replication

    要备份您的数据库,您可以执行以下操作:

    BACKUPDATE=$(date +"%Y%m%d")
    BACKUPDIR='/mnt/backup'
    
    BACKUPUSER='bkpUser'
    BACKUPPASS='bkpPassword'
    
    mkdir -p $BACKUPDIR/$BACKUPDATE/databases/
    
    for DATABASE in $(mysql -u$BACKUPUSER -pBACKUPPASS -e "show databases" | grep -v Database | grep -v  information_schema)
      do 
          mysqldump -u$BACKUPUSER -pBACKUPPASS $DATABASE > $BACKUPDIR/$BACKUPDATE/databases/$DATABASE.sql
      done
    

    这应该每天创建一个新文件夹并将所有数据库转储到其中。

    对于 public_html 文件夹,类似

    tar czvf $BACKUPDIR/$BACKUPDATE/public_html.tar.gz $(find /home/  -type d -name public_html)
    

    添加一些错误检查,这应该可以帮助您。

    关于备份的最后一句话。我强烈建议您保留比上次备份文件更多的内容。像把每样东西都留一个星期,每个月留一个这样的东西对我来说听起来很不错。

    【讨论】:

      【解决方案3】:

      试试这个脚本:

      #! /usr/bin/bash
      
      OK=0          
      KO=1
      
      MYSQL_DIR="/var/lib/mysql"
      MYSQL_BACKUP_DIR="/mnt/mysql_backup/date/dbname"
      HTML_DIR="/home/public_html"
      HTML_BACKUP_DIR="/mnt/files_backup/date/cpanelfoler"
      LOG_FILE="/tmp/backup_log.log"
      
      function archiving
      {
              local return_status=$OK         # Function return status
              local IN_DIR=$1                 # Input directory
              local ARC_DIR=$2                # Archiving directory
      
              final_arc_dir=$ARC_DIR
              timestamp=`date +%Y%m%d%H%M%S`
              # Archive will be like this : archive_YYYYMMDDHHMMSS
              final_arc_dir=${final_arc_dir}/archive_$timestamp
      
              if [ ! -d "$final_arc_dir" ]; then
              echo "Creating directory $final_arc_dir"
              mkdir -p $final_arc_dir
              fi
      
              # More secure : copy then delete instead of moving
              echo "Copying files ... to $ARC_DIR"
              # For each file, or directory we copy than delete
              cp -r $IN_DIR $final_arc_dir
              return_last_command=`echo $?`
              if [ $return_last_command -ne 0 ]
              then
                      return_status=KO
                      echo "Error copying files ---> $IN_DIR"
              else
                      rm -rf $IN_DIR
              fi
      
              # Archive name
              archive_name=$(echo $final_arc_dir |  awk -F/ '{print $NF}')
              # We can compress
              tar cvf - $final_arc_dir | gzip > $ARC_DIR/$archive_name.tar.gz
              ret=$?
              if [ $ret -ne 0 ]
              then
                      echo "Compression failed ---> $final_arc_dir"
                      return_status=$KO
              else
                      echo "Compression terminated successfully, we can delete original directory"
                      rm -rf $final_arc_dir
              fi
      
              # Cleanup old archives
              for f in `ls -l $ARC_DIR | awk '{print $9}' | grep -v "$timestamp"`
              do
                  echo "\nRemove this older backup --------------------> $f\n"
                  rm -rf $ARC_DIR/$f
              done
      
      
              return $return_status
      }
      
      ### MAIN ###
      
      ### Archiving MYSQL FILES
      if ! archiving $MYSQL_DIR $MYSQL_BACKUP_DIR
      then
          echo "\nError archiving MYSQL FILES ----> KO" | tee -a $LOG_FILE
          exit $KO
      fi
      
      ### Archiving HTML FILES
      if ! archiving $HTML_DIR $HTML_BACKUP_DIR
      then
          echo "\nError archiving HTML FILES ----> KO" | tee -a $LOG_FILE
          exit $KO
      fi
      
      # All seems to be ok
      echo "\nAll seems to be okay\n"
      exit $OK
      

      【讨论】:

      • 看起来不错,但这不会创建无穷无尽的“日期”文件夹吗?如果备份成功,有没有办法让它只保留最新的并删除旧的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多