mysql在登录时挂起

时间:2017-02-22 13:43:31

标签: mysql bash ubuntu infinidb

我正在使用InfiniDB(不是选择)。当我使用linux shell时,我能够很好地连接数据库:

<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:

输入密码并按“输入”后,它停止响应。我必须使用ctrl-C来摆脱它。

以下是我的代码:

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

我是bash的新手并尝试使用它来遍历我的数据库中的所有表并导出它们(https://github.com/berkshelf/vagrant-berkshelf),但是如果我甚至无法连接到数据库那都没用。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您分配给mysql_data_dir的命令替换不是以交互方式运行的,因此必须运行mysql命令,生成其输出并在输出返回到shell变量之前终止。仔细查看您的linked example(摘录如下),您将看到他的mysql命令就是这种命令行;它包含一个mysql命令,该命令被执行并通过管道传送到awk命令进行后处理。

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

您需要做的是确定您的&#34; one-liner&#34; mysql命令将其放入您的$()

答案 1 :(得分:-1)

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

/ usr / local / Calpont / mysql / bin / mysql -u [user] -p [pwd] -h [host] [db_name]

注意:-p和密码之间必须没有空格。

如果您的密码有某些标点字符,则可能需要用双引号括起来。

显然,这是最不安全的方法,但它是最简单的。