Могу ли я увидеть, как исторические запросы выполняются в базе данных SQL Server?
-
16-10-2019 - |
Вопрос
Кто-то удаленно выполнял запрос к нашей базе данных SQL Server, и его система вышла из строя.
У них нет резервной копии этого запроса, и они хотят увидеть, что было запущено на сервере.
Можно ли найти этот запрос где-нибудь в журнале или истории?
Решение
Подобный Грант Фриччи была проблемой, где он закрыл SSM и потерял запрос, над которым он работал ... В блогах здесь:Ой **********!
РЕДАКТИРОВАТЬ
Чтобы сделать это немного более подробно о ответе, указанный выше грант, связанный выше, предоставляет запрос просто перейти к кэшу на экземпляре, чтобы вывести только что только что выполнил запрос (или, по крайней мере, попытка):
SELECT dest.text
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE deqs.last_execution_time > '5/19/2011 11:00'
AND dest.text LIKE 'WITH%';
Еще несколько вариантов, которые были отмечены в комментариях блога Гранта:
- Джейми Томсон указывает, где SSMS на самом деле имеет область "восстановления" Под вашим профилем Windows, аналогично Word или Excel Recovery.
- Другие индивидуальные заметки в комментариях о пакете инструментов SSMS, но это дополнение бесплатно только для SQL Server 2008. Начиная с SQL Server 2012, он оплачен только, но имеет много функций, которые вы можете найти полезными.
Другие советы
2005+, след по умолчанию на помощь.
Трассировка по умолчанию переворачивается на 20 МБ, но SQL сохраняет историю 5 следов. С доступом к серверу вы можете получить файлы *.trc из каталога MSSQL log. Если вы не можете получить доступ к серверу, следующее даст вам имя текущего файла трассировки по умолчанию:
SELECT * FROM ::fn_trace_getinfo(default)
Если текущий файл, например, e: mssql.1 mssql log log_200.trc, предыдущие файлы должны быть log_199.trc, log_198.trc и т. Д. Получить содержимое трассировки с:
SELECT * FROM fn_trace_gettable('E:\MSSQL.1\MSSQL\LOG\log_199.trc', default)
Ты мощь иметь возможность получить информацию из планов кэшированного запроса, проверьте BOL для получения информации о SYS.DM_EXEC_QUERY_STATS или запустите это из студии управления, подключенной к той же базе данных:
SELECT d.plan_handle ,
d.sql_handle ,
e.text
FROM sys.dm_exec_query_stats d
CROSS APPLY sys.dm_exec_sql_text(d.plan_handle) AS e
Отфильтровать вывод с помощью
WHERE text like '%something%'
Чтобы сузить результаты.
Если база данных находилась в режиме полного восстановления, может быть шанс восстановить некоторые данные и получить представление о том, что было сделано путем чтения журнала транзакций.
К сожалению, это не поддерживается по умолчанию, но есть способы сделать это.
Вы можете попробовать использовать сторонние инструменты, такие как ApexSQL Log или же SQL Log Rescue (бесплатно, но только SQL 2000).
Другой вариант - попробовать использовать функции без документов dbcc log или fn_dblog. Это более сложно, но это бесплатно.
Если для вашей базы данных настроена модель полного восстановления, вы можете изучить резервные копии журнала транзакций.Видеть fn_dump_dblog
для получения дополнительной информации.
ApexSQL имеет функциональность «выполненных запросов», которая позволяет искать и фильтровать по дате.
Я не уверен, что это вытаскивает историю из кеша SSMS или фактически отслеживает ее само по себе. Вы можете попытаться установить его и надеяться на лучшее.