Jak mogę wykonać polecenie SQL za pomocą skryptu powłoki, aby można było je zautomatyzować?
Chcę przywrócić dane zebrane w pliku SQL za pomocą skryptu powłoki. Chcę połączyć się z serwerem i przywrócić dane. Polecenie działa, gdy jest wykonywane osobno za pomocą wiersza poleceń SSH.
Oto polecenie, którego używam:
mysql -h "server-name" -u root "password" "database-name" < "filename.sql"
To jest kod skryptu powłoki, który tworzy plik ds_fbids.sql
i przekazuje go do 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
Jaki jest właściwy sposób, aby to zrobić?
+ mysql -h dbservername -u user-name -ppassword dbname</br> : No such file or directoryids.sql</br> + $'\r' : command not found2:
Oto komunikat o błędzie, który otrzymałem-p
jeśli hasło jest puste lub pusty ciąg, być może możesz zaktualizować swój post? :)Użyj tej składni:
mysql -u $user -p$passsword -Bse "command1;command2;....;commandn"
źródło
"command1;command2;....;commandn"
części tej odpowiedzi nie zadziała. Użycie go do zastąpienia użycia przekierowanego pliku w składni OP może działać. Odniosłem się do tego problemu w mojej odpowiedzi na to pytanie.Wszystkie poprzednie odpowiedzi są świetne. Jeśli jest to prosta, jednowierszowa komenda sql, którą chcesz uruchomić, możesz również użyć opcji -e.
mysql -h <host> -u<user> -p<password> database -e \ "SELECT * FROM blah WHERE foo='bar';"
źródło
Jak wykonać skrypt SQL, użyj następującej składni:
mysql --host= localhost --user=root --password=xxxxxx -e "source dbscript.sql"
Jeśli używasz hosta jako lokalnego, nie musisz o tym wspominać. Możesz użyć tego:
mysql --user=root --password=xxxxxx -e "source dbscript.sql"
To powinno działać w systemach Windows i Linux.
Jeśli treść hasła zawiera
!
(wykrzyknik), należy dodać przed nim\
(ukośnik odwrotny).źródło
Na sedno pytania udzielono już odpowiedzi kilka razy, pomyślałem tylko, że dodam, że znaki odwrotne (y) mają beaning zarówno w skryptach powłoki, jak i SQL. Jeśli chcesz użyć ich w języku SQL do określenia nazwy tabeli lub bazy danych, musisz zmienić ich znaczenie w skrypcie powłoki w następujący sposób:
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;"
Oczywiście generowanie kodu SQL za pomocą połączonych danych wejściowych użytkownika (przekazane argumenty) nie powinno być wykonywane, chyba że ufasz wejściu użytkownika. Znacznie bezpieczniej byłoby umieścić go w innym języku skryptowym z obsługą parametrów / poprawnymi znakami ucieczki do wstawienia do MySQL.
źródło
mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file
(w
sql_script_file
razie potrzeby użyj pełnej ścieżki )Jeśli chcesz przekierować wyjście do pliku
mysql -h "hostname" -u usr_name -pPASSWD "db_name" < sql_script_file > out_file
źródło
Zapomniałeś
-p
lub--password=
(to drugie jest lepiej czytelne):mysql -h "$server_name" "--user=$user" "--password=$password" "--database=$database_name" < "filename.sql"
(Cudzysłowy są niepotrzebne, jeśli masz pewność, że Twoje poświadczenia / nazwy nie zawierają spacji ani znaków specjalnych powłoki).
Zauważ, że strona podręcznika również mówi, że podanie poświadczeń w wierszu poleceń jest niebezpieczne. Więc postępuj zgodnie z radą Billa dotyczącą my.cnf.
źródło
Jak wspomniano wcześniej, możesz użyć -p do przekazania hasła do serwera.
Ale polecam to:
mysql -h "hostaddress" -u "username" -p "database-name" < "sqlfile.sql"
Zauważ, że nie ma tam hasła. Następnie poprosi o hasło. WTEDY wpisałbym to. Aby Twoje hasło nie zostało zalogowane w historii wiersza poleceń serwera.
To jest podstawowy środek bezpieczeństwa.
Jeśli bezpieczeństwo nie jest problemem, po prostu tymczasowo usunąłbym hasło z użytkownika bazy danych. Następnie po imporcie - dodaj go ponownie.
W ten sposób żadne inne konta, które możesz mieć, korzystające z tego samego hasła, nie zostaną naruszone.
Wydaje się również, że w skrypcie powłoki nie czekasz / nie sprawdzasz, czy plik, który próbujesz zaimportować, rzeczywiście istnieje. Skrypt Perla może nie zostać jeszcze ukończony.
źródło
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
Posługiwać się
echo "your sql script;" | mysql -u -p -h db_name
źródło
Aby „zautomatyzować” proces importowania wygenerowanego
.sql
pliku, unikając przy tym wszystkich pułapek, które mogą być ukryte podczas próby przepuszczenia plików,stdin
istdout
po prostu powiedz MySQL, aby wykonał wygenerowany.sql
plik za pomocąSOURCE
polecenia w MySQL.Składnia w krótkim, ale bardzo dobre, odpowiedź , z Kshitij Sood , daje najlepszy punkt wyjścia. Krótko mówiąc, zmodyfikuj polecenie OP zgodnie ze składnią Kshitij Sood i zastąp polecenia w tym
SOURCE
poleceniem:#!/bin/bash mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql SOURCE ds_fbidx.sql"
Jeśli nazwa bazy danych jest zawarta w wygenerowanym
.sql
pliku, można ją usunąć z polecenia.Zakłada się tutaj, że wygenerowany plik jest sam w sobie ważny jako
.sql
plik. Brak przekierowania pliku, potokowania lub w inny sposób obsługiwany przez powłokę nie powoduje problemu z koniecznością ucieczki któregokolwiek ze znaków w wygenerowanym wyjściu z powodu powłoki. Zasady dotyczące tego, co należy zmienić w.sql
pliku, oczywiście nadal obowiązują.Sposób radzenia sobie z kwestiami bezpieczeństwa związanymi z hasłem w wierszu poleceń, w
my.cnf
pliku itp. Został dobrze omówiony w innych odpowiedziach, z kilkoma doskonałymi sugestiami. Moja ulubiona odpowiedź od Danny'ego obejmuje to, w tym sposób radzenia sobie z problemem podczascron
pracy lub cokolwiek innego.Aby odpowiedzieć na komentarz (pytanie?) Do krótkiej odpowiedzi, o której wspomniałem: Nie, nie można jej używać ze składnią HEREDOC, ponieważ podano to polecenie powłoki. HEREDOC może być używany w składni wersji przekierowania (bez
-Bse
opcji), ponieważ przekierowanie I / O jest tym, na czym opiera się HEREDOC. Jeśli potrzebujesz funkcjonalności HEREDOC, lepiej byłoby użyć jej podczas tworzenia.sql
pliku, nawet jeśli jest to plik tymczasowy, i użyć tego pliku jako „polecenia” do wykonania z wierszem wsadowym MySQL.#!/bin/bash cat >temp.sql <<SQL_STATEMENTS ... SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable'; ... SQL_STATEMENTS mysql -u $user -p$password $db_name -Be "SOURCE temp.sql" rm -f temp.sql
Należy pamiętać, że ze względu na rozszerzenie powłoki w HEREDOC można używać zmiennych powłoki i środowiska. Wadą jest to, że musisz uciec przed każdym backtickiem. MySQL używa ich jako separatorów dla identyfikatorów, ale powłoka, która jako pierwsza pobiera łańcuch, używa ich jako separatorów poleceń wykonywalnych. Przegap ucieczkę za jednym kliknięciem wstecz w poleceniach MySQL, a całość eksploduje błędami. Cały problem można rozwiązać, korzystając z cytowanego limitu dla HEREDOC:
#!/bin/bash cat >temp.sql <<'SQL_STATEMENTS' ... SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value'; ... SQL_STATEMENTS mysql -u $user -p$password $db_name -Be "SOURCE temp.sql" rm -f temp.sql
Usunięcie rozszerzenia powłoki w ten sposób eliminuje potrzebę ucieczki przed znakami odwrotnymi i innymi znakami specjalnymi powłoki. Usuwa również możliwość używania w nim zmiennych powłoki i środowiska. To właściwie usuwa korzyści płynące z używania HEREDOC wewnątrz skryptu powłoki.
Inną opcją jest użycie wielowierszowych cudzysłowów dozwolonych w Bash z wersją składni wsadowej (z
-Bse
). Nie znam innych muszli, więc nie mogę powiedzieć, czy one też w nich działają. Będziesz musiał użyć tego do wykonania więcej niż jednego.sql
pliku zSOURCE
poleceniem i tak, ponieważ nie jest to przerywane przez a,;
jak inne polecenia MySQL, a tylko jeden jest dozwolony w każdym wierszu. Łańcuch wielowierszowy może być ujęty w pojedyncze lub podwójne cudzysłowy, z normalnym wpływem na rozwinięcie powłoki. Ma również te same zastrzeżenia, co użycie składni HEREDOC w przypadku grawitacji itp.Potencjalnie lepszym rozwiązaniem byłoby użycie języka skryptowego, Perla, Pythona itp., Aby utworzyć
.sql
plik, tak jak zrobił to OP, iSOURCE
ten plik przy użyciu prostej składni poleceń u góry. Języki skryptowe znacznie lepiej radzą sobie z operacjami na łańcuchach niż powłoka, a większość z nich ma wbudowane procedury do obsługi cytowań i znaków ucieczki potrzebnych podczas pracy z MySQL.źródło
Ważną kwestią podczas uzyskiwania dostępu do mysql ze skryptu powłoki używanego w cron jest to, że mysql sprawdza zalogowanego użytkownika, aby określić plik .my.cnf do załadowania.
To nie działa z cronem. Może to również być mylące, jeśli używasz su / sudo, ponieważ zalogowany użytkownik może nie być użytkownikiem, jako którego używasz.
Używam czegoś takiego:
mysql --defaults-extra-file=/path/to/specific/.my.cnf -e 'SELECT something FROM sometable'
Po prostu upewnij się, że prawa własności i uprawnienia użytkowników i grup są ustawione odpowiednio i ściśle w pliku .my.cnf.
źródło
#!/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
źródło
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password
Jak wykonać wiersz poleceń z bezpiecznym hasłem? użyj edytora konfiguracji !!!
Począwszy od mysql 5.6.6 możesz przechowywać hasło w pliku konfiguracyjnym, a następnie wykonywać polecenia CLI, takie jak to ...
mysql --login-path=storedPasswordKey ....
--login-path zastępuje zmienne ... host, użytkownik ORAZ hasło. świetnie, prawda!
źródło
Napisałem skrypt powłoki, który odczyta dane z pliku właściwości, a następnie uruchomi skrypt mysql na skrypcie powłoki. dzielenie się tym może pomóc innym.
#!/bin/bash PROPERTY_FILE=filename.properties function getProperty { PROP_KEY=$1 PROP_VALUE=`cat $PROPERTY_FILE | grep "$PROP_KEY" | cut -d'=' -f2` echo $PROP_VALUE } echo "# Reading property from $PROPERTY_FILE" DB_USER=$(getProperty "db.username") DB_PASS=$(getProperty "db.password") ROOT_LOC=$(getProperty "root.location") echo $DB_USER echo $DB_PASS echo $ROOT_LOC echo "Writing on DB ... " mysql -u$DB_USER -p$DB_PASS dbname<<EOFMYSQL update tablename set tablename.value_ = "$ROOT_LOC" where tablename.name_="Root directory location"; EOFMYSQL echo "Writing root location($ROOT_LOC) is done ... " counter=`mysql -u${DB_USER} -p${DB_PASS} dbname -e "select count(*) from tablename where tablename.name_='Root directory location' and tablename.value_ = '$ROOT_LOC';" | grep -v "count"`; if [ "$counter" = "1" ] then echo "ROOT location updated" fi
źródło