mysql在登录时挂起

mysql在登录时挂起,mysql,bash,ubuntu,infinidb,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

我不是自愿使用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新手,尝试使用它在数据库中的所有表中循环并导出它们,但如果我连数据库都连接不上,这是没有用的


提前感谢您的帮助。

您分配给mysql\u data\u dir的命令替换不是以交互方式运行的,因此mysql命令必须运行、生成其输出并在输出返回到shell变量之前终止。仔细看下面的摘录,你会发现他的mysql命令就是这样的命令行;它包括一个mysql命令,该命令被执行并通过管道传输到awk命令中进行后处理

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

您需要做的是确定您的单行mysql命令是什么,并将其放入美元中。

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

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

注意,-p和密码之间不能有空格

如果您的密码包含某些标点符号,您可能需要将其用双引号括起来


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

db_export.sh实际上是什么样子的?它看起来像我在帖子中链接的脚本。我编辑了我的帖子以包含代码。除了我必须使用/usr/local/Calpont/mysql/bin/mysql,而不仅仅是mysql,因为这就是infinidb afaik的工作原理。啊,谢谢!我没有意识到语法就是这样工作的。我找到了我需要的命令,现在我可以连接了。不幸的是,我似乎无法运行SELECT INTO OUTFILE命令:它似乎没有正确使用$t变量。当我运行它时,我得到了导出/usr/local/Calpont/mysql/bin/mysql版本14.14发行版5.1.39,用于未知的linux gnu x86_64,使用readline 5.1版权所有2000-2008 mysql AB,2008 Sun Microsystems,Inc。。。。并列出MySQL的所有选项。但是它实际上并没有导出任何东西……你知道可能发生了什么吗?我在我的帖子中添加了其余的代码,以防万一,这对任何人都有帮助。你确定你正在传递到循环中的mysql命令的输出只生成表名吗?它可能有一些需要跳过的头行,以便代码正常工作。另外,如果我上面的回答回答了您的基本问题,请将答案标记为正确。当我在键入use之后在mysql shell中键入show tables时,它会显示表,而不会显示其他内容:我不确定是什么原因导致它列出InfiniDB的帮助选项,InfiniDB是14.14发行版5.1.39,用于未知linux gnu。。。胡说八道。我这里没有mysql配置,但看起来您当前的问题是mysql的输出中有很多视觉垃圾。所有这些+--+和|都会混淆后续命令。讨论如何将表列表放入变量中。将表放入变量中,然后在${variable}中将while read T替换为for T。在Bash中编写脚本是一项很好的技能,学会从计算机的角度来看待命令i/o。我可以很好地输入密码,所以我不认为这是问题所在…我无论如何都尝试过,以防万一,但在运行程序后它仍然挂起。。。