automatizarea paginii DBCC

înapoi în 2006, Paul Randal documentat pagina DBCC pe blogul său Microsoft la https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. În postarea sa, veți observa că, pentru a returna ieșirea din pagina DBCC pe ecran, trebuie să activați mai întâi steagul de urmărire 3604. Postarea de pe blog de mai sus arată câteva exemple de rezultate și le utilizează pentru acțiuni ulterioare. Din păcate, această metodă necesită intervenție manuală pentru a obține datele necesare din pagină pentru a lucra cu ea în continuare.

știți, sigur ar fi frumos dacă intervenția manuală ar putea fi eliminată și să automatizați complet sarcina pe care o căutați. Această postare pe blog vă va arăta cum se poate face acest lucru și vă va oferi câteva exemple în acest sens.

în ultima mea postare pe blog, am introdus o setare opțională la mai multe comenzi DBCC: cu TABLERESULTS. Aceasta returnează ieșirea în format tabelar, într-un mod care permite ieșirea să fie consumată. După cum se dovedește, această setare opțională funcționează și cu pagina DBCC. Puteți vedea acest lucru examinând pagina de informații a bazei de date (Pagina 9) a bazei de date master:

codul sursă
pagina DBCC ('master', 1, 9, 3) cu TABLERESULTS;

această declarație, care poate fi rulată fără steagul de urmărire, returnează datele de pe pagină în 4 coloane: ParentObject, Object, Field și VALUE. După cum se dovedește, această pagină specială a fiecărei baze de date are o mulțime de informații interesante despre ea. Să automatizeze hapsân o anumită bucată de informații din această pagină:

codul sursă
dacă OBJECT_ID ('tempdb.dbo.#DBCCPAGE') nu este NULL DROP TABLE #dbccpage;creați TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));introduceți în #DBCCPAGEEXECUTE ('pagina DBCC ("master", 1, 9, 3) cu TABLERESULTS;'); selectați LASTGOODDBCCDATE = convertiți(DATETIME, valoare)din #dbccpagewhere field = 'DBI_DBCCLASTKNOWNGOOD';

acest fragment minunat de cod returnează ultima dată când un DBCC CHECKDB de succes a fost rulat împotriva bazei de date master. Cât de dulce e asta? Când descoperiți un server în care jobul CHECKDB nu a reușit până la punctul în care jobul a eșuat doar în intrările din istoricul jobului, puteți afla acum cât timp a trecut de când a fost rulat cu succes.

„trucul” pentru a face acest lucru este să încapsulați comanda DBCC ca șir și să o apelați cu funcția EXECUTE (). Aceasta este utilizată ca parte a unei instrucțiuni INSERT in / EXECUTE, astfel încât rezultatele din pagina DBCC să fie inserate într-un tabel (în acest caz se folosește un tabel temporar, deși poate fi utilizată și o variabilă de tabel sau un tabel permanent). Există trei pași simpli pentru acest proces:

  1. creați un tabel (permanent / temporar) sau o variabilă de tabel pentru a menține ieșirea.
  2. introduceți în acest tabel rezultatele instrucțiunii de pagină DBCC utilizând INSERT in / EXECUTE.
  3. selectați datele pe care le căutați din tabel.

prin utilizarea unui cursor, puteți roti cu ușurință prin toate bazele de date de pe instanță pentru a obține atunci când au avut ultima dată un succes DBCC CHECKDB rula împotriva lor. Următoarele utilizează sp_MSforeachdb (care se folosește un cursor să se rotească prin toate bazele de date) pentru a face doar acest lucru:

codul sursă
dacă OBJECT_ID ('tempdb.dbo.#DBCCPAGE') nu este NULL DROP TABLE #DBCCPAGE;dacă OBJECT_ID('tempdb.dbo.#CheckDBDates') nu este NULL DROP TABLE # CheckDBDates;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));CREATE TABLE #CheckDBDates ( database_name sysname, LastCheckDB DATETIME); EXECUTE sp_MSforeachdb 'TRUNCATE TABLE #DBCCPAGE;INSERT INTO #DBCCPAGE EXECUTE (''DBCC PAGE (''''?'''', 1, 9, 3) WITH TABLERESULTS;'');INSERT INTO #CheckDBDatesSELECT ''?'', CONVERT(DATETIME, VALUE)FROM #DBCCPAGEWHERE Field = ''dbi_dbccLastKnownGood'';'; SELECT database_name, LastCheckDBFROM #CheckDBDates;

și aici avem fiecare bază de date pe instanță, și data la care DBCC CHECKDB a fost ultima rula cu succes împotriva ei – bine, cel puțin pentru bazele de date care sp_MSforeachdb nu a omis (a se vedea https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ pentru mai multe informații despre acest lucru).

în rezumat, prin utilizarea „cu TABLERESULTS” opțiune de DBCC, putem automatiza procesele care utilizează pagina DBCC, în loc de a avea nevoie de intervenție manuală pentru a lucra drum prin aceasta.

în următoarele câteva tranșe, vom analiza alte utilizări ale utilizării „cu TABLERESULTS” pentru a automatiza ieșirea DBCC.

Lasă un răspuns

Adresa ta de email nu va fi publicată.