ฉันจะทราบได้อย่างไรว่าฐานข้อมูล SQL Server ยังคงถูกใช้อยู่


33

เรากำลังมองหาการรื้อถอนอินสแตนซ์ของ SQL Server ที่ยังมีฐานข้อมูลอยู่สองสามตัว

ฉันจะรู้ได้อย่างไรว่าผู้ใช้หรือแอปพลิเคชันเว็บยังคงใช้งานอยู่หรือไม่

ฉันพบเธรดฟอรัมซึ่งมีเคียวรี T-SQL ที่คุณสามารถเรียกใช้เพื่อดึงวันที่สืบค้นล่าสุด ดูเหมือนว่าจะใช้งานได้ แต่ฉันต้องการทราบว่าข้อมูลนี้ถูกต้องเพียงพอที่จะลบฐานข้อมูลหรือไม่ ใช่ไหม?

หากคุณมีวิธีการอื่นที่จะช่วยเช่นกัน


1
การอภิปรายที่ดีมากมายด้านล่าง แต่ยังเห็นโพสต์บล็อกนี้
Aaron Bertrand

คำตอบ:


29

คุณจะต้องเกี่ยวข้องกับรายการที่ถูกลบออกจากแคชและที่คุณพลาดหรือสำหรับฐานข้อมูลที่มีการใช้งานไม่บ่อยนัก

แทนที่จะปล่อยฐานข้อมูลออกจากมือให้วางทั้งออฟไลน์เพื่อป้องกันการเข้าถึงโดยไม่ปล่อยหรือในโหมด RESTRICTED_USER เพื่อ จำกัด การเข้าถึง การทำเช่นนี้คุณสามารถปล่อยให้พวกเขาอยู่ในสถานะนั้นเป็นเวลาหนึ่งหรือสองเดือนเพื่อตรวจสอบและดูว่ามีการใช้งานเป็นครั้งคราว

คุณสามารถใช้การกรองการติดตามตัวสร้างโปรไฟล์ฝั่งเซิร์ฟเวอร์บนฐานข้อมูลนั้นได้


24
กฎข้อที่ 1 ของการเป็น DBA: อย่าทำการเปลี่ยนแปลงใด ๆ ที่คุณไม่สามารถถอยออกได้อย่างรวดเร็วหากคุณต้องการ
ออกุสตุส

14

นี่คือวิธีที่ฉันใช้ในอดีต:

  1. ใช้ฐานข้อมูลออฟไลน์ / แยกออก
  2. ปฏิเสธการเข้าถึงของผู้ใช้ / ล็อกอิน
  3. การติดตาม Profiler

ปัญหาคือ: คุณรอนานแค่ไหนก่อนที่จะมั่นใจว่าไม่มีใครเข้าถึงข้อมูลได้? สำหรับข้อมูลทางการเงินคุณมีรายการบางรายการที่ทำงานรายวันรายสัปดาห์รายเดือนรายไตรมาสรายครึ่งและรายปี แต่ปีนี้นานพอไหม ฉันเคยเห็นคำขอให้จัดเก็บข้อมูลไว้อย่างน้อย 7 ปีและในกรณีหนึ่งฉันได้รับแจ้งว่าข้อมูลในระบบเดียวจำเป็นต้องมีตลอดไปแม้ว่าจะไม่มีใครใช้ก็ตาม

คำแนะนำที่ดีที่สุดคือ: ไม่ว่าคุณจะทำอะไรเพื่อปิดการเข้าถึงตรวจสอบให้แน่ใจว่าคุณสามารถเปิดใช้งานได้ทันที ฉันพบว่าการถอดออกทำงานได้ดีที่สุดสำหรับสิ่งนี้ ฉันเพียงแค่สคริปต์ออก reattach และสอนทีมของฉัน "ถ้าใครเคยถามว่ามันอยู่ที่ไหนรันสคริปต์นี้" นั่นทำให้เรามีโอกาสที่ดีที่สุดในการนำสิ่งต่าง ๆ กลับคืนมาโดยเร็วที่สุด


