Для InnoDB оптимальное решение без репликации выглядит так:
mysqldump mydbname --result-file=mydbname.sql --verbose --single-transaction
Это использует функцию моментального снимка транзакции InnoDB и позволяет нормальные (запись!) Операции с базами данных без прерываний вообще. С --master-data=1
вы даже сможете автоматически записывать двоичную позицию журнала снимка. Тем не менее, положение двоичного журнала кажется бесполезным, если делать это отдельно для нескольких баз данных на одном сервере.
Недостатком является то, что это не работает должным образом, когда у вас есть некоторые таблицы MyISAM. Я сам использую полнотекстовое индексирование MySQL, которое требует неразделенных таблиц MyISAM. Однако можно расположить вещи таким образом, чтобы таблицы MyISAM были только вторичными наборами данных, в которые сбрасываются тексты, уже существующие в таблицах InnoDB, так что таблицы MyISAM могут быть перестроены с нуля при необходимости. У меня есть скрипт, который проверяет типы таблиц баз данных и использует --single-transaction
вместо --lock-tables
всякий раз, когда внутри одной БД есть только таблицы InnoDB.
Другим решением будет использование некоторой функции моментального снимка диска или файловой системы, например LVM. Но это было бы весьма существенным ударом по производительности при записи, когда существуют моментальные снимки из-за чрезвычайно тупого механизма резервного копирования при записи LVM (который ошибочно называют COW, что не является здравым смыслом). Поэтому довольно хорошим решением, похоже, является MySQL на Solaris ZFS или на FreeBSD UFS. Оба поддерживают эффективные снимки и являются относительно стабильными из-за их возраста. Btrfs также имеет эффективные снимки, но все еще БЕТА.