У меня есть база данных MySQL на сервере под управлением Windows 7, и я хочу создать быстрый (но безопасный!) копировать, не выключая ничего. Я выдаю FLUSH TABLES READ LOCK, запускаю Robocopy, затем выхожу UNLOCK TABLES. Вот проблема: если я использую параметр /B для Robocopy, он печатает много сообщений, говорящих «Процесс не может получить доступ к файлу, потому что он используется другим процессом.», И копирует только 209 из 535 файлов в данных MySql каталог. Если я опускаю опцию /B, Robocopy сообщает, что все файлы скопированы. Но сейчас я не уверен. Я предполагаю, что MySQL оставляет файлы таблиц открытыми, даже когда все заблокировано, и Robocopy /B решает, что их резервное копирование будет небезопасным. Без /B Robocopy делает все возможное, что должно сработать, потому что MySQL не выполняет никаких операций ввода-вывода, но я бы хотел узнать мнение кого-то более мудрого, чем я. Спасибо!
1 ответ
MyISAM
Если у вас есть база данных all-MyISAM, это может сработать, поскольку во всех таблицах MyISAM в заголовках будет 0 счетчиков файлов.
InnoDB
Если у вас есть какие-либо таблицы InnoDB, FLUSH TABLES WITH READ LOCK;
может не обеспечить надлежащую изоляцию для целостности данных. Я писал об этом в StackExchange DBA еще в ноябре 2012 года (Как запустить холодное резервное копирование с Linux/tar без выключения ведомого MySQL?)
Учитывая архитектуру InnoDB (Фото сделано техническим директором Percona Вадимом Ткеченко)
есть четыре объекта, которые все еще движутся после FLUSH TABLES WITH READ LOCK;
выпущен:
- Двойной буфер записи
- Вставить буфер
- Redo Logs
- Отменить Журналы
Предположим, вы запускаете FLUSH TABLES WITH READ LOCK;
и Robocopy, копирование занимает 5 минут, это означает, что любые физические изменения, которые делаются в течение 5 минут, не будут присутствовать в резервной копии. Что еще хуже, изменения файла не будут происходить с одного момента времени. Это означает, что могут быть некоторые файлы .ibd
которые могут измениться или не измениться, но транзакция, содержащая ее изменения, не была полностью зафиксирована.
Вам нужно будет скопировать эти данные на другой компьютер, запустить MySQL и посмотреть, сделает ли восстановление после сбоя (которое происходит во время запуска mysqld, чтения и обработки этих четырех объектов) стабильность данных и их использование.
Вам лучше использовать mysqldump
с опцией --single-transaction
.
Для некоторых идей, см. Мои старые сообщения DBA StackExchange
Apr 17, 2011
: Как я могу оптимизировать mysqldump большой базы данных?Mar 14, 2014
: mysqldump с автоматически сгенерированным именем экспорта