MySQL如何对整个数据库进行10-20%的数据备份?

10

我知道可以忽略一些表来进行数据库备份。 但是我想备份所有表的数据,只需要备份其中20%或40%的数据,因为整个备份文件太大了。 这是我的正常备份查询。

mysqldump -h dburl -u user -p password --databases dbname > dbname.sql

我不在寻找具体的操作系统,而是使用Linux Ubuntu。


您可以使用以下命令组合来获取数据库结构:mysqldump -h dburl -u user -p password --no-data --databases dbname > dbname.schema.sql,然后使用一系列的 SELECT ... INTO OUTFILE 语句进行数据表数据的筛选和导出。最后,使用 LOAD DATA INFILE 语句将数据加载回去。详情请参见 https://dev.mysql.com/doc/refman/8.0/en/select-into.html。 - Yuri Lachin
3
你可能会遇到的问题是如何使你的子集满足约束条件,否则在实践中它肯定会相当不可用。我建议通过谷歌搜索专门针对此目的的开源工具 - 这些工具确实存在。 - MandyShaw
你应该标记一下你正在使用的操作系统,这有助于脚本编写人员。 - Krish
@MandyShaw 是的,这是当前选项的一个更大的问题,如果您能提供一些好的工具名称或链接,那将非常棒。谢谢。 - Rick_C137
1
我自己没有尝试过,但这看起来像是这样的东西:https://github.com/18F/rdbms-subsetter - MandyShaw
3个回答

4

80-20规则指出,最小的80%的表可能只占用20%的空间。因此,为它们准备一个mysqldump。

然后,对于每个剩余的小于20%空间的表,都要有更多的mysqldump。

最后,任何大表都需要Nambu14提到的--where选项。或者,您可以尝试使用--where="true LIMIT 20000,10000"的方法来偷偷地添加OFFSETLIMIT。(请参见https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html中的评论之一)。但是在这样做时不要允许对表进行写入操作,否则可能会导致额外/缺失的记录。

或者,您可以采用分块技术,如此处所讨论的那样。这避免了额外/缺失的问题,并避免了LIMIT糟糕的情况。幸运的是,您可以硬编码所需的范围值,例如--where="my_pk >= 'def' AND my_pk < 'mno'" 不要忘记处理触发器、存储过程、视图等。

2
有一个类似的问题已开放。使用--where选项,您可以限制包含在mysqldump官方文档在此处)中的记录数量,但此选项适用于数据库中的每个表。
另一种方法是给命令一个要运行的SQL脚本,并准备该脚本中的数据,这将作为伪ETL管道运行。

谢谢,那个解决了问题,但写脚本不是很好的选择,我会等待更好的解决方案。 - Rick_C137
很高兴能够帮助! :) - Nambu14

2

听起来您想避免编写脚本,一个快速的解决方案是使用mysqldump的--where选项。

mysqldump --opt --where="1 limit 1000" myschema

这将限制转储为1000行 - 显然根据您的大小限制进行调整。
您可以跟进偏移转储以获取接下来的1000个 - 需要进行小调整,以便不重新创建表格。
mysqldump --opt --where="1 limit 1000 offset 1000" --no-create-info myschema

您可以进一步混合,比如您想要来自随机选择行的所有数据中仅有40%:
mysqldump --opt --where="1 having rand() < 0.40" myschema

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接