限制mysqldump中的记录数?


137

我正在尝试将一小部分记录记录从大型数据库加载到测试数据库中。

您如何告诉mysqldump只给您800万条记录中的n条?

谢谢

Answers:


212

作为skaffman说,使用--where选项:

mysqldump --opt --where="1 limit 1000000" database

当然,这将为您提供每个表的前一百万行。


15
限制前的“ 1”有什么作用?
Phob

31
@Phob:--where选项基本上附加到表单的查询中SELECT * from table WHERE ,因此在这种情况下,您会得到SELECT * from table WHERE 1 limit 1000000。没有1,您将有一个无效的查询。为where子句指定1(因为1始终为true)只会选择所有记录。
亚当·贝莱尔

24
哇,真是骇人听闻。因此,您基本上可以通过这种方式将SQL注入自己。
Phob

6
这会保持所有外键完整性吗?如果没有,有办法吗?
keithxm23

4
谢谢!此外,您可以使用: mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database 获得100万条记录的第二页。确保在第一个页面之外的页面上使用--no-create-info标志,以仅转储数据并保留创建表的内容。
pfuri

59

如果n要从特定表中获取记录,可以执行以下操作:

mysqldump --opt --where="1 limit 1000000" database table > dump.sql

这会将1000000表中的前几行转储table到文件中dump.sql


9

可以给mysqldump一个SQL查询来执行,它将从中获取转储的数据。然后,您可以在查询中使用“ limit X”子句来限制行数。


6

由于默认的顺序是ASC,在这种情况下,这几乎是您所不想要的,因此您需要具有适当的数据库设计以使DESC可以立即使用。如果您所有的表都有一个具有相同名称(自然或替代)的主键列,则可以使用以下方法轻松转储n条最新记录:

mysqldump --opt --where="1 ORDER BY id DESC limit 1000000" --all-databases > dump.sql

这是为什么您始终要命名PK的ID并避免使用组合PK的最佳理由,即使在关联表中也是如此(改用代理键)。


1
这样做(命名id并避免使用复合PK),则需要忽略关系数据库理论。
mpoletto

1
实际上,如果您按照关系数据库的最佳实践来设计数据库,并根据数据和实体定义PK,则可以使用--option --where =“ 1 LIMIT 10000”。如果没有ORDER BY,这将起作用,因为MySQL将以自然的方式进行排序,这相当于说它将遵循PK的索引顺序。然后,所有相关表的FK都将只有其引用表中存在的数据,因为顺序是相同的。
mpoletto

ID的使用是许多开发人员的真正困扰。拥有ID就像拥有PK一样,没有拥有PK。您的完整性很糟糕,因为在大多数情况下,自动递增数字与实体数据无关。
mpoletto

@mpoletto --where =“ 1 LIMIT 10000”仅会选择10000个第一项。我的回答的重点是展示如何解决获取最新的X条目的问题,这通常是您想要的。我还不了解命名约定与“忽略关系数据库理论”有什么关系,我想您误解了我的答案。大多数流行的ORM(例如EF,Django ORM等)默认为PK列并建议“ id”,因为多余的是说users.user_id而不是仅users.id。
AndreasBergström'17

当您说“有一个完美的理由说明为什么您总是要命名PK的ID并避免使用复合PK的原因”时,您会忽略关系数据库理论。您关于“最受欢迎的ORM”的论点无效,因为此ORM需要具有ID的表才能工作。
mpoletto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.