¿Cómo puedo ejecutar un comando SQL a través de un script de shell para poder automatizarlo?
Quiero restaurar los datos que he recopilado en un archivo SQL utilizando un script de shell. Quiero conectarme a un servidor y restaurar datos. El comando funciona cuando se ejecuta por separado a través de la línea de comando SSH.
Este es el comando que uso:
mysql -h "server-name" -u root "password" "database-name" < "filename.sql"
Este es el código de script de shell que crea el archivo ds_fbids.sql
y lo canaliza a 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
¿Cuál es la forma correcta de hacer esto?
+ mysql -h dbservername -u user-name -ppassword dbname</br> : No such file or directoryids.sql</br> + $'\r' : command not found2:
Este es el mensaje de error que recibí-p
si la contraseña es una cadena nula o vacía, ¿tal vez pueda actualizar su publicación? :)Use esta sintaxis:
fuente
"command1;command2;....;commandn"
parte de esta respuesta no funcionará. Usarlo para reemplazar el uso del archivo redirigido en la sintaxis del OP puede funcionar. He abordado ese problema en mi respuesta a esta pregunta.Todas las respuestas anteriores son geniales. Si es un comando sql simple de una línea que desea ejecutar, también puede usar la opción -e.
fuente
Cómo ejecutar un script SQL, use esta sintaxis:
Si usa host como localhost, no necesita mencionarlo. Puedes usar esto:
Esto debería funcionar para Windows y Linux.
Si el contenido de la contraseña contiene un
!
(signo de exclamación), debe agregar una\
(barra diagonal inversa) delante de él.fuente
El núcleo de la pregunta ya ha sido respondido varias veces, solo pensé agregar que los backticks (`s) se han inclinado tanto en el scripting de shell como en SQL. Si necesita usarlos en SQL para especificar un nombre de tabla o base de datos, deberá escapar de ellos en el script de shell de la siguiente manera:
Por supuesto, no se debe generar SQL a través de la entrada de usuario concatenada (argumentos pasados) a menos que confíe en la entrada del usuario. Sería mucho más seguro ponerlo en otro lenguaje de script con soporte para parámetros / escapar correctamente las cadenas para la inserción en MySQL.
fuente
(use la ruta completa para
sql_script_file
si es necesario)Si desea redirigir la salida a un archivo
fuente
Olvidó
-p
o--password=
(este último es mejor legible):(Las comillas son innecesarias si está seguro de que sus credenciales / nombres no contienen espacios o caracteres especiales de shell).
Tenga en cuenta que la página de manual también dice que proporcionar las credenciales en la línea de comandos no es seguro. Así que sigue los consejos de Bill sobre my.cnf.
fuente
Como se indicó anteriormente, puede usar -p para pasar la contraseña al servidor.
Pero yo recomiendo esto:
Observe que la contraseña no está allí. Luego le pedirá la contraseña. ENTONCES lo escribiría. Para que su contraseña no se registre en el historial de la línea de comandos del servidor.
Esta es una medida de seguridad básica.
Si la seguridad no es una preocupación, simplemente eliminaría temporalmente la contraseña del usuario de la base de datos. Luego, después de la importación, vuelva a agregarlo.
De esta manera, cualquier otra cuenta que pueda tener que comparta la misma contraseña no se verá comprometida.
También parece que en su script de shell no está esperando / verificando si el archivo que está tratando de importar realmente existe. Es posible que el script perl aún no esté terminado.
fuente
perl fb_apps_frm_fb.pl
</br> perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql` </br>mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
Utilizar
fuente
Para "automatizar" el proceso de importación del
.sql
archivo generado , evitando al mismo tiempo todas las trampas que pueden ocultarse al intentar pasar los archivosstdin
ystdout
, simplemente dígale a MySQL que ejecute el.sql
archivo generado utilizando elSOURCE
comando en MySQL.La sintaxis en la breve pero excelente respuesta , de Kshitij Sood , ofrece el mejor punto de partida. En resumen, modifique el comando del OP de acuerdo con la sintaxis de Kshitij Sood y reemplace los comandos con el
SOURCE
comando:Si el nombre de la base de datos se incluye en el
.sql
archivo generado , se puede quitar del comando.La presunción aquí es que el archivo generado es válido como un
.sql
archivo por sí solo. Al no tener el archivo redirigido, canalizado o de cualquier otra manera manejado por el shell, no hay problema con la necesidad de escapar de cualquiera de los caracteres en la salida generada debido al shell. Las reglas con respecto a lo que se debe escapar en un.sql
archivo, por supuesto, todavía se aplican.La forma de abordar los problemas de seguridad relacionados con la contraseña en la línea de comandos, o en un
my.cnf
archivo, etc., se ha abordado bien en otras respuestas, con algunas sugerencias excelentes. Mi respuesta favorita , de Danny , cubre eso, incluyendo cómo manejar el problema cuando se trata decron
trabajos o cualquier otra cosa.Para abordar un comentario (pregunta?) Sobre la respuesta corta que mencioné: No, no se puede usar con una sintaxis HEREDOC, ya que se da ese comando de shell. HEREDOC se puede usar en la sintaxis de la versión de redirección (sin la
-Bse
opción), ya que la redirección de E / S es la base de HEREDOC. Si necesita la funcionalidad de HEREDOC, sería mejor usarlo en la creación de un.sql
archivo, incluso si es temporal, y usar ese archivo como el "comando" para ejecutar con la línea de lote MySQL.Tenga en cuenta que debido a la expansión de shell, puede usar variables de shell y de entorno dentro de HEREDOC. El inconveniente es que debes escapar de todos y cada uno de los backticks. MySQL los usa como delimitadores para identificadores, pero el shell, que obtiene la cadena primero, los usa como delimitadores de comandos ejecutables. Echa de menos el escape en un solo backtick de los comandos de MySQL, y todo explota con errores. Todo el problema se puede resolver utilizando un LimitString citado para el HEREDOC:
Eliminar la expansión de shell de esa manera elimina la necesidad de escapar de los backticks y otros caracteres especiales de shell. También elimina la capacidad de usar shell y variables de entorno dentro de él. Para empezar, eso elimina los beneficios de usar un HEREDOC dentro del script de shell.
La otra opción es utilizar las cadenas entre comillas de varias líneas permitidas en Bash con la versión de sintaxis por lotes (con el
-Bse
). No conozco otros proyectiles, así que no puedo decir si también funcionan allí. Debería usar esto para ejecutar más de un.sql
archivo con elSOURCE
comando de todos modos, ya que eso no está terminado por un;
como otros comandos MySQL, y solo se permite uno por línea. La cadena de varias líneas puede ser entre comillas simples o dobles, con los efectos normales en la expansión de shell. También tiene las mismas advertencias que el uso de la sintaxis HEREDOC para backticks, etc.Una solución potencialmente mejor sería usar un lenguaje de script, Perl, Python, etc., para crear el
.sql
archivo, como lo hizo el OP, ySOURCE
ese archivo usando la sintaxis de comando simple en la parte superior. Los lenguajes de secuencias de comandos son mucho mejores en la manipulación de cadenas que el shell, y la mayoría tienen procedimientos integrados para manejar las citas y los escapes necesarios cuando se trata con MySQL.fuente
Una consideración importante para acceder a mysql desde un script de shell utilizado en cron, es que mysql mira al usuario conectado para determinar un .my.cnf para cargar.
Eso no funciona con cron. También puede ser confuso si está usando su / sudo, ya que el usuario conectado puede no ser el usuario con el que está ejecutando.
Yo uso algo como:
Solo asegúrese de que la propiedad y los permisos de usuarios y grupos estén configurados de manera adecuada y estricta en el archivo .my.cnf.
fuente
fuente
¿Cómo ejecuto una línea de comando con una contraseña segura? usa el editor de configuración !!!
A partir de mysql 5.6.6 puede almacenar la contraseña en un archivo de configuración y luego ejecutar comandos cli como este ...
--login-path reemplaza las variables ... host, usuario y contraseña. excelente derecho!
fuente
He escrito un script de shell que leerá los datos del archivo de propiedades y luego ejecutará el script mysql en el script de shell. compartir esto puede ayudar a otros.
fuente