2

У меня есть база данных MySQL на сервере под управлением Windows 7, и я хочу создать быстрый (но безопасный!) копировать, не выключая ничего. Я выдаю FLUSH TABLES READ LOCK, запускаю Robocopy, затем выхожу UNLOCK TABLES. Вот проблема: если я использую параметр /B для Robocopy, он печатает много сообщений, говорящих «Процесс не может получить доступ к файлу, потому что он используется другим процессом.», И копирует только 209 из 535 файлов в данных MySql каталог. Если я опускаю опцию /B, Robocopy сообщает, что все файлы скопированы. Но сейчас я не уверен. Я предполагаю, что MySQL оставляет файлы таблиц открытыми, даже когда все заблокировано, и Robocopy /B решает, что их резервное копирование будет небезопасным. Без /B Robocopy делает все возможное, что должно сработать, потому что MySQL не выполняет никаких операций ввода-вывода, но я бы хотел узнать мнение кого-то более мудрого, чем я. Спасибо!

1 ответ1

4

MyISAM

Если у вас есть база данных all-MyISAM, это может сработать, поскольку во всех таблицах MyISAM в заголовках будет 0 счетчиков файлов.

InnoDB

Если у вас есть какие-либо таблицы InnoDB, FLUSH TABLES WITH READ LOCK; может не обеспечить надлежащую изоляцию для целостности данных. Я писал об этом в StackExchange DBA еще в ноябре 2012 года (Как запустить холодное резервное копирование с Linux/tar без выключения ведомого MySQL?)

Учитывая архитектуру InnoDB (Фото сделано техническим директором Percona Вадимом Ткеченко)

InnoDB Сантехника

есть четыре объекта, которые все еще движутся после FLUSH TABLES WITH READ LOCK; выпущен:

  • Двойной буфер записи
  • Вставить буфер
  • Redo Logs
  • Отменить Журналы

Предположим, вы запускаете FLUSH TABLES WITH READ LOCK; и Robocopy, копирование занимает 5 минут, это означает, что любые физические изменения, которые делаются в течение 5 минут, не будут присутствовать в резервной копии. Что еще хуже, изменения файла не будут происходить с одного момента времени. Это означает, что могут быть некоторые файлы .ibd которые могут измениться или не измениться, но транзакция, содержащая ее изменения, не была полностью зафиксирована.

Вам нужно будет скопировать эти данные на другой компьютер, запустить MySQL и посмотреть, сделает ли восстановление после сбоя (которое происходит во время запуска mysqld, чтения и обработки этих четырех объектов) стабильность данных и их использование.

Вам лучше использовать mysqldump с опцией --single-transaction .

Для некоторых идей, см. Мои старые сообщения DBA StackExchange

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .