我知道要进行数据库转储,可以忽略一些表。但是我想对所有表进行转储,其中包含20%到40%的数据,因为整个转储太大了。这是我的常规转储查询。
mysqldump -h dburl -u user -p password --databases dbname > dbname.sql
我不是在寻找特定的操作系统和使用linux-ubuntu。
ldfqzlk81#
还有一个类似的问题。使用--where选项可以限制mysqldump(此处为官方文档)中包含的记录数量,但此选项适用于数据库中的每个表。另一种方法是给命令一个sql脚本来运行并准备该脚本中的数据,这将作为一个伪etl管道工作。
ghhkc1vu2#
听起来你想避免编写脚本,一个快速的解决方法是使用 --where 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
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'" 别忘了处理触发器、存储的例程、视图等。
--where="true LIMIT 20000,10000"
OFFSET
LIMIT
--where="my_pk >= 'def' AND my_pk < 'mno'"
3条答案
按热度按时间ldfqzlk81#
还有一个类似的问题。使用--where选项可以限制mysqldump(此处为官方文档)中包含的记录数量,但此选项适用于数据库中的每个表。
另一种方法是给命令一个sql脚本来运行并准备该脚本中的数据,这将作为一个伪etl管道工作。
ghhkc1vu2#
听起来你想避免编写脚本,一个快速的解决方法是使用
--where
mysqldump的选项。这将限制转储到1000行-显然要根据您的大小限制进行调整。
接下来可以使用偏移转储来获得下一个1000-需要进行小的调整,以便不重新创建表。
您可以进一步混合,假设您只需要从随机选择的行中获取所有数据的40%:
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'"
别忘了处理触发器、存储的例程、视图等。