এসকিউএল সার্ভারের ডাটাবেসের স্থিতি নিরীক্ষণ করার জন্য সবচেয়ে ভাল কোয়েরিটি কী?


20

আমি একটি ডাটাবেসের স্থিতি সম্পর্কে গুরুত্বপূর্ণ তথ্য পেতে একটি ক্যোয়ারী চালাতে সক্ষম হতে চাই। উদাহরণস্বরূপ, আমি চাই ক্যোরিটি ডেটাবেস ভাল অবস্থায় রয়েছে কিনা তা জানাতে সক্ষম হবে।

এই অনুসন্ধানের জন্য আমি উত্তরাধিকার সূত্র:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
  has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
   OR (has_dbaccess(name) = 0)

যদি এই ক্যোয়ারী কোনও ফলাফল দেয়, অনুমান করা হচ্ছে যে ডাটাবেস সন্দেহভাজন বা সম্ভাব্য খারাপ অবস্থায় রয়েছে।

এই কাজ করতে একটি ভাল উপায় আছে কি?


আপনি যদি গভীরতার স্বাস্থ্য পরীক্ষায় আরও আগ্রহী হন তবে আপনি আরও গুরুত্বপূর্ণ ডাব্লুএমআই পারফরম্যান্স কাউন্টার যেমন ডেডলকস, ডিস্ক আইও

@ আরকিউডিসি - আপনি এসকিউএল সার্ভার ২০০৮ এ রাস্তায় নামা থাকলে পরিচালনা ডেটাওয়ারহাউস স্থাপন করা সম্ভবত সহজতর।

@ ব্রেট রোজার্স - 'সেরা / ভাল' কে বিষয়গত প্রশ্ন হিসাবে বিবেচনা করা হয়। আবার বাক্যাংশ।
কোডারহক

দয়া করে কীভাবে পুনঃব্যবস্থা করা যায় সে সম্পর্কে একটি পরামর্শ দিন এবং আমি আনন্দের সাথে এটি বিবেচনা করব। আমি "সেরা অনুশীলন" হিসাবে "সেরা" খুঁজছি। এটি আমার কাছে বাক্যাংশ দেওয়ার সঠিক উপায় বলে মনে হচ্ছে।
ব্রেট রোজার

@ ব্রেট - ভাল! আপনি 'সেরা' পেয়েছেন বলে আনন্দিত :)
কোডারহক

উত্তর:


12

যদি আপনি এসকিউএল 2005+ ব্যবহার করেন এবং কেবলমাত্র ডিবি নামটি ফিরে আসতে চান যেখানে ডিবি "অনলাইন" অবস্থায় নেই আমি এইটি ব্যবহার করব:

SELECT
    name
FROM sys.databases
WHERE state != 0;

মনে রাখবেন যে মিররিং বা লগ শিপিংয়ে অংশ নেওয়া ডাটাবেসগুলি অনলাইনে থাকবে না বা নিয়মিতভাবে রাষ্ট্র পরিবর্তন করতে পারে। Sys.databases সম্পর্কে আরও তথ্যের জন্য না DMV এখানে ডকুমেন্টেশন দেখুন: http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

আমি নতুন ব্যবহার করতে চাই sys.databases না sydatabases কিন্তু অন্যথায় এই ঠিক আছে

কমপক্ষে, আপনার DATABASEPROPERTY কল দরকার নেই

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)

2

আমি যেভাবে ডিবি স্থিতিটি দেখতে পেয়েছি তা হ'ল DATABASEPROPERTYEX (ডাটাবেস, সম্পত্তি) ফাংশনটি এইভাবে ব্যবহার করা:

নির্বাচন করুন ডেটাবেসপ্রপেক্টিেক্স ('অ্যাডভেঞ্চার ওয়ার্কস', 'স্ট্যাটাস')।

স্ট্যাটাসগুলি বেশ স্ব-বর্ণনামূলক:

অনলাইন = ডেটাবেস ক্যোয়ারির জন্য উপলব্ধ।

