20%

kgsdhlau  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(343)

我知道要进行数据库转储,可以忽略一些表。但是我想对所有表进行转储,其中包含20%到40%的数据,因为整个转储太大了。这是我的常规转储查询。

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

我不是在寻找特定的操作系统和使用linux-ubuntu。

ldfqzlk8

ldfqzlk81#

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

ghhkc1vu

ghhkc1vu2#

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

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
xmq68pz9

xmq68pz93#

80-20规则表示最小的80%的表可能只消耗20%的空间。所以给他们一个mysqldump。
然后为小于20%空间的每个剩余表提供更多mysqldump。
最后,任何大table都需要 --where nambu14提到的选项。或者你可以尝试说 --where="true LIMIT 20000,10000" 偷袭 OFFSET 以及 LIMIT 在(请参见上的注解之一https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html )但在执行此操作时不允许向表中写入数据—这可能会导致额外/丢失记录。
或者你也可以像这里讨论的那样调整分块技术。这就避免了额外/缺失的问题,并避免了 LIMIT 乱七八糟的。幸运的是,您可以硬编码这样的范围所需的范围值 --where="my_pk >= 'def' AND my_pk < 'mno'" 别忘了处理触发器、存储的例程、视图等。

相关问题