Come eseguire un comando MySQL da uno script di shell?

Come posso eseguire un comando SQL attraverso uno script di shell in modo che possa renderlo automatizzato?

Voglio ripristinare i dati che ho raccolto in un file SQL utilizzando uno script di shell. Voglio connettermi a un server e ripristinare i dati. Il comando funziona quando viene eseguito separatamente tramite la riga di comando SSH.

Questo è il comando che uso:

mysql -h "server-name" -u root "password" "database-name" < "filename.sql" 

Questo è il codice script della shell che crea il file ds_fbids.sql e lo canalizza in 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 è il modo corretto per farlo?

È necessario utilizzare il flag -p per inviare una password. Ed è difficile perché non devi avere spazio tra -p e la password.

 $ mysql -h "server-name" -u "root" "-pXXXXXXXX" "database-name" < "filename.sql" 

Se usi uno spazio dopo -p fa in modo che mysql client richieda in modo interattivo la password e interpreta il successivo argomento di comando come nome-database:

 $ mysql -h "server-name" -u "root" -p "XXXXXXXX" "database-name" < "filename.sql" Enter password:  ERROR 1049 (42000): Unknown database 'XXXXXXXX' 

In realtà, preferisco memorizzare l'utente e la password in ~ / .my.cnf, quindi non devo assolutamente metterlo sulla riga di comando:

 [client] user = root password = XXXXXXXX 

Poi:

 $ mysql -h "server-name" "database-name" < "filename.sql" 

Re il tuo commento:

Eseguo comandi mysql in modalità batch come sopra nella riga di comando e negli script di shell tutto il tempo. È difficile diagnosticare cosa c'è di sbagliato nello script della shell, perché non hai condiviso lo script esatto o l'output di eventuali errori. Ti suggerisco di modificare la tua domanda originale qui sopra e fornire esempi di ciò che va storto.

Anche quando sto risolvendo un problema con uno script di shell, utilizzo il flag -x , così posso vedere come sta eseguendo ogni comando:

 $ bash -x myscript.sh 

Usa questa syntax:

 mysql -u $user -p$passsword -Bse "command1;command2;....;commandn" 

Tutte le risposte precedenti sono fantastiche. Se si tratta di un semplice comando sql su una riga che si desidera eseguire, è ansible utilizzare anche l’opzione -e.

 mysql -h  -u -p database -e \ "SELECT * FROM blah WHERE foo='bar';" 

Come eseguire uno script SQL, utilizzare questa syntax:

 mysql --host= localhost --user=root --password=xxxxxx -e "source dbscript.sql" 

Se usi host come localhost non hai bisogno di menzionarlo. Puoi usare questo:

 mysql --user=root --password=xxxxxx -e "source dbscript.sql" 

Questo dovrebbe funzionare per Windows e Linux.

Se il contenuto della password contiene un ! (Punto esclamativo) dovresti aggiungere un \ (backslash) davanti ad esso.

Il nucleo della domanda è stato già risposto diverse volte, ho solo pensato di aggiungere che i backtick (`s) hanno lo stesso bing sia in shell che in SQL. Se è necessario utilizzarli in SQL per specificare un nome di tabella o di database, è necessario sfuggire ad essi nello script della shell in questo modo:

 mysql -p=password -u "root" -Bse "CREATE DATABASE \`${1}_database\`; CREATE USER '$1'@'%' IDENTIFIED BY '$2'; GRANT ALL PRIVILEGES ON `${1}_database`.* TO '$1'@'%' WITH GRANT OPTION;" 

Ovviamente, la generazione di SQL tramite input utente concatenato (argomenti passati) non dovrebbe essere eseguita a meno che non ci si fidi dell’input dell’utente. Sarebbe molto più sicuro inserirla in un altro linguaggio di scripting con supporto per parametri / escape corretto delle stringhe per l’inserimento in MySQL.

Hai dimenticato -p o --password= (quest’ultimo è più leggibile):

 mysql -h "$server_name" "--user=$user" "--password=$password" "--database=$database_name" < "filename.sql" 

(Le virgolette non sono necessarie se si è sicuri che le proprie credenziali / nomi non contengano spazio o caratteri speciali della shell.)

Si noti che anche la manpage dice che fornire le credenziali sulla riga di comando non è sicuro. Quindi segui i consigli di Bill su my.cnf.

Come affermato in precedenza è ansible utilizzare -p per passare la password al server.

Ma io consiglio questo:

 mysql -h "hostaddress" -u "username" -p "database-name" < "sqlfile.sql" 

Si noti che la password non è lì. Quindi richiederebbe la tua password. Lo digitarei quindi. In questo modo la password non verrà registrata nella cronologia della riga di comando del server.

Questa è una misura di sicurezza di base.

Se la sicurezza non è un problema, rimuoverò temporaneamente la password dall'utente del database. Quindi, dopo l'importazione, aggiungilo nuovamente.

In questo modo qualsiasi altro account che potresti avere che condivide la stessa password non verrebbe compromesso.

Sembra anche che nello script della shell non si stia aspettando / controllando per vedere se il file che si sta tentando di importare esiste realmente. Lo script perl potrebbe non essere ancora finito.

 mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file 

(usa il percorso completo per sql_script_file se necessario)

Se si desidera redirect l'out put su un file

 mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file > out_file 
 mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password 

Come eseguo una riga di comando con una password sicura ?? usa l’editor di configurazione !!!

A partire da mysql 5.6.6 è ansible memorizzare la password in un file di configurazione e quindi eseguire comandi cli come questo ….

 mysql --login-path=storedPasswordKey .... 

–login-path sostituisce le variabili … host, utente AND password. eccellente!

 #!/bin/sh #Procedures = update #Scheduled at : Every 00.05 v_path=/etc/database_jobs v_cnt=0 MAILTO="[email protected] [email protected] [email protected]" touch "$v_path/db_db_log.log" #test mysql -uusername -ppassword -h111.111.111.111 db_name -e "CALL functionName()" > $v_path/db_db_log.log 2>&1 if [ "$?" -eq 0 ] then v_cnt=`expr $v_cnt + 1` mail -s "db Attendance Update has been run successfully" $MAILTO < $v_path/db_db_log.log else mail -s "Alert : db Attendance Update has been failed" $MAILTO < $v_path/db_db_log.log exit fi 

Una considerazione importante per l’accesso a mysql da uno script di shell usato in cron, è che mysql guarda l’utente loggato per determinare un file .my.cnf da caricare.

Questo non funziona con cron. Può anche creare confusione se si utilizza su / sudo in quanto l’utente che ha effettuato l’accesso potrebbe non essere l’utente in cui si sta eseguendo.

Io uso qualcosa come:

 mysql --defaults-extra-file=/path/to/specific/.my.cnf -e 'SELECT something FROM sometable' 

Assicurati che la proprietà e le autorizzazioni dell’utente e del gruppo siano impostate in modo appropriato e preciso sul file .my.cnf.

Uso

 echo "your sql script;" | mysql -u -p -h db_name