MySQL хранит множество файлов журналов (регистрации событий), которые могут оказаться для вас полезными. По большей части эти файлы по умолчанию не создаются, поэтому, если вы хотите их иметь, необходимо активизировать запись файлов журнала. Включить запись любого из файлов журнала можно с помощью опций командной строки при запуске сервера или с помощью команды set.
Ниже приведен список журналов, которые можно создать.
■ Журнал регистрации ошибок. Отслеживает все возникающие ошибки. Единственный из журналов, запись в который по умолчанию включена, размещается в вашем каталоге данных. Файл называется hostname.err в Linux и mysql. err в Windows. Можно назначить ему любое другое расположение, используя опцию 1од-еггог=имя_файла в файле конфигурации my. ini (или ту. cnf).
■ Журнал регистрации запросов. Регистрирует все запросы, выполняемые системой. Можно включить запись этого журнала и указать его расположение с помощью опции 1од=имя_файла.
■ Журнал двоичной регистрации. Регистрирует все запросы, изменяющие данные. Заменил журнал регистрации обновлений, который все еще существует и будет существовать до версии MySQL 5.0. Можно включить запись этого журнала и указать его расположение с помощью опции log-bin=
имя_файла. •. ‘.
■ Журнал регистрации медленных запросов. Регистрирует все запросы, время выполнения которых оказалось больше, чем значение, хранимое переменной long_query_time. Можно включить запись этого журнала и указать его расположение с помощью опции log-slow-queries=*»<ts_$aJ&ia.
Все указанные выше журналы, кроме журнала двоичной регистрации, являются простыми текстовыми файлами. Журнал двоичной регистрации можно просмотреть с помощью команды
mysqlbinlog logfile
Использование журнала регистрации медленных запросов будет обсуждаться в главе 19, “Оптимизация запросов”.
Файлы журналов регистрации будут со временем разрастаться, поэтому желательно на регулярной основе менять файлы журналов. В среде Linux система
MySQL предлагает сценарий mysql-log-rotate, избавляющий от необходимости делать это вручную.
При использовании другой операционной системы вы можете переместить старые файлы журналов в другое место на диске вручную и дать указание MySQL начать использование новых файлов журналов с помощью команды
mysqladmin flush-logs
]]>Программа mysqladmin имеет очень много опций, польза и частота применения которых весьма различны.
Некоторые задачи могут быть выполнены как с помощью команд SQL, так и с помощью mysqladmin — например, создание и уничтожение баз данных:
mysqladmin create имяБД
mysqladmin drop имяБД
Типичным примером использования mysqladmin является получение информации о сервере и его текущем состоянии. Такая информация может быть как очень простой (”Доступен ли сервер?” — ping), так и существенно более подробной, например, включающей список всех доступных переменных или процессов. Ниже приводится несколько примеров использования mysqladmin.
Чтобы выяснить, включен ли сервер, используйте
mysqladmin ping
Чтобы выяснить, какая версия программного обеспечения сервера MySQL установлена на вашей машине, используйте
mysqladmin version
Чтобы получить короткое или длинное сообщение о статусе сервера, используйте
mysqladmin status mysqladmin extended-status
Чтобы получить список активных потоков в рамках данного сервера, используйте
mysqladmin processlist
Получив список процессов (потоков), вы можете принудительно завершить выполнение некоторых из них по вашему усмотрению, используя команду
mysqladmin kill idl,id2,id3…
Чтобы напечатать значения переменных MySQL, используйте
mysqladmin variables
]]>■ Сервер можно запустить с помощью mysqladmin, с помощью запуска исполняемого файла mysqld или с помощью Диспетчера сервисов Windows.
■ Завершить работу сервера можно с помощью mysql. server stop или mysqladmin shutdown.
■ Используйте mysqlshow или SHOW для получения информации о текущем состоянии базы данных и сервера MySQL.
■ Установить переменные можно с помощью set переменная-значение;.
я Увидеть список выполняемых потоков можно с помощью show processlist, а завершить их выполнение — с помощью kill id_npoiiecca.
я Очистить кэши можно с помощью FLUSH и RESET.
■ Увеличить скорость работы объединений можно с помощью analyze table имя_ та блицы;.
я MySQL сохраняет информацию о событиях в журнале регистрации ошибок, журнале регистрации запросов, журнале двоичной регистрации (о запросах, изменяющих данные) и журнале регистрации медленных запросов (о запросах, выполнение которых заняло больше времени, чем значение переменной long_query_time).
]]>В этой главе описывается, как резервировать (т.е. делать копии баз данных),
как перемещать их на другую машину и восстанавливать в случае каких бы то ни было неполадок в системе.
Мы рассмотрим следующие вопросы.
■ Резервирование баз данных.
■ Восстановление с помощью резервных копий.
■ Проверка и восстановление таблиц.
]]>Очевидно, как и в случае любых других файлов, вы должны иметь резервные копии своих баз данных. Можно также сделать копию базы данных с целью репликации или для того, чтобы переместить ее на другую машину.
В MySQL имеется несколько вариантов резервирования баз данных.
■ Применение сценария mysql dump для создания дампа, т.е. файла, содержащего операторы SQL, необходимые для воссоздания базы данных.
■ Применение сценария mysqlhotcopy для создания файла данных. Этот сценарий непосредственно копирует файлы данных конкретной базы данных.
■ Непосредственное создание резервной копии файлов данных вручную. Это фактически эквивалентно применению mysqlhotcopy, но в данном случае все делается вручную. Если вы предпочтете использовать этот вариант, необходимо перед копированием прекратить работу базы данных или обновить и блокировать все таблицы, чтобы обеспечить их внутреннюю согласованность. И mysqldump, и mysqlhotcopy обновят и блокируют таблицы за вас, поэтому применение указанных сценариев является более простым и безопасным.
■ Использование команд BACKUP TABLE и RESTORE TABLE для резервирования или восстановления конкретной таблицы или множества таблиц.
Мы рассмотрим каждый из этих вариантов по очереди.
Не забывайте также о том, что хотя резервирование и является жизненно .важным для нормальной работы базы данных, на время выполнения резервирования доступ пользователей к базе данных ограничивается. Зачем? Чтобы получить согласованный “снимок” базы данных, таблицы должны быть обновлены и во время копирования должны оставаться в неизменном состоянии. Этого можно добиться, заблокировав таблицы (как это и бывает в большинстве случаев) или выключив сервер (чего делать не рекомендуется), но в любом случае на время выполнения резервирования приходится уменьшить способность базы данных к реагированию на запросы.
Одним из решений этой проблемы является использование репликации. Вы получаете возможность отключить один компонент системы и выполнить резервное копирование, в то время как пользователи продолжают счастливо делать свое дело. Мы обсудим использование репликации достаточно подробно в главе 16, “Репликация баз данных”.
]]>Проще и удобнее всего выполнить резервирование базы данных с помощью сценария mysqldump, запустив его из командной строки. Этот сценарий обеспечивает соединение с сервером MySQL и создание файла дампа SQL. Файл дампа содержит операторы SQL, необходимые для воссоздания соответствующей базы данных.
Ниже приведен типичный пример использования этого сценария.
mysqldump –opt -и имя_пользователя -р пароль employee > backup.sql
Здесь используется опция —opt, инкапсулирующая несколько других опций, — мы обсудим их чуть позже. Мы также указали имя базы данных и перенаправили вывод в резервный файл, который хотели бы использовать.
В результате применения указанного сценария к простой базе данных employee создается файл вывода, подобный показанному в листинге 14.1.
Листинг 14.1. Пример вывода сценария mysqldump
— MySQL dump 10.2
– Host: localhost Database: employee
— Server version 4.1.O-alpha-max-debug
— Table structure for table ‘assignment’
DROP TABLE IF EXISTS assignment;
CREATE TABLE assignment (
clientID int(11) NOT NULL default ‘0′, employeelD int (11) NOT NULL default ‘0′, workdate date NOT NULL default ‘0000-00-00′, hours float default NULL,
PRIMARY KEY (clientID,employeelD,workdate) ) TYPE=InnoDB CHARSET=latinl;
— Dumping data for table ‘assignment’
/* 140000 ALTER TABLE assignment DISABLE KEYS */; LOCK TABLES assignment WRITE; INSERT INTO assignment VALUES
(1,7513,’0000-00-00′,5), (1,7513,’2003-01-20′,8.5); UNLOCK TABLES;
7*140000 ALTER TABLE assignment ENABLE KEYS */;
— Table structure for table ‘client’
DROP TABLE IF EXISTS client;
CREATE TABLE client (
clientID’int(11) NOT NULL auto_increment, name varchar(40) default NULL, address varchar(100) default NULL, contactPerson varchar(80) default NULL, contactNumber varchar(12) default NULL, PRIMARY KEY (clientID)
) TYPE=InnoDB CHARSET=latinl;
— Dumping data for table ‘client’
/* 140000 ALTER TABLE client DISABLE KEYS */; LOCK TABLES client WRITE; INSERT INTO client VALUES
(1,’Telco Inc’,'1 Collins St Melbourne’,'Fred Smith’,'95551234′),
(2,’The Bank’,'100 Bourke St Melbourne”,’Jan Tristan’,'95559876′); UNLOCK TABLES;
/*!40000 ALTER TABLE client ENABLE KEYS */;
— Table structure for table ‘department’
DROP TABLE IF EXISTS department; CREATE TABLE department (
departmentID int (11) NOT NULL auto_increment,
name varchar(30) default NULL,
PRIMARY KEY (departmentID) ) TYPE=InnoDB CHARSET=latinl;
— Dumping data for table ‘department’
/*140000 ALTER TABLE department DISABLE KEYS */; LOCK TABLES department WRITE; INSERT INTO department VALUES
(42, ‘Finance’),
(128,’Research and Development’), (129,’Human Resources’), (130,’Marketing’) , (131,’Property Services’); UNLOCK TABLES;
/* 140000 ALTER TABLE department ENABLE KEYS */;
— Table structure for table ‘employee’
DROP TABLE IF EXISTS employee; CREATE TABLE employee (
employeelD int(11) NOT NULL auto_increment,
name varchar(80) default NULL,
job varchar(30) default NULL,
departmentID int (11) NOT NULL default ‘0′,
PRIMARY KEY (employeelD) ) TYPE=InnoDB CHARSET=latinl;
— Dumping data for table ‘employee’
/*140000 ALTER TABLE employee DISABLE KEYS */; LOCK TABLES employee WRITE; INSERT INTO employee VALUES
(6651, ‘Ajay Patel’, ‘ProgrammerM28) , (7513,’Nora Edwards’,'Programmer’,128), (9006,’Candy Burnett’,'Systems Administrator’,128), (9842, ‘Ben Smith’,'DBA’, 42), (9843,’Fred Smith’,'DBA’,131); UNLOCK TABLES;
/*140000 ALTER TABLE employee ENABLE “KEYS
— Table structure for table ‘employeeSkills’
DROP TABLE IF ExTSTS employeeSkills;
CREATE TABLE’employeeSkills (
employeelD int (11) NOT NULL default ‘0′, skill varchar(15) NOT NULL default “, PRIMARY KEY (employeelD,skill)
) TYPE=InnoDB CHARSET=latinl;
— Dumping data for table ‘employeeSkills’
/*140000 ALTER TABLE employeeSkills DISABLE KEYS */; LOCK TABLES employeeSkills WRITE; •■ INSERT INTO employeeSkills VALUES
(6651,’Java’),
(6651,’VB’),
(7513,’C'),
(7513,1 Java’),
(7513, ‘Perl’),
(9006,’Linux’),
(9006,’NT’),
(9842,’DB2′); UNLOCK TABLES;
/*140000 ALTER TABLE employeeSkills ENABLE KEYS */;
Теперь можно перезагрузить или воссоздать базу данных employee, выполнив следующие действия.
1. Создать базу данных с подходящим именем на нужной машине.
2. Загрузить файл копии с помощью команды mysql -и имя_пользователя -р < backup.sql
Сценарий mysqldump имеет множество опций. Здесь мы использовали опцию —opt, которую могут сопровождать следующие параметры.
■ —quick. Заставляет MySQL направить данные дампа сразу в файл, минуя буфер памяти (что предполагается По умолчанию). В результате процесс ускорится.
■ —add-drop-table. Дает MySQL указание добавлять оператор DROP TABLE перед каждым оператором CREATE TABLE в дампе (см. листинг 14.1),
■ —add-locks. Добавляет операторы LOCK TABLES и UNLOCK TABLES (их вы тоже можете увидеть в файле дампа).
■ —extend-insert. Заставляет MySQL использовать многострочный синтаксис вставки для добавления множества строк с помощью одного оператора INSERT. Так, в нашем листинге соответствующий оператор выглядит так:
INSERT INTO employeeSkills VALUES (6651,’Java’), (6651,’VB’), (7513,’C'),
Если потребуется воссоздать базу данных из резервной копии, такой оператор будет выполняться быстрее, чем соответствующая последовательность отдельных операторов INSERT.
■—lock-tables. Заставляет MySQL блокировать все таблицы, прежде чем начать создание дампа.
Обратите внимание на то, что опция —opt (означающая optimized — оптимизированное) будет оптимизировать время, необходимое для последующей загрузки дампа, а не время, потраченное на создание дампа. Процесс создания файла дампа может оказаться долгим.
Вот еще несколько полезных опций.
■ —databases. Позволяет указать не одну, а несколько баз данных для дампа.
■ —all-databases. Дает MySQL указание создать дамп всех имеющихся баз данных.
■ —allow-keywords. Если имеются имена полей, которые являются ключевыми словами MySQL (или могут стать таковыми в будущем), эта опция требует от MySQL квалифицировать (т.е. сопровождать) имя каждого столбца именем таблицы.
■ -^d или –no-data. Создавать дамп только структуры базы данных, но не ее содержимого. Это может оказаться полезным при размещении и тестировании базы данных на разных машинах.
Преимуществами использования mysqldump являются простота и автоматическая блокировка таблиц.
Но имеются и два недостатка. Во-первых, этот сценарий блокирует таблицы: запуск этого сценария на сервере блокирует доступ пользователей на несколько секунд (или минут, в зависимости от размера таблиц). Если вам потребуется создать дамп на отдельном не имеющем репликации сервере, желательно делать это не во время пиковых нагрузок, чтобы не вызвать раздражения пользователей. Если вы храните множество данных и имеете много пользователей в любое время, необходимо выбрать другой способ резервирования.
Во-вторых, поскольку сценарий mysqldump работает через сервер MySQL, то будет выполняться медленнее, чем mysqlhotcopy. Сценарий mysqlhotcopy использует сервер MySQL не слишком активно, а выполняет значительную часть своей работы, обращаясь непосредственно к файловой системе.
]]>Сценарий mysqlhotcopy отличается от mysqldump тем, что копирует непосредственно файлы данных базы данных, а не данные, необходимые для восстановления, с помощью соединения с сервером. При этом связь с сервером все равно требуется, чтобы обновить и блокировать таблицы базы данных, но поскольку данный сценарий в основном использует операции с файловой системой, а не запросы к базе данных, он должен в целом выполняться несколько быстрее, чем сценарий mysqldump.
Данный сценарий можно использовать так, как показано ниже.
mysqlhotcopy -и имя_пользователя -р имяБД размещение_копии
Этот сценарий является сценарием Perl. Если вы используете Unix или подобную ей операционную систему, у вас почти наверняка где-то уже есть исполняемый файл perl. В Windows, чтобы использовать Perl, вам нужно установить его. Если установщика Perl для Windows у вас еще нет, загрузите его с узла ActiveState:
www.activestate.com/Products/ActivePerl
]]>Файлы, создаваемые mysqlhotcopy, — это точные копии файлов данных базы данных. Чтобы использовать эти копии, необходимо остановить работу сервера MySQL и заменить файлы данных в каталоге данных MySQL соответствующими файлами-копиями.
]]>Вместо использования mysqlhotcopy можно сделать то же самое вручную. Это предполагает обновление данных (запись на диск содержимого файловых буферов) и блокировку таблиц, а затем копирование файлов данных в резервное место (при этом таблицы должны оставаться заблокированными).
Это значит, что сначала придется открыть сеанс MySQL. Затем можно ввести команду LOCK TABLES, чтобы блокировать все таблицы, которые планируется резервировать:
lock tables employee read, department read, client read, assignment read, employeeSkills read;
Оператор LOCK TABLES в качестве параметров получает список имен таблиц и тип блокировки, который необходимо применить: READ или WRITE. Для резервирования блокировки для чтения обычно бывает достаточно. Это означает, что другие потоки (связывающиеся объекты) могут продолжать читать данные таблиц, но не смогут записывать в них данные, пока резервирование не будет завершено.
Блокировка в таких ситуациях очень важна, поскольку копирование может занять достаточно много времени. В нашем случае будет катастрофой, если, например, после копирования таблицы employee, но еще перед копированием таблицы department, кто-то удалит информацию о всех служащих какого-то отдела и информацию о самом отделе. Полученная в результате квпия будет несогласованной, поскольку будет содержать информацию о служащих несуществующего отдела.
Затем следует применить команду FLUSH TABLES: flush tables;
Если необходимо резервировать все базы данных, можно совместить эти два шага, используя команду
flush tables with read lock;
Теперь можно копировать файлы данных. Очень важно, чтобы сеанс связи (в ходе которого вы обновили и блокировали таблицы) оставался открытым, пока выполняется копирование. Это обеспечит сохранение блокировок. В результате завершения сеанса таблицы будут разблокированы.
По завершении копирования файлов следует, конечно, разблокировать таблицы:
unlock tables;
Эта процедура аналогична сценарию mysqlhotcopy, и точно так же вы можете восстановить базу данных.
]]>Альтернативу только что рассмотренным вариантам составляют два оператора SQL, которые можно использовать для получения тех же результатов. Это — операторы BACKUP TABLE и RESTORE TABLE. Соответствующие команды работают только с таблицами MylSAM.
Вы можете создать резервную копию таблицы MylSAM с помощью команды
backup table tl to ‘путь/к/копии‘;
Обратите внимание на то, что в Windows необходимо также указать букву дисковода, например,
backup table tl to ‘с:/путь/к/копии’;
В результате файлы, представляющие указанную таблицу MylSAM, будут скопированы в указанное место. Таблица будет заблокирована для чтения, пока будет выполняться копирование.
Можно также указать список таблиц, разделенный запятыми, однако каждая из таких таблиц будет блокироваться и копироваться отдельно, по очереди. Если необходимо получить согласованный набор таблиц, следует сначала применить оператор LOCK TABLES (о том, как это сделать, говорилось в предыдущем разделе, “Резервирование и восстановление вручную”).
Чтобы восстановить данные с помощью копии, введите
restore table tl’from 1c:/tmp’;
Это сработает только в том случае, если восстанавливаемых таблиц в текущей базе данных не существует. Если уже имеется таблица с соответствующим именем, перед использованием оператора RESTORE следует применить команду DROP TABLE.
И подчеркнем еще раз, RESTORE работает только с таблицами MylSAM.
]]>