Лучшие практики для изящной замены базы данных SQL Server только для чтения - PullRequest
1 голос
/ 16 декабря 2008

У меня есть база данных только для чтения, в которой хранится кэшированная информация, которая используется для отображения страниц на сайте. Существуют процессы, которые запускаются для создания базы данных, и те, которые запускаются на другом сервере. Когда мне нужно обновить работающую базу данных, я восстанавливаю эту базу данных на работающем сервере с новым именем и файлом. Затем я сбрасываю живую базу данных и переименовываю ее в исходное имя. В настоящее время я делаю это с помощью хранимой процедуры, которая уничтожает все соединения через sp_who и kill, затем команду drop database, затем sp_renamedb. Теперь, когда я уничтожу все подключения, на сайте появятся ошибки для людей и сканеров, которые в настоящее время обращаются к этим страницам, есть ли лучшая методология для выполнения этой процедуры?

Ответы [ 4 ]

1 голос
/ 16 декабря 2008

Настройте репликацию транзакций с вашим сервером генерации данных в качестве издателя и вашим живым сервером в качестве подписчика. Клиентские подключения ничего не заметят.

1 голос
/ 16 декабря 2008

Вероятно, вы хотите перевести работающую базу данных в автономный режим с помощью команды:

ALTER DATABASE name SET OFFLINE

Вы можете прочитать больше здесь , но там написано:

Приведенная выше команда пытается немедленно перевести указанную базу данных в автономный режим. Если пользователь или фоновый процесс в настоящее время подключены к базе данных, команда не может быть завершена. В этой ситуации оператор ALTER DATABASE будет заблокирован и будет ожидать закрытия всех соединений. Это гарантирует, что ни одна транзакция не будет отменена неожиданно. В течение периода блокировки новые подключения к базе данных не будут разрешены.

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

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

Пул соединений или другие долго работающие соединения могут вызвать проблемы в этом сценарии. Возможно, вы захотите настроить сценарий для ожидания в течение определенного периода времени после того, как была введена команда ALTER DATABASE SET OFFLINE (скажем, 15 минут), и если база данных еще не отключена, вы можете повторить команду с помощью WITH NO_WAIT. возможность принудительно отключить его.

Если этого недостаточно для вас, вы также можете корректно завершить работу SQL Server ... который также будет ждать, пока вся работа на сервере не будет выполнена, прежде чем остановиться.

0 голосов
/ 16 декабря 2008

Если вы хотите сделать что-то действительно удобное для ваших пользователей. Я бы сделал что-то вроде этого.

Когда вы копируете новую версию своей базы данных, присваивайте ей новое имя, возможно, с указанием даты и времени, в зависимости от того, как часто вы ее обновляете. Когда он появится, скажите вашему веб-приложению, чтобы начать использовать новую базу данных. Это можно сделать, изменив строку подключения в файле web.config или добавив в нее базу данных конфигурации.

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

0 голосов
/ 16 декабря 2008

+ 1 для Майка Шарека - мне нравится ваше решение, оно очень аккуратное и предотвращает внезапное (и очень грубое) отключение пользователей.

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

Это позволит вам отправлять сообщения примерно в реальном времени аналогично тому, как работает Microsoft Mobile Mobile Access, позволяя пользователям получать уведомления о том, что через 10 минут сайт отключается для обслуживания.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...