লাইভ প্রোডাকশন ডাটাবেসগুলিতে টেবিল পরিবর্তন করুন


24

কীভাবে সর্বাধিক "জনপ্রিয়" (মাইএসকিউএল, পোস্টগ্রিস ...) ডাটাবেস সিস্টেম লাইভ প্রোডাকশন ডেটাবেজে (যেমন কলমের ধরণ যোগ করা, মোছা বা পরিবর্তন করতে পারে) পরিবর্তনের টেবিলগুলি পরিচালনা করে?

আমি জানি সঠিক উপায় হ'ল প্রতিটি সময়সূচী ডাউনটাইম ব্যাকআপ করা এবং তারপরে পরিবর্তনগুলি করা।

কিন্তু ... কোনও বর্তমান ডাটাবেস সিস্টেম কি কিছু না থামিয়ে "অন-লাইন" এই জিনিসগুলি সমর্থন করে? (সম্ভবত স্রেফ পরিবর্তন / মুছে ফেলা হচ্ছে এমন একটি কলাম উল্লেখ করে এমন প্রশ্নগুলিতে বিলম্ব করছে)

এবং যখন আমি কেবল ALTER TABLE...একটি লাইভ চলমান ডাটাবেসে একটি করি তখন কী ঘটে ? যখন এটি ঘটে তখন কি সবকিছু বন্ধ হয়ে যায়? ডেটা কি নষ্ট হতে পারে? প্রভৃতি

আবার, আমি বেশিরভাগ পোস্টগ্রিস বা মাইএসকিউএলকে উল্লেখ করছি কারণ এটি আমার মুখোমুখি।

(এবং হ্যাঁ, যে কোনও সময় আমাকে "সঠিক উপায়ে" করার আগে জিনিসগুলি ব্যাক আপ করা, ডাউনটাইন নির্ধারিত করা ইত্যাদি আগেই করতে হয়েছিল ... তবে আমি কেবল জানতে চাই যে এই ধরণের এবং জিনিসগুলি "তাত্পর্য এবং কাজগুলি করা সম্ভব কিনা) নোংরা "বা যদি এমন কোনও ডিবি সিস্টেম থাকে যা আসলে" দ্রুত, লাইভ এবং নোংরা "স্কিমা পরিবর্তনের পক্ষে সমর্থন করে)


এইমাত্র কেউ প্রস্তাব ফেসবুক স্ক্রিপ্ট থেকে মাইএসকিউএল অনলাইন স্কিমা পরিবর্তন (একটি টিউটোরিয়াল সঙ্গে এখানে এবং উৎস এখানে ) ... একটা চমৎকার উপায় "হল hacky" এটা করতে উপায়ে একটি সেট স্বয়ংক্রিয় মত মনে হয় ... কেউ কি কখনো এটা ব্যবহার করেছেন কিছু সদৃশ উত্পাদন?


3
দ্রষ্টব্য: "সঠিক উপায়" নির্দিষ্ট করা মাইএসকিউএল এর সাথে সম্পর্কিত এবং পোস্টগ্রেএসকিউএল এর সাথে নয়। পোস্টগ্র্রেএসকিউএলে "সঠিক উপায়" সাধারণত খুব সহজ, যদিও এটি জড়িত হতে পারে। এর ব্যবহার pg_reorgআরও কঠিন পরিস্থিতিতে সাহায্য করতে পারে।
শন

আমি এই বিষয়ে একটি বিস্তারিত ভিডিও রাখতে পছন্দ করতাম, যার সাথে যতটা সম্ভব কৌশলগুলি ব্যাখ্যা করা হত।
সন্দীপন নাথ

উত্তর:


22

ALTER TABLEআপনি পোস্টগ্রিজ এসকিউএল এ একটি ইস্যু করার সময় এটি এমন একটি ACCESS EXCLUSIVEলক নেবে যা এতে অন্তর্ভুক্ত সমস্ত কিছুই আটকে রাখেSELECT । তবে, এই লকটি খুব সংক্ষিপ্ত হতে পারে যদি টেবিলটির পুনরায় লেখার প্রয়োজন না হয়, কোনও নতুন UNIQUE, CHECKবা FOREIGN KEYসীমাবদ্ধতা যাচাই করতে ব্যয়বহুল পূর্ণ টেবিল স্ক্যানের প্রয়োজন হয় না etc.

