【问题标题】:Limiting the number of records from mysqldump?限制来自 mysqldump 的记录数?
【发布时间】:2008-09-25 20:29:30
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: mysqldump


    【解决方案1】:

    正如 skaffman 所说,使用 --where 选项:

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

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

    【讨论】:

    • limit前的“1”有什么作用?
    • @Phob:--where 选项基本上附加到SELECT * from table WHERE 形式的查询中,所以在这种情况下你会得到SELECT * from table WHERE 1 limit 1000000。如果没有 1,您的查询将无效。为 where 子句指定 1(因为 1 始终为真)只会选择所有记录。
    • 哇,真是个黑客。所以你基本上可以通过这种方式进行 SQL 注入。
    • 这是否保持所有外键完整性?如果没有,有没有办法做到这一点?
    • 谢谢!此外,您可以使用:mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database 获取 100 万条记录的第二页。确保在第一个页面以外的页面上使用 --no-create-info 标志仅转储数据并保留 create table 内容。
    【解决方案2】:

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

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

    这会将名为table 的表中的第一行1000000 转储到文件dump.sql 中。

    【讨论】:

      【解决方案3】:

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

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

      这是为什么您应该始终命名您的 PK 的 id 并避免复合 PK 的一个完美理由,即使在关联表中也是如此(改用代理键)。

      【讨论】:

      • 这样做(命名 id 并避免复合 PK),您将需要忽略关系数据库理论。
      • 实际上,如果你按照关系数据库的最佳实践来设计你的数据库,根据数据和实体定义你的PK,你可以使用--option --where="1 LIMIT 10000" 例子。如果没有 ORDER BY,这将起作用,因为 MySQL 将以自然方式排序,相当于说它将遵循 PK 的索引顺序。然后,所有相关表的 FK 将只有其引用表中存在的数据,因为顺序相同。
      • ID 的使用是许多开发人员的真正困扰。拥有像 PK 一样的 ID 与没有 PK 是一样的。您的完整性受到了损害,因为在大多数情况下,自动递增数字与实体数据无关。
      • @mpoletto --where="1 LIMIT 10000" 只会选择前 10000 个条目。我回答的重点是展示如何解决获取最新的 X 条目,这通常是你想要的。我也不明白命名约定与“忽略关系数据库理论”有什么关系,我想你误解了我的回答。大多数流行的 ORM,如 EF、Django ORM 等。默认为 PK 列并建议“id”,因为说 users.user_id 而不仅仅是 users.id 是多余的。
      • 如果您的 ID 列的命名不一致,而是表中定义的第一个逻辑列,您也可以ORDER BY 1 DESC
      【解决方案4】:

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

      【讨论】:

      • 真的吗?你怎么能给mysqldump一个查询?我在文档中找不到。
      猜你喜欢
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多