
У меня есть сервер Proxmox с гостевой ОС Windows 10, на которой будет работать MSSQL Express. На гостевой ОС Windows установлен и работает гостевой агент QEMU. Для резервного копирования у меня есть отдельный сервер, на котором запущен Proxmox Backup, который уже запланирован для создания полных резервных копий гостевой ОС раз в неделю (режим остановки). Кроме того, мне нужно чаще делать моментальные снимки с небольшим или нулевым прерыванием доступа, однако простое «замораживание» файловой системы с активной базой данных проблематично из-за вероятности несогласованности данных.
Если это был MySQL на гостевой ОС Linux, то уже есть решение в виде добавления скрипта в fsfreeze-hook, вплоть до того, что естьпримервключено в репозиторий. Но, судя по той небольшой конкретной информации, которую мне удалось найти, вся эта функция, похоже, отсутствует в сборке гостевого агента QEMU для Windows.
Как мне реализовать аналогичный гостевой скрипт-хук в Windows? В идеале скрипт должен вызываться непосредственно перед началом снимка, чтобы перевести базу данных в безопасное состояние для создания снимка.
решение1
Вы должны иметь возможность написать скрипт моментального снимка на машине Windows с помощью vssadmin create shadow
. Однако, обратите внимание, что:
Снимки vss в Windows 10 имеют репутацию непригодных к использованию из-за повреждения данных снимка (я столкнулся с этой проблемой лично, когда пытался восстановить некоторые файлы снимка с помощью
ShadowExplorer
)любая современная СУБД (читай: почти любая, ожидаемая
MyISAM
) использует журналирование и/или WAL, чтобы без проблем пережить отключение питания или резервное копирование, устойчивое к сбоям.
Помимо создания резервных копий всей виртуальной машины, я бы рекомендовал по возможности регулярно создавать скриптовые дампы базы данных в других местах (например, на сетевых ресурсах).
решение2
Я понимаю требования здесь, но, к сожалению, "альтернативным" платформам виртуализации нелегко иметь дело с махинациями Microsoft. Если вы думаете, что даже Citrix отказался от неподвижных снимков в xenserver, вы понимаете, в чем здесь проблема.
Думаю, можно попробовать вызвать vssadmin create shadow через ssh или powershell, но я этого никогда не пробовал.
Единственные способы, которые я знаю,надежнорезервное копирование виртуальных машин Windows на корпоративном уровне с помощью чего-то вроде Proxmox:
- Поскольку мы говорим конкретно о машине SQL Server, вы храните данные отдельно, поскольку вы делаете резервное копирование с помощью собственных функций SQL Server. Вы можете использовать любую ОС или просто сохранить резервную/клонированную установку SQL Server (без нарушения лицензии, если она остановлена). Однако вы используете SQL Server Express, что проблематично, поскольку вы не можете иметь запланированные задачи, поэтому вам нужно найти что-то другое.
- Использование резервного копирования Windows (Server) изнутри виртуальной машины, возможно, в сочетании с общей папкой ZFS, которую вы делаете моментальным снимком после создания резервной копии, так что вы можете фактически контролировать историю, которую вы хотите сохранить со стороны управления хранилищем; это бесплатно и на самом деле работает довольно хорошо; восстановление не самое быстрое, так как вам нужно загрузить установочный образ Windows iso и выполнить поддельное восстановление "голого железа" внутри виртуальной машины. Вам нужно запустить SQL Server VSS writer, и это должно также обеспечить вам согласованные резервные копии SQL Server,в теории. Я регулярно делаю это в средах разработки и тестирования, но производство — это совсем другое дело, и документация не самая понятная (спасибо Microsoft, как обычно, хорошая работа).
- Используйте другие сертифицированные решения для резервного копирования, которые справляются с этой задачей лучше, чем Windows Backup, но опять же изнутри виртуальной машины; это все равно дорого, если вам придется покупать лицензии для большого количества виртуальных машин, поэтому на данном этапе я бы рассмотрел вариант с более крупными решениями.
На самом деле, я знаю, что вы спрашиваете о Proxmox, но нужно сказать, что с профессиональной точки зрения, лучший способ управлять машинами Windows, которые содержат важные данные, — это использовать VMWare vSphere или Hyper-V с Veeam Backup; это самое дорогое решение, но и самое крутое для аварийного восстановления: вы можете запустить машину из резервных копий, например, и другие крутые функции. Я ничего не рекламирую; я испытал практически все платформы виртуализации, которые имеют смысл, и если вы переходите на Windows, то это так.
решение3
Теперь, дляненадежные способыдля выполнения резервного копирования SQL Server в Proxmox, я вношу поправки в свой предыдущий ответ, чтобы он соответствовал тому, о чем вы спрашиваете. Я только хочу подчеркнуть, что это вообще не лучшая практика, но я видел, как это делалось даже с VMWare (это глупо).
Что вы можете сделать:
установить сервер OpenSSH в Windows, который теперь есть в Windows
настройте хуки в резервном копировании proxmox (но вам нужно запускать резервное копирование из командной строки, а не из веб-интерфейса), как описано здесь:https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_hook_scripts;таким образом, я могу запустить скрипт, который выполняет что-то внутри виртуальной машины Windows через SSH
скрипт, который я запущу, не VSSADMIN, а что-то вроде:
SqlCmd -E -S LOCALHOST -Q "BACKUP DATABASE <DATABASENAME> TO DISK ='<PATH>'"
или это может быть что-то более сложное, например, инкрементальные резервные копии и т. п. Вы также можете установить скрипты этого парня, чтобы лучше обрабатывать резервные копии, если вы увлекаетесь скриптами SQL:https://ola.hallengren.com/sql-server-backup.html.На этом этапе вы сделаете резервную копию с помощью Proxmox. Это гарантированно будет согласованным, если вы дождетесь очистки буферов (это одна из причин, по которой это нельзя считать надежным с профессиональной точки зрения).
Однако причины, по которым мне это не нравится, а также предыдущее предложение делать снимки VSS, следующие:
- Это кажется слишком сложным, и вы все равно делаете что-то ненадежное.
- На самом деле, если мне придется положиться на службу записи VSS SQL Server (это обязательно, иначе не будет никакой согласованности), я бы вернулся к своему предыдущему предложению использовать резервное копирование Windows + моментальные снимки хранилища, что в целом удобнее, чем просто вызывать VSS со скриптом и создавать резервную копию.
Для моих машин БД под Proxmox, XCP-ng или чем-то еще я никогда не беспокоился о резервном копировании их как машин; вам просто нужно убедиться, что они содержат только сервер БД, как это должно быть в общем случае, если это какое-то критическое приложение. Я думаю, что резервное копирование этих машин — пустая трата времени. Я всегда делаю резервное копирование на внешнее хранилище (с помощью скриптов, запланированных задач, mysqldump, SQL Server Agent, sqlcmd), потому что я могу снова работать за считанные минуты с контейнером docker/VM, который я могу подготовить заранее, если мне действительно нужно выполнить аварийное восстановление. Это также занимаетгораздо меньше места.