Někdo spustil dotaz na naší databázi SQL Server vzdáleně a jejich systém havaroval.
Nemají zálohu tohoto dotazu a chtějí vidět, co bylo na serveru spuštěno.
Je možné tento dotaz najít v protokolu nebo někde v historii?
Podobný Grant Fritchey měl problém, kdy uzavřel SSMS a ztratil dotaz, na kterém pracoval ... blogoval zde: Oh **********!
[~ # ~] upravit [~ # ~]
Aby to bylo trochu podrobnější, odpoví výše uvedený odkaz Grant poskytuje dotaz, který jednoduše přejde do mezipaměti na instanci a vytáhne dotaz, který jste právě provedli (nebo alespoň pokus o):
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%';
Několik dalších možností, které byly uvedeny v komentářích blogu Granta:
2005+, výchozí trasování k záchraně.
Výchozí trasování se převrátí na 20 MB, ale SQL si uchová historii 5 tras. S přístupem na server můžete získat soubory * .trc z adresáře MSSQL\Log. Pokud nemůžete získat přístup k serveru, následující název vám poskytne název aktuálního výchozího souboru trasování:
SELECT * FROM ::fn_trace_getinfo(default)
Pokud je aktuální soubor například E:\MSSQL.1\MSSQL\LOG\log_200.trc, měly by být předchozí soubory log_199.trc, log_198.trc atd. Získat obsah trasování pomocí:
SELECT * FROM fn_trace_gettable('E:\MSSQL.1\MSSQL\LOG\log_199.trc', default)
možná budete moci načíst informace z plánů dotazů uložených v mezipaměti, vyhledat informace o BOL na sys.dm_exec_query_stats nebo je spustit ze správcovského studia připojeného ke stejné databázi:
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
Filtrujte výstup pomocí
WHERE text like '%something%'
pro zúžení výsledků.
Pokud byla databáze v úplném režimu obnovy, pak by mohla existovat možnost obnovit některá data a získat informace o tom, co bylo provedeno čtením protokolu transakcí.
Ve výchozím nastavení to bohužel není podporováno, ale existují způsoby, jak to provést.
Můžete zkusit použít nástroje třetích stran, například ApexSQL Log nebo SQL Log Rescue (zdarma, ale pouze SQL 2000).
Další možností je zkusit použít nezdokumentované funkce DBCC LOG nebo fn_dblog. To je složitější, ale je to zdarma.
ApexSQL má funkci 'Provedené dotazy', která umožňuje vyhledávat a filtrovat podle data.
Nejsem si jistý, zda vytáhne historii z mezipaměti SSMS, nebo ji skutečně sleduje sám. Můžete to zkusit nainstalovat a doufat v to nejlepší.
Pokud je vaše databáze nastavena na plný model obnovy, můžete prozkoumat zálohy protokolu transakcí. Viz fn_dump_dblog
pro více informací.