【问题标题】:Can I get a dump of all my databases *except one* using mysqldump?我可以使用 mysqldump 得到我所有数据库的转储*除了一个*吗?
【发布时间】:2011-02-24 10:33:01
【问题描述】:

我目前正在使用 mySQLdump 来备份我的开发机器和服务器。

不过,我刚刚开始了一个项目,它有一个 HUUUUUGE 数据库,我真的不需要备份,将它添加到备份周期的其余部分将是一个大问题。

我目前正在这样做:

"c:\Program Files\mysql\MySQL Server 5.1\bin\mysqldump" -u root -pxxxxxx --all-databases > g:\backups\MySQL\mysqlbackup.sql

是否可以以某种方式指定“除了这个数据库”?

我不想手动指定数据库列表,因为这意味着我必须记住每次创建新数据库时都更新我的备份批处理文件,而且我知道这不会发生。

编辑:正如您可能从我上面的命令行中猜到的那样,我在 Windows 上执行此操作,所以我不能做任何花哨的 bash 东西,只能做懦弱的 .bat 东西。

或者,如果您有其他想法来解决同样的问题,当然欢迎他们!

【问题讨论】:

  • 也许这应该是对 Oracle 的功能请求。
  • 如果您使用 Windows 可能会考虑使用 PowerShell 进行操作

标签: windows backup mysqldump


【解决方案1】:

mysql ... -N -e "show databases like '%';" |grep-v -F databaseidontwant |xargsmysqldump ... --databases > out.sql

【讨论】:

  • 感谢您的回答。不幸的是,我在 Windows 上,所以我不能这样做
  • @Daniel:您确实点击了答案中的链接...对吗?
  • 呃,不,我没有。那些看起来根本不像是我的链接。我责怪网站的设计师 :-) 感谢您的回答!
【解决方案2】:

创建一个备份用户并仅授予该用户访问您要备份的数据库的权限。

您仍然需要记住明确授予权限,但这可以在数据库中完成,并且不需要编辑文件。

【讨论】:

  • 谢谢你的想法! remembering 部分是问题所在。默认情况下是否可以授予用户对所有数据库的访问权限,而只授予对某些数据库的拒绝访问权限?这样,在创建新数据库时,它会备份,但我可以明确选择一些跳过。
  • 据我所知,您不能默认允许访问,然后明确拒绝访问某些数据库。
【解决方案3】:

怎么样

--ignore-table=db_name.tbl_name

不要转储给定的表,它必须使用数据库和表名来指定。要忽略多个表,请多次使用此选项。

也许您需要指定一些才能完全忽略大数据库。

【讨论】:

  • 也许吧,但是这个数据库有大约 100 个表,那会很痛苦 :-) 不过还是最简单的想法,谢谢!
  • 好点。但仍然有足够多的桌子,这让人很头疼。
【解决方案4】:
echo 'show databases;' | mysql -uroot -proot | grep -v ^Database$ | grep -v ^information_schema$ | grep -v ^mysql$ | grep -v -F db1 | xargs mysqldump -uroot -proot  --databases > all.sql

转储所有数据库,除了:mysqlinformation_schemamysqldb1

或者,如果您想在倾销前查看列表:

  1. echo 'show databases;' | mysql -uroot -proot > databases.txt
  2. 编辑 databases.txt 并删除您不想转储的任何内容
  3. cat databases.txt | xargs mysqldump -uroot -proot --databases > all.sql

【讨论】:

  • 这太棒了!这真的是最优雅的解决方案!当我发表这个声明时,我还包括 Linux 机器。
  • 用于 linux 的确切语法: 1. echo 'show databases;' | mysql -u root -p > databases.txt 2. nano databases.txt 3. cat databases.txt | xargs mysqldump -u root -p --databases > all.sql
【解决方案5】:

我花了很多时间才想出这个,但我已经用了几年了,而且效果很好......

