এসকিউএল সার্ভার ডিবি রাতারাতি অকেজো হয়ে যায়


9

গতকাল, আমার এসকিউএল সার্ভার ডাটাবেস ভাল ছিল। আজ এটি প্রায় অকার্যকর - আমি যখন এটি আঘাত করি তার উপর নির্ভর করে এটি পাঁচ থেকে বিশের মধ্যে একটি ফ্যাক্টর দ্বারা ধীর হয়ে যায়।

সারারাত লোড প্রক্রিয়াতে কিছু ডেটা সার্ভারে যুক্ত করা হয়েছিল, তবে ভলিউমের মতো কিছুই যা কোনও ডেটাবেসকে বেশি প্রভাবিত করবে। প্রায় 50,000 সরল পাঠ্য রেকর্ড (কোনও এক্সএমএল বা অন্যান্য ফ্রিপি নেই)।

আমরা এটি পুনরায় চালু করার আগে এই সকালে সার্ভারটি প্যাচ করা হয়েছিল। তবে আমাদের অন্যান্য ডাটাবেস সার্ভারগুলির মধ্যেও যে প্যাচ পেয়েছে তারা আলাদা আচরণ করছে না।

রিসোর্স মনিটরের পরামর্শ থেকে মনে হয় যে এর ডিস্ক আইওতে এটি দোষ রয়েছে। এটি পুরো সময়টিতে .mdf ফাইলের প্রায় 100% ক্ষমতার সাথে চলেছে, এমনকি ডাটাবেসে খুব বেশি কিছু ঘটছে না তখনও। টেম্পলগ.ল্ডফের অ্যাক্সেসও বেশ উচ্চতায় চলছে running

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

আমি মনে করি প্যাচটির সাথে অবশ্যই কিছু করার দরকার - এটি কোনও সহ-ঘটনা বলে মনে হয়। একজন সহকর্মী নিশ্চিত হন যে এটি ডেটা লোডের ফলে এমডিএফের আকার এমন এক পর্যায়ে বেড়ে গেছে যেখানে এটি কার্যকর করার পরিকল্পনাগুলি অকার্যকর হয়ে উঠেছে।

পৃথিবীতে কি ঘটেছিল? আমরা কীভাবে এটি জানতে পারি এবং এটি ঠিক করার জন্য আমরা কী করতে পারি?

সম্পাদনা করুন:

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

এটি এসকিউএল সার্ভার ২০০৮ আর 2 এর স্ট্যান্ডার্ড সংস্করণ। SELECT @@VERSIONদেয়:

মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৮ আর 2 (এসপি 2) - 10.50.4033.0 (এক্স 64)
জুলাই 9 2014 16:04:25
কপিরাইট (সি) উইন্ডোজ এনটি 6.1 তে মাইক্রোসফ্ট কর্পোরেশন স্ট্যান্ডার্ড সংস্করণ ( -৪ -বিট) (বিল্ড 7601: সার্ভিস প্যাক 1) (হাইপারভাইজার )

সার্ভারটিতে GB২ জিবি র‌্যাম এবং তিনটি কোয়াড-কোর 2 জিএইচজেড প্রসেসর রয়েছে।

প্যাচিংটি কেবল উইন্ডোজে প্রয়োগ করা হয়েছিল। প্যাচ ব্যতীত অন্য কোনও পরিবর্তন হয়নি।

নির্বাচিত সেটিংস:

_id     name                        value   minimum     maximum     value_in_use    description                                 is_dynamic  is_advanced
1540    min memory per query (KB)   1024    512         2147483647  1024            minimum memory per query (kBytes)           1           1
1541    query wait (s)              -1      -1          2147483647  -1              maximum time to wait for query memory (s)   1           1
1543    min server memory (MB)      0       0           2147483647  16              Minimum size of server memory (MB)          1           1
1544    max server memory (MB)      65536   16          2147483647  65536           Maximum size of server memory (MB)          1           1

আপডেট: ইন্ডেক্স এবং টেবিলগুলি বিভিন্ন ডিস্ক পার্টিশনে স্থানান্তর করা জিনিসগুলির উন্নতি করে বলে মনে হচ্ছে। এইরকম কঠোর ফলাফলের সাথে আমরা কীভাবে হঠাৎ কোনও টিপিংয়ে পৌঁছতে পারলাম তা নিয়ে আমি এখনও বিভ্রান্ত।


