ন্যূনতম ডাউনটাইম সহ আমি কীভাবে একটি বড় টেবিলটিতে একটি রোভার্সন কলাম যুক্ত করতে পারি


21

এসকিউএল সার্ভার ২০০৮ এবং তারপরে ব্যবহার করে, আমি যখন সহজসাধ্য হই তখন আমি একটি বড় টেবিলের সাথে একটি রোভার্সন কলাম যুক্ত করতে চাই

ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL

তারপরে টেবিলটি খুব দীর্ঘ সময়ের জন্য আপডেটগুলির জন্য অনুপলব্ধ।

এই ডাউনটাইম কমাতে আমি কী কৌশলগুলি ব্যবহার করতে পারি? আমি কিছু বিবেচনা করব। অবশ্যই সহজতর, তবে আমি কোনও কৌশল বিবেচনা করব।

আমার চিন্তাভাবনাটি হ'ল একটি সর্বশেষ অবলম্বন হিসাবে, আমি ট্রিগারদের দ্বারা রক্ষণাবেক্ষণ করা একটি অনুলিপি স্টেজিং টেবিল বজায় রাখতে পারি এবং তারপরে মজাদার টেবিলটিকে মূল টেবিলটিতে sp_rename করতে পারি। তবে আমি সহজ / সহজ কিছু আশা করছি।

উত্তর:


26

একই স্কিমা প্লাস রোভার্সন কলাম সহ একটি নতুন টেবিল তৈরি করার বিষয়টি বিবেচনা করুন এবং উভয় টেবিলের উপরে একটি ভিউ যুক্ত করুন যা সমস্ত ইউনিয়ন করে। অন্তর্নিহিত সারণী ও দর্শনগুলির বিরুদ্ধে লোকেরা ভিউটি ব্যবহার করুন এবং পরিবর্তে ট্রিগার লিখুন।

নতুন টেবিলটিতে সন্নিবেশ প্রেরণ করা উচিত, আপডেটগুলি ডেটা নতুন টেবিলের দিকে সরানো উচিত, এবং মুছে ফেলা উভয় টেবিলের জন্য প্রয়োগ করা উচিত।

তারপরে ব্যাচটি ব্যাকগ্রাউন্ডে চলে যান, একবারে যতগুলি রেকর্ড সরিয়ে আপনি নতুন টেবিলে যেতে পারেন। এটি চলাকালীন আপনার এখনও সামঞ্জস্য সংক্রান্ত সমস্যা থাকতে পারে এবং কিছু ক্র্যাকট্যাকুলার এক্সিকিউশন পরিকল্পনা রয়েছে তবে চলনগুলি চলাকালীন এটি আপনাকে অনলাইনে থাকতে দেয়।

আদর্শভাবে, আপনি শেষ ব্যবহারকারীদের উপর প্রভাব হ্রাস করার জন্য শুক্রবার বিকেলে প্রক্রিয়াটি শুরু করেন এবং সোমবার সকাল হওয়ার আগে এটি সম্পন্ন করার চেষ্টা করুন। এটি ঠিকঠাক হয়ে গেলে, আপনি কেবলমাত্র নতুন টেবিলের দিকে ইঙ্গিত করার জন্য দৃষ্টিভঙ্গিটি পরিবর্তন করতে পারেন এবং ক্র্যাপট্যাকুলার এক্সিকিউশন পরিকল্পনাটি চলে যায়। মূলত।

ব্যাচগুলিতে ডেটা স্থানান্তরিত হওয়ার সময় ট্রিগার গুলি চালানো এড়াতে ট্রিগারটিতে মুছে ফেলা / সন্নিবেশ করা সারণিতে সারি সংখ্যাটি দেখুন এবং আপনার ব্যাচের সারি সংখ্যার কাছাকাছি থাকলে ক্রিয়াকলাপগুলি এড়িয়ে যান।


