2017-02-22 88 views
0

我正在使用InfiniDB(不是通過選擇)。當我使用Linux shell中,我能夠連接到數據庫就好了:mysql在登錄時掛起

<user>@<host>:~$ /usr/local/Calpont/mysql/bin/mysql -u <user> -p -h <host> 
Enter password: <password> 

Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 1725 
Server version: 5.1.39 MySQL Community/Calpont InfiniDB Community 2.2.11-1 Fin                    al (COSS LA) 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> use <database_name> 
Database changed 
mysql> 

但是當我使用一個bash腳本,它掛起:

<user>@<host>:~$ bash -x /home/aliceell/db_export.sh 
+ DB=al05_09 
+ export_dir=/tmp/ 
++ /usr/local/Calpont/mysql/bin/mysql -u <user> -p -h <host> <db_name> 
Enter password: 

它停止我進入後響應我密碼並按'enter'。我必須使用Ctrl-C來擺脫它。

這裏是我的代碼:我是新來bash和試圖將它通過所有的表在我的數據庫使用循環和導出它們(similar to this script

DB=<db_name> 
export_dir="/tmp/" 

err_exit() 
{ 
echo -e 1>&2 
exit 1 
} 

mysql_data_dir=$(/usr/local/Calpont/mysql/bin/mysql -u <user> -p -h <host> <db_name>) #it hangs at this stage 

if ! (mysqlshow $DB 1>/dev/null); then 
    echo ERROR: unable to access database 
    exit 1 
fi 

echo "connected" 

if ! [ -w $export_dir ]; then 
    echo ERROR: export dir is not writable 
    exit 1 
fi 

ExportTable() 
{ 
/usr/local/Calpont/mysql/bin/mysql -u <user> -p -h <host> <db_name>" 
    SELECT * INTO OUTFILE '/tmp/$T.csv' 
    FIELDS TERMINATED BY '|' 
    LINES TERMINATED BY '\n' 
    FROM $T 
" 
} 

/usr/local/Calpont/mysql/bin/mysql -u <user> -p -h <host> <db_name> "show tables" | 
while read T; do 
    echo exporting $T 
    ExportTable || err_exit 
    sudo mv $mysql_data_dir/$DB/$T.psv $export_dir/ || err_exit 
done 

,但也沒有用如果我甚至不能連接到數據庫...

在此先感謝您的幫助。

+0

db_export.sh實際上看起來像什麼? – chepner

+0

它看起來像我在帖子中鏈接的腳本。我編輯了我的帖子以包含代碼。除了我必須使用/ usr/local/Calpont/mysql/bin/mysql而不是僅僅使用mysql,因爲這就是它對於infinidb(afaik)的作用。 – ale19

回答

1

您分配給mysql_data_dir的命令替換不是交互式運行的,因此mysql命令必須運行,生成其輸出並在輸出返回到shell變量之前終止。仔細看你的linked example(下面摘錄),你會看到他的mysql命令就是這種命令行;它包含一個mysql命令,該命令被執行並傳送到awk命令中進行後處理。

mysql_data_dir=$(mysql $myopts "show variables like 'datadir'" | awk '{sub(/\/$/,"");print$NF}') 

你需要做的是找出你的「一個班輪」 mysql命令是什麼,以及它放入您的$()

+0

啊,謝謝!我沒有意識到這是語法的工作原理。我找到了我需要的命令,現在我可以連接了。不幸的是,我似乎無法運行SELECT INTO OUTFILE命令:它似乎沒有正確使用$ T變量。當我運行它時,我得到''導出/ usr/local/Calpont/mysql/bin/mysql版本14.14 Distrib 5.1.39,用於unknown-linux-gnu(x86_64)使用readline 5.1 Copyright 2000-2008 MySQL AB,2008 Sun Microsystems,Inc ....「'列出了MySQL的所有選項。但它並沒有實際輸出任何東西......任何你知道會發生什麼的機會? – ale19

+0

我將其餘的代碼添加到我的文章中,以防萬一 – ale19

+0

你確定你輸入到你的循環中的mysql命令的輸出只產生表名嗎?它可能有一些標題行需要跳過您的代碼工作。 另外,如果我上面的回答回答了您的基本問題,請將答案標記爲正確。 –

-1

您通常可以在命令行中包含密碼。

的/ usr /本地/ Calpont/MySQL的/ bin中/ MySQL的-u [用戶] -P [PWD] -h [主機] [DB_NAME]

注意:必須有-p之間無間隙,且密碼。

如果您的密碼有某些標點符號,您可能需要用雙引號包裝它。

顯然這是最不安全的方法,但它是最簡單的。

+0

我可以輸入我的密碼就好了,所以我不認爲這是問題...無論如何,我試過它,以防萬一,並且在我運行程序後仍然掛起... – ale19