আপনি কি 5 মিনিটের জন্য sp_Woisactive চালাতে পারেন এবং আউটপুটটি টেবিলের কাছে ক্যাপচার করতে পারেন? আপনি এখান থেকে এটি ডাউনলোড করতে পারেন এবং এটি আপনাকে টেবিলে আউটপুট ক্যাপচার করতে পারে তা দেখায়
কিন শাহ

ঠিক আছে, আপনি যদি সার্ভারটি পুনরায় চালু করেন, তার অর্থ আপনার বাছাই করা ডেটা বাফার পুল থেকে ফেলে দেওয়া হয়েছিল, এবং আপনার সমস্ত ক্যাশেড এক্সিকিউশন প্ল্যানগুলিও ফেলে দেওয়া হয়েছিল। এর অর্থ এই যে এসকিউএল সার্ভারকে উভয়ই র‌্যাম্প আপ করতে হবে - প্রতিটি সম্পাদন পরিকল্পনা পুনরায় সংকলন করতে হবে, এবং যদি পরিসংখ্যানগুলি বাসি হয় তবে আপনি সম্ভবত সবচেয়ে দক্ষ পরিকল্পনাগুলি নাও পেতে পারেন। এর অর্থ হ'ল ডিস্ক থেকে ডেটা মেমোরিতে পড়তে হবে, যখন পুনরায় চালু করার আগে সম্ভবত এটি মেমরিতে থাকা ডেটা সহ গুনগুন করছিল। এটি স্বল্পকালীন হওয়া উচিত।
অ্যারন বার্ট্র্যান্ড

অ্যারনবার্ট্র্যান্ড আট ঘন্টা ধরে এমন হয়েছে। আমরা প্যাচিংয়ের জন্য সার্ভারটি নিয়মিত পুনরায় বুট করি এবং এর আগে এর আগে কখনও লক্ষ্য করি নি।
বব টাওয়ে

1
কনফিগারেশন সেটিংস পরীক্ষা করতে UI ব্যবহার করবেন না। SELECT * FROM sys.configurations;- আপনি চাই value, value_in_useমত জিনিস max server memory (MB)। এছাড়াও বিল্ড নম্বরটি কার্যকর SELECT @@VERSION;হবে, পাশাপাশি এটি কোনও হাইপারভাইজারে রয়েছে কিনা এবং গতকাল থেকে হোস্টে কিছু পরিবর্তন হয়েছে কিনা (বা শেষ বারের থেকে এসকিউএল সার্ভার পুনরায় চালু হওয়ার পরে)।
অ্যারন বারট্র্যান্ড

2
আপনি কোন ধরণের আইও সাবসিস্টেম ব্যবহার করছেন? সান, লোকাল ডিস্ক ইত্যাদি? আপনার কাকতালীয়ভাবে ড্রাইভ খারাপ হওয়ার কোনও সুযোগ আছে কি? এছাড়াও আপনার ডিবিগুলির কোনও কোনও ওএস ফাইলের মতো একই জায়গায় সঞ্চিত আছে? এবং শেষ প্রশ্ন। কোনও ওএস আপগ্রেড করার আগে আমাদের প্রক্রিয়ার অংশটি ছিল আগে ভিএম স্ন্যাপশট নেওয়া। দুর্ভাগ্যক্রমে দায়বদ্ধ ব্যক্তি এটি প্রতিশ্রুতি দিতে ভুলে গেছেন। খুব দ্রুত পুরো সিস্টেমটি ধীর এবং ধীর হয়ে উঠল। আপনার কি কোন সুযোগ হয়েছে?
কেনেথ ফিশার 16

উত্তর:


3

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

আপনার ধীর গতির জন্য সম্ভাব্য দুটি বেস কারণ রয়েছে।

  1. আপনি আপনার সিস্টেম আপগ্রেড করেছেন এবং এটি পুনরায় বুট করেছেন
  2. আপনি এতে একটি গুচ্ছ ডেটা লোড করুন

আসুন এক নং অংশটি একবার দেখুন

আপনার এসকিউএল সার্ভারের কনফিগারেশনটি ভেঙে যেতে পারে। এটি আপনার সার্ভারের গতি এবং ডিস্ক ব্যবহার সম্পর্কিত গুরুতর সমস্যা সৃষ্টি করতে পারে।

আপনার প্রথম সার্ভার সেটিংস প্রথম পরীক্ষা করুন। সেই মৌলিক সেটিংস max server memory, affinity I/O mask, affinity maskএবং max degree of parallelism। আপনার ব্যবহার করে উন্নত বিকল্পগুলি সক্ষম করতে হবে show advanced options

এখানে একটি সম্পূর্ণ স্ক্রিপ্ট:

-- enable advanced options
EXEC sp_configure 'show advanced options',1
-- apply configuration
RECONFIGURE
-- how much memory can the sql server allocate?
EXEC sp_configure 'max server memory'
-- which cpu is used to run I/O operations
EXEC sp_configure 'affinity I/O mask'
-- which cpus can run processes?
EXEC sp_configure 'affinity mask'
-- how many threads can work on one query part?
EXEC sp_configure 'max degree of parallelism'

ফলাফলটি আপনার ইনস্টলেশন পদক্ষেপে আপনার নথিভুক্ত মানগুলির সাথে তুলনা করুন। তারা এখনও কি একই?

আপনার সার্ভারটি এত অদ্ভুত আচরণ করার অনেক কারণ থাকতে পারে। আমি সাধারণত বাজি দেব, যে আপনার max server memoryঠিক ভুল। এটি আপনার এসকিউএল সার্ভারের স্থায়ীভাবে ডেটা পৃষ্ঠাগুলি অদলবদল করবে। সে তার স্মৃতিতে সব ধরে রাখতে পারে না। এর অর্থ হল তাকে ডিস্ক থেকে পৃষ্ঠাগুলি পড়তে হবে, আপডেট করতে হবে, তাত্ক্ষণিকভাবে ফিরে লিখতে হবে। যদি অন্য কোনও আপডেট আসে এবং আপডেটের জন্য একই পৃষ্ঠা ব্যবহার করে, এটি মেমরি থেকে পড়া যায় না। পরিবর্তে সার্ভারটি আবার এটি ডিস্ক থেকে পড়তে হবে। শুধু অদলবদল হচ্ছে ...

আরেকটি সমস্যা হ'ল ডিস্ক বা প্রক্রিয়াগুলিতে উচ্চ সখ্যতা হতে পারে। যদি আপনি এসকিউএল সার্ভারের জন্য ডেডিকেটেড ডিস্কের সাথে একটি শেয়ার্ড সার্ভার (এসকিউএল সার্ভার + অন্যান্য পরিষেবাদি) ব্যবহার করেন (যা বিরল ক্ষেত্রে হতে পারে তবে এটি হতে পারে), এটি আপনার সমস্যা হতে পারে। আপনার সার্ভারে সাধারণত প্রক্রিয়াগুলির জন্য 3 সিপাস এবং I / O এর জন্য একটি ব্যবহৃত হত। অন্যান্য 12 সিপিএস অন্যান্য পরিষেবার জন্য ব্যবহৃত হয়। এই ক্ষেত্রে আপনার অ্যাফিনিটি মাস্কটি ভুল এবং উদাহরণস্বরূপ একটি স্বয়ংক্রিয় কনফিগারেশন ব্যবহার করে। এর অর্থ আপনার সার্ভার প্রসেসের জন্য সমস্ত 16 টি কর এবং I / O গতিশীলভাবে ব্যবহার করে। যদি আপনার বিশাল প্রক্রিয়াগুলি চলমান থাকে তবে তারা ডিস্কে একটি বিশাল বোঝা চাপাতে পারে যা এটি পরিচালনা করতে পারে না। তবে বাস্তবে, আমি বিশ্বাস করি না যে এটি আপনার ক্ষেত্রে। এটি প্রয়োগ করা হলে এটি দ্রুত হবে (এমনকি কিছুটা হলেও) তবে আপনার কেসটি ধীর গতির হয়।