সন্দেহ হলে, আপনি সাধারণত এটি চেষ্টা করতে পারেন! পোস্টগ্রিসএসকিউএল এর সমস্ত ডিডিএল লেনদেনমূলক, সুতরাং এটি ALTER TABLEযদি খুব বেশি সময় নেয় এবং অন্যান্য অনুসন্ধানগুলি ধরে রাখা শুরু করে তবে এটি বাতিল করা বেশ ভাল । বিভিন্ন কমান্ড দ্বারা প্রয়োজনীয় লক স্তরগুলি লকিং পৃষ্ঠায় নথিভুক্ত করা হয়

কিছুটা ধীরে ধীরে ধীর অপারেশন ডাউনটাইম ছাড়াই সম্পাদন করা নিরাপদ হতে পারে sp উদাহরণস্বরূপ, যদি আপনি টেবিল আছে tএবং আপনার কলাম পরিবর্তন করতে চান customercode integer NOT NULLকরতে textকারণ গ্রাহকের সব গ্রাহকের কোড এখন একটি সঙ্গে শুরু হওয়া উচিত সিদ্ধান্ত নিয়েছে X, আপনি লিখতে পেরেছিলেন:

ALTER TABLE t ALTER COLUMN customercode TYPE text USING ( 'X'||customercode::text );

... তবে তা পুনরায় লেখার জন্য পুরো টেবিলটি লক করে দেবে। সুতরাং একটি সঙ্গে একটি কলাম যুক্ত করে DEFAULT। দীর্ঘ লকটি এড়ানোর জন্য এটি কয়েকটি পদক্ষেপে করা যেতে পারে তবে অ্যাপ্লিকেশনগুলি অস্থায়ী নকলটি মোকাবেলা করতে সক্ষম হতে হবে:

ALTER TABLE t ADD COLUMN customercode_new text;
BEGIN;
LOCK TABLE t IN EXCLUSIVE MODE;
UPDATE t SET customercode_new = 'X'||customercode::text;
ALTER TABLE t DROP COLUMN customercode;
ALTER TABLE t RENAME COLUMN customercode_new TO customercode;
COMMIT;

এটি কেবলমাত্র প্রতিরোধ করবে লিখেছেন করতে tপ্রক্রিয়ার সময়; লক নাম EXCLUSIVEযে কিছুটা কূট এটা বাদ সবকিছু ব্যতীতSELECT ; ACCESS EXCLUSIVEমোড একমাত্র বাদ একেবারে সবকিছু হয়। লক মোডগুলি দেখুন । এতে একটি ঝুঁকি রয়েছে যে লক আপগ্রেডের প্রয়োজনীয় আবশ্যকতার কারণে এই অপারেশনটি ডডলক-রোলব্যাক করতে পারে ALTER TABLEতবে সবচেয়ে খারাপভাবে আপনাকে আবার এটি করতে হবে।

এমনকি আপনি সেই লকটি এড়াতে পারেন এবং এটির মধ্যে একটি ট্রিগার ফাংশন তৈরি করে পুরো জিনিসটি সরাসরি tকরতে পারেন যখনই কোনও আসে INSERTবা UPDATEআসে না, স্বয়ংক্রিয়ভাবে customercode_newএখান থেকে সঞ্চারিত হয় customercode

এছাড়াও অন্তর্নির্মিত সরঞ্জামগুলিও রয়েছে CREATE INDEX CONCURRENTLYএবং এটি ALTER TABLE ... ADD table_constraint_using_indexস্বেচ্ছাসেবী-বান্ধব উপায়ে আরও ধীরে ধীরে কাজ করে ডিবিএগুলিকে এক্সক্লুসিভ লকিংয়ের সময়কাল হ্রাস করার অনুমতি দেওয়ার জন্য ডিজাইন করা হয়েছে।

pg_reorgটুল বা তার উত্তরাধিকারী pg_repackহিসাবে ভাল কিছু টেবিল পূনর্গঠনকারী অপারেশনের জন্য ব্যবহার করা যাবে।


1
@ ক্রেইগ যা বলেছিলেন তার মূল বিষয়টি হ'ল, "যদি এটি পুনরায় লেখার প্রয়োজন না হয়।" একবার ব্যবহার করে ALTER TABLE t ADD COLUMN i INTদ্রুত অপারেশন করা হয় (সাধারণত <1 মিমি) একবার লকটি অর্জন করা হয়। লকটি অর্জন করা সংযোগগুলি সারিবদ্ধ করতে পারে, তবে এটি "মুক্ত" নয় ... যদিও আপনি মাইএসকিউএল এ যা করতে হবে তার চেয়ে এটি বিশ্বের সেরা। একটি যোগ করার পদ্ধতি NOT NULLবাধ্যতা আরো কঠিন এবং হৃদয় feignt জন্য নয়।
শান

