簡體   English   中英

Bash腳本未運行MySQL命令

[英]Bash Script not running MySQL Command

我正在運行的bash腳本中有一個MySQL命令。 在此命令之前,我正在運行其他Linux命令行命令(實際上,甚至是一個mysql命令),但是當它到達此命令時,它將不起作用:

DEST_HOST="localhost"
DEST_DBNAME="db_name"
DEST_DBUSER="root"
DEST_DBPASS=""

# FILE NAME
MIGRATION_FILE="migration_database"

# Export/Import Commands
DO_DATABASE_UPDATE="mysql --host=$SOURCE_HOST --user=$DEST_DBUSER --password $DEST_DBNAME < $MIGRATION_FILE.sql"

echo 'Running local updates...'
$DO_DATABASE_UPDATE

echo "$DO_DATABASE_UPDATE"

# Done!
echo "Complete!"

我從中運行migration_database.sql文件。 如您所見,我將在所有內容的最后打印出UPDATE命令。 發生的是,我運行了此程序,它就像在運行mysql -I以獲得幫助菜單一樣,僅打印在mysql菜單上。

如果我復制並粘貼打印出來的命令並運行它,則效果很好。 我不確定為什么bash不在腳本中執行此操作。

有任何想法嗎?

... --password $DEST_DBNAME

您沒有通過數據庫密碼。 您只需使用不帶參數的--password選項,即“提示我輸入密碼”。 如果在非交互式外殼中運行此腳本,則永遠不會看到提示。

您可以將密碼設置為參數:

... --password='$DEST_DBPASS' $DEST_DBNAME

或者實際上,我建議您根本不要在命令行上輸入用戶名和密碼,因為這不是一個好的安全習慣。

而是將用戶名和密碼放在配置文件中,並告訴您的命令使用該配置文件。

DO_DATABASE_UPDATE="mysql --defaults-extra-file=$HOME/migration.cnf $DEST_DBNAME < $MIGRATION_FILE.sql"

在您的migration.cnf中:

[client]
host = localhost
user = root
password = xxxxxxxx

如果您使用的是MySQL 5.6或更高版本,則還應該了解mysql_config_editor,以便可以將這些帳戶憑據存儲在加密文件中。


發表您的評論:

在bash變量中使用小於號登錄命令是否存在一些問題?

是的,有一個問題。 在變量擴展之前,shell過程重定向中的求值順序似乎很高。 抱歉,我之前沒有注意到這一點。

如果我正在編寫您的腳本,則可以這樣編寫:

DO_DATABASE_UPDATE="mysql ...opts..."
echo 'Running local updates...'
$DO_DATABASE_UPDATE $DEST_DBNAME < $MIGRATION_FILE.sql

否則這種方式:

DO_DATABASE_UPDATE="mysql ...opts... $DEST_DBNAME -e 'source $MIGRATION_FILE.sql'"
echo 'Running local updates...'
$DO_DATABASE_UPDATE

從Bash Shell一行執行MySQL命令

使用以下命令從Linux Bash Shell快速執行MySQL查詢:#mysql -u [用戶] -p [pass] -e“ [mysql命令]”

范例:

# mysql -u root -pSeCrEt -e "show databases"

使用EOF在Bash腳本中運行MySQL查詢在Bash腳本中使用以下語法來運行MySQL命令:

mysql -u [user] -p[pass] << EOF
[mysql commands]
EOF

范例:

#!/bin/bash
mysql -u root -pSeCrEt << EOF
use mysql;
show tables;
EOF

遠程執行MySQL命令使用-h選項指定MySQL服務器的IP地址:

# mysql -h [ip] -u [user] -p[pass] -e "[mysql commands]"

范例:

# mysql -h 192.168.1.10 -u root -pSeCrEt -e "show databases"

指定要使用的數據庫

Use -D option to specify the name of MySQL database :
# mysql -D [db name] -u [user] -p[pass] -e "[mysql commands]"

范例:

# mysql -D clients -u root -pSeCrEt -e "show tables"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM