Как сделать копию базы данных

Резервное копирование данных в MySQL

1. Копирование файлов базы

Базу данных MySQL можно скопировать, если временно выключить MySQL-сервер и просто скопировать файлы из папки /var/lib/mysql/db/. Если сервер не выключить, по очевидным причинам вероятна потеря и порча данных. Для больших нагруженных баз эта вероятность близка к 100%. Кроме того, при первом запуске с «грязной» копией базы данных MySQL-сервер начнет процесс проверки всей базы, который может затянуться на часы.

В большинстве «живых» проектов регулярное выключение сервера БД на длительное время неприемлемо. Для решения этой проблемы применяется трюк, основанный на снэпшотах файловой системы. Снэпшот — это что-то вроде «фотографии» файловой системы на определенный момент времени, сделанный без реального копирования данных (и потому быстро). Аналогичным образом работает «ленивое копирование» объектов во многих современных языках программирования.
Общая схема действий такова: блокируются все таблицы, сбрасывается файловый кэш БД, делается снэпшот файловой системы, разблокируются таблицы. После этого файлы спокойно копируются из снэпшота, после чего он уничтожается. «Блокирующая» часть такого процесса занимает время порядка секунд, что уже терпимо. В качестве расплаты на какое-то время, пока «жив» снэпшот, снижается производительность файловых операций, что в первую очередь бьет по скорости операций записи в базу.

Некоторые файловые системы, например, ZFS, поддерживают снятие снэпшотов нативно. Если вы не пользуетесь ZFS, но на вашем сервере стоит менеджер томов LVM, вы также сможете скопировать базу MySQL через снэпшот. Наконец, под *nix можно воспользоваться драйвером снэпшотов R1Soft Hot Copy, но этот способ не заработает в контейнере openvz (процесс бэкапа MySQL описан здесь).

Для баз MyISAM существует официальная бесплатная утилита mysqlhotcopy, которая «правильно» копирует файлы баз MyISAM без остановки сервера. Существует аналогичная утилита для InnoDB, но она платная, хотя и возможностей в ней больше.

Копирование файлов — самый быстрый способ перебросить базу данных целиком с одного сервера на другой.

2. Копирование через текстовые файлы

Для того, чтобы считать в бэкап данные из production-базы, необязательно дергать файлы. Можно выбрать данные запросом и сохранить их в текстовый файл. Для этого используется SQL-команда SELECT INTO OUTFILE и парная ей LOAD DATA INFILE. Выгрузка производится построчно (можно отобрать для сохранения только нужные строки, как в обычном SELECT). Структура таблиц нигде не указывается — об этом должен заботиться программист. Он также должен позаботиться о включении команд SELECT INTO OUTFILE в транзакцию, если это необходимо для обеспечения целостности данных. На практике SELECT INTO OUTFILE используется для частичного бэкапа очень больших таблиц, которые нельзя скопировать никаким другим образом.

В большинстве случаев намного более удобна созданная Игорем Романенко утилита mysqldump. Утилита mysqldump формирует файл, содержащий все SQL-команды, необходимые для полного восстановления БД на другом сервере. Отдельными опциями можно добиться совместимости этого файла с практически любой СУБД (не только MySQL), кроме того, существует возможность выгрузки данных в форматах CSV и XML. Для восстановления данных из таких форматов существует утилита mysqlimport.

Утилита mysqldump консольная. Существуют её надстройки и аналоги, позволяющие управлять бэкапом через веб-интерфейс, например, украинская тулза Sypex Dumper (их представитель zapimir есть на хабре).

Недостатки универсальных утилит бэкапа в текстовые файлы — это относительно невысокая скорость работы и отсутствие возможности делать инкрементные бэкапы.

3. Инкрементные бэкапы

Традиционно рекомендуют держать 10 бэкапов: по одному на каждый день недели, а также бэкапы двухнедельной, месячной и квартальной давности — это позволит достаточно глубоко откатиться в случае порчи каких-либо данных.
Храниться бэкапы должны точно не на том же диске, что и живая база, и не на том же сервере. На случай пожаров и прочих катаклизмов лучше всего арендовать пару юнитов в соседнем дата-центре.

