Domanda

Stiamo cercando di smantellare un'istanza di SQL Server che ha un paio di database rimanendo su di esso.

Come faccio a sapere se sono ancora utilizzati da utenti o un'applicazione web?

che ha avuto una query T-SQL è possibile eseguire per recuperare l'ultima data query. Sembra di lavoro, ma voglio sapere se queste informazioni sono abbastanza valide per cadere database. Lo è?

Se si dispone di metodi alternativi che aiutano pure.

È stato utile?

Soluzione

Si dovrebbe essere interessati con gli elementi che sono stati eliminati dalla cache e senza risposta, o per i database che hanno l'uso frequente.

Piuttosto che cadere i database di mano metterli o non in linea per impedire l'accesso senza farli cadere o in modalità RESTRICTED_USER per limitare l'accesso. In questo modo li si può lasciare in quello stato per un mese o due per controllare e vedere se c'è uso occasionale.

Si potrebbe anche cercare di utilizzare una traccia lato server profiler filtraggio su quel database.

Altri suggerimenti

Questi sono i metodi che ho usato in passato:

  1. del database Non in linea / Stacca
  2. DENY utente / login di accesso
  3. Profiler traccia

Il problema è questo: quanto tempo aspettate prima di essere certi che nessuno sta per accedere ai dati? Per i dati finanziari, si dispone di alcuni elementi corrono tutti i giorni, settimanale, mensile, trimestrale, semestrale e annuale. Ma è un anno abbastanza a lungo? Ho visto anche le richieste per avere tenuti a disposizione per almeno 7 anni di dati, e in un caso mi è stato detto che i dati in un unico sistema doveva essere lì per sempre, anche se nessuno lo stava usando.

Il miglior consiglio è questo: tutto quello che fate per disattivare l'accesso, assicurarsi la possibilità di riattivarlo immediatamente. Ho trovato che il detatch ha funzionato meglio per questo. Vorrei semplicemente scritto il riattacco e istruire la mia squadra "se qualcuno chiede sempre dove si trova, eseguire questo script". Che ci ha dato la migliore occasione per rimettere le cose il più rapidamente possibile.

Sono d'accordo con Nic con i suoi consigli. Se avete bisogno di essere sicuri, allora si dovrebbe andare con Profiler (Service traccia lato) perché alcune delle query SQL non verrà memorizzata nella cache o per qualsiasi motivo la cache delle procedure potrebbe essere eliminato.

I normalmente controllare le informazioni del file virtuale statistiche anche per vedere se ci sono legge o scrive accadendo a livello di file del sistema operativo. Anche se il database non è attivo si continua a vedere una piccola legge / scrive se sta assumendo backup del log, backup completi ecc ... ma che vi darà anche un'idea di attività di lettura / scrittura su quel database.

Prima di far cadere qualsiasi database, vorrei assicurarsi di avere a-almeno 2 o 3 copie di backup leggibili (li test) in posizioni separate. Non si sa mai quando ne hai bisogno.

I seguenti DB mostra di query che hanno avuto nessun utilizzo dall'ultimo riavvio, senza affidarsi a piani di query che si terrà nella cache, in quanto mostra utente IO contro gli indici (e cumuli). Questa è una sorta di lungo le linee di utilizzare statistiche di file virtuali, ma il DMV qui usato esclude attività di IO dai backup. Non c'è bisogno di mantenere un profiler traccia in esecuzione, nessun trigger o di controllo necessari. Naturalmente, se si riavvia il server SQL di frequente (o si collega / database shutdown spesso) Questo potrebbe non essere la strada da percorrere: -)

Dopo aver detto che, comunque d'accordo che anche se la query sembra confermare che un DB può essere eliminato, sicuramente fare l'ASSENTE / scollegamento o negare l'accesso degli utenti per un certo tempo, più eventuali due diligence chiedere in giro prima di poter realmente far cadere!

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))

Ho lavorato in un posto che aveva un gran numero di database orfani e semi-orfani. E 'stato difficile dire se davvero sono rimasti orfani, come molte attività erano stagionale o annuale - in modo che il sito funziona solo per 3-4 mesi all'anno (ad esempio, forme W2 devono essere depositate elettronicamente 1/31, in modo che il trattamento sito questi correvano solo da metà gennaio a fine aprile).

Ciò che è stato fatto era una combinazione di:
* Chiedere se tutti gli sviluppatori che stavano usando un po 'di base di dati o l'altro (queste email sarebbero andati mensilmente o ogni volta che i backup stavano prendendo troppo lungo).
* Prendere il database non in linea e vedere che si lamenta.
* Rinominare il server per vedere chi si lamenta.

Dato che il capo dai capelli a punta è stato solo disposto a permettere "piena e completa" la documentazione, un wiki è stato espressamente vietato, e riduzioni di personale portano a un drastico calo nella documentazione che ha incontrato lo standard.

Se fosse per me, non ci sarebbe una pagina wiki per server con i nomi dei contatti per ogni database (e forse una breve descrizione di ciò che il database è per). Qualsiasi database senza documenti sulla wiki sarebbe giusto gioco per l'eliminazione.

Abbiamo avuto una grande cliente finanziaria che era ancora l'utilizzo di SQL Server 2000 più tardi del 2009, quindi abbiamo dovuto tenere un'istanza di SQL Server 2000 in esecuzione fino a quel cliente finalmente spostato a SQL Server 2005.

Altri due alternative sono:

  1. Crea trigger sul DB che vi informerà (o negozio per tabelle) di qualsiasi attività.
  2. Attivare il controllo sui DB.

    • dipende dalla versione di DB.

I prossimi spettacoli soluzione totale temporanea, pagine pulite e sporche di MB per particolari database sotto l'istanza (che si trova su internet e modificato un po '):

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)

o

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

o

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top