2017-02-22 4 views
0

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

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

Но когда я использую Баш скрипт, он прицепляется:

<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 

Я новичок в Баш и пытается использовать его для перебора всех таблиц в моей базе данных и экспортировать их (similar to this script), но это не имеет смысла если я не могу даже подключиться к базе данных ...

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

+0

Как выглядит 'db_export.sh' на самом деле? – chepner

+0

Похоже на сценарий, который я связал в сообщении. Я редактировал свой пост, чтобы включить код. За исключением того, что я должен использовать/usr/local/Calpont/mysql/bin/mysql вместо просто mysql, так как это работает для infinidb (afaik). – ale19

ответ

1

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

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

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

+0

Ах, спасибо! Я не понимал, как работает синтаксис. Я нашел команду, в которой я нуждался, и теперь могу подключиться. К сожалению, я не могу запустить команду SELECT INTO OUTFILE: она, похоже, неправильно использует переменную $ T. Когда я запустил его, я получаю '' экспорт/usr/local/Calpont/mysql/bin/mysql Ver 14.14. Распространение 5.1.39 для unknown-linux-gnu (x86_64) с использованием readline 5.1 Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc .... "и перечислены все опции для MySQL. Но на самом деле он ничего не экспортирует ... Любой шанс, что вы знаете, что может быть? – ale19

+0

Я добавил остальную часть кода в свой пост, на всякий случай, который помогает кому-либо. – ale19

+0

Вы уверены, что вывод команды 'mysql', которую вы пишете в своем цикле, создает только имена таблиц? У него могут быть некоторые строки заголовков, которые необходимо пропустить, чтобы ваш код работал. Также, если мой ответ, выше, отвечает на ваш базовый вопрос, пожалуйста, отметьте ответ как правильный. –

-1

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

/USR/местные/Calpont/MySQL/бен/MySQL -u [пользователь] -n [PWD] -h [хост] [имя_базы_данных]

Примечание: не должно быть пробела между -p и пароль.

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

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

+0

Я могу ввести свой пароль в порядке, поэтому я не думаю, что это проблема ... Я попробовал это в любом случае на всякий случай, и он все еще зависает после запуска программы ... – ale19

Смежные вопросы