9

我知道要进行数据库转储,我可以忽略一些表。但我想使用 20% 40% 这样的数据百分比对所有表进行转储,因为整个转储太大。这是我的正常转储查询。

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

我不是在寻找特定的操作系统并使用 Linux Ubuntu。

4

3 回答 3

3

80-20 规则表示最小的 80% 的表可能只占用 20% 的空间。所以为他们准备一个 mysqldump。

然后为每个小于 20% 空间的剩余表提供更多的 mysqldump。

最后,任何大桌子都需要--whereNambu14 提到的选项。或者您可以尝试--where="true LIMIT 20000,10000"偷偷摸摸地OFFSET进入。(请参阅https://dev.mysql.com/doc/refman/8.0/en/mysqldump.htmlLIMIT上的评论之一) 不允许写入这样做时的表 - 它可能导致额外/缺失的记录。

或者您可以调整这里讨论的分块技术。这避免了额外/缺失的问题并避免了LIMIT混乱。运气好的话,你可以硬编码这样的范围所需的范围值--where="my_pk >= 'def' AND my_pk < 'mno'"

不要忘记处理触发器、存储例程、视图等。

于 2018-05-24T21:37:41.040 回答
2

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

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
于 2018-05-30T23:32:05.880 回答
2

有一个类似的问题 open。使用--where选项,您可以限制mysqldump此处的官方文档)中包含的记录数量,但此选项适用于数据库中的每个表。

另一种方法是给命令一个 sql 脚本来运行并准备该脚本中的数据,这将作为伪 ETL 管道工作。

于 2018-05-24T14:58:57.430 回答