限制mysqldump的记录数量?

132 mysqldump

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

你怎么告诉mysqldump只给你800万个n个记录?

谢谢

Ada*_*ire 208

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

mysqldump --opt --where="1 limit 1000000" database
Run Code Online (Sandbox Code Playgroud)

当然,这将为您提供每个表中的第一百万行.

  • @Phob:--where选项基本上附加到表'WH*'形式的SELECT*的查询中,所以在这种情况下你得到'SELECT*from table WHERE 1 limit 1000000`.如果没有1,您的查询将无效.为where子句指定1(因为1始终为true)只选择所有记录. (30认同)
  • 哇,什么是黑客.所以你基本上可以用这种方式注入SQL. (23认同)
  • 限制前的"1"是做什么的? (14认同)
  • 这是否保持所有外键整合?如果没有,有没有办法做到这一点? (6认同)
  • 谢谢!此外,您可以使用:`mysqldump --opt --where ="1 limit 1000000 offset 1000000"--no-create-info database`来获取100万条记录的第二页.确保在第一个页面以外的页面上使用_-- no-create-info_标志,仅转储数据并省略_create table_ stuff. (3认同)
  • 看起来像`--opt`是没有必要的.从联机帮助页:"因为默认情况下启用了--opt选项,所以只指定其反转, - skip-opt关闭几个默认设置." (2认同)

Cas*_*sse 57

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

mysqldump --opt --where="1 limit 1000000" database table > dump.sql
Run Code Online (Sandbox Code Playgroud)

这将转储首先1000000从命名表中的行table到文件中dump.sql.


And*_*röm 12

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

mysqldump --opt --where="1 ORDER BY id DESC limit 1000000" --all-databases > dump.sql
Run Code Online (Sandbox Code Playgroud)

这就是为什么你应该总是命名你的 PK 的id并避免复合 PK 的完美理由,即使在关联表中(使用代理键代替)。

  • 如果您的 ID 列的命名不一致,但它是表中定义的第一个逻辑列,您也可以使用“ORDER BY 1 DESC”。 (2认同)

ska*_*man 9

mysqldump可以被赋予一个SQL查询来执行,从中获取转储的数据.然后,您可以在查询中使用"limit X"子句来限制行数.