আর একটি সমস্যা খুব বেশি মাত্রায় সমান্তরালতা হতে পারে। যার অর্থ আপনার একটি ক্যোয়ারির একটি আংশিক অংশে অনেকগুলি থ্রেড আইডল করছে। যদি সমান্তরালতা প্রত্যাশা অনুযায়ী কাজ না করে তবে এটি একটি বিশাল ধীরগতির কারণ হতে পারে। তবে এটি মোট আপনার উচ্চ I / O বর্ণনা করবে না।

এখন আসুন অংশ 2 নং দেখুন

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

আপনি উল্লেখ করেছেন যে আপনি ইতিমধ্যে আপনার সূচকগুলি অন্য ডিস্কে স্থানান্তরিত করার চেষ্টা করেছেন যা মনে হয় এটি সাহায্য করবে। আপনি দুটি ভিন্ন ডিস্কে বোঝা ভাগ করে নেওয়ার বিষয়টি ঘটতে পারে।

এটি হতে পারে যে আপনার সূচকগুলি ভঙ্গুর হয়ে গেছে, আপনার পরিকল্পনাগুলি ভঙ্গুর হয়ে গেছে বা আপনার পরিসংখ্যান সবেমাত্র পুরানো।

1. পরিসংখ্যানের শেষ আপডেটটি চেক করতে দেয় আপনি প্রতিটি একক পরিসংখ্যান উপাদানগুলির জন্য ইন্টারফেসের মাধ্যমে ম্যানুয়ালি এটি করতে পারেন। যা একটি ব্যথা হবে। অথবা আপনি এই কোডটি ব্যবহার করে দেখতে পারেন:

SELECT name AS indexname,
STATS_DATE(OBJECT_ID, index_id) AS StatsUpdated
FROM sys.indexes

এটি আপনাকে প্রতিটি সূচক (এবং হিপ) এবং তাদের পিছনের পরিসংখ্যানের উপর একটি সম্পূর্ণ তথ্য দেবে। আপনি চালনা করলেও এর sp_updatestatsঅর্থ এই নয় যে পরিসংখ্যানগুলি আপডেট হয়েছিল। অংশটি যখন কোনও আপডেট বেশ জটিল, আপনি চালনা করেন sp_updatestatsএমনকি auto update statisticsসক্ষম থাকলেও , পরিসংখ্যান ঠিক সময়ে আপডেট করা হবে না। এখানে কয়েকটি প্রান্ত পয়েন্ট রয়েছে, যখন কোনও আপডেট প্রয়োজন / উত্পন্ন হয়:

  • একটি খালি টেবিল এক বা একাধিক সারি পায়
  • 500 টিরও বেশি সারি সহ একটি সারণী 20% + 500 অতিরিক্ত সারি আপডেট করে এবং পরে একটি সন্নিবেশ ঘটে
  • যখন 500 টি সারি একটি সারণীতে পরিবর্তন করা হয়েছিল যা 500 টিরও কম সারি রাখে

এর অর্থ, আপনি আপডেট চালনা করলেও আপনার পরিসংখ্যানগুলি পুরানো হতে পারে।

আপনি উপরের ক্যোয়ারীটি একবার দেখে নিতে পারেন। আপনি যদি কিছু টেবিলে কিছু পুরানো পরিসংখ্যান খুঁজে পান, আপনি এই টেবিলের জন্য একটি ম্যানুয়াল পরিসংখ্যান আপডেট চালাতে চাইতে পারেন:

UPDATE STATISTICS dbo.YourBadTable WITH FULLSCAN

এর পরে, আপনি সমস্ত পুরানো পরিকল্পনা ফেলে দিতে আপনার সার্ভারটিকে পাছায় একটি লাথি দিতে চাইতে পারেন।

DBCC FREEPROCCACHE 

আপনি যদি কেবল সমস্ত ক্যাশে পরিষ্কার করতে চান তবে আপনি এটি পরিবর্তে চালাতে চাইতে পারেন:

DBCC FREESYSTEMCACHE ('ALL')

