2015-11-24 7 views
0

Клиент имеет одно из приложений моей компании, которое указывает на конкретную базу данных и таблицы в базе данных на их сервере. Нам нужно обновлять данные несколько раз в день. Мы не хотим обновлять таблицы, которые пользователи просматривают в живых сеансах. Мы хотим обновить данные сбоку, а затем перевернуть ту базу данных/таблицы, к которой пользователи обращаются.Переключение базы данных SQL Server

Каков приемлемый способ сделать это? У нас есть две базы данных и переименование баз данных? Мы помещаем данные в отдельные таблицы, а затем переименовываем таблицы? Существуют ли другие подходы, которые мы можем предпринять?

+0

Получают ли пользователи доступ к отчетам через процедуры? –

+0

Вы не беспокоитесь о том, что данные вводятся в базу данных 1 при обновлении базы данных 2? Это данные только для чтения? – Steve

+0

Переключение раздела или изменение на _Read Committed Snapshot Isolation_ http://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/ , Переключение разделов требует вмешательства в процесс загрузки. Прочитайте выделенную изоляцию моментальных снимков просто требует, чтобы вы использовали транзакции и намного проще. –

ответ

0

Я думаю, что понимаю, что вы говорите: если пользователь находится на экране, вы не хотите, чтобы экран обновлялся с новой информацией во время просмотра, обновлялся, когда они вытаскивали новый экран после нового данные загружены? Поправьте меня если я ошибаюсь. Вопрос Майка тоже хорош, как эти данные передаются пользователям? Возможно, есть способ приостановить это или что-то, пока загружаются новые данные. Есть более элегантные способы загрузки таких данных, как, возможно, разделение таблицы, использование промежуточной таблицы, репликация, просмотр снимков пользователей и т. Д. Но нам нужно знать, что вы подразумеваете под «живыми сеансами».

Редактировать: с дополнительной информацией, которую вы мне предоставили, переключение разделов может быть ответом. Процесс занимает практически нет времени, он просто меняет указатели от старых записей на новые. Только проблема заключается в том, что вам нужно разделить на что-то патируемое, например, дату или временную метку, чтобы отличать старые и новые данные. Это также функция Enterprise-Edition, и я не уверен, какую версию вы используете.

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

http://www.databasejournal.com/features/mssql/snapshot-isolation-level-in-sql-server-what-why-and-how-part-1.html
https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx

Надеется, что это помогает и удаче!

+0

Данные выводятся назад в дискретных кусках. Пользователь не смотрит на формы, в которых эти данные постоянно обновляются. Они запрашивают набор данных, их извлекают и представляют. Затем через несколько минут они попросят другой набор данных. Данные поступают из необработанных таблиц, без хранимых процедур и т.п. Но пользователь может использовать программу в течение периода времени, когда данные обновляются. Сейчас мы обновляем таблицы, когда пользователи запрашивают данные. Запрос данных может попасть в базу данных в неустойчивый момент и не возвращать данные. Я пытаюсь избежать этого. – user1753352

+0

Я знаю даже с разбиением на разделы, пользователь может просто запросить данные при запуске коммутатора. Но это будет менее вероятно, чем то, что в настоящее время выполняется, когда процесс обновления может занять от 20 до 30 минут. Процесс обновления имеет дело с одной таблицей (по 20) за раз. Поэтому, надеюсь, только данные таблицы будут выглядеть странно. Но я все еще ищу что-то более чистое. – user1753352

+0

Блокировка обычной записи в SQL Server останавливает любые «неустойчивые моменты». Либо запись завершена, либо нет. Проблемы возникают, когда вы посыпаете 'С (NOLOCK)' фея пыль через ваш код. Затем вы открываете себе ошибки. Тем не менее, обычная блокировка записи вводит «соперничество». Таким образом, у вас есть проблема с конфликтом (взаимоблокировки, проблемы с производительностью) или у вас есть проблема с согласованностью (поврежденные данные, которые могут быть введены только с помощью «NOLOCK») –

0

Основываясь на информации, предоставленной вами, я считаю, что лучшим выбором будет переключение разделов. Я включил пару ссылок для вас, чтобы проверить, потому что гораздо проще направить вас к источнику, который уже хорошо объясняет это. Существует несколько подходов с переключением разделов, которые вы можете использовать.

Ссылки: Microsoft и Catherin Wilhelmsen blog

Надеется, что это помогает!

0

на вопрос подробности немного расплывчатым, так чтобы уточнить:

Что такое живая сессия? Это сеанс в самом приложении (с кодом приложения, управляющим его собственными подключениями к базе данных), или это соединение низкого уровня для ситуации с пользователем/сеансом? Пользователи просто запускают отчеты или активно читают/записывают из базы данных во время сеанса? Когда проходит сеанс и как вы знаете?

Некоторые опции:

1) Напряжения все данные в клиенте для всей сессии.

2) Использование чтения совершало или разделов, как указано в других ответах (однако, требует тщательной настройки для ваших запросов и увеличивает требования к базе данных)

3) Использование реплики базы данных для всех запросов, пауза/возобновление репликации когда необходимо (обновление данных должно быть быстрее, чем ваш процесс, но это может занять некоторое время, в зависимости от объема и сложности)

4) Используйте базу данных реплик и автоматизируйте резервное копирование/восстановление от мастера (это может быть самым быстрым в зависимости от общего размер вашей базы данных)

5) Использование несколько реплик баз данных с репликацией или резервное копирование/восстановление, а затем переключить строку подключения (это позволяет вам постоянно обновлять мастер, а затем обновлять реплику и переключаться в определенное предсказуемое время)

Смежные вопросы