Làm cách nào để biết cơ sở dữ liệu SQL Server vẫn đang được sử dụng?


33

Chúng tôi đang tìm cách ngừng hoạt động một phiên bản SQL Server có một vài cơ sở dữ liệu vẫn còn trên đó.

Làm cách nào để biết họ vẫn đang được người dùng hoặc ứng dụng web sử dụng?

Tôi tìm thấy một chủ đề diễn đàn có truy vấn T-SQL mà bạn có thể chạy để lấy ngày truy vấn cuối cùng. Nó có vẻ hoạt động nhưng tôi muốn biết thông tin này có đủ hợp lệ để bỏ cơ sở dữ liệu hay không. Là nó?

Nếu bạn có phương pháp thay thế cũng sẽ giúp.


1
Rất nhiều cuộc thảo luận tuyệt vời dưới đây nhưng cũng thấy bài viết trên blog này .
Aaron Bertrand

Câu trả lời:


29

Bạn sẽ phải quan tâm đến các mục đã bị xóa khỏi bộ đệm và bạn đã bỏ lỡ hoặc cho các cơ sở dữ liệu sử dụng không thường xuyên.

Thay vì bỏ các cơ sở dữ liệu ra khỏi tay, hãy đặt OFFLINE để ngăn truy cập mà không bỏ chúng hoặc ở chế độ RESTRICTED_USER để hạn chế quyền truy cập. Làm điều này bạn có thể để chúng ở trạng thái đó trong một hoặc hai tháng để kiểm tra và xem nếu có sử dụng không thường xuyên.

Bạn cũng có thể tìm cách sử dụng bộ lọc theo dõi hồ sơ phía máy chủ trên cơ sở dữ liệu đó.


24
Quy tắc số 1 về việc trở thành một DBA: Không bao giờ thực hiện bất kỳ thay đổi nào mà bạn không thể rút lui nhanh chóng nếu phải.
Gaius

14

Đây là những phương pháp tôi đã sử dụng trong quá khứ:

  1. Lấy cơ sở dữ liệu ngoại tuyến / Detach
  2. Truy cập người dùng / đăng nhập
  3. Hồ sơ theo dõi

Vấn đề là ở đây: bạn đợi bao lâu trước khi bạn chắc chắn rằng không ai sẽ truy cập dữ liệu? Đối với dữ liệu tài chính, bạn có một số mục chạy hàng ngày, hàng tuần, hàng tháng, hàng quý, nửa năm và hàng năm. Nhưng một năm có đủ dài không? Tôi cũng đã thấy các yêu cầu để dữ liệu được lưu trữ trong ít nhất 7 năm và trong một trường hợp tôi được thông báo rằng dữ liệu trong một hệ thống cần phải ở đó mãi mãi, mặc dù không ai sử dụng nó.

Lời khuyên tốt nhất là đây: bất cứ điều gì bạn làm để tắt quyền truy cập, hãy chắc chắn rằng bạn có thể bật lại ngay lập tức. Tôi thấy rằng các công cụ làm việc tốt nhất cho việc này. Tôi chỉ đơn giản là viết kịch bản ra reattach và hướng dẫn nhóm của tôi "nếu có ai hỏi nó ở đâu, hãy chạy tập lệnh này". Điều đó đã cho chúng tôi cơ hội tốt nhất để đưa mọi thứ trở lại nhanh nhất có thể.


Tôi đã nghĩ về điều đó, cho dù lượng thời gian tôi theo dõi việc sử dụng cơ sở dữ liệu có đủ lâu hay không. Bạn có nhận bản chất của SQL Server và thực hiện cuộc gọi phán xét đó không?
jsauni

vâng, đến một lúc nào đó bạn khiến mọi người đồng ý rút phích cắm, và để hiểu rằng nếu một quá trình lừa đảo nào đó thất bại, bạn sẽ cần phải nhanh chóng đưa mọi thứ trở lại. miễn là họ ổn khi bị cúp điện, và bạn nhanh chóng đưa mọi thứ trở lại trực tuyến, bạn sẽ ổn thôi. nhưng không dễ để khiến mọi người đồng ý!
SQLRockstar

13

Tôi đồng ý với Nic với lời khuyên của anh ấy. Nếu bạn cần chắc chắn, thì bạn sẽ phải sử dụng Profiler (theo dõi bên dịch vụ) vì một số truy vấn SQL sẽ không được lưu trong bộ nhớ cache hoặc vì bất kỳ lý do nào mà bộ đệm thủ tục có thể bị xóa.

Tôi thường sẽ kiểm tra thông tin thống kê tệp ảo để xem liệu có bất kỳ đọc hoặc ghi xảy ra ở cấp độ tệp OS. Ngay cả khi cơ sở dữ liệu KHÔNG hoạt động, bạn vẫn sẽ thấy một lần đọc / ghi nhỏ nếu bạn đang sao lưu nhật ký, sao lưu toàn bộ, v.v ... nhưng điều đó cũng sẽ cho bạn ý tưởng về hoạt động đọc / ghi trên cơ sở dữ liệu đó.