ฉันคิดถึงเรื่องนั้นไม่ว่าจะใช้เวลานานแค่ไหนในการตรวจสอบการใช้ฐานข้อมูลก็เพียงพอแล้ว คุณเพียงใช้ลักษณะของ SQL Server และทำการเรียกวิจารณญาณนั้นหรือไม่?
jsauni

ใช่ในบางจุดคุณจะทำให้ทุกคนตกลงที่จะดึงปลั๊กและเข้าใจว่าหากกระบวนการโกงบางอย่างล้มเหลวคุณจะต้องนำสิ่งต่าง ๆ กลับคืนมาอย่างรวดเร็ว ตราบใดที่พวกเขาตกลงกับการหยุดทำงานและคุณกลับมาออนไลน์ได้อย่างรวดเร็วคุณควรจะสบายดี แต่มันไม่ง่ายเลยที่จะให้ทุกคนเห็นด้วย!
SQLRockstar

13

ฉันเห็นด้วยกับคำแนะนำของเขา หากคุณต้องแน่ใจว่าคุณจะต้องไปกับ Profiler (การติดตามด้านการบริการ) เพราะแบบสอบถาม SQL บางส่วนจะไม่ถูกแคชหรือด้วยเหตุผลใดก็ตามที่แคชกระบวนการอาจถูกกำจัด

ปกติฉันจะตรวจสอบข้อมูลสถิติไฟล์เสมือนเพื่อดูว่ามีการอ่านหรือการเขียนที่เกิดขึ้นที่ระดับไฟล์ OS หรือไม่ แม้ว่าฐานข้อมูลจะไม่ทำงานคุณจะยังเห็นการอ่าน / เขียนขนาดเล็กถ้าคุณกำลังทำการสำรองข้อมูลบันทึกการสำรองข้อมูลเต็มรูปแบบอื่น ๆ ... แต่จะทำให้คุณมีความคิดในการอ่าน / เขียนกิจกรรมบนฐานข้อมูลนั้น

ก่อนที่จะวางฐานข้อมูลใด ๆ ฉันจะทำให้แน่ใจว่าคุณมีการสำรองข้อมูลอย่างน้อย 2 หรือ 3 ที่สามารถอ่านได้ (ทดสอบพวกเขา) ในสถานที่ที่แยกต่างหาก คุณไม่มีทางรู้ว่าคุณต้องการพวกเขา


8

แบบสอบถามต่อไปนี้แสดงฐานข้อมูลที่ไม่มีการใช้งานตั้งแต่การรีสตาร์ทครั้งล่าสุดโดยไม่ต้องพึ่งพาแผนคิวรีที่ถูกเก็บไว้ในแคชเนื่องจากจะแสดง user IO เทียบกับดัชนี (และฮีป) นี่คือการเรียงลำดับของการใช้สถิติไฟล์เสมือน แต่ DMV ที่ใช้ที่นี่ยกเว้นกิจกรรม IO จากการสำรองข้อมูล ไม่จำเป็นต้องทำให้การติดตาม profiler ทำงานอยู่ไม่จำเป็นต้องเรียกใช้หรือตรวจสอบ แน่นอนถ้าคุณรีสตาร์ทเซิร์ฟเวอร์ SQL ของคุณบ่อยๆ (หรือคุณแนบ / ปิดฐานข้อมูลบ่อย ๆ ) สิ่งนี้อาจไม่ใช่วิธีที่จะไป :-)

ต้องบอกว่ายังคงยอมรับว่าแม้ว่าแบบสอบถามนี้ดูเหมือนว่าจะยืนยันว่าฐานข้อมูลสามารถลบทิ้งได้แน่นอนออฟไลน์ / แยกออกหรือปฏิเสธการเข้าถึงของผู้ใช้เป็นเวลารวมทั้งความขยันเนื่องจากการถามรอบก่อนที่จะลดลงจริง!

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