Эти требования могут стать проблемой для больших баз. Прокачка бэкапа 100-гигабайтной базы по 100-мбитной сети займет часа три, на которые полностью забьет канал.
Частично решить эту проблему позволяют инкрементные бэкапы, когда полный бэкап делается, скажем, только по воскресеньям, а в остальные дни пишутся только данные, добавленные или измененные за прошедшие сутки. Сложность в том, как выявить эти самые «данные, изменившиеся за сутки».

Здесь практически вне конкуренции система Percona XtraBackup, которая содержит модифицированный движок InnoDB, анализирует двоичные логи MySQL и вытаскивает из них необходимую информацию. Почти такими же возможностями обладает платная InnoDB Hot Backup, упомянутая выше.

Общая проблема с любыми бэкапами в том, что они всегда отстают. В случае фатального сбоя основного сервера восстановить систему можно будет только с некоторым «откатом» по времени, что очень и очень разочарует её пользователей. Если в системе так или иначе были затронуты финансовые потоки, подобный «откат» может в прямом смысле влететь в копеечку.

4. Репликация

Избежать откатов призвана система репликации MySQL. Идея репликации основана на том, что кроме «главного» сервера («Мастера») постоянно работают ведомые сервера MySQL («слейвы»), которые получают инкрементные бэкапы с мастера в режиме реального времени. Таким образом, время отката уменьшается почти до сетевого лага. В случае краха Мастера можно оперативно назначить «новым Мастером» один из слейвов и перенаправить клиентов на него. Кроме того, слейвы могут обрабатывать запросы на чтение данных (SELECT-ы); это можно использовать для выполнения каких-то расчетов или снижения нагрузки на мастера. MySQL поддерживает репликацию «из коробки», процесс настройки репликации в MySQL хорошо описан юзером whisk. Существует возможность запуска конфигураций Master-Master, а с помощью внешних аппаратно-программных систем — и балансировки нагрузки между мастерами. Только не нужно забывать про ограничения, накладываемые CAP-теоремой.

Репликация — это очень здорово, только использовать её нужно по назначению. Реплика — это полная копия базы, но это не резервная копия! Очевидно же, что если на мастере выполнить DROP TABLE или UPDATE users SET password=«Haha!», изменения будут тут же скопированы на слейв, и откатить их назад станет невозможно.

Репликацию можно совместить с бэкапом на уровне файлов базы, останавливая слейв, а не мастера.

Источник

Путеводитель по резервному копированию баз данных

– О, никакое убежище не выдержит попадания метеорита. Но ведь у вас, как и у каждого, есть резерв, так что можете не беспокоиться.

Станислав Лем, «Звёздные дневники Ийона Тихого»

Резервным копированием называется сохранение копии данных где-то вне основного места их хранения.

Как сделать копию базы данных

Главное назначение резервного копирования – восстановление данных после их потери. В связи с этим нередко приходится слышать, что при наличии реплики базы данных с неё всегда можно восстановить данные, и резервное копирование не нужно. На самом деле резервное копирование позволяет решить как минимум три задачи, которые не могут быть решены при помощи реплики, да и реплику без резервной копии не инициализировать.

Во-первых, резервная копия позволяет восстановить данные после логической ошибки. Например, бухгалтер удалил группу проводок или администратор БД уничтожил табличное пространство. Обе операции абсолютно легитимны с точки зрения базы данных, и процесс репликации воспроизведёт их в базе-реплике.

Во-вторых, современные СУБД – весьма надёжные программные комплексы, однако изредка всё же происходит повреждение внутренних структур базы данных, после которого доступ к данным пропадает. Что особенно обидно, такое нарушение происходит обычно при высокой нагрузке или при установке какого-нибудь обновления. Но как высокая нагрузка, так и регулярные обновления говорят о том, что база данных – отнюдь не тестовая, и данные, хранящиеся в ней, ценны.

Наконец, третья задача, решение которой требует наличия резервной копии, – это клонирование базы, например, для целей тестирования.

Резервное копирование баз данных так или иначе базируется на одном из двух принципов:

Выгрузка данных