এটি কেবল পরিকল্পনার ক্যাশে নয়, সমস্ত ক্যাশে পরিষ্কার করবে। আমি সাধারণত সতর্ক করে বলব, এটি উত্পাদন পর্যায়ে প্রোডাকশন সার্ভারে ব্যবহার করতে। তবে আপনার সার্ভারটি বর্তমানে কাজ না করায় আপনি তাদের খুব বেশি ক্ষতি করতে পারবেন না। এটা কিছু সেকেন্ডের জন্য হয়তো 1-2 মিনিট মন্দীভূত পারে সে সব ক্যাশে পুনর্নির্মাণের প্রয়োজন, কিন্তু যে পরে সঠিক পরিকল্পনার সাথে চালানো উচিত।

আর একটি কারণ সম্পূর্ণ খণ্ডিত সূচক হতে পারে। এই বিবৃতিটি ব্যবহার করে এটি পুরো সার্ভারে পরীক্ষা করা যেতে পারে:

SELECT * 
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL)

যদি খণ্ডটি খুব বেশি হয় তবে আপনাকে পুনরায় সংগঠিত করার প্রয়োজন হতে পারে (ফ্র্যাগমেন্টেশন <20%) বা এটি সম্পূর্ণ পুনর্নির্মাণ করতে (> 20%)। এটি আপনার ডিস্কের উপর আরও চাপ নিতে পারে এবং সমস্যার কারণ হতে পারে। অন্যদিকে, সূচকগুলি যদি খুব খারাপ হয় তবে এটি ক্ষতিগ্রস্থ হওয়ার চেয়ে সম্ভবত শেষ পর্যন্ত সহায়তা করবে।

এই দুটি কারণে পাশাপাশি, তৃতীয় সমস্যা হতে পারে

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

আপনি এই আদেশটি ব্যবহার করে এটি পরীক্ষা করতে পারেন:

SELECT * FROM sys.dm_exec_query_memory_grants

এটি আপনাকে সমস্ত সেশনের একটি তালিকা সরবরাহ করবে যা মেমরি গ্রহণ করে। কিছু ক্যোয়ারী থাকতে পারে যা এখনও স্মৃতি পেতে অপেক্ষা করছে। এই প্রশ্নগুলি সহজেই ফিল্টার করা যায়। সমস্ত সেশন যেখানে granted_memory_kb IS NULL। এগুলি সেশনগুলি যা মেমোরির অনুরোধ করে তবে তা পায় না। আরেকটি জিনিস একটি অনুমোদিত মেমরি যা কম হতে পারে be আপনি কলামগুলির requested_memory_kbসাথে তুলনা করতে পারেন granted_memory_kb। অনুরোধ করা হয় প্রক্রিয়াটি সক্রিয় করার জন্য মেমরিটি প্রদর্শন করার সময় কতটা মেমরি প্রক্রিয়াটি অপটিমাল চালানো দরকার তা দেখায়। যদি কোনও প্রক্রিয়া চালানোর জন্য 2 গিগাবাইটের প্রয়োজন হয় তবে কেবল 2 এমবি পায় ... আপনি নিজেরাই এটি পেতে পারেন। ;-)

আরেকটি উপায় হ'ল RESSOURCE_SEMAPHORE:

SELECT * FROM sys.dm_exec_query_resource_semaphore

আপনি waiter_countএবং এর উপর একবার দেখে নিতে পারেন grantee_count। ওয়েটার যদি 0 এর উপরে থাকে তবে আপনার স্মৃতিতে আপনার চাপ রয়েছে যার ফলে অদলবদল হতে পারে এবং পারফিউমে আপনার দ্বারা দেখা ডিস্ক চাপের কারণ হতে পারে।


0

সম্ভাব্য ড্রাইভ ব্যর্থতা ছাড়াও, আপনার RAID সাবসিস্টেমের অবস্থা পরীক্ষা করুন। আমরা অনুরূপ কিছু দেখেছি এবং এটি RAID কন্ট্রোলারে ব্যাটারি সক্রিয় হয়ে গেছে যাতে কোনও লেখার ক্যাশে উপলব্ধ ছিল না - সমস্ত লেখককে সরাসরি ডিস্কে যেতে হয়েছিল। এক পাশের নোট - আরডিসিটি এতে প্রবেশ করার সময় আমরা সিস্টেম বিরতি অনুভব করতে পারি।

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