Как я могу определить, используется ли база данных SQL Server?

dba.stackexchange https://dba.stackexchange.com/questions/2050

  •  16-10-2019
  •  | 
  •  

Вопрос

Мы стремимся к изгнанию экземпляра SQL Server, в котором есть пара баз данных, которые все еще остаются на нем.

Как я могу сказать, используются ли они по -прежнему пользователями или веб -приложением?

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

Если у вас есть альтернативные методы, которые также помогут.

Это было полезно?

Решение

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

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

Вы также можете использовать фильтрацию трассировки на стороне сервера в этой базе данных.

Другие советы

Это методы, которые я использовал в прошлом:

  1. Возьмите базу данных в автономном режиме/ отделке
  2. Откажитесь от пользователя/входа в систему
  3. Профилировщик след

Проблема такова: как долго вы ждете, прежде чем вы уверены, что никто не собирается получить доступ к данным? Для финансовых данных у вас есть несколько предметов ежедневно, еженедельно, ежемесячно, ежеквартально, полугодового и годового. Но достаточно год? Я также видел запросы на то, чтобы данные были доступны в течение как минимум 7 лет, и в одном случае мне сказали, что данные в одной системе должны быть там навсегда, хотя никто не использовал их.

Лучший совет: что бы вы ни делали, чтобы отключить доступ, убедитесь, что вы можете сразу же включить его. Я обнаружил, что Detatch работал лучше всего для этого. Я бы просто пописал бы на сценарию и проинструктировал свою команду: «Если кто -нибудь когда -нибудь спрашивает, где он находится, запустите этот сценарий». Это дало нам лучший шанс вернуть вещи как можно быстрее.

Я согласен с Ником с его советом. Если вам нужно быть уверенным, то вам придется пойти с Profiler (Service Side Trace), потому что некоторые из запросов SQL не будут кэшированы или по любой причине, когда кеш процедуры может быть очищен.

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

Прежде чем бросить какую-либо базу данных, я бы позаботился о том, чтобы у вас было 2 или 3 читаемых резервных копий (проверить их) в отдельных местах. Вы никогда не знаете, когда они вам нужны.

Следующий запрос показывает DBS, которые не имели использования с момента последнего перезапуска, не полагаясь на планы запросов, которые хранятся в кэше, поскольку он показывает пользовательский IO против индексов (и кучи). Это вроде как использование статистики виртуальных файлов, но DMV, используемый здесь, исключает активность IO из резервных копий. Нет необходимости поддерживать профилировщик, не требуется триггеры или аудит. Конечно, если вы часто перезагружаете свой SQL Server (или часто прикрепляете/выключаете базы данных), это может быть не путь :-)

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

select [name] from sys.databases 
where database_id > 4
AND [name] NOT IN 
(select DB_NAME(database_id) 
from sys.dm_db_index_usage_stats
where coalesce(last_user_seek, last_user_scan, last_user_lookup,'1/1/1970') > 
(select login_time from sys.sysprocesses where spid = 1))

Я работал в месте, в котором было большое количество баз данных осиротевших и полукорфея. Трудно было сказать, были ли они на самом деле осиротежными, так как многие задачи были сезонными или годовыми - так что веб -сайт работает только в течение 3-4 месяцев в год (в качестве примера формы W2 должны быть поданы в электронном виде 1/31, поэтому обработка веб -сайта. Они работали только с середины января до конца апреля).

То, что было сделано, было комбинацией:
* Спросите каждого разработчика, использовали ли они какую -то базу данных или другую (эти электронные письма будут выходить ежемесячно или когда резервные копии занимали слишком много времени).
* Возьмите базу данных в автономном режиме и посмотрите, кто жалуется.
* Переименовать сервер, чтобы увидеть, кто жалуется.

Поскольку только заостренный босс был готов разрешить «полную и полную» документацию, вики была прямо запрещена, а сокращение персонала привело к резкому снижению документации, которая соответствовала стандарту.

Если бы это было для меня, была бы вики -страница на сервер с именами контактов для каждой базы данных (и, возможно, краткое описание того, для чего предназначена база данных). Любая база данных, незарегистрированная на вики, была бы честной игрой для удаления.

У нас был один большой финансовый клиент, который все еще использовал SQL Server 2000 уже в 2009 году, поэтому нам пришлось поддерживать один экземпляр SQL Server 2000, пока этот клиент, наконец, не перенесен на SQL Server 2005.

Еще две альтернативы:

  1. Создайте триггеры на БД, которые уведомит вас (или хранить в таблицах) о любой деятельности.
  2. Включить аудит на DBS.

    • Зависит от вашей версии DB.

Следующее решение показывает временные общие, чистые и грязные страницы в МБ для определенных баз данных в вашем экземпляре (найдено в Интернете и немного изменено):

SELECT
    (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
    COUNT(*) *8/1024 AS [TotalPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) *8/1024 AS [CleanPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) *8/1024 AS [DirtyPages in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DB_NAME(database_id)

или же

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
where  attribute = 'dbid' 
order by last_execution_time desc

или же

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
--where dbid=8
where 
      text like '%idAdministrator%' and
      attribute = 'dbid' 
      and value>= 5 -- dbid >=5 for user databases but include resource database which
                     --you can exclude by its numer I don't remember at the moment
order by last_execution_time desc
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top