Сегодня надо было перенести огромный сайт. Там не тысячи, а десятки тысяч таблиц. При mysqldump вылезает ошибка вида: «mysqldump: Got error: 1146: "Table doesn't exist" when using LOCK TABLES» или «mysqldump: Got error: 29: "File 'table.MYD' not found (Errcode: 23 "Too many open files in system")" when using LOCK TABLES». Перемещаю я его уже второй раз, так что ошибка мне знакома. Приступим!
На самом деле интернет прямо-таки пестрит сообщениями, что эта ошибка означает нарушение связности InnoDB. Возможно, это так. Но я ещё не видел нарушения связности, выглядящего таким образом :). Да и сообщение про Too many open files in system однозначно говорит о том, что база данных разрослась (жаль только, это сообщение выскакивает гораздо реже). Есть на самом деле 2 метода решения проблемы.
Первый — простой — увеличить количество открытых файлов. Откройте файл /etc/security/limits.conf, поставьте что-то вроде "* hard nofile 8192" и этого должно хватить для большинства пользователей. Хватило и мне в первый переезд сервера. Целостность данных в порядке, а вот работа сайта может на некоторое время прерываться, если вы попытаетесь начать записывать в таблицу, которая сейчас архивируется. Идеальным будет перевести сайт в режим "только для чтения".
Второй — ещё более простой. Всё делается очень просто: архивируются файлы, создаются неработоспособные бэкапы, портится структура БД, всё это делается очень просто. Работоспособность сайта при этом не страдает, опять же! "Что это за способ?", — спросите вы. Спрашивали — отвечаю: это mysqldump --skip-lock-tables.
Способ реально очень простой, но вы реально можете испортить себе жизнь в будущем. Перевод сайта в режим "только для чтения" строго обязателен, если вы не хотите получить неработоспособную резервную копию. Возможно, лучше даже повесить статичную страницу-заглушку с информацией о том, что ведутся технические работы и сайт недоступен.