এটি conক্যমত্য বলে মনে হয় pg_repackযা এর উন্নত উত্তরসূরি pg_reorg
এরউইন ব্র্যান্ডসটেটার

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

7

পারকোনা অনলাইন স্কিমা পরিবর্তনগুলি সম্পাদনের জন্য নিজস্ব সরঞ্জাম নিয়ে এসেছে

সরঞ্জামটিকে পিটি-অনলাইন-স্কিমা-পরিবর্তন বলা হয়

এটিতে ট্রিগারগুলি জড়িত রয়েছে, তাই দয়া করে ডকুমেন্টেশনটি সাবধানতার সাথে পড়ুন।

ডকুমেন্টেশন অনুসারে, বড় অপারেশনগুলি হ'ল

  • স্যানিটি পরীক্ষা করে দেখুন
  • কদর্য
  • অনলাইন স্কিমা পরিবর্তন
    • অস্থায়ী সারণী তৈরি এবং পরিবর্তন করুন
    • টেবিল থেকে অস্থায়ী সারণীতে পরিবর্তনগুলি ক্যাপচার করুন
    • টেবিল থেকে অস্থায়ী সারণীতে সারিগুলি অনুলিপি করুন
    • টেবিল এবং অস্থায়ী টেবিল সিঙ্ক্রোনাইজ করুন
    • টেবিল এবং অস্থায়ী টেবিলটি অদলবদল / নামকরণ করুন
    • পরিষ্কার কর

ধন্যবাদ, ফেসবুকের পদ্ধতির "সলিফাইড" সংস্করণের মতো মনে হচ্ছে যা আমি আরও বিশ্বাস করতে পারি ...
নিউরনকিউ

আপনি যদি নিজের মাইএসকিউএল সার্ভার চালাচ্ছেন তবে অবশ্যই এটি করার পছন্দের উপায়টি হল পিটি-অনলাইন-স্কিমা-পরিবর্তন। পারকোনা সরঞ্জাম ২.২ অনুসারে, (দুঃখের সাথে) তারা আরডাব্লুএসে আরডিএস / অরোরাকে সমর্থন করে না। পিটি-অনলাইন-স্কিমা-পরিবর্তনটি গন্তব্য টেবিলটিমেটগুলিতে সারিগুলি (মাইআইএসএএমের জন্য কম অগ্রাধিকার) অনুলিপি করতে উত্স টেবিলের উপর একটি ট্রিগার সন্নিবেশ করায় এবং যখন সমস্ত সারি উত্স এবং গন্তব্যের মধ্যে সিঙ্কে থাকে তখন একক দ্রুত লকিং ড্রপ এবং পুনরায় নামকরণ করে does টেবিল।
phpguru

6

সিস্টেমটি বন্ধ করে দেওয়া এবং একবারে সমস্ত পরিবর্তন করা খুব ঝুঁকিপূর্ণ হতে পারে। যদি কিছু ভুল হয়ে যায়, এবং ঘন ঘন এটি ঘটে তবে ফিরে যাওয়ার কোনও সহজ উপায় নেই।

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

নিম্নলিখিত পদ্ধতির কম ঝুঁকি রয়েছে, কারণ পরিবর্তনটি বেশ কয়েকটি স্বল্প ঝুঁকির পদক্ষেপে করা হয়েছে যা খুব সহজেই ফিরে যেতে পারে:

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

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


3
দুর্দান্ত ... তবে ঠিক এটাই যে "বেদনা" এড়াতে
চাইছি

@ নিউরনকিউ " ফিরে যাওয়ার কোনও সহজ উপায় নেই " - পোস্টগ্র্রেসে রয়েছে: সবকিছুকে একটি লেনদেনের মধ্যে রাখুন এবং rollbackযদি কিছু ভুল হয়ে যায় তবে।
a_horse_with_no_name

2

হ্যাঁ, অনেকগুলি আধুনিক ডাটাবেস আপনাকে কেবল একটি কলাম যুক্ত করতে বা কলামের বৈশিষ্ট্যগুলি পরিবর্তন করতে, যেমন যুক্ত বা যুক্ত করতে বা মুছতে পারে will

