Резервное копирование 22 ГБ базы данных MySQL ежедневно

28

Прямо сейчас я могу сделать резервную копию, используя mysqldump. Но мне нужно отключить веб-сервер, и резервное копирование занимает около 5 минут. Если я не отключаю веб-сервер, он работает вечно и никогда не завершается + веб-сайт становится недоступным во время резервного копирования.

Есть ли более быстрый / лучший способ сделать резервную копию моей 22 ГБ и растущей базы данных?

Все таблицы MyISAM.

Анон
источник
посмотрите на эту ссылку, это к подобному вопросу serverfault.com/questions/8044/backup-mysql-server
Чарльз Фэйга

Ответы:

28

Да.

Настройте репликацию на второй компьютер. Когда вам нужно сделать резервную копию, вы можете заблокировать дополнительный компьютер, выполнить mysqlhotcopy или mysqldump, а затем разблокировать его. Он догонит вашего мастера, и вам никогда не придется переводить мастера в автономный режим.

Вы можете даже сделать это на той же машине, если вы не против удвоить ввод-вывод при записи, но в идеале вы должны выполнять резервное копирование в реальном времени на второй физический сервер и делать резервные копии снимков так часто, как вам нужно. не мешая вашему производственному серверу.

Также теоретически возможно восстановить базу данных, используя известное состояние и binlogs. Я никогда не делал этого, поэтому, пожалуйста, сначала исследуйте, но вы можете сделать резервную копию известного состояния вашей базы данных, а затем просто сделать резервную копию всех новых binlogs и воспроизвести их, если вам когда-нибудь понадобится восстановление. Поскольку binlogs пишутся линейно, пересылка новых binlogs на удаленный компьютер будет очень быстрой.

Изменить: Действительно, похоже, что использование binlogs для резервного копирования задокументировано.

Этот вопрос тесно связан

Джон Даутат
источник
Да, это прекрасно работает и будет моим ответом. Единственным существенным недостатком является то, что вы должны убедиться, что репликация работает правильно на ежедневной основе. Мы делаем снимки нашей ведомой базы данных в рабочее время и выполняем ночное резервное копирование от мастера.
5

Простите за то, что я предполагаю, что ОС - это Linux. Если вы не используете LVM, вы должны быть. Если да, вот очень простой способ сделать резервные копии с помощью моментального снимка.

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

Это позволит вам создавать ночные резервные копии без необходимости добавления подчиненного сервера. Я очень поддерживаю наличие подчиненного сервера для высокой доступности, но я не хочу, чтобы вы думали, что застряли, пока не сможете создать этого ведомого.

Бруно Броноски
источник
2

FLUSH TABLES WITH READ LOCK - это не то, что вы хотите делать на регулярной (или даже полурегулярной) основе в производственной системе. Это должно быть только последнее средство.

Настройте как минимум двух подчиненных устройств репликации (это, конечно, потребует FLUSH TABLES WITH READ LOCK). После того, как они настроены, вы можете снять резервную копию с одного, пока другой синхронизируется как резервный мастер.

Кроме того, если один из ваших подчиненных выходит из строя, вы можете использовать снимок с него для восстановления второго (или третьего) подчиненного устройства. Если все ваши рабы терпят неудачу, вы возвращаетесь в FLUSH TABLES WITH READ LOCK.

Не забывайте всегда иметь процесс, который регулярно проверяет синхронизацию данных - для этого используйте что-то вроде mk-table-checkum (это нетривиально настроить, обратитесь к документации Maatkit за подробностями).

Поскольку 22 ГБ относительно невелики, у вас не возникнет проблем с этим. Выполнение этого с большой базой данных может быть более проблематичным.

MarkR
источник
1

Решение здесь двоякое, как описано выше:

  1. Настройте репликацию вашего сервера на подчиненное устройство, которое вы можете отключить. Лучший способ сделать это - получить дамп базы данных, используя mysqldump и параметр --master-data.
  2. Настроить ночные резервные копии на раб. Вы можете либо использовать mysqldump с флагами --master-data --flush-logs и --single-транзакции, либо остановить сервер mysql, скопировать файлы данных на диск и перезапустить его (репликация будет это прекратилось).
  3. Запускайте скрипт на ведомом устройстве каждые (например, 5, 10, 20 минут), чтобы проверить и убедиться, что mysql все еще реплицируется. Я написал для этого простой скрипт на python , который вы можете использовать.

Обратите внимание, что если вы используете InnoDB для своих таблиц, вы можете использовать флаг --single -action, чтобы избежать необходимости делать какие-либо блокировки таблиц и при этом получать согласованный дамп базы данных, даже на главном сервере, и, следовательно, выполнять резервное копирование без снятия сервера. Вышеупомянутое решение, однако, является лучшим.

Кроме того, если вы используете LVM в Linux, вы можете сделать снимок LVM раздела, а затем создать резервную копию. Снимки LVM являются атомарными, поэтому, если вы выполните «очистку таблиц с помощью блокировки чтения», а затем сделаете снимок и разблокируете его, вы получите согласованный снимок.

Если вас беспокоит конфликт ввода-вывода, из-за которого дамп занимает слишком много времени, вы можете добавить третью машину и запустить на ней mysqldump по сети, чтобы избежать перегрузки дисков.

Дэн Удей
источник
0

В зависимости от вашей среды, снимки обычно являются отличным способом. Особенно, если вам нужно сделать резервную копию мастера по какой-то причине. Мы запускаем пары master и slave и используем резервные копии снимков на обоих.

  1. FLUSH TABLES WITH READ LOCK;
  2. Вытащите снимок из базы данных и зарегистрируйте файловые системы.
  3. UNLOCK TABLES;
  4. Скопируйте файлы данных со снимка на досуге.

С таблицами InnoDB вы захотите запустить их SET AUTOCOMMIT=0;перед тем, как выполнить блокировку чтения.

jasonjwwilliams
источник
-1

Вы могли бы сделать постепенное резервное копирование. Резервное копирование 1/24 записи каждый час. Единственная проблема с этим подходом заключается в том, что если он потерпит крах в течение первых нескольких часов дня, вы потеряете что-либо с этого времени до момента сбоя. В любом случае, потеря записей занимает менее 24 часов (я не знаю, насколько это важно для вас).

musicfreak
источник