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