Mysql 转储 - 如何通过转义执行长查询?

Posted

技术标签:

【中文标题】Mysql 转储 - 如何通过转义执行长查询?【英文标题】:Mysql dump - How to execute a long query with escaping? 【发布时间】:2012-12-17 21:47:04 【问题描述】:

我正在使用mysqldump 导出一个圆形立方体 MySQL 数据库,但遗憾的是,当我使用长查询时它会失败。我怎样才能摆脱它以使其正常工作?

mysqldump -t --skip-add-drop-table roundcube contacts --where="select * from contacts where user_id in (select user_id from users where username like '%mysite.com% ')" > roundcube_contacts.sql

运行上面的代码给了我这个错误,那么我该如何正确地转义查询呢?

mysqldump: 无法执行 'SELECT /*!40001 SQL_NO_CACHE / /!50084 SQL_NO_FCACHE */ * FROM contacts WHERE select * from contacts where user_id in (select user_id from users where username like '%mysite.com%')': 您的 SQL 语法有错误; 请查看与您的 MySQL 服务器版本相对应的手册以了解要使用的正确语法在 第 1 行 (1064)

的“从 user_id 所在的联系人中选择 *(从 usernam 所在的用户中选择 user_id”附近)

【问题讨论】:

查看 MySQL 文档:dev.mysql.com/doc/refman/5.1/en/… 【参考方案1】:

mysqldump --where 选项指定要包含在 WHERE 子句中的文本。

你有一个完整的语句,这会产生语法错误,

... WHERE SELECT ... 
          ^

mysqldump 已经在写入SELECT * FROM roundcube.contacts。 --where 选项告诉 mysqldump 包含一个 WHERE 关键字,后跟您提供的文本,作为它生成的语句的一部分。

你想要更多类似的东西:

--where="user_id in (select user_id from users where username like '%mysite.com%')"

所以生成的语句将是......

... WHERE user_id in ...
          ^

另外,数据库名和表名应该跟在选项后面...

mysqldump -t --skip-add-drop-table --where="1=1" roundcube contacts \
  > roundcube_contacts.sql

【讨论】:

以上是关于Mysql 转储 - 如何通过转义执行长查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高MYSQL查询的性能?

将所有查询结果转储到 plsql 块内的文件中

如何在 MySQL Workbench 中执行多个 SQL 查询?

Laravel 5:如何转储 SQL 查询?

MySQL——通过EXPLAIN分析SQL的执行计划

mysql如何查询SQL中哪些语句执行最占用CPU?