Поскольку таблицы MySQL хранятся в виде файлов, то резервное копирование
выполняется легко. Чтобы резервная копия была согласованной, выполните на
выбранных таблицах LOCK TABLES
, а затем FLUSH TABLES
для этих таблиц (см.
разделы Раздел 6.7.2, «Синтаксис команд LOCK TABLES/UNLOCK TABLES
» и see Раздел 4.5.3, «Синтаксис команды FLUSH
»). При этом
требуется блокировка только на чтение; поэтому другие потоки смогут
продолжать запросы на таблицах в то время, пока будут создаваться копии
файлов из каталога базы данных. Команда FLUSH TABLE
обеспечивает гарантию
того, что все активные индексные страницы будут записаны на диск прежде,
чем начнется резервное копирование.
Начиная с 3.23.56 и 4.0.12 BACKUP TABLE
не позволит вам перезаписать существующие
файлы, так как это создает потенциальные проблемы в безопасности.
Если есть необходимость провести резервное копирование на уровне SQL, то
можно воспользоваться SELECT INTO OUTFILE
или BACKUP TABLE
(см. разделы
Раздел 6.4.1, «Синтаксис оператора SELECT
» и see Раздел 4.4.2, «Синтаксис BACKUP TABLE
»).
Существует еще один способ создать резервную копию базы данных -
использовать программу mysqldump
или сценарий mysqlhotcopy
(см. разделы
Раздел 4.8.5, «mysqldump
, Получение дампов данных и структуры таблицы» и see Раздел 4.8.6, «mysqlhotcopy
, Копирование баз данных и таблиц MySQL»). Для этого нужно выполнить следующие действия:
-
Сделать полное резервное копирование баз данных:
shell> mysqldump --tab=/path/to/some/dir --opt --all или shell> mysqlhotcopy database /path/to/some/dir
Можно также просто скопировать табличные файлы (файлы
*.frm
,*.MYD
и*.MYI
) в тот момент, когда сервер не проводит никаких обновлений. Этот метод используется в сценарииmysqlhotcopy
. -
Если
mysqld
выполняется, остановить его, и затем запустить с опцией--log-update[=file_name]
(see Раздел 4.9.3, «Журнал обновлений (update)»). В файлах журнала обновлений находится информация, необходимая для того, чтобы повторить в базе данных последовательность изменений, внесенных с момента выполненияmysqldump
.
Если дело дошло до восстановления, сначала надо попробовать восстановить
таблицы с помощью REPAIR TABLE
или myisamchk -r
- это должно сработать в
99,9% случаев. Если myisamchk
не даст результата, попробуйте применить
следующую процедуру (эти действия применимы только в случае, если MySQL
запускался с --log-update
(see Раздел 4.9.3, «Журнал обновлений (update)»)):
Восстановите исходный вариант по копии, сделанной в
mysqldump
.-
Выполните следующую команду, чтобы повторить обновления из бинарного журнала:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
Если используется журнал обновлений, то можно применить:
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls
используется для того, чтобы расположить все файлы журнала обновлений в
правильном порядке.
Можно проводить избирательное резервное копирование посредством SELECT * INTO OUTFILE 'file_name' FROM tbl_name
, а восстановление - при помощи LOAD DATA INFILE 'file_name' REPLACE ...
Чтобы избежать повторения записей, в
таблице должен быть первичный
или уникальный ключ
. Ключевое слово REPLACE
задает замену старых записей новыми в случае, когда новая запись в
значении уникального ключа повторяет старую.
Если в системе, где выполняется резервное копирование, возникают проблемы с производительностью, то решить их можно, установив репликацию и выполняя резервное копирование на подчиненном сервере вместо головного (see Раздел 4.10.1, «Введение»).
Пользователи файловой системы Veritas могут поступить следующим образом:
Из клиента (или Perl) выполнить:
FLUSH TABLES WITH READ LOCK
.Из другого shell выполнить:
mount vxfs snapshot
.Из первого клиента выполнить:
UNLOCK TABLES
.Скопировать файлы из образа.
Демонтировать образ.