มันค่อนข้างดีถ้ามันใช้งานได้ดี ฉันถามได้ไหมว่าทำไมคุณถึงรวมตัวกันและเปรียบเทียบกับ login_time และทำไมคุณถึงไม่รวม last_user_update นี่เป็นความพยายามที่ชาญฉลาดในการดูว่าฐานข้อมูลได้รับการแทรกหรือไม่ แต่ไม่มีใครสอบถามเลยหรือไม่ หรือเป็นไปได้ที่ DMV นี้จะรวมการประทับเวลา NULL ทั้งหมดหรือไม่
Jason

2

ฉันทำงานในสถานที่ที่มีฐานข้อมูลเด็กกำพร้าและกึ่งกำพร้าจำนวนมาก เป็นการยากที่จะบอกว่าพวกเขาเป็นเด็กกำพร้าจริงๆหรือไม่เนื่องจากมีหลายงานตามฤดูกาลหรือเป็นประจำทุกปี - เพื่อให้เว็บไซต์ทำงานเพียง 3-4 เดือนต่อปีเท่านั้น (ตัวอย่างเช่นรูปแบบ W2 ต้องยื่นแบบอิเล็กทรอนิกส์ 1/31 ดังนั้นการประมวลผลเว็บไซต์ สิ่งเหล่านี้วิ่งจากกลางเดือนมกราคมถึงสิ้นเดือนเมษายน

สิ่งที่ได้ทำคือการรวมกันของ:
* ถามนักพัฒนาทุกคนว่าพวกเขากำลังใช้ฐานข้อมูลบางส่วนหรืออื่น ๆ (อีเมลเหล่านี้จะออกไปทุกเดือนหรือเมื่อใดก็ตามที่การสำรองข้อมูลใช้เวลานานเกินไป)
* ใช้ฐานข้อมูลออฟไลน์และดูว่าใครบ่น
* เปลี่ยนชื่อเซิร์ฟเวอร์เพื่อดูว่าใครบ่น

เนื่องจากเจ้านายที่มีผมแหลมเพียง แต่เต็มใจที่จะอนุญาตให้ใช้เอกสาร "เต็มและสมบูรณ์" วิกินั้นถูกห้ามอย่างชัดแจ้งและการลดพนักงานนำไปสู่การลดลงอย่างมากของเอกสารที่ตรงตามมาตรฐาน

ถ้ามันขึ้นอยู่กับฉันจะมีหน้าวิกิต่อเซิร์ฟเวอร์ที่มีชื่อผู้ติดต่อสำหรับแต่ละฐานข้อมูล (และอาจเป็นคำอธิบายสั้น ๆ ว่าฐานข้อมูลนั้นมีไว้เพื่ออะไร) ฐานข้อมูลใด ๆ ที่ไม่มีเอกสารในวิกิจะเป็นเกมที่ยุติธรรมสำหรับการลบ

เรามีลูกค้าการเงินรายใหญ่หนึ่งรายที่ยังใช้ SQL Server 2000 จนถึงปลายปี 2009 ดังนั้นเราจึงต้องเก็บอินสแตนซ์ของ SQL Server 2000 หนึ่งตัวไว้จนกว่าไคลเอ็นต์นั้นจะย้ายไปยัง SQL Server 2005 ในที่สุด


2

อีกสองทางเลือกคือ:

  1. สร้างทริกเกอร์บนฐานข้อมูลที่จะแจ้งให้คุณทราบ (หรือจัดเก็บลงในตาราง) ของกิจกรรมใด ๆ
  2. เปิดใช้งานการตรวจสอบใน DBs

    • ขึ้นอยู่กับรุ่นฐานข้อมูลของคุณ

2

วิธีแก้ไขปัญหาถัดไปจะแสดงหน้าทั้งหมดชั่วคราวที่สะอาดและสกปรกเป็น MB สำหรับฐานข้อมูลเฉพาะภายใต้อินสแตนซ์ของคุณ (พบได้บนอินเทอร์เน็ตและแก้ไขเล็กน้อย):

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)

หรือ

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

หรือ

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
คุณช่วยอธิบายได้ว่าวิธีนี้แก้ปัญหาเดิมได้อย่างไร
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.