【问题标题】:How to automatically backup ALL mysql databases into sql statement?如何自动将所有 mysql 数据库备份到 sql 语句中?
【发布时间】:2010-12-30 03:36:56
【问题描述】:

MySQL 管理员> 备份项目。它是一个很棒的工具,可让您选择数据库并安排它。

但是我的问题是:

今天有几个新网站(创建了新数据库) 明天会有更多新网站(创建新数据库)

在这种情况下,我必须始终进入备份项目> 选择那些不在备份列表中的剩余架构...

如何让它自动检查任何新数据库并包含在备份计划列表中?

也就是说,如何自动备份所有的mysql数据库(这样每天都有新的数据库创建时我们不用担心)。

有什么方法可以实现吗?

我使用的是 Windows 2008 服务器,它对 sh 不友好。

【问题讨论】:

    标签: mysql database backup


    【解决方案1】:

    到目前为止发布的三个答案的问题是它们不能让您有选择地恢复数据库。除了灾难之外,这可能是一个真正的问题。

    理想情况下,您应该每天备份一次,并包含一些历史记录。它应该是防弹的 (--force),它应该被记录 (>> ...log),它应该被压缩 (| gzip),它应该保留每个数据库的单独副本,并且它应该自动拾取任何添加的数据库.

    不妨考虑这样的 shell 脚本:

    #!/bin/bash
    
    Host=server.domain.com
    BDir=/home/backup/backup/mysql
    
    Dump="/usr/bin/mysqldump --skip-extended-insert --force"
    MySQL=/usr/bin/mysql
    
    Today=$(date "+%a")
    
    # Get a list of all databases
    Databases=$(echo "SHOW DATABASES" | $MySQL -h $Host)
    
    
    for db in $Databases; do
            date=`date`
            file="$BDir/$Host-$db-$Today.sql.gz"
            echo "Backing up '$db' from '$Host' on '$date' to: "
            echo "   $file"
            $Dump -h $Host $db | gzip > $file
    done
    

    假设你有一个文件~/.my.cnf (chmod 600),它有:

    [client]
    user = "BACKUP"
    password = "SOMEPASS8342783492"
    

    确保您用于BACKUP 的任何用户都有此授权声明:

    GRANT 
      SELECT, SHOW VIEW ON *.* 
      TO BACKUP@localhost 
      IDENTIFIED BY 'SOMEPASS8342783492';
    

    因此,只需将其添加到每晚的 cronjob 中,您就有了一个每周 7 天轮换一次的每日备份。

    0 3 * * *   backup-mysql >> backup-mysql.log 2>> backup-mysql.log
    

    然后备份目录包含:

    -rw-r--r-- 1 backup backup 2217482184 Sep  3 13:35 base.appcove.net-VOS4_0-20090903.sql.gz
    -rw-rw-r-- 1 backup backup 2505876287 Dec 25 00:48 base.appcove.net-VOS4_0-Fri.sql.gz
    -rw-r--r-- 1 backup backup 2500384029 Dec 21 00:48 base.appcove.net-VOS4_0-Mon.sql.gz
    -rw-r--r-- 1 backup backup 2506849331 Dec 26 00:48 base.appcove.net-VOS4_0-Sat.sql.gz
    -rw-r--r-- 1 backup backup 2499859469 Dec 20 00:48 base.appcove.net-VOS4_0-Sun.sql.gz
    -rw-rw-r-- 1 backup backup 2505046147 Dec 24 00:48 base.appcove.net-VOS4_0-Thu.sql.gz
    -rw-rw-r-- 1 backup backup 2502277743 Dec 22 00:48 base.appcove.net-VOS4_0-Tue.sql.gz
    -rw-r--r-- 1 backup backup 2504169910 Dec 23 00:48 base.appcove.net-VOS4_0-Wed.sql.gz
    -rw-r--r-- 1 backup backup   76983829 Dec 25 00:49 base.appcove.net-VOS4_Mail_0-Fri.sql.gz
    -rw-r--r-- 1 backup backup   76983829 Dec 21 00:49 base.appcove.net-VOS4_Mail_0-Mon.sql.gz
    -rw-r--r-- 1 backup backup   76983829 Dec 26 00:49 base.appcove.net-VOS4_Mail_0-Sat.sql.gz
    -rw-r--r-- 1 backup backup   76983829 Dec 20 00:48 base.appcove.net-VOS4_Mail_0-Sun.sql.gz
    -rw-rw-r-- 1 backup backup   76983829 Dec 24 00:49 base.appcove.net-VOS4_Mail_0-Thu.sql.gz
    -rw-rw-r-- 1 backup backup   76983829 Dec 22 00:49 base.appcove.net-VOS4_Mail_0-Tue.sql.gz
    -rw-r--r-- 1 backup backup   76983829 Dec 23 00:49 base.appcove.net-VOS4_Mail_0-Wed.sql.gz
    -rw-r--r-- 1 backup backup  304803726 Dec 25 00:49 base.appcove.net-WeSell_0-Fri.sql.gz
    -rw-r--r-- 1 backup backup  303480087 Dec 21 00:49 base.appcove.net-WeSell_0-Mon.sql.gz
    -rw-r--r-- 1 backup backup  304710121 Dec 26 00:49 base.appcove.net-WeSell_0-Sat.sql.gz
    -rw-r--r-- 1 backup backup  303791294 Dec 20 00:49 base.appcove.net-WeSell_0-Sun.sql.gz
    -rw-rw-r-- 1 backup backup  305315415 Dec 24 00:49 base.appcove.net-WeSell_0-Thu.sql.gz
    -rw-rw-r-- 1 backup backup  302516217 Dec 22 00:49 base.appcove.net-WeSell_0-Tue.sql.gz
    -rw-r--r-- 1 backup backup  303314217 Dec 23 00:49 base.appcove.net-WeSell_0-Wed.sql.gz
    -rw-r--r-- 1 backup backup     135301 Dec 25 00:30 dc40.appcove.net-mysql-Fri.sql.gz
    -rw-r--r-- 1 backup backup     135301 Dec 21 00:30 dc40.appcove.net-mysql-Mon.sql.gz
    -rw-r--r-- 1 backup backup     135301 Dec 26 00:30 dc40.appcove.net-mysql-Sat.sql.gz
    -rw-r--r-- 1 backup backup     135301 Dec 20 00:30 dc40.appcove.net-mysql-Sun.sql.gz
    -rw-rw-r-- 1 backup backup     135301 Dec 24 00:30 dc40.appcove.net-mysql-Thu.sql.gz
    -rw-rw-r-- 1 backup backup     135301 Dec 22 00:30 dc40.appcove.net-mysql-Tue.sql.gz
    -rw-r--r-- 1 backup backup     135301 Dec 23 00:30 dc40.appcove.net-mysql-Wed.sql.gz
    

    【讨论】:

    • 不错的答案。在the script I have on github 上达到顶峰,这非常相似,可以下载了:)
    • 这种方法的缺陷在于,当您拥有一个从属设备时,您无法从该备份中恢复它并将二进制日志重播到备份点。检查--master-data=2
    • 没错,Glenn,该脚本不是为具有复制的环境而设计的。
    【解决方案2】:

    MySQL 管理员

    使用 MySQL Administrator,您需要手动将数据库添加到备份中。

    mysqldump 和 --all-databases

    如果您通过dump-command 处理此问题,则可以使用--all-databases 选项将所有数据库包含到转储中。

    【讨论】:

    • 这种方法很简单,但会将所有数据库备份集中到一个文件中。这是一个small script,它为每个数据库创建一个单独的文件等等。
    • 这也适用于恢复所有数据库吗? gunzip
    • @quickshiftin 你可以指定 --one-database 选项:dev.mysql.com/doc/refman/5.7/en/…
    • 虽然这个问题没有偏好,但我的问题是为每个数据库都有一个单独的备份文件。因此,即使您可以通过--one-database 恢复一个,也不是一个非常有用的功能。
    【解决方案3】:
    mysqldump -u <username> -p<password> --all-databases > database_backup.sql
    

    【讨论】:

    • 这真的很粗糙,因为您无法选择性地恢复数据库。
    • 您可以使用 dev.mysql.com/doc/refman/5.1/en/…"> --one-database 选项选择性地恢复数据库。
    • 虽然这个问题没有偏好,但我的问题是为每个数据库都有一个单独的备份文件。走--all-databases/--one-database 路线对如何存储备份提出了严格的(阅读:严重的)要求。结帐my script 以获得干净的方法。
    【解决方案4】:

    迟到的答案,但很简单:

    1. 您需要更改第 3、4 和 5 行以反映您的 MySQL userpassworddir 您要存储转储的位置。
    2. 每次运行时,它都会删除所有以前的备份(如果您不 想要这个,只需评论 #rm "$OUTPUT/*gz" &gt; /dev/null 2&gt;&amp;1)

    MySqlBackup.sh

    #!/bin/bash
     
    USER="your_user"
    PASSWORD="your_password"
    OUTPUT="/path/to/backup/dir"
     
    rm "$OUTPUT/*gz" > /dev/null 2>&1
     
    databases=`mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
     
    for db in $databases; do
        if [[ "$db" != "information_schema" ]] ; then
            echo "Dumping database: $db"
            mysqldump --force --opt --user=$USER --password=$PASSWORD --databases $db > $OUTPUT/`date +%Y%m%d`.$db.sql
            gzip $OUTPUT/`date +%Y%m%d`.$db.sql
        fi
    done
    


    使其可执行并运行它:

    chmod 700 MySqlBackup.sh
    ./MySqlBackup.sh
    

    如果需要,请将其添加到 crontab,以便它自动运行:

    crontab -e
    00 02 * * * /path/to/MySqlBackup.sh
    

    在这种情况下,它将在每天凌晨 2 点运行。您可以了解更多关于 crontab 的信息here

    src

    【讨论】:

    • 效果很好,谢谢,我只需要在必要时添加 HOST=my.host.com 和 --host=$HOST。
    【解决方案5】:

    几年来,我一直在使用http://sourceforge.net/projects/automysqlbackup/ 备份我的 MySQL 数据库,它对我来说非常有效。以下是 sourceforge 页面的描述:

    每天、每周和 MySQL 的每月备份 使用 mysqldump 的数据库。特征 - 备份多个数据库 - 单个 备份文件或单独的文件 每个 DB - 压缩备份文件 - 备份远程服务器 - 电子邮件日志 - 更多..

    您可以将脚本设置为备份所有数据库,这样您就不必在添加新数据库时更改脚本。如果您有一两个由于某种原因不想备份的数据库,您还可以告诉它要排除哪些数据库。

    它有很好的文档记录,您可以设置许多选项来满足大多数基本的数据库备份需求。由于它是一个单一的 bash 脚本,因此如果某些东西不是您想要的样子,也很容易修改/调整。

    【讨论】:

      【解决方案6】:

      尝试使用

      mysqldump --all-databases
      

      【讨论】:

      • 这个答案有点简洁,但绝对有帮助,+1 以弥补反对意见!
      • 是的,我很抱歉简洁,但是,这就是全部,可以说(根据提问者的规范)。我的意思是,如果您需要所有细节,您可以阅读 mysqldump 的手册,对吗?至少是这样工作的..
      • 问题是如果你只这样做,它会锁定每个表的导出,你是不是像我们公司有一个超过 300gb 的数据库,你是非常糟糕的导出。但总的来说,如果你有一个小数据库,这个命令就可以正常工作:)
      【解决方案7】:

      只有我的两分钱。从@gahooa升级优秀的脚本

      它增加了授权保存。如果您想保存权限以及一些改进和值检查,这很有用。如果提供,还使用用户和通行证。

      希望对你有帮助。

      UDATE:为每个文件添加 sha1 和

      #!/bin/bash
      # 
      # Script to backup database and grants from mysql 
      # Author: Gonzalo Aguilar Delgado <gaguilar indomain level2crm.com> 
      # Usage:
      #       backup-mysql.sh <HOST> username password   <--- Yes this is insecure as this will get on history
      # Based on script http://stackoverflow.com/questions/1963884/how-to-automatically-backup-all-mysql-databases-into-sql-statement
      # from gahooa (http://stackoverflow.com/users/64004/gahooa)
      #
      
      
      if [ "$#" -lt 1 ]; then
          FILENAME="$(basename $0)"
          echo "Usage $FILENAME <HOST> [user] [pass]"
          exit 1
      fi
      
      #http://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux
      COLOR_GREEN='\e[0;32m'
      COLOR_RED='\e[0;31m'
      COLOR_BLACK='\e[0;30m'
      COLOR_DISABLE='\e[0m'
      
      HOST=$1
      
      if [ ! -z "$2" ]; then 
          USER=$2
      fi
      PASS=$3
      BACKUP_DIRECTORY="/home/gaguilar/mysql-backup"
      
      if [ ! -x $BACKUP_DIRECTORY ]; then
          echo "Cannot access to $BACKUP_DIRECTORY"
          exit 1
      fi
      
      DUMP_COMMAND="/usr/bin/mysqldump --skip-extended-insert --force"
      MYSQL_COMMAND=/usr/bin/mysql
      
      TODAY_DATE=$(date "+%F")
      
      COMMAND_ARGS="-h$HOST"
      
      if [ ! -z "$USER" ]; then
          COMMAND_ARGS="$COMMAND_ARGS -u$USER" 
      fi
      
      if [ ! -z "$PASS" ]; then
          COMMAND_ARGS="$COMMAND_ARGS -p$PASS" 
      fi
      
      
      echo -e "Connecting to ${COLOR_BLACK}$HOST${COLOR_DISABLE} with user ${COLOR_BLACK}$USER${COLOR_DISABLE}..."
      # Get a list of all databases
      DB_LIST=$(echo "SHOW DATABASES" | $MYSQL_COMMAND $COMMAND_ARGS)
      
      if [ "$?" -ne "0" ]; then
          echo "Cannot connect"
          exit 1
      fi
      
      echo "Starting backup"
      for db in $DB_LIST; do
          if [ "$db" != "information_schema" ] && [ "$db" != "mysql" ] && [ "$db" != "performance_schema" ]; then
                  date=`date`
                  file="$BACKUP_DIRECTORY/$HOST-$db-$TODAY_DATE.sql.bz2"
                  file_sum=$BACKUP_DIRECTORY/$HOST-$db-$TODAY_DATE.sql.bz2.sha1
                  echo "Backing up '$db' from '$HOST' on '$date' to: "
                  echo "   [$file]..."
                  $DUMP_COMMAND $COMMAND_ARGS $db | bzip2 > $file
                  sha1sum $file > $file_sum
                  if [ "$?" -ne "0" ]; then
                          echo "Backup of '$db' from '$HOST' ${COLOR_RED}failed${COLOR_DISABLE}..."
                      fi
          else
                      echo "Skipping $db database because mysql internal"
          fi
      done
      echo -e "${COLOR_GREEN}Done backup databases${COLOR_DISABLE}"
      
      echo "Backing up privileges of users"
      USER_LIST=$(echo "SELECT CONCAT('\'',user,'\'@\'',host,'\'') FROM mysql.user WHERE user != 'root'" | $MYSQL_COMMAND -BN $COMMAND_ARGS)
      grants_file="$BACKUP_DIRECTORY/$HOST-grants-$TODAY_DATE.sql"
      
      echo "-- GRANTS FOR $HOST at $TODAY_DATE" > $grants_file
      for username in $USER_LIST; do
          echo "Backing up $username"
          GRANT_LIST=$(echo "show grants for $username" | $MYSQL_COMMAND -BN $COMMAND_ARGS | sed 's/$/;/; s/\\\\/\\/g';) # 
          echo "" >> $grants_file
          echo "-- " >> $grants_file
          echo "-- BACKUP OF USERNAME [$username]" >> $grants_file
          echo "-- " >> $grants_file
          echo "$GRANT_LIST" >> $grants_file
      done
      
      echo -e "${COLOR_GREEN}Done backup users${COLOR_DISABLE}"
      

      授权文件的输出是这样的:

      -- GRANTS FOR localhost at 2014-10-15
      
      -- 
      -- BACKUP OF USERNAME ['java'@'%']
      -- 
      GRANT USAGE ON *.* TO 'java'@'%' IDENTIFIED BY PASSWORD 'XXX';
      GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, TRIGGER ON `widgetdb`.* TO 'java'@'%';
      
      -- 
      -- BACKUP OF USERNAME ['planes2'@'%']
      -- 
      GRANT USAGE ON *.* TO 'planes2'@'%' IDENTIFIED BY PASSWORD 'XXX';
      GRANT ALL PRIVILEGES ON `planes2`.* TO 'planes2'@'%';
      

      【讨论】:

        【解决方案8】:

        我制作了一个脚本,它将获取所有数据库备份,除了 information_schema 和 performance_schema。

        将创建 date 和 time wise 文件夹,将数据库保存为 db 文件夹名称 wise 和 gunzip 。我今天创建了它,发现可以 100% 正常工作

        USER=root
        PASSWORD='password'
        
        #Place where you want to preserved backup.
        OUTPUT="."
        
        TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`;
        mkdir $OUTPUT/$TIMESTAMP;
        cd $OUTPUT/$TIMESTAMP;
        echo "Starting MySQL Backup";
        echo 'date';
        databases=$(mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -Ev "(Database|information_schema|performance_schema)");
        
        echo $databases;
        
        
        for db in $databases; do
                mysqldump --force --opt -u $USER -p$PASSWORD --databases $db > $OUTPUT/dbbackup-$TIMESTAMP-$db.sql
                gzip $OUTPUT/dbbackup-$TIMESTAMP-$db.sql
        done
        echo "Finished MySQL Backup";
        echo 'date';
        

        【讨论】:

          【解决方案9】:

          要忽略错误,请使用 --force 选项

          mysqldump -u root --force --all-databases > d:\all.sql
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-26
            • 1970-01-01
            • 2015-06-19
            • 2019-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多