Вместо использования 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, и точно так же вы можете восстановить базу данных.