অফলাইন = ডেটাবেস স্পষ্টভাবে অফলাইনে নেওয়া হয়েছিল।

RESTORING = ডাটাবেস পুনরুদ্ধার করা হচ্ছে।

পুনরুদ্ধার = ডাটাবেস পুনরুদ্ধার করছে এবং এখনও অনুসন্ধানের জন্য প্রস্তুত নয়।

SUSPECT = ডাটাবেস পুনরুদ্ধার হয়নি।

EMERGENCY = ডেটাবেস জরুরি, কেবল পঠনযোগ্য অবস্থায় state সিসাদমিন সদস্যদের কাছে অ্যাক্সেস সীমাবদ্ধ

ইন ওলা Hallengren এর ব্লগ (একটি SQL সবচেয়ে মূল্যবান খেলোয়াড়), ডাটাবেজ অখণ্ডতা যাচাই করার জন্য তার হাতিয়ার, আমি দেখেছি তিনি ডিবি অবস্থা ক্যোয়ারীতে দৃশ্য sys.database_recovery_status ব্যবহার করছে। এই ভিউতে যদি ডিবিটির সারি থাকে তবে এটি লাইভ এবং লাথি মারছে, যদি তা না হয় তবে এটি অফলাইন।

পিএস: আপনি যে ডাটাবেসপ্রোপার্টি ফাংশনটি ব্যবহার করছেন তা ভবিষ্যতের সংস্করণগুলিতে মুছে ফেলা হবে, সুতরাং ডাটাবেসপ্রোপার্টিেক্স এটি প্রতিস্থাপন করছে।


আমি মনে করি না যে প্রশ্নকারী নির্দিষ্ট পুনরুদ্ধারের তথ্য খুঁজছিলেন, বরং সাধারণ স্বাস্থ্য পরীক্ষার জন্য একটি প্রশ্ন query অফলাইনে ডাটাবেসগুলি দেখার জন্য আপনি যথেষ্ট সুযোগ-সুবিধা নিয়ে চলেছেন তা ধরে নিয়ে ডিবি স্ট্যাটাসটি খুঁজে পাওয়ার জন্য সিস.ডেটাবেসগুলি আরও ভাল স্পট। এটি যদি sys.databases এ না থাকে তবে এটি ফেলে দেওয়া বা বিচ্ছিন্ন।
অ্যান্ড্রুএসকিউএল

1
হ্যাঁ, আপনি কী বলতে চাইছেন তা আমি জানি, তবে আমি বলেছিলাম যে তিনি কেবল এই ভিউতে ডিবি উপস্থিত ছিলেন কিনা তা যাচাই করছিলেন, যদি হ্যাঁ, তিনি ডাটাবেসটিকে অ্যাক্সেসযোগ্য হিসাবে বিবেচনা করেছিলেন, তবে না, তিনি ডিবিটিকে অ্যাক্সেসযোগ্য হিসাবে বিবেচনা করেছিলেন। সুতরাং এটি দ্বিতীয় চেক হতে পারে :)। আমার কাছে, সূক্ষ্ম সূচনা করে স্বাস্থ্য পরীক্ষা করা সেই ডিবি থেকে যে কোনও একটি ছোট টেবিলকে জিজ্ঞাসা করা হবে এবং যদি সেই কোয়েরিতে কোনও ডেটা ফেরত আসে, আমি ডিবিটিকে প্রথম দর্শনে অ্যাক্সেসযোগ্য বিবেচনা করব।
মেরিয়ান

2

নির্দিষ্ট শর্তগুলির জন্য জিজ্ঞাসা করার পরিবর্তে, আমি sys.databases- এ যে কোনও কিছুর দিকে একবার নজর রাখি যেখানে state_desc <> 'অনলাইন'। এছাড়াও, আপনি যা করতে চাইছেন তার উপর নির্ভর করে has_dbaccess কিছু ভুল ধনাত্মকতা ফেলে দিতে পারে।


0

আমার এটা ভাল লেগেছে:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.