Trước khi bỏ bất kỳ cơ sở dữ liệu nào, tôi sẽ đảm bảo bạn có ít nhất 2 hoặc 3 bản sao lưu có thể đọc được (kiểm tra chúng) ở các vị trí riêng biệt. Bạn không bao giờ biết khi nào bạn cần chúng.


8

Truy vấn sau đây cho thấy các DB không có sử dụng kể từ lần khởi động lại cuối cùng, mà không dựa vào các gói truy vấn được giữ trong bộ đệm, vì nó hiển thị IO của người dùng so với các chỉ mục (và heaps). Đây là loại dọc theo các dòng sử dụng số liệu thống kê tệp ảo, nhưng DMV được sử dụng ở đây loại trừ hoạt động IO khỏi các bản sao lưu. Không cần phải giữ một dấu vết hồ sơ chạy, không cần kích hoạt hoặc kiểm toán. Tất nhiên, nếu bạn khởi động lại máy chủ SQL của mình thường xuyên (hoặc bạn thường xuyên đính kèm / tắt cơ sở dữ liệu) thì đây có thể không phải là cách để đi :-)

Tuy nhiên, vẫn đồng ý rằng ngay cả khi truy vấn này dường như xác nhận rằng DB có thể bị hủy, chắc chắn hãy thực hiện OFFLINE / tách hoặc từ chối quyền truy cập của người dùng trong một thời gian, cộng với bất kỳ sự cẩn trọng nào về việc hỏi xung quanh trước khi thực sự bỏ qua!

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

Điều này là khá tuyệt nếu nó hoạt động tốt. Tôi có thể hỏi tại sao bạn lại tham gia và so sánh với login_time không? Và tại sao bạn chưa bao gồm last_user_update? Đây có phải là một nỗ lực thông minh để xem liệu một cơ sở dữ liệu có bị TẠO hay không nhưng không ai truy vấn nó? Hoặc DMV này có thể bao gồm tất cả các dấu thời gian NULL không?
Jason

2

Tôi đã làm việc tại một nơi có số lượng lớn cơ sở dữ liệu mồ côi và bán mồ côi. Thật khó để biết liệu họ có thực sự mồ côi hay không vì nhiều nhiệm vụ là thời vụ hoặc hàng năm - vì vậy trang web chỉ hoạt động trong 3-4 tháng mỗi năm (ví dụ, các mẫu W2 cần phải được nộp điện tử 1/31, vì vậy việc xử lý trang web chúng chỉ chạy từ giữa tháng 1 đến hết tháng 4).

Những gì đã được thực hiện là sự kết hợp của:
* hỏi mọi nhà phát triển nếu họ đang sử dụng một số cơ sở dữ liệu khác (các email này sẽ bị mất hàng tháng hoặc bất cứ khi nào các bản sao lưu mất quá nhiều thời gian).
* lấy cơ sở dữ liệu ngoại tuyến và xem ai phàn nàn.
* đổi tên máy chủ để xem ai phàn nàn.

Vì ông chủ tóc nhọn chỉ sẵn sàng cho phép tài liệu "đầy đủ và hoàn chỉnh", một wiki bị cấm rõ ràng và việc cắt giảm nhân sự dẫn đến sự sụt giảm nghiêm trọng trong tài liệu đáp ứng tiêu chuẩn.

Nếu nó tùy thuộc vào tôi, sẽ có một trang wiki trên mỗi máy chủ với tên liên hệ cho mỗi cơ sở dữ liệu (và có thể mô tả ngắn gọn về cơ sở dữ liệu đó để làm gì). Bất kỳ cơ sở dữ liệu nào không có giấy tờ trên wiki sẽ là trò chơi công bằng để xóa.

Chúng tôi đã có một khách hàng tài chính lớn vẫn đang sử dụng SQL Server 2000 vào cuối năm 2009, vì vậy chúng tôi phải duy trì một phiên bản SQL Server 2000 cho đến khi khách hàng đó cuối cùng chuyển sang SQL Server 2005.


2

Hai lựa chọn khác là:

  1. Tạo các kích hoạt trên DB sẽ thông báo cho bạn (hoặc lưu trữ vào các bảng) về bất kỳ hoạt động nào.
  2. Cho phép kiểm toán trên các DB.

    • Phụ thuộc vào phiên bản DB của bạn.

2

Giải pháp tiếp theo hiển thị tổng số trang tạm thời, sạch và bẩn trong MB cho các cơ sở dữ liệu cụ thể trong trường hợp của bạn (tìm thấy trên internet và sửa đổi một chút):

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)

hoặc là

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

hoặc là

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
Bạn có thể làm rõ làm thế nào để giải quyết vấn đề ban đầu?
dezso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.