Search the MySQL manual:
Subscribe to the monthly
MySQL Newsletter!

3.6 Использование mysql в пакетном режиме

В предыдущих разделах было показано, как использовать mysql в интерактивном режиме, вводя запросы и тут же просматривая результаты. Запускать mysql можно и в пакетном режиме. Для этого нужно собрать все команды в один файл и передать его на исполнение mysql:

shell> mysql < batch-file

Если вы работаете с mysql в ОС Windows, и некоторые из специальных символов, содержащихся в пакетном файле, могут вызвать проблемы, воспользуйтесь следующей командой:

dos> mysql -e "source batch-file"

Если необходимо указать параметры соединения в командной строке, она может иметь следующий вид:

shell> mysql -h host -u user -p < batch-file
Enter password: ********

Работая с mysql таким образом, вы, в сущности, создаете сценарий и затем исполняете его.

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

Зачем вообще нужны сценарии? Причин тому несколько:

По умолчанию при работе с mysql в пакетном режиме используется более сжатый формат вывода результатов, чем при интерактивной работе. В интерактивном режиме результаты работы запроса SELECT DISTINCT species FROM pet выглядят так:

+---------+
| species |
+---------+
| bird    |
| cat     |
| dog     |
| hamster |
| snake   |
+---------+

А в пакетном - вот так:

species
bird
cat
dog
hamster
snake

Если вам нужно, чтобы в пакетном режиме программа выводила данные так же, как и в интерактивном, воспользуйтесь ключом mysql -t. Включить "эхо" исполняемых команд можно с помощью ключа mysql -vvv.

В командную строку mysql можно включать и сценарии - при помощи команды source:

mysql> source filename;

User Comments

Posted by Yurii Zborovs'kyi on March 6 2003 2:57am[Delete] [Edit]

How to measure total batch running time for several SQLs:

# at start of your script file
SET @start=UNIX_TIMESTAMP();

# great job
...
...
...

# at bottom of your script file
SET
@s=@seconds:=UNIX_TIMESTAMP()-@start,
@d=TRUNCATE(@s/86400,0), @s=MOD(@s,86400),
@h=TRUNCATE(@s/3600,0), @s=MOD(@s,3600),
@m=TRUNCATE(@s/60,0), @s=MOD(@s,60),
@day=IF(@d>0,CONCAT(@d,' day'),''),
@hour=IF(@d+@h>0,CONCAT(IF(@d>0,LPAD(@h,2,'0'),@h),' hour'),''),
@min=IF(@d+@h+@m>0,CONCAT(IF(@d+@h>0,LPAD(@m,2,'0'),@m),' min.'),''),
@sec=CONCAT(IF(@d+@h+@m>0,LPAD(@s,2,'0'),@s),' sec.');

SELECT
CONCAT(@seconds,' sec.') AS seconds,
CONCAT_WS(' ',@day,@hour,@min,@sec) AS elapsed;

# enjoy :)

p.s. Tested & works
p.p.s. No fractions of seconds :(

jz

Posted by Musba - on May 20 2003 3:41am[Delete] [Edit]

Example of a Korn Shell Script

#!/bin/ksh
mysql --user=<user> --password=<password> -h <host> <<!!
SELECT VERSION(), CURRENT_DATE;
quit
!!

Posted by Matthew Dominick on January 10 2004 12:20pm[Delete] [Edit]

When using mysql in batch mode there is an odd requirement that cost me hours. Your .sql file cannot contain any #comment lines. Delete them and importing will be a breeze. There is no indication that this is the problem. However, experimentation revealed this to be the cause.

Posted by Donald Axel on February 18 2004 4:52pm[Delete] [Edit]

Lines beginning with two dashes are comment lines. Inside a shell script you will use #comment lines in the shell part and if you use a here-document you must use --comment lines inside the here document. Example:
===file petquery.sh===
#!/bin/sh
# This is a comment
mysql -t <<STOP
-- This is a comment inside an sql-command-stream.
use menagerie
select * from pet ;
\q
STOP
test $? = 0 && echo "Your batch job terminated gracefully"

===end-of-file petquery.sh===
DO NOT cut/paste the === lines.
I don't know how to make source listings inside the example.
donald_j_axel(at)get2net.dk

Add your own comment.