В наборе утилит, прилагающихся к любой СУБД, обязательно есть инструменты для выгрузки и загрузки данных. Данные сохраняются либо в текстовом формате, либо в двоичном формате, специфичном для конкретной СУБД. В таблице ниже приведён список таких инструментов:

Двоичный форматТекстовый формат
OracleDataPump Export/DataPump Import
Export/Import
SQL*Plus/SQL*Loader
PostgreSQLpg_dump, pg_dumpall/pg_restorepg_dump, pg_dumpall/psql
Microsoft SQL Serverbcpbcp
DB2unload/loadunload/load
MySQLmysqldump, mysqlpump/mysql, mysqlimport
MongoDBmongodump/mongorestoremongoexport/mongoimport
Cassandranodetool snapshot/sstableloadercqlsh

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

Несмотря на простоту и очевидность идеи выгрузки данных, для резервирования нагруженных промышленных баз такой метод применяют редко. Вот причины, по которым выгрузка не подходит для полноценного резервного копирования:

Самым же распространённым методом резервного копирования баз данных является копирование файлов базы.

«Холодное» сохранение файлов БД

Очевидная идея – остановить базу данных и скопировать все её файлы. Такая резервная копия называется «холодной». Способ крайне надёжный и простой, но у него есть два очевидных недостатка:

«Горячее» сохранение файлов

Большинство резервных копий современных баз данных выполняется путём копирования файлов базы данных без остановки базы. Здесь видны несколько проблем:

Вот как выглядит подготовка к резервному копированию в СУБД с изменяемыми дисковыми структурами, т. е. во всех традиционных дисковых реляционных системах:

По окончании резервного копирования нужно перевести базу данных обратно в обычное состояние. В Oracle это делается командой ALTER DATABASE/TABLESPACE END BACKUP, в PostgreSQL – вызовом функции pg_stop_backup(), а в других базах – внутренними подпрограммами соответствующих команд или внешних сервисов.

Вот как выглядит временнáя диаграмма процесса резервного копирования:

Как сделать копию базы данных

Восстановление на точку

Резервная копия позволяет восстановить состояние базы данных на момент, когда завершилась команда возврата из режима резервного копирования. Однако авария, после которой потребуется восстановление, может произойти в любой момент. Задача восстановления состояния БД на произвольный момент называется «восстановлением на точку» (point-in-time recovery).

Чтобы обеспечить такую возможность, следует сохранять журналы БД начиная с момента окончания резервного копирования, а в процессе восстановления продолжить применять журналы к восстановленной копии. После того, как БД восстановлена из резервной копии на момент окончания копирования, состояние базы (файлов и кэшированных страниц) гарантированно корректно, поэтому особый режим журналирования не нужен. Применяя журналы до нужного момента, можно получить состояние базы данных на любую точку во времени.

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

Инкрементальное резервное копирование

Чтобы ускорить восстановление на точку, хотелось бы иметь возможность выполнять резервное копирование как можно чаще, но при этом не занимать лишнего места на дисках и не нагружать базу задачами резервного копирования.

Решение задачи – инкрементальное резервное копирование, то есть копирование только тех страниц данных, которые изменились с момента предыдущего резервного копирования.
Инкрементальное резервное копирование имеет смысл только для СУБД, использующих изменяемые структуры данных.

Инкремент может отсчитываться как от полной резервной копии (кумулятивная копия), так и от любой предыдущей копии (дифференциальная копия).

Как сделать копию базы данных

К сожалению, единой терминологии не существует, и разные производители используют разные термины:

ДифференциальнаяКумулятивная
OracleDifferentialCumulative
PostgresProIncremental
Microsoft SQL ServerDifferential
IBM DB2DeltaIncremental
MySQL EnterpriseIncrementalDifferential
Percona ServerIncremental

При наличии инкрементальных копий процесс восстановления на точку выглядит следующим образом:

Есть три способа создания инкрементальной копии:

Второй и третий способ отличаются механизмом определения списка изменённых страниц. Разбор журналов более ресурсоёмкий, плюс для его реализации необходимо знать структуру журнальных файлов. Спросить у самой базы, какие именно страницы изменились, проще всего, но для этого ядро СУБД должно иметь функциональность отслеживания изменённых блоков (block change tracking).

