Bagaimana saya bisa tahu jika database SQL Server masih digunakan?

33

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 utas 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.

jsauni
sumber
1
Banyak diskusi hebat di bawah ini tetapi juga melihat posting blog ini .
Aaron Bertrand

Jawaban:

29

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 melihat untuk menggunakan penyaringan jejak profiler sisi server pada database itu.

NicCain
sumber
24
Aturan # 1 sebagai DBA: Jangan pernah melakukan perubahan yang Anda tidak bisa mundur dengan cepat jika Anda harus.
Gayus
14

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 tidak ada yang akan mengakses data? Untuk data keuangan, Anda memiliki beberapa item berjalan harian, mingguan, bulanan, triwulanan, semi-tahunan, dan tahunan. Tetapi apakah satu tahun cukup lama? Saya juga telah melihat permintaan agar data 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 membuat skrip pada 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.

SQLRockstar
sumber
Saya sudah memikirkan hal itu, apakah jumlah waktu saya memonitor penggunaan basis data sudah cukup lama. Apakah Anda hanya mengambil sifat dari SQL Server dan membuat panggilan penilaian itu?
jsauni
ya, pada titik tertentu Anda membuat semua orang setuju untuk mencabut sumbatnya, dan untuk memahami bahwa jika beberapa proses jahat gagal, Anda harus mengembalikan semuanya dengan cepat. selama mereka baik-baik saja dengan pemadaman listrik, dan Anda mendapatkan kembali secara online dengan cepat, Anda harus baik-baik saja. tetapi tidak mudah untuk membuat semua orang setuju!
SQLRockstar
13

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 di 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 pastikan Anda memiliki minimal 2 atau 3 cadangan yang dapat dibaca (mengujinya) di lokasi yang terpisah. Anda tidak pernah tahu kapan Anda membutuhkannya.

Sankar Reddy
sumber
8

Kueri berikut menunjukkan DB yang tidak memiliki penggunaan sejak restart terakhir, tanpa bergantung pada rencana kueri yang disimpan dalam cache, karena ia memperlihatkan pengguna IO terhadap indeks (dan heap). Ini semacam jalur menggunakan statistik file virtual, tetapi DMV yang digunakan di sini mengecualikan aktivitas IO 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 dihapus, pasti melakukan OFFLINE / lepaskan atau menolak akses pengguna untuk beberapa waktu, ditambah uji tuntas bertanya sekitar sebelum benar-benar jatuh!

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))
FloorDivision
sumber
Ini cukup bagus jika berfungsi dengan baik. Bisakah saya bertanya mengapa Anda mengambil kombinasi dan membandingkan dengan login_time? Dan mengapa Anda belum memasukkan last_user_update? Apakah ini upaya yang cerdas untuk melihat apakah database mendapatkan SERI tetapi tidak ada seorang pun yang menanyakannya? Atau mungkinkah DMV ini untuk memasukkan semua cap waktu NULL?
Jason
2

Saya telah bekerja di tempat yang memiliki banyak basis data 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 perlu 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 cadangan terlalu lama).
* Bawalah database secara 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.

Tangurena
sumber
2

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.
StanleyJohns
sumber
2

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
Frant SQL Server
sumber
2
Bisakah Anda mengklarifikasi bagaimana cara mengatasi masalah aslinya?
dezso