# Главная
# О библиотеке

# Выбор дистрибутива
преимущества Linux/UNIX | основные дистрибутивы | серверный Linux | BSD | LiveCDs | прочее

# Установка и удаление программ
общие вопросы | каталоги софта | специальные случаи

# Настройка и работа
установка, загрузчики | настройка Linux | консоль | файловые системы | процессы | шеллы, русификация, коммандеры | виртуальные машины, эмуляторы

# X Window и оконные менеджеры
настройка X Window | GNOME | KDE | IceWM и др.

# Работа с текстами
редакторы | офис | шрифты, кодировки и русификация | преобразования текстовых файлов | LaTeX, SGML и др. | словари

# Графика
GIMP | фото | обработка изображений | форматы графических файлов

# Сети, администрирование
общие вопросы | Dialup & PPP | брандмауэры | маршрутизация | работа в Windows-сетях | веб-серверы | Apache | прокси-серверы | сетевая печать | прочее

# Программирование
GCC & GNU make | программирование в UNIX | графические библиотеки | Tcl | Perl | PHP | Java & C# | СУБД | CVS | прочее

# Ядро
# Мультимедиа
# Интернет
# Почта
# Безопасность
# Железо
# Разное

# Linux HowTo (как сделать)
# Книги и руководства
# Материалы на английском языке


MySQL The World's Most Popular Open Source Database # Online shop | Site map |  
CompanyProductsSupport & ConsultingTraining & CertificationDownloadsDocumentation
  BooksArticlesMailing ListsPresentationsOther Sites  
Search the MySQL manual:
MySQL Manual
  • 3 Учебное пособие по MySQL
    • 3.1 Подсоединение к серверу и отсоединение от него
    • 3.2 Ввод запросов
    • 3.3 Создание и использование базы данных
    • 3.4 Получение информации о базах данных и таблицах
    • 3.5 Примеры стандартных запросов
    • 3.6 Использование mysql в пакетном режиме
    • 3.7 Запросы проекта "Близнецы" (Twin Project)
    • 3.8 Использование MySQL совместно с Apache

Buy this Reference Manual in softcover from Barnes & Noble!

MySQL Reference Manual
Previous / Next / Up / Table of Contents

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.

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

  • При необходимости частого (ежедневного или хотя бы еженедельного) запуска одного и того же запроса сценарий позволяет избавиться от многократного набора этого запроса.
  • Можно создавать новые запросы, подобные уже существующим, просто копируя и затем изменяя файлы сценариев.
  • Пакетный режим может пригодиться и при разработке особенно длинных запросов, а именно - многострочных команд или больших последовательностей команд. В таком деле одна допущенная ошибка может привести к необходимости повторного набора большого количества текста. Зато при работе со сценарием легко исправить ошибку и запустить запрос на повторное исполнение.
  • Если ваш запрос выводит на экран много текста, его можно просмотреть постранично, не мучаясь догадками относительно убежавшей за край экрана части результатов:
    shell> mysql < batch-file | more
    
  • Выводимые запросом результаты можно сохранить в файле для последующей обработки:
    shell> mysql < batch-file > mysql.out
    
  • Свой сценарий вы можете дать кому-нибудь еще, чтобы он тоже мог воспользоваться содержащимися в сценарии командами.
  • В некоторых случаях работать в интерактивном режиме просто не получается. И здесь без пакетного режима не обойтись.

По умолчанию при работе с 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 [name withheld] on Wednesday December 18 2002, @5:27pm[Delete] [Edit]

It would be very nice if source would take a string instead of a line. That way, you could have a lot of the functionality of Procedures by just passing it things like CONCAT(@procedurePath,"/doTheThing.txt").

It would also allow for your sources to call each other without having to hard-code an absolute path into each of them, because they could also do "source CONCAT(@libraryPath,"/checkValidity.txt")".

This seems so useful I (a newcomer to MySQL) was amazed that this was how it DIDN'T work.
-The Amazing Llama

Posted by [name withheld] on Friday August 16 2002, @4:07am[Delete] [Edit]

I am very new to this. When I tried this
command:
dos> mysql -e "source batch-file"
it failed because the database wasn't named. It
worked when I changed the command to this:
dos> mysql -e "source batch-file" dbname

(- by Aelfgifu)

Posted by Shrimp on Monday September 9 2002, @3:02am[Delete] [Edit]

You can solve that issue by adding "USE
database_name;" to your script file before any other
commands.

Posted by Christopher Agboile on Wednesday October 9 2002, @2:36am[Delete] [Edit]

How actually can I run an mysql script file?
I use the command:
mysql>.\<file name>| source <filename>
it would not work.
Can some help out if i did not use it properly.

Posted by Fernando Wendt on Thursday October 31 2002, @5:30am[Delete] [Edit]

On a Windows system, how to tell MySQL to search
for a text file from any directory? Example: mysql -
>source 'dir\file.txt'.

Posted by [email protected] on Tuesday December 3 2002, @12:20am[Delete] [Edit]

I think there is a bug here. When for instance
having an INSERT INTO table VALUES ('ЕЖД',...)
in the file (that is - swedish characters) they are
not inserted as swedish characters into the
database. If I run the exact same command
from the mysql command prompt, they are
inserted correctly (the db is latin1 which is
correct). When using the mysql < file.sql it
seems like mysql cannot handle other character
sets. So it's _not_ true that the batch mode is
just like entering the commands from the mysql
prompt.

Posted by tobias adelgren on Wednesday December 4 2002, @2:12pm[Delete] [Edit]

To Fernando: You must use "\\" instead of only "\"
when describing a folder in windows.
E.g. "C:\\mysql\\mybatchfile.txt"

Posted by Elaine Seery on Monday February 10 2003, @2:59am[Delete] [Edit]

another tip. using -s writes the results of your query without the field name as the first line e.g.
mysql -s < writemaillists > members.list
results in:

[email protected]
[email protected]

instead of the less useful

email
[email protected]
[email protected]

this used to be in the manual, but seems to have disappeared. i can't remember if '-s' is officially the right option (i worked through some letters at random), but it seems to work.

Posted by Yurii Zborovs'kyi on Thursday 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

Add your own comment.

Top / Previous / Next / Up / Table of Contents
# MySQL.com home | Site map | Contact us | Press | Jobs | Privacy policy | Trademark info | © 1995-2003 MySQL AB. All rights reserved.