Впервые функциональность инкрементального резервного копирования была создана в ПО Oracle Recovery Manager (RMAN), появившемся в релизе Oracle 8i. Oracle сразу реализовал отслеживание изменённых блоков, поэтому необходимости в разборе журналов нет.

PostgreSQL не отслеживает изменённые блоки, поэтому утилита pg_probackup, разработанная российской компанией Postgres Professional, определяет изменённые страница путём анализа журнала. Однако компания поставляет и СУБД PostgresPro, которая включает расширение ptrack, отслеживающее изменение страниц. При использовании pg_probackup с СУБД PostgresPro утилита запрашивает изменённые страницы у самой базы – точно так же, как и RMAN.

Microsoft SQL Server так же, как и Oracle, отслеживает изменённые страницы, но команда BACKUP позволяет делать только полные и кумулятивные резервные копии.

В DB2 есть возможность отслеживания измененных страниц, но по умолчанию она выключена. После включения DB2 позволит делать полные, дифференциальные и кумулятивные резервные копии.

Важное отличие описанных в этом разделе средств (кроме pg_probackup) от файловых средств резервного копирования в том, что они запрашивают образы страниц у базы данных, а не читают данные с диска самостоятельно. Недостаток такого подхода – небольшая дополнительная нагрузка на базу. Однако этот недостаток с лихвой компенсируется тем, что прочитанная страница всегда корректна, поэтому нет необходимости во включении на время резервного копирования особого режима журналирования.

Ещё раз обратите внимание, что наличие инкрементальных копий не отменяет требований к наличию журналов для восстановления на произвольную точку во времени. Поэтому в промышленных базах данных журналы постоянно переписываются на внешний носитель, а резервные копии, полные и/или инкрементальные, создаются по расписанию.

Наилучшей на сегодня реализацией идеи инкрементального резервного копирования является программно-аппаратный комплекс (в терминологии Oracle – engineered system) Zero Data Loss Recovery Appliance – специализированное решение Oracle для резервного копирования собственной БД. Комплекс представляет собой кластер серверов с большим объёмом дисков, на которые установлена модифицированная версия ПО Recovery Manager и может работать как с другими программно-аппаратными комплексами Oracle (Database Appliance, Exadata, SPARC Supercluster), так и с базами Oracle на традиционной инфраструктуре. В отличие от «обычного» RMAN, в ZDLRA реализована концепция «вечного инкремента» (incremental forever). Система единственный раз создаёт полную копию базы данных, а потом делает только инкрементальные копии. Дополнительные модули RMAN позволяют объединять копии, создавая новые полные копии из инкрементальных.

К чести российских разработчиков нужно заметить, что и pg_probackup умеет объединять инкрементальные копии.

Как сделать копию базы данных

В отличие от многих похожих вопросов, вопрос «какой метод резервного копирования лучше» имеет однозначный ответ – лучше всего родная для используемой СУБД утилита, обеспечивающая возможность инкрементального копирования.

Для администратора БД гораздо более важными являются вопросы выбора стратегии резервного копирования и интеграция средств резервирования баз данных в корпоративную инфраструктуру. Но эти вопросы выходят за рамки данной статьи.

Источник

Копирование баз данных путем создания и восстановления резервных копий Copy Databases with Backup and Restore

SQL Server 2016 использует путь по умолчанию, отличный от пути, использованного в предыдущих версиях. SQL Server 2016 uses a different default path than earlier versions. Поэтому для восстановления резервной копии базы данных, созданной в месте расположения по умолчанию для ранних версий, необходимо использовать параметр MOVE. Therefore, to restore backups of a database created in the default location of earlier versions you must use the MOVE option. Сведения о новом пути по умолчанию см. в разделе Расположение файлов для экземпляра по умолчанию и именованных экземпляров SQL Server. For information about the new default path see File Locations for Default and Named Instances of SQL Server. Дополнительные сведения о перемещении файлов баз данных см. в статье «Перемещение файлов баз данных» далее в этом подразделе. For more information about moving database files, see «Moving the Database Files,» later in this topic.

