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

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


person ale19    schedule 22.02.2017    source источник
comment
Как на самом деле выглядит db_export.sh?   -  person chepner    schedule 22.02.2017
comment
Это похоже на скрипт, который я связал в посте. Я отредактировал свой пост, чтобы включить код. За исключением того, что я должен использовать /usr/local/Calpont/mysql/bin/mysql вместо просто mysql, потому что так это работает для infinidb (афаик).   -  person ale19    schedule 22.02.2017


Ответы (2)


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

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

Что вам нужно сделать, так это определить, что представляет собой ваша «однострочная» команда mysql, и поместить ее в файл $().

person Greg Tarsa    schedule 22.02.2017
comment
Ах, спасибо! Я не понимал, как работает синтаксис. Я нашел нужную мне команду и теперь могу подключиться. К сожалению, я не могу запустить команду SELECT INTO OUTFILE: похоже, она неправильно использует переменную $T. Когда я запускаю его, я получаю "exporting /usr/local/Calpont/mysql/bin/mysql Ver 14.14 Distrib 5.1.39, for unknown-linux-gnu (x86_64) using readline 5.1 Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc...." и перечисляю все параметры для MySQL. Но на самом деле он ничего не экспортирует... Может, вы знаете, что происходит? - person ale19; 22.02.2017
comment
Я добавил остальную часть кода в свой пост, на всякий случай, если это кому-то поможет. - person ale19; 22.02.2017
comment
Вы уверены, что вывод команды mysql, которую вы передаете в свой цикл, создает только имена таблиц? В нем могут быть некоторые строки заголовка, которые необходимо пропустить, чтобы ваш код работал. Кроме того, если мой ответ выше отвечает на ваш основной вопрос, пожалуйста, отметьте ответ как правильный. - person Greg Tarsa; 23.02.2017
comment
Когда я набираю в оболочке mysql команду «показать таблицы» (после ввода «использовать ‹db_name›»), она показывает таблицы и ничего больше: i.imgur.com/wv79i5t.png Я не уверен, что могло заставить его перечислить параметры справки для InfiniDB (это то, что Ver 14.14 Distrib 5.1.39, для unknown-linux- гну... бред это). - person ale19; 23.02.2017
comment
У меня здесь нет конфигурации mysql, но похоже, что ваша текущая проблема заключается в том, что в выводе mysql много визуального мусора. Все эти +---+ и | путают последующую команду. Этот вопрос SO говорит о том, как поместить список таблиц в переменная. Поместите свои таблицы в variable, а затем замените while read T на for T in ${variable}. Написание сценариев в Bash — отличный навык, научитесь смотреть на ввод-вывод команд с точки зрения компьютера. - person Greg Tarsa; 23.02.2017

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

/usr/local/Calpont/mysql/bin/mysql -u [пользователь] -p[пароль] -h [хост] [имя_базы_данных]

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

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

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

person KenP_olb    schedule 22.02.2017
comment
Я могу просто ввести свой пароль, поэтому я не думаю, что это проблема ... Я все равно попробовал на всякий случай, и он все еще зависает после запуска программы ... - person ale19; 22.02.2017