Оглавление
- Что такое теневое копирование
- Зачем теневое копирование в обновляторе
- И всё-таки насколько безопасно делать теневые копии баз 1с
- Как включить теневое копирование в обновляторе
- Есть ли какие-то ограничения для работы теневых копий в обновляторе
- Решение проблем при создании теневых копий
- Технические подробности реализации теневых копий в обновляторе
Что такое теневое копирование
Это технология операционной системы, которая позволяет копировать файлы, которые в данный момент заблокированы другими приложениями или даже самой операционной системой.
Обновлятор поддерживает создание теневых копий для всех версий Windows начиная с XP и Server 2003.
Теневое копирование позволяет нам в любой момент создать моментальный снимок диска и такая копия будет согласованной на уровне файловой системы.
Что значит согласованной? Это значит, что такая копия будет на самом деле моментальной. То есть не получится ситуации, что, пока мы копируем одну часть данных, успевает измениться другая часть данных.
Для тех, кто владеет техническим английским хотя бы на минимальном уровне я очень советую вот эту статью с замечательными картинками и лаконичными пояснениями: ссылка.
Пример #1
Алгоритм (очень упрощенно) такой:
- Мы просим операционную систему (а вернее её службу "Теневое копирование тома" VSS) создать теневую копию диска;
- Система делает у себя в базе данных пометку о том, что с этого момента создана теневая копия диска;
- Теперь (пока существует теневая копия диска) перед тем как вносить изменения на диск (теневая копия которого создана) система записывает то, как было до изменений в свою базу данных.
- И когда затем мы запрашиваем данные теневой копии (например, копируем файлы в архив) система возвращает нам первоначальные данные без последовавших изменений.
Получается, что создание теневой копии нам почти ничего не стоит. И пока существует теневая копия в ней на самом деле накапливаются только последующие изменения, а не весь диск, как можно было подумать.
Пример #2
Давайте ещё один ещё более упрощенный пример. Предположим, что у нас на диске только один единственный файл Hello.txt и в нём содержится текст "Вова":
- Мы просим систему создать теневую копию этого диска;
- Система делает у себя пометку, что с этого момента создана теневая копия диска;
- Какая-то программа хочет внести изменения в файл Hello.txt записав туда новый текст "Алёна".
- Операционная система перед тем как изменить файл Hello.txt на новый копирует этот файл (с старым содержимым) в свою теневую копию (реально копирует).
- После этого файл меняется, теперь в нём содержится "Алёна". И с этого момента у нас есть 2 копии файла - один на диске (с текстом "Алёна"), другой в базе данных менеджера теневых копий (с текстом "Вова");
- Затем мы в своей программе архивации запрашиваем содержимое этого файла из теневой копии;
- Система видит, что этот файл изменялся и возвращает нам не файл с диска, а файл из своей базы данных (со старым текстом "Вова");
- Если бы этот файл не был изменен после создания теневой копии, то система вернула бы нам его прямо с диска.
Только надо понимать, что теневое копирование работает на более низком уровне, чем файлы (на уровне блоков файловой системы).
Writers (писатели)
Обсуждая создание теневых копий в контексте баз данных 1с мы не можем обойти стороной такой компонент системы теневого копирование как Writers (будем использовать в статье англоязычный термин).
Когда мы рассматривали последовательность создания теневой копии мы упустили один важный момент.
После того как система создала теневую копию она уведомляет об этом другие приложения (например, MS SQL Server Writer) и даёт им шанс внести в созданную копию изменения для того, чтобы она была согласованной на уровне логики приложения данные которого мы копируем.
Ведь данные могут быть согласованы на уровне файловой системы (это мы получаем автоматически), но быть не согласованы на уровне логики приложения, которое записывает эти данные. Например, потому что не завершились какие-то операции ввода-вывода.
Чтобы узнать какие вообще Writers установлены у вас в системе достаточно выполнить команду консоли:
vssadmin list writers |
Список будет примерно такой:
VSSADMIN 1.1 - Утилита теневого копирования тома
(C) Корпорация Майкрософт, 2001-2005.
Имя компонента записи: "Task Scheduler Writer"
Id компонента записи: {d61d61c8-d73a-4eee-8cdd-f6f9786b7124}
Id экземпляра компонента записи: {1bddd48e-5052-49db-9b07-b96f96727e6b}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Имя компонента записи: "VSS Metadata Store Writer"
Id компонента записи: {75dfb225-e2e4-4d39-9ac9-ffaff65ddf06}
Id экземпляра компонента записи: {088e7a7d-09a8-4cc6-a609-ad90e75ddc93}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Имя компонента записи: "Performance Counters Writer"
Id компонента записи: {0bada1de-01a9-4625-8278-69e735f39dd2}
Id экземпляра компонента записи: {f0086dda-9efc-47c5-8eb6-a944c3d09381}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Имя компонента записи: "System Writer"
Id компонента записи: {e8132975-6f93-4464-a53e-1050253ae220}
Id экземпляра компонента записи: {3724e839-8b8b-4264-94f6-9059621065db}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Имя компонента записи: "SqlServerWriter"
Id компонента записи: {a65faa63-5ea8-4ebc-9dbd-a0c4db26912a}
Id экземпляра компонента записи: {a87c5267-608c-4080-bea4-4b79218038a4}
Состояние: [5] Ожидание завершения
Последняя ошибка: Нет ошибок
Имя компонента записи: "ASR Writer"
Id компонента записи: {be000cbe-11fe-4426-9c58-531aa6355fc4}
Id экземпляра компонента записи: {d2f573be-dd2d-454d-9f58-856614692a27}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Имя компонента записи: "WMI Writer"
Id компонента записи: {a6ad56c2-b509-4e6c-bb19-49d8f43532f0}
Id экземпляра компонента записи: {019e81fd-86d8-41fc-990e-08c931a475a3}
Состояние: [5] Ожидание завершения
Последняя ошибка: Нет ошибок
Имя компонента записи: "Shadow Copy Optimization Writer"
Id компонента записи: {4dc3bdd4-ab48-4d07-adb0-3bee2926fd7f}
Id экземпляра компонента записи: {2e3263fc-bc8e-4e22-adc0-46e0135f4a6a}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Имя компонента записи: "BITS Writer"
Id компонента записи: {4969d978-be47-48b0-b100-f328f07ac1e0}
Id экземпляра компонента записи: {9820bb7a-cc0b-4439-9f0a-641cbf28917c}
Состояние: [5] Ожидание завершения
Последняя ошибка: Нет ошибок
Имя компонента записи: "Registry Writer"
Id компонента записи: {afbab4a2-367d-4d15-a586-71dbb18f8485}
Id экземпляра компонента записи: {098f8e92-6230-4ea7-ac71-61302f43167d}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Имя компонента записи: "MSSearch Service Writer"
Id компонента записи: {cd3f2362-8bef-46c7-9181-d62844cdc0b2}
Id экземпляра компонента записи: {f811522b-223e-4c00-aa88-c9efd37428ca}
Состояние: [5] Ожидание завершения
Последняя ошибка: Нет ошибок
Имя компонента записи: "COM+ REGDB Writer"
Id компонента записи: {542da469-d3e1-473c-9f4f-7847f01fc64f}
Id экземпляра компонента записи: {fe108756-fe41-413e-bbc3-d8a7056b4dab}
Состояние: [1] Стабильный
Последняя ошибка: Нет ошибок
Обратите внимание, что в списке Writers нет платформы 1с (его и быть не может для файлового варианта работы).
Для теневого копирования файлов серверной базы (если мы хотим это делать на уровне файловой системы, а не выгрузкой данных из sql сервера) это не актуально (ведь в списке есть SqlServerWriter), но вот при копировании файловой базы данных этот момент нужно учитывать.
Получается, что создавая теневую копию файловой базы 1с (будь то семёрка или восьмёрка) теоретически есть шанс получить абсолютно корректную базу на уровне файловой системы, но не корректную базу на уровне логики приложения.
Создание теневой копии файловой базы данных, в которой работают пользователи, будет аналогично тому, как если бы мы аварийно выключили компьютер, затем включили его и сняли эту копию.
Соответственно к теневым копиям файловых баз нужно относиться как к копиям снятых с баз, в которых завершение работы пользователей было аварийным.
О том как жить с этой информацией мы рассуждаем ниже в разделе "И всё-таки насколько безопасно делать теневые копии баз 1с".