mysql 在登录时挂起
mysql hangs at login
我正在使用 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:
在我输入密码并按 'enter' 后它停止响应。我必须使用 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 的新手,并尝试使用它循环遍历我数据库中的所有表并导出它们 (similar to this script),但如果我什至不能,那也没用连接到数据库...
在此先感谢您的帮助。
您分配给 mysql_data_dir
的命令替换不是 运行 交互式的,因此 mysql
命令必须 运行,生成它的输出并在输出将结束之前终止返回到 shell 变量。仔细看你的linked example(摘录如下),你会发现他的mysql
命令就是这种命令行;它包括一个 mysql
命令,该命令被执行并通过管道传输到 awk
命令以进行 post-processing.
mysql_data_dir=$(mysql $myopts "show variables like 'datadir'" | awk '{sub(/\/$/,"");print$NF}')
您需要做的是确定您的 "one-liner" mysql
命令是什么,并将其放入您的 $()
.
您通常可以在命令行中包含密码。
/usr/local/Calpont/mysql/bin/mysql -u [用户] -p[密码] -h [主机] [db_name]
注意:-p 和密码之间不能有 SPACE。
如果您的密码包含某些标点符号,您可能需要用双引号将其括起来。
显然这是最不安全的方法,但却是最简单的方法。
我正在使用 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:
在我输入密码并按 'enter' 后它停止响应。我必须使用 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 的新手,并尝试使用它循环遍历我数据库中的所有表并导出它们 (similar to this script),但如果我什至不能,那也没用连接到数据库...
在此先感谢您的帮助。
您分配给 mysql_data_dir
的命令替换不是 运行 交互式的,因此 mysql
命令必须 运行,生成它的输出并在输出将结束之前终止返回到 shell 变量。仔细看你的linked example(摘录如下),你会发现他的mysql
命令就是这种命令行;它包括一个 mysql
命令,该命令被执行并通过管道传输到 awk
命令以进行 post-processing.
mysql_data_dir=$(mysql $myopts "show variables like 'datadir'" | awk '{sub(/\/$/,"");print$NF}')
您需要做的是确定您的 "one-liner" mysql
命令是什么,并将其放入您的 $()
.
您通常可以在命令行中包含密码。
/usr/local/Calpont/mysql/bin/mysql -u [用户] -p[密码] -h [主机] [db_name]
注意:-p 和密码之间不能有 SPACE。
如果您的密码包含某些标点符号,您可能需要用双引号将其括起来。
显然这是最不安全的方法,但却是最简单的方法。