সমাপ্তিতে, মাইকেল আরও স্থিতিশীল পরিকল্পনা পেতে ভিউটি (এবং মূল টেবিল থেকে মুছবে না) এড়িয়ে যাওয়ার সিদ্ধান্ত নিয়েছে। বাণিজ্য বন্ধ মূলত টেবিলের দুটি কপি ছিল। তিনি এটিকে ব্লগ পোস্টের একটি সিরিজে পরিণত করেছিলেন ।


7

আপনার যদি সামনে পরিকল্পনা করার সময় থাকে তবে একটি আরও সহজ সমাধান রয়েছে ... (সাধারণত)

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

  1. ডেটাটাইপ সহ একটি NULL- সক্ষম অস্থায়ী কলাম যুক্ত করুন VARBINARY(8)
  2. ক্ষেত্রটির জন্য একটি বৈধ মান সহ বিদ্যমান রেকর্ডগুলির ব্যাচগুলি আপডেট করতে ডাটাবেসে স্লো সময় উপলভ্য করুন। ( 0x0000000027F95A5Bউদাহরণস্বরূপ)
  3. আপডেটগুলি প্রয়োজনীয় পৃষ্ঠা বিভক্ত করতে বাধ্য করবে এবং টেবিলে আরও স্থান বরাদ্দ করবে।
  4. আপনি যখন ধরা পড়বেন তখন অস্থায়ী কলামটি (বরাদ্দ স্টোরেজটি স্পর্শ করবে না) ফেলে দিন এবং রোভার্সন কলাম যুক্ত করুন।
  5. কোনও পৃষ্ঠা বিভক্ত হয় না এবং একটি লক থাকে যা মানগুলি পপুলেট করার জন্য যথেষ্ট দীর্ঘ প্রয়োজন।

আমি এটি সাফল্যের সাথে 10 মিনিটের মধ্যে 150M সারি টেবিলটিতে একটি রোভার্সন কলাম যুক্ত করতে ব্যবহার করেছি।

ক্যাভেট ... আপনার কাছে যদি বড় বার্চার ক্ষেত্রগুলির একটি টেবিল থাকে (বিশেষত varchar(max)) এসকিউএল সার্ভার সদ্য উপলভ্য স্থানটি পুনরায় ব্যবহারের পরিবর্তে টেবিলটি পুনর্নির্মাণের সিদ্ধান্ত নেয়। এখনও একটি কাছাকাছি উপায় বের করার চেষ্টা করছি।


আকর্ষণীয়, আমি অনুমান করি যে আমার প্রশ্নের মধ্যে "দীর্ঘ" বলতে কী বোঝায় আমি তা নির্দিষ্ট করেছিলাম না। যদি> 30 মিনিট আপনার দৃশ্যের জন্য দীর্ঘ হয় এবং 10 মিনিট সহনীয় হয় তবে এই সমাধানটি কার্যকর হবে। আমার দৃশ্যে শূন্য ডাউনটাইম বা আরও সুনির্দিষ্টভাবে <10 সেকেন্ড অর্জন করার চেষ্টা করা জড়িত যা ব্রেন্টের উত্তর দ্বারা প্রাপ্ত।
মাইকেল জে স্বার্ট

1

তাহলে TIMESTAMPআপনাকে জুড়তে হয় NULLABLE:

  1. একটি VARBINARY(8)কলাম যুক্ত করুন
  2. ডেটা সহ জনসংখ্যা দিন।

এটি পপুলেটেড হওয়ার পরে, এসকিউএল বিবৃতিতে পিছনে ফিরে, আপনি DROPযে VARBINARY(8)কলামটি সবে যুক্ত করেছেন এবং পপুলেটেড করেছেন এবং TIMESTAMP NULLকলামটি যুক্ত করুন।


যদি TIMESTAMPআপনাকে জুড়তে হয় NOT NULLABLE:

  1. একটি BINARY(8)কলাম যুক্ত করুন
  2. ডেটা সহ জনসংখ্যা দিন।

এটি পপুলেটেড হওয়ার পরে, এসকিউএল বিবৃতিতে পিছনে ফিরে, আপনি DROPযে BINARY(8)কলামটি সবে যুক্ত করেছেন এবং পপুলেটেড এবং ADD THE TIMESTAMP NOT NULLকলাম করেছেন।

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