колонтитул в word 2007, 0000002111
Резервное копирование и профилактика баз данных
Поскольку таблицы MySQL хранятся в виде файлов, то резервное копирование
выполняется легко. Чтобы резервная копия была согласованной, выполните на
выбранных таблицах LOCK TABLES
, а затем FLUSH TABLES
для этих таблиц. При этом требуется блокировка только на чтение;
поэтому другие потоки смогут продолжать запросы на таблицах в то время, пока
будут создаваться копии файлов из каталога базы данных. Команда FLUSH
TABLE
обеспечивает гарантию того, что все активные индексные страницы
будут записаны на диск прежде, чем начнется резервное копирование.
Начиная с 3.23.56 и 4.0.12 BACKUP TABLE
не позволит вам
перезаписать существующие файлы, так как это создает потенциальные проблемы в
безопасности.
Если есть необходимость провести резервное копирование на уровне SQL, то
можно воспользоваться SELECT INTO OUTFILE
или BACKUP TABLE
.
Существует еще один способ создать резервную копию базы данных - использовать
программу mysqldump
или сценарий mysqlhotcopy
Для этого нужно
выполнить следующие действия:
-
Сделать полное резервное копирование баз данных:
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]
(Журнал
обновлений (update)). В файлах журнала обновлений находится
информация, необходимая для того, чтобы повторить в базе данных
последовательность изменений, внесенных с момента выполнения
mysqldump
.
Если дело дошло до восстановления, сначала надо попробовать восстановить
таблицы с помощью REPAIR TABLE
или myisamchk -r
- это
должно сработать в 99,9% случаев. Если myisamchk
не даст
результата, попробуйте применить следующую процедуру (эти действия применимы
только в случае, если MySQL запускался с --log-update
Журнал
обновлений (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
задает замену старых записей новыми в
случае, когда новая запись в значении уникального ключа повторяет старую.
Если в системе, где выполняется резервное копирование, возникают проблемы с
производительностью, то решить их можно, установив репликацию и выполняя
резервное копирование на подчиненном сервере вместо головного.
Пользователи файловой системы Veritas могут поступить следующим образом:
-
Из клиента (или Perl) выполнить: FLUSH TABLES WITH READ LOCK
.
-
Из другого shell выполнить: mount vxfs snapshot
.
-
Из первого клиента выполнить: UNLOCK TABLES
.
-
Скопировать файлы из образа.
-
Демонтировать образ.
Настройка режима профилактики таблиц
Начиная с версии MySQL 3.23.13 можно проверять таблицы типа MyISAM
с помощью команды CHECK TABLE
. Для ремонта таблиц можно использовать команду REPAIR
TABLE
.
Целесообразно выполнять регулярные проверки таблиц, не дожидаясь появления
проблем. В целях профилактики для проверки таблиц можно использовать
myisamchk -s
. Опция -s
(сокращение для --silent
)
задает выполнение myisamchk
в молчаливом режиме с выдачей сообщений
только при возникновении ошибок.
Не стоит сбрасывать со счетов и выполнение проверки таблиц при запуске
сервера. Например, всякий раз, когда во время обновления происходит
перезагрузка, необходима проверка всех таблиц, которые могли при этом пострадать
(назовем их "потенциально поврежденными таблицами"). В safe_mysqld
можно добавить тест, запускающий myisamchk
для проверки всех
таблиц, измененных за последние 24 часа, в случае, если после перезагрузки
остался старый файл .pid
(ID процесса) (mysqld
создает .pid
-файл во время запуска и удаляет его
при нормальном завершении; наличие .pid
-файла во
время запуска системы свидетельствует о том, что mysqld не завершился
нормально).
Можно сделать даже более надежный тест - выполнить проверку таблиц с более
поздней, чем у .pid
-файла, датой последней
модификации.
Таблицы также следует регулярно проверять в ходе нормального функционирования
системы. У себя в MySQL AB
мы запускаем задачи по cron
для проверки всех наших важных таблиц раз в неделю, используя следующую строку в
файле crontab
:
35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI
Такая команда отображает информацию о поврежденных таблицах, и мы при
надобности можем их исследовать и исправить.
Поскольку за последние пару лет у нас (на самом деле) не было неожиданно
поврежденных таблиц (таблиц, получивших повреждение по причинам, отличным от
неисправностей оборудования), то для нас проверки один раз в неделю более чем
достаточно.
Мы рекомендуем для начала выполнять myisamchk -s
еженощно на
всех таблицах, обновленных на протяжении последних 24 часов, пока вы не станете
доверять MySQL настолько, насколько доверяем мы.
Обычно в таком контроле над таблицами MySQL необходимости нет. При изменении
таблиц с динамическим размером строк (таблиц со столбцами типов VARCHAR
,
BLOB
или TEXT
) или при наличии таблиц с большим числом
удаленных строк может потребоваться время от времени (где-то раз в месяц)
дефрагментировать таблицы.
Это можно сделать, используя OPTIMIZE TABLE
на аналогичных
таблицах, или, если есть возможность приостановить mysqld
,
выполняя:
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM
myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI
Синтаксис BACKUP TABLE
BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory'
Копирует в каталог резервного копирования тот минимум табличных файлов,
который достаточен для восстановления таблицы, после сброса на диск всех
изменений. На данный момент работает только для таблиц MyISAM
. Для
таблиц MyISAM
копирует файлы .frm
(определений) и .MYD
(данных). Индексные файлы
могут быть реконструированы по этим двум.
В процессе резервного копирования будет установлена блокировка чтения
отдельно для каждой таблицы на время ее копирования. Если необходимо сделать
резервное копирование в виде мгновенного образа нескольких таблиц, необходимо
сначала запросить LOCK TABLES
установки блокировки чтения для
каждой таблицы в группе.
Синтаксис RESTORE TABLE
RESTORE TABLE tbl_name[,tbl_name...] FROM '/path/to/backup/directory'
Восстанавливает таблицу(ы) из резервной копии, созданной с помощью
BACKUP TABLE
. Существующие таблицы не перезаписываются: при попытке
восстановления поверх существующей таблицы будет выдана ошибка. Восстановление
занимает больше времени, нежели BACKUP
- из-за необходимости
повторного построения индекса. Чем больше в таблице будет ключей, тем больше
времени заберет реконструкция. Эта команда, так же как и BACKUP TABLE
,
в настоящее время работает только для таблиц MyISAM
.
Синтаксис CHECK TABLE
CHECK TABLE tbl_name[,tbl_name...] [option [option...]]
option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED
CHECK TABLE
работает только на таблицах MyISAM
и
InnoDB
. На таблицах типа MyISAM
команда эквивалентна
запуску на таблице myisamchk -m table_name
.
Если опция не указана, используется MEDIUM
.
Проверяет таблицу(ы) на наличие ошибок. Для таблиц MyISAM
обновляется статистика ключей.
колонтитулы в word 2007, 000000211111