我在将包含 SQL 语句的预先存在的文件传递到 mysqlslap 时遇到问题。
例如,我有一个名为的文件create.sql
,其中包含我的表结构(由 转储mysqldump
),正常;划界。
我还有一个名为slap.sql
(实际上是一个稍微修改过的general-log-file,但这是一个重现错误的小例子)的文件,其中包含
INSERT INTO comments VALUES ("I like winks ;) and frowns :(");
我跑:
mysqlslap --delimiter=";" --create create.sql --query thing.sql
我得到错误:
mysqlslap: Cannot run query INSERT INTO comments VALUES ("I like winks
ERROR : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"I like winks' at line 1
这与 MySQL 在 ; 处终止语句是一致的。那是在一个字符串的中间。
我该怎么做才能让 mysqlslap--create
从 mysqldump 中获取数据,而不是对嵌入在--query
数据中的字符串中的分号产生影响?当您将文件传递给 --query 参数时,mysqlslap 是否可能不遵循正常的解析规则?
简要看一下源代码,看起来 mysqlslap 没有对分隔符进行任何复杂的解析......它只是分割字符串。
如果您将每个查询写在一行上,则不必终止它们——默认语句分隔符是换行符。
每行一个查询,它拆分行并执行每个语句。
在
;
每个查询结束时实际上并不需要分隔符来使--query
文件有效,并且服务器在执行您提供的删除分号的示例查询时没有问题。您可以修改输出文件 from
mysqldump
以使用不同的分隔符,例如$$
使用sed
orperl
,然后在查询文件中也使用该分隔符。编辑:哎呀,是的,这真的很原始......甚至不支持多
字符字节分隔符。放弃。因为(正如迈克尔指出的那样)mysqlslap 使用的是简单的字符串查找而不是分隔符的解析器,如果您选择的分隔符在您的 --query 或 --create 数据集中的任何位置,那么您将被淹没。
相反,打开 mysqldump 文件,将任何多行语句合并为一行,让 mysqlslap 继续期望每行一个语句。
如果您使用 Vim,这很容易,只需搜索已知的多行模式(在我这里它只是 CREATE TABLE,我猜它可能包括存储过程或触发器),然后用于
J
连接每个语句中的所有行。