Estou tendo um problema ao passar arquivos preexistentes cheios de instruções SQL para o mysqlslap.
Por exemplo, tenho um arquivo chamado create.sql
que contém minha estrutura de tabela (conforme despejado por mysqldump
), com normal ; delimitando.
Eu também tenho um arquivo chamado (na verdade, um general-log-fileslap.sql
levemente mudo , mas este é um pequeno exemplo que reproduz o erro) que contém
INSERT INTO comments VALUES ("I like winks ;) and frowns :(");
E eu corro:
mysqlslap --delimiter=";" --create create.sql --query thing.sql
Eu recebo o erro:
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
O que é consistente com o MySQL encerrando a instrução no ; que está no meio de uma string .
O que posso fazer para que o mysqlslap obtenha --create
dados do mysqldump e não use ponto-e-vírgula incorporado em strings nos --query
dados? É possível que o mysqlslap não siga as regras normais de análise quando você passa um arquivo para o parâmetro --query?
Olhando rapidamente para o código-fonte, parece que o mysqlslap não faz nenhuma análise sofisticada para delimitadores... está apenas dividindo strings.
Se você escrever cada uma de suas consultas em uma única linha, não precisará encerrá-las -- o delimitador de instrução padrão é uma nova linha.
Com uma consulta por linha, ele divide a linha e executa cada instrução.
O
;
delimitador não é realmente necessário no final de cada consulta para tornar o--query
arquivo válido e o servidor não tem problemas para executar a consulta de exemplo que você forneceu com o ponto-e-vírgula removido.Você pode modificar o arquivo de saída
mysqldump
para usar um delimitador diferente, como$$
, usandosed
ouperl
e então usar esse delimitador em seu arquivo de consulta também.editar: oops, sim, isso é realmente primitivo... delimitadores de bytes de vários
caracteresnem mesmo são suportados.Desistir. Porque (como Michael apontou) mysqlslap está usando busca de string ingênua em vez de um analisador para o delimitador, se o delimitador que você escolher estiver em qualquer lugar em seus conjuntos de dados --query ou --create, você está perdido.
Em vez disso, abra o arquivo mysqldump e mescle quaisquer instruções de várias linhas em uma linha e deixe o mysqlslap continuar esperando uma instrução por linha.
Se você usar o Vim, é muito fácil, basta procurar por padrões multilinha conhecidos (no meu era apenas CREATE TABLE, acho que pode incluir procedimentos armazenados ou gatilhos) e use
J
para unir todas as linhas em cada instrução.