Como posso executar um comando SQL através de um shell script para que eu possa automatizá-lo?
Eu quero restaurar os dados que eu coletei em um arquivo SQL usando um script de shell. Quero me conectar a um servidor e restaurar dados. O comando funciona quando executado separadamente via linha de comando SSH.
Este é o comando que eu uso:
mysql -h "server-name" -u root "password" "database-name" < "filename.sql"
Este é o código do script shell que cria o arquivo ds_fbids.sql
e o envia para o mysql.
perl fb_apps_frm_fb.pl
perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql
mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Qual é a maneira correta de fazer isso?
+ mysql -h dbservername -u user-name -ppassword dbname</br> : No such file or directoryids.sql</br> + $'\r' : command not found2:
Esta é a mensagem de erro que recebi-p
se a senha for nula ou vazia, talvez você possa atualizar sua postagem? :)Use esta sintaxe:
fonte
"command1;command2;....;commandn"
parte desta resposta não funcionará. Usá-lo para substituir o uso do arquivo redirecionado na sintaxe do OP pode funcionar. Eu resolvi esse problema na minha resposta a esta pergunta.Todas as respostas anteriores são ótimas. Se for um comando sql simples de uma linha que você deseja executar, também poderá usar a opção -e.
fonte
Como executar um script SQL, use esta sintaxe:
Se você usa o host como host local, não precisa mencioná-lo. Você pode usar isto:
Isso deve funcionar para Windows e Linux.
Se o conteúdo da senha contiver um
!
(ponto de exclamação), você deverá adicionar um\
(barra invertida) na frente dele.fonte
O núcleo da pergunta já foi respondido várias vezes, apenas pensei em acrescentar que os backticks (`s) dependem tanto do script de shell quanto do SQL. Se você precisar usá-los no SQL para especificar um nome de tabela ou banco de dados, precisará escapá-los no shell script da seguinte maneira:
É claro que a geração de SQL por meio de entradas concatenadas do usuário (argumentos passados) não deve ser feita, a menos que você confie na entrada do usuário. no MySQL.
fonte
(use o caminho completo para,
sql_script_file
se necessário)Se você deseja redirecionar a saída para um arquivo
fonte
Você esqueceu
-p
ou--password=
(o último é melhor legível):(As aspas são desnecessárias se você tiver certeza de que suas credenciais / nomes não contêm espaço ou caracteres especiais do shell.)
Observe que a página de manual também diz que fornecer as credenciais na linha de comando é inseguro. Então, siga os conselhos de Bill sobre my.cnf.
fonte
Conforme declarado antes, você pode usar -p para passar a senha para o servidor.
Mas eu recomendo isso:
Observe que a senha não está lá. Em seguida, solicitaria sua senha. ENTÃO, digite-a. Para que sua senha não seja registrada no histórico da linha de comando dos servidores.
Esta é uma medida de segurança básica.
Se a segurança não for uma preocupação, eu apenas removeria temporariamente a senha do usuário do banco de dados. Depois da importação - adicione-a novamente.
Dessa forma, qualquer outra conta que você compartilhe a mesma senha não será comprometida.
Parece também que no seu script de shell você não está esperando / verificando se o arquivo que você está tentando importar realmente existe. O script perl pode não estar concluído ainda.
fonte
perl fb_apps_frm_fb.pl
</l> perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql` </br>mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Usar
fonte
Para "automatizar" o processo de importação do
.sql
arquivo gerado , evitando todas as armadilhas que podem estar ocultas na tentativa de passar arquivosstdin
estdout
, basta dizer ao MySQL para executar o.sql
arquivo gerado usando oSOURCE
comando MySQL.A sintaxe da resposta curta, mas excelente , de Kshitij Sood , fornece o melhor ponto de partida. Em resumo, modifique o comando do OP de acordo com a sintaxe de Kshitij Sood e substitua os comandos nele pelo
SOURCE
comando:Se o nome do banco de dados estiver incluído no
.sql
arquivo gerado , ele poderá ser removido do comandoA presunção aqui é que o arquivo gerado é válido como um
.sql
arquivo por si só. Por não ter o arquivo redirecionado, canalizado ou de qualquer outra maneira manipulada pelo shell, não há problema em escapar de nenhum dos caracteres na saída gerada por causa do shell. As regras com relação ao que precisa ser escapado em um.sql
arquivo, é claro, ainda se aplicam.Como lidar com os problemas de segurança em torno da senha na linha de comando ou em um
my.cnf
arquivo etc. foi bem abordado em outras respostas, com algumas sugestões excelentes. Minha resposta favorita , de Danny , cobre isso, incluindo como lidar com o problema ao lidar comcron
trabalhos ou qualquer outra coisa.Para endereçar um comentário (pergunta?) Sobre a resposta curta que mencionei: Não, ele não pode ser usado com uma sintaxe HEREDOC, pois esse comando é fornecido. O HEREDOC pode ser usado na sintaxe da versão de redirecionamento (sem a
-Bse
opção), pois o redirecionamento de E / S é o que o HEREDOC constrói. Se você precisar da funcionalidade do HEREDOC, seria melhor usá-lo na criação de um.sql
arquivo, mesmo que seja temporário, e use esse arquivo como o "comando" para executar com a linha de lote do MySQL.Lembre-se de que, devido à expansão do shell, você pode usar variáveis de ambiente e shell no HEREDOC. A desvantagem é que você deve escapar de cada backtick. O MySQL os usa como delimitadores para identificadores, mas o shell, que obtém a string primeiro, os usa como delimitadores de comando executável. Perca a fuga com um único backtick dos comandos do MySQL, e a coisa toda explode com erros. O problema todo pode ser resolvido usando um LimitString entre aspas para o HEREDOC:
Remover a expansão do shell dessa maneira elimina a necessidade de escapar dos backticks e outros caracteres especiais do shell. Ele também remove a capacidade de usar variáveis de ambiente e shell dentro dele. Isso praticamente remove os benefícios de usar um HEREDOC dentro do script de shell, para começar.
A outra opção é usar as seqüências de citação de várias linhas permitidas no Bash com a versão da sintaxe em lote (com o
-Bse
). Eu não conheço outras conchas, então não posso dizer se elas funcionam nela também. Você precisaria usar isso para executar mais de um.sql
arquivo com oSOURCE
comando de qualquer maneira, já que isso não é finalizado por um;
como outros comandos do MySQL, e apenas um é permitido por linha. A cadeia de linhas múltiplas pode ser simples ou dupla, com os efeitos normais na expansão do shell. Ele também possui as mesmas ressalvas que o uso da sintaxe HEREDOC para backticks, etc.Uma solução potencialmente melhor seria usar uma linguagem de script, Perl, Python, etc., para criar o
.sql
arquivo, como o OP, eSOURCE
esse arquivo usando a sintaxe de comando simples na parte superior. As linguagens de script são muito melhores na manipulação de strings do que o shell, e a maioria possui procedimentos embutidos para lidar com as aspas e escapamentos necessários ao lidar com o MySQL.fonte
Uma consideração importante para acessar o mysql a partir de um script de shell usado no cron, é que o mysql examina o usuário conectado para determinar um .my.cnf a ser carregado.
Isso não funciona com o cron. Também pode ser confuso se você estiver usando su / sudo, pois o usuário conectado pode não ser o usuário em que está executando.
Eu uso algo como:
Apenas certifique-se de que a propriedade e as permissões do usuário e do grupo estejam definidas de forma adequada e firme no arquivo .my.cnf.
fonte
fonte
Como executo uma linha de comando com uma senha segura? use o editor de configuração !!!
No mysql 5.6.6, você pode armazenar a senha em um arquivo de configuração e executar comandos cli como este ....
--login-path substitui variáveis ... host, usuário E senha. excelente né!
fonte
Eu escrevi um script de shell que irá ler dados do arquivo de propriedades e, em seguida, execute o script mysql no script de shell. compartilhar isso pode ajudar outras pessoas.
fonte