我可以转储所有数据库*除了一个*使用mysqldump吗?

时间:2010-05-26 23:09:59

标签: windows backup mysqldump

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

我刚刚开始有一个项目,它有一个我不需要备份的HUUUUUGE数据库,如果将它添加到剩余的备份周期中,我将是个大问题。

我目前正在这样做:

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

是否有可能以某种方式指定“除此数据库之外”?

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

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

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

8 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分:23)

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

答案 2 :(得分:9)

怎么样?
  

- 忽略表=的db_name.tbl_name

     

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

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

答案 3 :(得分:4)

我创建了以下一行解决方案,避免了多个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

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

看作是您使用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"

答案 6 :(得分:1)

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

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%'等。

答案 7 :(得分:0)

您可以将其用于生产
它不包括'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