【问题标题】:MYSQL: Selectively dump database with where clausesMYSQL:使用 where 子句选择性地转储数据库
【发布时间】:2019-04-10 04:05:12
【问题描述】:

我需要创建一个脚本来自动将我的生产数据库的开发副本更新为最新的数据和结构/等等。

问题是生产数据库非常大,但它的大部分大小由大约 10 个表保存,其中包含数百万行我不需要。

我想对所有表进行完整的数据库转储,但有选择地限制从非常大的表中提取的行数,以便在保持合理的样本集运行查询的同时保持最终数据库的小规模。

我尝试按照this question 的建议创建脚本

mysqldump -u root -p devdb smallTableNoWhereClause, bigTableWithWhereClauseAndOrderBy --where '1=1 order by id desc limit 2000'

然而,运行该脚本会产生无意义的错误:

mysqldump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `WH_SkuArrivals` WHERE 1 order by id desc limit 10': Unknown column 'id' in 'order clause' (1054)

这没有意义,因为 'id' 是该表的主键。

创建这样的转储脚本是正确的想法,是否有更好的选择,或者我是否必须为所有较小的表(大约 500 个)和带有 where 和 order by 子句的单个脚本创建一个没有 where cluses 的转储脚本对于更大的表,然后将这些转储中的每一个一一加载到新数据库中?

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    我觉得你写错了

    mysqldump -u root -p devdb smallTableNoWhereClause, bigTableWithWhereClauseAndOrderBy --where="1 ORDER BY id DESC LIMIT 2000"

    您需要使用等号WHERE = "..." 和缺少引号来编写它

    MysqlDocs

    【讨论】:

    • 我在第一次尝试时使用了单引号,但我只是按照您的建议用双引号尝试了它,我得到了同样的错误。
    • 是的,但是在您的示例中,等号和引号丢失。您是否尝试添加等号和缺少的引号?
    • 我没有看到任何缺失的引号,我不确定您指的是什么。我确实按照你写的那样尝试了你的陈述,但它给出了一个错误;在 where 之后添加等号会使语句计算为“... Where=1 order ...”,这会引发进一步的 SQL 语法错误。
    • 当然,还有一件事可能是错误的。该错误可能会告诉您数据库不知道哪个 table.id 是 ment。所以尝试不带 id 或使用 tablename.id
    • 我想过,但它只是告诉我它不知道 tablename.id 是什么 lol
    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多