it-swarm.asia

Bagaimana saya bisa tahu jika database SQL Server masih digunakan?

Kami sedang mencari untuk menonaktifkan contoh SQL Server yang masih memiliki beberapa basis data.

Bagaimana saya bisa tahu jika masih digunakan oleh pengguna atau aplikasi web?

Saya menemukan tas forum yang memiliki kueri T-SQL yang dapat Anda jalankan untuk mengambil tanggal kueri terakhir. Tampaknya berfungsi tetapi saya ingin tahu apakah informasi ini cukup valid untuk menjatuhkan basis data. Apakah itu?

Jika Anda memiliki metode alternatif yang akan membantu juga.

34
jsauni

Anda harus khawatir dengan item yang telah dihapus dari cache dan bahwa Anda telah terjawab, atau untuk database yang memiliki penggunaan yang jarang.

Alih-alih menjatuhkan database dari tangan, letakkan keduanya OFFLINE untuk mencegah akses tanpa menjatuhkannya atau dalam mode RESTRICTED_USER untuk membatasi akses. Dengan melakukan ini, Anda dapat membiarkan mereka dalam keadaan itu selama satu atau dua bulan untuk memeriksa dan melihat apakah ada penggunaan sesekali.

Anda juga bisa mencari untuk menggunakan filter jejak profiler sisi server pada database itu.

30
NicCain

Ini adalah metode yang saya gunakan di masa lalu:

  1. Ambil basis data offline/Lepaskan
  2. DENY akses pengguna/login
  3. Jejak profiler

Masalahnya adalah ini: berapa lama Anda menunggu sebelum Anda yakin bahwa tidak ada yang akan mengakses data? Untuk data keuangan, Anda memiliki beberapa item yang dijalankan harian, mingguan, bulanan, triwulanan, semi-tahunan, dan tahunan. Tetapi apakah satu tahun cukup lama? Saya juga telah melihat permintaan agar data tetap tersedia setidaknya selama 7 tahun, dan dalam satu kasus saya diberi tahu bahwa data dalam satu sistem perlu ada di sana selamanya, meskipun tidak ada yang menggunakannya.

Saran terbaik adalah ini: apa pun yang Anda lakukan untuk mematikan akses, pastikan Anda dapat segera mengaktifkannya kembali. Saya menemukan bahwa pengiriman bekerja paling baik untuk ini. Saya hanya akan skrip keluar reattach dan menginstruksikan tim saya "jika ada yang bertanya di mana itu, jalankan skrip ini". Itu memberi kami kesempatan terbaik untuk mengembalikan barang secepat mungkin.

14
SQLRockstar

Saya setuju dengan Nic dengan nasihatnya. Jika Anda perlu memastikan, maka Anda harus pergi dengan Profiler (Layanan sisi jejak) karena beberapa query SQL tidak akan di-cache atau karena alasan apa pun prosedur cache bisa dibersihkan.

Saya biasanya akan memeriksa informasi statistik file virtual juga untuk melihat apakah ada membaca atau menulis yang terjadi pada tingkat file OS. Bahkan jika database TIDAK aktif, Anda masih akan melihat sedikit baca/tulis jika Anda mengambil cadangan log, cadangan penuh dll ... tetapi itu juga akan memberi Anda gambaran tentang aktivitas baca/tulis pada database itu.

Sebelum menjatuhkan basis data apa pun, saya akan memastikan Anda memiliki setidaknya 2 atau 3 cadangan yang dapat dibaca (mengujinya) di lokasi yang terpisah. Anda tidak pernah tahu kapan Anda membutuhkannya.

13
Sankar Reddy

Kueri berikut menunjukkan DB yang tidak memiliki penggunaan sejak restart terakhir, tanpa bergantung pada rencana kueri yang disimpan dalam cache, karena ia menunjukkan pengguna IO terhadap indeks (dan heap). semacam menggunakan statistik file virtual, tetapi DMV yang digunakan di sini tidak termasuk IO aktivitas dari cadangan. Tidak perlu menjaga jejak profiler berjalan, tidak ada pemicu atau audit yang diperlukan. Tentu saja, jika Anda sering me-restart server SQL Anda (atau Anda sering melampirkan/mematikan database) ini mungkin bukan cara yang tepat :-)

Karena itu, masih setuju bahwa meskipun permintaan ini tampaknya mengkonfirmasi bahwa DB dapat dijatuhkan, pasti lakukan OFFLINE/lepaskan atau tolak akses pengguna untuk beberapa waktu, ditambah dengan uji tuntas menanyakan sekitar sebelumnya sebenarnya menjatuhkan!

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

Saya telah bekerja di tempat yang memiliki banyak database yatim dan semi-yatim. Sulit untuk mengatakan apakah mereka benar-benar yatim karena banyak tugas musiman atau tahunan - sehingga situs web hanya berjalan selama 3-4 bulan per tahun (sebagai contoh, formulir W2 harus diajukan secara elektronik 1/31, sehingga pemrosesan situs web ini hanya berjalan dari pertengahan Januari hingga akhir April).

Apa yang dilakukan adalah kombinasi dari:
* tanyakan setiap pengembang apakah mereka menggunakan beberapa database atau yang lain (email ini akan keluar setiap bulan atau setiap kali backup terlalu lama).
* bawa database menjadi offline dan lihat siapa yang mengeluh.
* ganti nama server untuk melihat siapa yang mengeluh.

Karena bos berambut runcing hanya bersedia untuk mengizinkan dokumentasi "lengkap dan lengkap", wiki secara tegas dilarang, dan pengurangan staf menyebabkan penurunan dramatis dalam dokumentasi yang memenuhi standar.

Jika itu terserah saya, akan ada halaman wiki per server dengan nama kontak untuk setiap basis data (dan mungkin deskripsi singkat untuk apa basis data itu). Basis data yang tidak berdokumen pada wiki akan menjadi permainan yang adil untuk dihapus.

Kami memiliki satu klien keuangan besar yang masih menggunakan SQL Server 2000 hingga 2009, jadi kami harus tetap menjalankan satu contoh SQL Server 2000 sampai klien itu akhirnya pindah ke SQL Server 2005.

3
Tangurena

Solusi berikutnya menunjukkan halaman sementara total, bersih dan kotor dalam MB untuk database tertentu dalam instance Anda (ditemukan di internet dan sedikit dimodifikasi):

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)

atau

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

atau

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
2
SQL Server Frant

Dua alternatif lain adalah:

  1. Buat pemicu pada DB yang akan memberi tahu Anda (atau menyimpan ke tabel) aktivitas apa pun.
  2. Aktifkan audit pada DBs.

    • Tergantung pada versi DB Anda.
2
StanleyJohns