আপনি যদি একটি কলাম বাদ দেন, তথ্য হারিয়ে যাবে, তবে দুর্নীতির খুব একটা ভয় নেই।


0

পারকোনা সরঞ্জামটি পরিবর্তিত করতে সহায়তা করতে ট্রিগার ব্যবহার করে এবং আপনার টেবিলটিতে ইতিমধ্যে বিদ্যমান ট্রিগার থাকলে এটি দুর্দান্তভাবে খেলবে না। আমি এমন একটি লিখতে পেরেছি যা আসলে বিদ্যমান ট্রিগারগুলিকে ভালভাবে পরিচালনা করে, যেহেতু সেগুলি আমাদের ডাটাবেস https://github.com/StirlingMarketingGroup/smg-live-alter এর জন্য অত্যন্ত গুরুত্বপূর্ণ


-1

কোনটি দিয়ে কী হয় সে সম্পর্কে প্রশ্নের সমাধান করতে ALTER TABLE বিবৃতি এটি আপনার পরিবর্তনগুলির মাত্রার উপর নির্ভর করে। নির্দিষ্ট ক্ষেত্রে, আপনি যদি একটি নতুন কলাম যুক্ত করেন, কমপক্ষে এমএস এসকিউএল সার্ভারে, ইঞ্জিনটি টেবিলটির একটি অস্থায়ী অনুলিপি তৈরি করবে, যখন এটি নতুন সারণির সংজ্ঞা তৈরি করবে এবং তারপরে তথ্যটি সেখানে প্রবেশ করিয়ে দেবে। পরিবর্তনের সময়কালের জন্য, টেবিলটি ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য হবে।

এমএসএসকিউএল সার্ভারের জন্য সুনির্দিষ্ট ক্রিয়াকলাপগুলির উদাহরণ এখানে রয়েছে: http://support.microsoft.com/kb/956176/en-us

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


-1 এটি এসকিউএল সার্ভারের জন্য সম্পূর্ণ ভুল: "যদি আপনি একটি নতুন কলাম যুক্ত করেন তবে কমপক্ষে এমএস এসকিউএল সার্ভারে ইঞ্জিনটি টেবিলটির একটি অস্থায়ী অনুলিপি তৈরি করবে, যখন এটি নতুন সারণির সংজ্ঞা তৈরি করবে এবং তারপরে তথ্যটি আবার প্রবেশ করিয়ে দেবে সেখানে "
একে

@ অ্যালেক্সকুজনেসভ - আমি পূর্ববর্তী লাইনটি আবিষ্কার করেছি, পাশাপাশি তালিকাভুক্ত কয়েকটি মামলার লিঙ্কটিও পরিষ্কার করে দেবে যে এটি সর্বদা ঘটে না। আমি এর আরও ভাল প্রতিফলিত করার জন্য বাক্যটি সংশোধন করেছি।
স্মিটজিট

1
আপনি জিইউআই, এসএসএমএসের আচরণের কথা উল্লেখ করছেন, এসকিউএল সার্ভারের আচরণের কথা নয়। আপনার লিঙ্কটি অনুসরণ করে, পরামর্শ হ'ল ডিডিএল পরিবর্তন করতে সরাসরি টি-এসকিউএল ব্যবহার করুন। এসডিএমএস ডিডিএল পরিবর্তনের জন্য খুব ভাল সরঞ্জাম নয়।
একে

@ অ্যালেক্সকুজনেটসভ - আমি নিবন্ধটি বলেছিলাম যে এতে ঝুঁকি জড়িত রয়েছে, তবে নিরুৎসাহিত করার মতো নয়। যাইহোক, আমি জিইআইআই বিটের জন্য নিবন্ধটি লিঙ্ক করি নি, তবে কিছু অপারেশনগুলির ইঙ্গিত হিসাবে যা আল্টারের বক্তব্যকে অন্তর্নিহিত ডেটা কাঠামোর পরিবর্তনের কারণে অস্থায়ী টেবিল তৈরির দিকে নিয়ে যায়। সরাসরি টি-এসকিউএল থেকে বিবৃতি জারি করার সময় ঠিক একই জিনিস প্রযোজ্য কিনা তা আমি পরীক্ষা করে দেখিনি, তবে আমি মনে করব প্রক্রিয়াটি বেশ অনুরূপ এবং এসএল সার্ভার পর্দার পিছনে লেগওয়ার্কটি করে।
স্মিটজিট

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