MySQL зависает при входе в систему

Я использую InfiniDB (не по выбору). Когда я использую оболочку linux, я могу просто подключиться к базе данных:

<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 и пытаюсь использовать его, чтобы перебрать все таблицы в моей базе данных и экспортировать их ( аналогично этому сценарию), но бесполезно, если я не могу даже подключиться к базе данных...

Заранее спасибо за помощь.

2 ответа

Решение

Подстановка команды, которую вы назначаете mysql_data_dir не работает в интерактивном режиме, поэтому mysql Команда должна выполнить, сгенерировать свой вывод и завершиться до того, как вывод будет возвращен в переменную оболочки. Посмотрите внимательно на ваш связанный пример (выдержка ниже), и вы увидите, что его mysql commmand - это как раз такая командная строка; это включает в себя mysql Команда, которая выполняется и передается в awk команда для постобработки.

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

То, что вам нужно сделать, это определить, что ваш "однострочник" mysql Команда и положить это в свой $(),

Обычно вы можете включить пароль в командной строке.

/ usr / local / Calpont / mysql / bin / mysql -u [пользователь] -p[pwd] -h [хост] [db_name]

ПРИМЕЧАНИЕ. Между -p и паролем не должно быть пробела.

Если ваш пароль содержит определенные знаки пунктуации, вам, возможно, придется заключить его в двойные кавычки.

Очевидно, что это наименее безопасный способ сделать это, но это самый простой.

Другие вопросы по тегам