Основные этапы копирования базы данных, используя функции резервного копирования и восстановления General steps for using Backup and Restore to copy a database

При использовании резервного копирования и восстановления для копирования базы данных на другой экземпляр SQL Server компьютер-источник и целевой компьютер могут быть любой платформой, на которой запускается SQL Server. When you use backup and restore to copy a database to another instance of SQL Server, the source and destination computers can be any platform on which SQL Server runs.

Основные этапы. The general steps are:

Восстановите резервную копию базы данных- источника на целевом компьютере. Restore the backup of the source database on the destination computer. При восстановлении базы данных автоматически создаются все ее файлы. Restoring the database automatically creates all of the database files.

Рассматриваются дополнительные вопросы, которые могут повлиять на процесс. Some additional considerations that may affect this process:

Перед восстановлением файлов базы данных Before You restore database files

При восстановлении базы данных необходимые файлы базы данных создаются автоматически. Restoring a database automatically creates the database files needed by the restoring database. По умолчанию у файлов, созданных SQL Server в процессе восстановления, те же имена и пути, что и у файлов резервной копии исходной базы данных на компьютере-источнике. By default, the files created by SQL Server during the restoration process use the same names and paths as the backup files from the original database on the source computer.

Также при восстановлении базы данных, если это необходимо, можно указать сопоставление дисков, имена файлов или путь для восстановления. Optionally, when restoring the database, you can specify the device mapping, file names, or path for the restoring database.

Это может быть необходимо в следующих ситуациях. This might be necessary in the following situations:

Нужная структура каталогов или сопоставление дисков, используемые на исходном компьютере, могут отсутствовать на другом компьютере. The directory structure or drive mapping used by the database on the original computer not exist on the other computer. Например, возможно, резервная копия содержит файл, который нужно восстановить на диск E, но на целевом компьютере диска E — нет. For example, perhaps the backup contains a file that would be restored to drive E by default, but the destination computer lacks a drive E.

на целевом диске может быть недостаточно свободного места; The target location might have insufficient space.

Если используется имя базы данных, которое уже существует на целевом сервере восстановления, а имя каждого из ее файлов совпадает с именем файла базы данных в резервном наборе данных, происходит одно из следующих действий. You are reusing a database name that exists on the restore destination and any of its files is named the same as a database file in the backup set, one of the following occurs:

Если существующий файл базы данных может быть перезаписан, он будет перезаписан (это не затронет файл, относящийся к базе данных с другим именем). If the existing database file can be overwritten, it will be overwritten (this would not affect a file that belongs to a different database name).

Если существующий файл не может быть перезаписан, возникнет ошибка восстановления. If the existing file cannot be overwritten, a restore error would occur.

Перемещение файлов баз данных Moving the database files

Если файлы резервной копии базы данных невозможно восстановить на целевом компьютере, необходимо переместить файлы в новое место назначения, где они могут быть восстановлены. If the files within the database backup cannot be restored onto the destination computer, it is necessary to move the files to a new location while they are being restored. Пример: For example:

Нужно восстановить базу данных из резервных копий, созданных в месте расположения по умолчанию для предыдущей версии. You want to restore a database from backups created in the default location of the earlier version.

Может оказаться необходимым восстановить некоторые файлы базы данных из резервной копии на другой диск из-за нехватки места на диске по умолчанию. It may be necessary to restore some of the database files in the backup to a different drive because of capacity considerations. Такое случается довольно часто, потому что у большинства компьютеров в организациях разное число и параметры дисковых накопителей и различные конфигурации программного обеспечения. This is a common occurrence because most computers within an organization do not have the same number and size of disk drives or identical software configurations.

Может оказаться необходимым создать копию существующей базы данных на том же компьютере для тестирования. It may be necessary to create a copy of an existing database on the same computer for testing purposes. В этом случае файлы базы данных для исходной базы данных уже существуют, и когда во время операции восстановления создается копия базы данных, должны быть указаны другие имена файлов. In this case, the database files for the original database already exist, so different file names must be specified when the database copy is created during the restore operation.

Дополнительные сведения см. в подразделе «Восстановление файлов и файловых групп в новое место назначения» далее в этом разделе. For more information, see «To restore files and filegroups to a new location,» later in this topic.