mysql -hServerName -uUserName -pPassword -e "SELECT CONCAT('\nmysqldump -hServerName -uUserName -pPassword --set-gtid-purged=OFF --max_allowed_packet=2048M --single-transaction --add-drop-database --opt --routines --databases ',DBList,' | mysql -hServerName2 -uUserName2 -pPAssword2 ' ) AS Cmd FROM (SELECT GROUP_CONCAT(schema_name SEPARATOR ' ') AS DBList FROM information_schema.SCHEMATA WHERE LEFT(schema_name, 8) <> 'cclegacy' AND schema_name NOT IN ('mysql','information_schema','performance_schema','test','external','othertoskip')) a \G" | cmd

您可以重定向到一个文件,而不是通过管道连接到 mysql,我从 serverName 移动到 Servername2,但这允许我定制我移动的内容。有时我什至 OR 列表,所以我可以说 LIKE 'Prefix%' 等。

【讨论】:

    【解决方案6】:

    我创建了以下一行解决方案,避免使用多个 grep 命令。

    mysql -e "show databases;" | grep -Ev "Database|DatabaseToExclude1|DatabaseToExclude2" | xargs mysqldump --databases >mysql_dump_filename.sql
    

    grep 中的 -E 启用扩展的正则表达式支持,允许提供由管道符号“|”分隔的不同匹配。可以将更多选项添加到 mysqldump 命令。但仅在“--databases”参数之前。

    小便条,我喜欢这样定义转储的文件名...

    ... >mysql_dump_$(hostname)_$(date +%Y-%m-%d_%H-%M).sql
    

    这会自动将主机名、日期和时间添加到文件名中。 :)

    【讨论】:

      【解决方案7】:

      作为您使用的 Windows,您应该可以使用 PowerShell。
      这是一个简短的 PowerShell 脚本,用于获取所有数据库的列表,从列表中删除不需要的数据库,然后使用 mysqldump 备份其他数据库。

      $MySQLPath = "."
      $Hostname = "localhost"
      $Username = "root"
      $Password = ""
      
      # Get list of Databases
      $Databases = [System.Collections.Generic.List[String]] (
          & $MySQLPath\mysql.exe -h"$Hostname" -u"$Username" -p"$Password" -B -N -e"show databases;"
      )
      
      # Remove databases from list we don't want
      [void]$Databases.Remove("information_schema")
      [void]$Databases.Remove("mysql")
      
      # Dump database to .SQL file
      & $MySQLPath\mysqldump.exe -h"$HostName" -u"$Username" -p"$Password" -B $($Databases) | Out-File "DBBackup.sql"
      

      【讨论】:

      • 这是在 Windows IMO 上最简单的方法
      • 这对我们也很有效,唯一的问题是您需要 PowerShell 3.0 才能运行它。
      • 我强烈建议将最后一行更改为 ("| Out-File" to "-r") as & $MySQLPath\mysqldump.exe -h"$HostName" -u"$Username" - p"$Password" -B $($Databases) -r "DBBackup.sql" 否则你会丢失一些特殊字符并且你的转储大小将是两倍。在继续之前检查数据库可能很有趣 Write-Host "Will take backup of..." $Databases -join "rn" | Out-String Write-Host "如果没问题?" Write-Host "Press any key to continue..." [void][System.Console]::ReadKey($true)
      【解决方案8】:

      您可以将其用于生产
      它不包括'performance_schema\|information_schema\|mysql\|sys'...根据您的需要进行修改

      MYSQL_USER=
      MYSQL_PASS=
      MYSQL_HOST=
      MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST}"
      MYSQLDUMP_OPTIONS="--routines --triggers --single-transaction"
      
      DBLIST=`mysql -s --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS \
      --execute="SHOW DATABASES;" | grep -v \
      'performance_schema\|information_schema\|mysql\|sys' | awk '{printf("\"%s\" ",$0)}'`
      
      mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} --databases ${DBLIST} | gzip >all-dbs.sql.gz
      

      【讨论】:

        猜你喜欢
        • 2011-07-13
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 2010-11-03
        • 1970-01-01
        相关资源
        最近更新 更多