Изменение имени базы данных Changing the database name

Имя базы данных, явно задаваемое при ее восстановлении, автоматически используется в качестве нового имени базы данных. The database name explicitly supplied when you restore a database is used automatically as the new database name. Так как такой базы данных еще не существует, новая база данных создается из файлов резервной копии. Because the database name does not already exist, a new one is created by using the files in the backup.

Обновление базы данных с помощью восстановления When upgrading a database by using Restore

При восстановлении резервных копий из предыдущей версии желательно заранее знать, существует ли на целевом компьютере путь (диск и каталог) для каждого полнотекстового каталога резервной копии. When restoring backups from an earlier version, it is helpful to know in advance whether the path (drive and directory) of each of the full-text catalogs in a backup exists on the destination computer. Чтобы получить список всех логических и физических имен — пути и имени файла — всех файлов резервной копии, включая файлы каталогов, выполните инструкцию RESTORE FILELISTONLY FROM To list the logical names and physical names, path and file name) of every file in a backup, including the catalog files, use a RESTORE FILELISTONLY FROM statement. Дополнительные сведения см. в разделе Инструкция RESTORE FILELISTONLY (Transact-SQL). For more information, see RESTORE FILELISTONLY (Transact-SQL).

Если нужный путь на целевом компьютере не существует, есть два варианта. If the same path does not exist on the destination computer, you have two alternatives:

Создать нужное сопоставление дисков или структуру каталогов на целевом компьютере. Create the equivalent drive/directory mapping on the destination computer.

Переместить файлы каталогов на новое место назначения во время операции восстановления с помощью предложения WITH MOVE инструкции RESTORE DATABASE. Move the catalog files to a new location during the restore operation, by using the WITH MOVE clause in your RESTORE DATABASE statement. Дополнительные сведения см. в разделе RESTORE (Transact-SQL)невозможно. For more information, see RESTORE (Transact-SQL).

Дополнительные сведения об альтернативных параметров обновления полнотекстовых индексов см. в разделе Обновление полнотекстового поиска. For information about alternative options for upgrading full-text indexes, see Upgrade Full-Text Search.

Владелец базы данных Database ownership

При восстановлении базы данных на другом компьютере имя входа пользователя SQL Server SQL Server или Microsoft Microsoft Windows, начавшего процесс восстановления, автоматически становится именем владельца базы данных. When a database is restored on another computer, the SQL Server SQL Server login or Microsoft Microsoft Windows user who initiates the restore operation becomes the owner of the new database automatically. При восстановлении базы данных системный администратор или владелец новой базы данных могут сменить ее владельца. When the database is restored, the system administrator or the new database owner can change database ownership. Для предотвращения несанкционированного восстановления базы данных устанавливайте пароли на носители или сами резервные копии. To prevent unauthorized restoration of a database, use media or backup set passwords.

Управление метаданными при восстановлении базы данных на другой экземпляр сервера Managing metadata when restoring to another server instance

Чтобы обеспечить целостность работы пользователей и приложений при восстановлении базы данных на другой экземпляр сервера, на новом экземпляре необходимо повторно создать некоторые или все метаданные, например имена входа и задания. When you restore a database onto another server instance, to provide a consistent experience to users and applications, you might have to re-create some or all of the metadata for the database, such as logins and jobs, on the other server instance. Дополнительные сведения см. в статье Управление метаданными при обеспечении доступности базы данных на другом экземпляре сервера (SQL Server). For more information, see Manage Metadata When Making a Database Available on Another Server Instance (SQL Server).

Просмотр файлов данных и журналов в резервном наборе данных View the data and log files in a backup set

Восстановление файлов и файловых групп в новом расположении Restore files and filegroups to a new location

Восстановление файлов и файловых групп поверх существующих файлов Restore files and filegroups over existing files

Восстановление базы данных с новым именем Restore a database with a new name

Перезапуск прерванной операции восстановления Restart an interrupted restore operation

Изменение владельца базы данных Change database owner

Копирование базы данных с помощью управляющих объектов SQL Server (SMO) Copy a database by using SQL Server Management Objects (SMO)

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *