টেবিলটি লক না করে টেবিলটি পরিবর্তন করবেন?


107

মাইএসকিউএলে একটি অল্টার টেবিল স্টেটমেন্ট করার সময়, পুরো টেবিলটি বিবৃতিটির সময়কালের জন্য পঠিত-লক করা হয় (সমবর্তী লেখাগুলি অনুমতি দেয় তবে সমবর্তী লেখাগুলি নিষিদ্ধ করে)। যদি এটি একটি বড় টেবিল হয় তবে INSERT বা আপডেটের বিবৃতিগুলি খুব দীর্ঘ সময়ের জন্য অবরুদ্ধ করা যেতে পারে। কোনও "হট অল্টার" করার মতো কোনও উপায় আছে, যেমন কলামটি এমনভাবে যুক্ত করার মতো রয়েছে যে পুরো প্রক্রিয়া জুড়ে টেবিলটি এখনও আপডেটযোগ্য?

বেশিরভাগ ক্ষেত্রে আমি মাইএসকিউএল এর সমাধানে আগ্রহী তবে আমি অন্য আরডিবিএমএসে আগ্রহী যদি মাইএসকিউএল এটি না করতে পারে।

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


2
আপনি কতবার টেবিলটি পরিবর্তন করবেন তা ভাবতে হবে?
আল্লায় লালনোদে

1
আইএমএইচও, ডাটাবেস স্কিমা পরিবর্তনগুলি সম্পূর্ণ নতুন সংস্করণগুলির সাথে সম্পর্কিত - তারা অন্যান্য পরিবর্তনগুলির মতো বায়ুযুক্তভাবে ঘূর্ণিত হয় না। এটি অবশ্যম্ভাবী একটি বড় বিষয়।
dkretz

9
@ অ্যালাইনলোনডে - 0 টিরও বেশি বার এই প্রশ্নটিকে বৈধ করে তোলে, বিশেষত যদি আপনার সিস্টেমে ডাউনটাইমটির জন্য জীবন বা প্রচুর অর্থ ব্যয় হয়। এবং যে কোনও হারে, নতুন সফ্টওয়্যার প্রয়োজনীয়তা কখনও কখনও প্রদর্শিত হয়।
নাথান লং

উত্তর:


60

কেবলমাত্র অন্য বিকল্পটি হ'ল বহু আরডিবিএমএস সিস্টেম যাইহোক ম্যানুয়ালি করে তা করা যায় ...
- একটি নতুন টেবিল তৈরি করুন

তারপরে আপনি একবারে পুরানো টেবিলের বিষয়বস্তু অনুলিপি করতে পারেন। উত্স টেবিলের যে কোনও INSERT / আপডেট / ডিলিট সম্পর্কে সর্বদা সতর্ক থাকাকালীন। (একটি ট্রিগার দ্বারা পরিচালনা করা যেতে পারে। যদিও এটি একটি ধীর গতি ঘটায়, এটি কোনও লক নয় ...)

একবার শেষ হয়ে গেলে সোর্স টেবিলের নাম পরিবর্তন করুন, তারপরে নতুন সারণির নাম পরিবর্তন করুন। পছন্দসই একটি লেনদেন।

একবার শেষ হয়ে গেলে, সারণী ব্যবহার করে এমন কোনও সঞ্চিত প্রক্রিয়া পুনরায় সংকলন করুন। কার্যকর করার পরিকল্পনাগুলি আর বৈধ হবে না।

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

এই সীমাবদ্ধতাটি কিছুটা দরিদ্র হওয়া সম্পর্কে কিছু মন্তব্য করা হয়েছে। সুতরাং আমি ভেবেছিলাম আমি কেন এটি কেমন তা দেখানোর জন্য এটিতে একটি নতুন দৃষ্টিকোণ রাখব ...

  • নতুন ক্ষেত্র যুক্ত করা প্রতিটি সারিতে একটি ক্ষেত্র পরিবর্তন করার মতো।
  • ফিল্ড লকগুলি সারি লকগুলির চেয়ে অনেক বেশি শক্ত হবে, টেবিল লকগুলিতে কোনও আপত্তি নেই।

  • আপনি ডিস্কের প্রকৃত গঠন পরিবর্তন করছেন, প্রতিটি রেকর্ড সরে যায় moves
  • এটি পুরো টেবিলে একটি আপডেটের মতো তবে আরও প্রভাব সহ ...

2
অদলবদল করার আগে একটি পুঙ্খানুপুঙ্খ পরীক্ষার পরিকল্পনা করুন। যদি এটি ব্যর্থ হয় তবে আবার শুরু করুন।
dkretz

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

2
+1 আপনি যখন ইউআই-তে নির্দিষ্ট ধরণের টেবিল পরিবর্তন করেন তখন এসকিউএল এন্টারপ্রাইজ ম্যানেজার আক্ষরিক অর্থে এটি ঘটে যায়। এসকিউএল ২০০৮ এ, তারা প্রকৃতপক্ষে একটি সতর্কতা যুক্ত করেছিল যাতে ব্যবহারকারী এটি জানতে পারে যে এই কঠোর ক্রিয়াটি সম্পাদন করছে।
ব্র্যাডসি ২

2
আপনি যে টেবিলগুলি পরিবর্তন করা হচ্ছে তা উল্লেখ করে বিদেশী কী সম্পর্কে কোনও উল্লেখ করেননি। সমস্যা হবে না?
রাফায়

2
@ মোহাম্মদআরফয়েআলিম - এবং স্বতঃসিদ্ধ ক্ষেত্র এবং মতামত, এবং ট্রিগার, ইত্যাদি ইত্যাদি But তবে তারপরেও এই পদ্ধতিটি এখনও কার্যকর।
ম্যাটবাইলি

42

পারকোনা পিটি-অনলাইন-স্কিমা-পরিবর্তন নামে একটি সরঞ্জাম তৈরি করে যা এটি করার অনুমতি দেয়।

এটি মূলত টেবিলের একটি অনুলিপি তৈরি করে এবং নতুন টেবিলটি সংশোধন করে। নতুন টেবিলটি মূলটির সাথে সিঙ্কে রাখতে এটি আপডেট করতে ট্রিগার ব্যবহার করে। নতুন টেবিলটি পটভূমিতে প্রস্তুত হওয়ার সময় এটি আসল টেবিলটি অ্যাক্সেস করার অনুমতি দেয়।

এটি উপরের ডেমস প্রস্তাবিত পদ্ধতির অনুরূপ, তবে এটি একটি স্বয়ংক্রিয় ফ্যাশনে এটি করে।

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

উদা:

pt-online-schema-change --alter "ADD COLUMN c1 INT" D=db,t=numbers_are_friends

মনে হচ্ছে লিঙ্কটি নষ্ট হয়ে গেছে। আমি এই লিঙ্কটি কাজ করতে পেলাম ।
নোয়াম বেন এরি

25

২০০৯ থেকে এই প্রশ্নটি। এখন মাইএসকিউএল একটি সমাধান দেয়:

অনলাইন ডিডিএল (ডেটা সংজ্ঞা ভাষা)

একটি বৈশিষ্ট্য যা ডিডিএল (প্রাথমিকভাবে টেবিল) অপারেশন চলাকালীন ইনোডিবি টেবিলগুলির কর্মক্ষমতা, সামঞ্জস্য এবং প্রাপ্যতার উন্নতি করে। বিশদের জন্য বিভাগ 14.11, "InnoDB এবং অনলাইন ডিডিএল" দেখুন।

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

এটি আপনাকে ডিডিএল ক্রিয়াকলাপের সময় পারফরম্যান্স এবং সমঝোতার মধ্যে ভারসাম্য সামঞ্জস্য করতে দেয়, পুরো টেবিলে অ্যাক্সেস সম্পূর্ণরূপে (LOCK = এক্সক্লুসিভ ধারা) বাছাই করতে বা ডিএমএলকে (LOCK = অংশবিধির ধারা) অনুমতি না দেওয়ার বা সম্পূর্ণ জিজ্ঞাসা এবং ডিএমএলের অনুমতি দেওয়ার মাধ্যমে সারণীতে অ্যাক্সেস (LOCK = কোন শৃঙ্খলা)। আপনি যখন লক ক্লজটি বাদ দেন বা লক = ডিফল্ট নির্দিষ্ট করেন, তখন মাইএসকিউএল অপারেশনের ধরণের উপর নির্ভর করে যতটা সম্ভব সম্মতি দেয়।

যেখানে সম্ভব সেখানে স্থানে পরিবর্তনগুলি সম্পাদন করা সারণীর নতুন কপি তৈরি করার পরিবর্তে ডিস্ক স্পেস ব্যবহারে সাময়িক বৃদ্ধি এড়ানো যায় এবং টেবিলটি অনুলিপি করা এবং গৌণ সূচকগুলি পুনর্গঠনের সাথে যুক্ত I / O ওভারহেড।

আরও তথ্যের জন্য মাইএসকিউএল 5.6 রেফারেন্স ম্যানুয়াল -> ইনোডিবি এবং অনলাইন ডিডিএল দেখুন।

দেখে মনে হচ্ছে মারিয়াডিবিতেও অনলাইন ডিডিএল উপলব্ধ available

আপনার অলটার টেবিলে সমবর্তী ক্রিয়াকলাপগুলিতে অবরুদ্ধ না হয় তা নিশ্চিত করার জন্য বিকল্প হিসাবে আপনি অনলাইনে ট্যাবলেট ব্যবহার করতে পারেন (কোনও লক লাগে না)। এটি LOCK = NONE এর সমতুল্য।

ALTER TABLE সম্পর্কে মারিয়াডিবি কেবি


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


14

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

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

আমি লিখেছি এই একটি সামান্য বিট আগে, সম্ভবত এটি অন্যান্য যথার্থতা আরো কিছু অন্তর্দৃষ্টি চালা পারবেন না।


6
পোস্টগ্র্রেস এখনও অন্যটিকে সেই টেবিলটি থেকে পড়া থেকে বাধা দিয়ে পরিবর্তকটিতে একচেটিয়া লক তৈরি করে।
ক্লফ্রেশ

5
আমি "মূলত কোনও ডাউনটাইম" বিটের সাথে একমত নই। ক্লোফ্রেস যেমন বলেছে, অল্টার টেবিলে সমস্ত সমবর্তী পাঠ্য এবং লেখাগুলি ব্লক করে টেবিলের উপর একটি এক্সক্লুসিভ লক ধরে। আমার অভিজ্ঞতায় সক্রিয় টেবিলের জন্য বেশিরভাগ সময় আপনি লকটিও পাবেন না (ALTER TABLE অভুক্ত হয়ে যাবে)। এবং লেনদেনের মাধ্যমে আপনি খুব সতর্ক না হলে সহজেই ডেডলকগুলি দিয়ে শেষ করতে পারেন। যে কারণে পোস্টগ্রিসে বিদ্যমান সারণীগুলি পরিবর্তন করার সময় আমি এখন সর্বদা ডাউনটাইম সেট করি।
পঙ্করত

1
আরও বিশদ বিবরণ: dba.stackexchange.com / দ্য রিপোর্টগুলি / 27153/… এটি একচেটিয়া লকের কী কী প্রভাব ফেলবে এবং এর চারপাশে কাজ করার কিছু উপায়ের কথা উল্লেখ করেছে
জন ডাউটহাট

4
হ্যাঁ, পোস্টগ্রিসে একটি টেবিল পরিবর্তন করা একচেটিয়া লক ধরেছে, তবে অপারেশনটি নিজে মিলিসেকেন্ডে সম্পূর্ণ হওয়ার কারণে এটি বেশিরভাগ ক্ষেত্রে ব্যবহারিকভাবে অপ্রাসঙ্গিক। আমি ব্যবসায়ের দিনের মাঝামাঝি সময়ে শূন্যের ফলে ডাউনটাইমের সাথে শত মিলিয়ন-সারি টেবিলগুলিতে ব্যক্তিগতভাবে কলামগুলি যুক্ত করেছি।
নোয়া তবুও 16

2
@ কোবজিলা হ্যাঁ, ড্রপ কলম ঠিক তত দ্রুত। এটি মূলত হুডের নীচে কলামটি লুকানো হিসাবে চিহ্নিত করে mark Column কলামে থাকা মানগুলি বাদ দেওয়ার আগেও ডেটা ফাইলগুলিতে রয়েছে (এবং অন্যান্য লেনদেনের জন্য দৃশ্যমান), এবং যতক্ষণ না আপনি ভ্যাকিউম পূর্ণতা না করেন ততক্ষণ তা থাকবে।
নোহ ইয়েটার

7

যেহেতু আপনি অন্যান্য ডাটাবেস সম্পর্কে জিজ্ঞাসা করেছেন, তাই ওরাকল সম্পর্কে কিছু তথ্য এখানে।

ওরাকল টেবিলটিতে একটি NULL কলাম যুক্ত করা খুব দ্রুত অপারেশন কারণ এটি কেবল ডেটা ডিকশনারিটি আপডেট করে। এটি খুব স্বল্প সময়ের জন্য টেবিলটিতে একচেটিয়া লক ধারণ করে। তবে এটি হ'ল ডিপেন্ডেন্ট স্টোরেজ পদ্ধতি, ভিউ, ট্রিগার ইত্যাদি বাতিল করে দেবে These এগুলি স্বয়ংক্রিয়ভাবে পুনরায় সংযুক্ত হয়ে যাবে।

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

আপনার যদি কোনও বিদেশী কী যুক্ত করার দরকার হয় তবে আপনি এটি করতে পারেন এবং ডেটা সঠিক বলে আপনার বিশ্বাস করার জন্য ওরাকলকে পেতে পারেন। অন্যথায় এটি পুরো টেবিলটি পড়তে হবে এবং ধীর হতে পারে এমন সমস্ত মানগুলি যাচাই করতে হবে (প্রথমে আপনার সূচক তৈরি করুন)।

যদি আপনাকে নতুন কলামের প্রতিটি সারিটিতে একটি ডিফল্ট বা গণনা করা মান লাগাতে হয় তবে আপনাকে একটি বিশাল আপডেট বা সম্ভবত একটি নতুন ইউটিলিটি প্রোগ্রাম চালানো দরকার যা নতুন ডেটা পপুলেট করে। এটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধিরে আপনি ঘুরে ঘুরে ঘুরে ঘষা ঘষে ছাঁটা ঘেফ उतरতে চাড়াড়ের অংশগুলি এসে দাঁড়ানোর ঝাঁটা ঝাঁটা ঝাঁটা ঝাঁটা ঝাঁটা ঝাঁটা ঝাঁটি থেকে ঝাঁটা ঝাঁটি থেকে ঝাঁটা ঝাঁটি থেকে পড়ে থাকা সারিগুলি অনেক বেশি বড় হয়ে যায় এবং তাদের ব্লকগুলিতে আর ফিট না করে, বিশেষত যদি এটি ধীর হতে পারে। এই প্রক্রিয়া চলাকালীন লক করা পরিচালনা করা যেতে পারে। আপনার অ্যাপ্লিকেশনটির পুরাতন ভার্সিনো, যেটি এখনও চলছে, আপনার এই স্তম্ভটি সম্পর্কে জানে না কারণ আপনার একটি ছদ্মবেশী ট্রিগার বা ডিফল্ট নির্দিষ্ট করতে পারে।

সেখান থেকে, আপনি কোডের নতুন সংস্করণে আপনার অ্যাপ্লিকেশন সার্ভারগুলিতে একটি সুইচচরো করতে পারেন এবং এটি চলতে থাকবে। আপনার স্নিগ্ধ ট্রিগারটি ফেলে দিন।

বিকল্পভাবে, আপনি DBMS_REDEFINITION ব্যবহার করতে পারেন যা এই ধরণের জিনিসটি করার জন্য ডিজাইন করা একটি কালো বক্স।

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


3

অ্যাপ্লিকেশন আপডেটগুলি করার সময় আপনি যদি আপনার ডাটাবেসের জন্য ডাউনটাইম সহ্য করতে না পারেন তবে উচ্চতর উপলভ্যতার জন্য আপনার একটি দ্বি-নোড ক্লাস্টার বজায় রাখা বিবেচনা করা উচিত। একটি সাধারণ প্রতিলিপি সেটআপ দিয়ে আপনি প্রায় সম্পূর্ণ অনলাইন স্ট্রাকচারাল পরিবর্তনগুলি আপনার পরামর্শ মতো করতে পারেন:

  • সমস্ত পরিবর্তন একটি প্যাসিভ ক্রীতদাসে প্রতিলিপি করা অপেক্ষা করুন
  • প্যাসিভ ক্রীতদাসকে সক্রিয় কর্তা হিসাবে পরিবর্তন করুন
  • পুরানো মাস্টারের কাঠামোগত পরিবর্তনগুলি করুন
  • নতুন মাস্টার থেকে পুরানো মাস্টারে পরিবর্তনগুলি প্রতিলিপি করুন
  • মাস্টার আবার অদলবদল এবং একযোগে নতুন অ্যাপ্লিকেশন স্থাপন করুন

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


1
ওল্ড মাস্টার গুচ্ছের বাইরে নাকি গুচ্ছের মধ্যে?
জন চর্নেলিয়াস

2

নাঃ। যদি আপনি মাইআইএসএএম টেবিলগুলি ব্যবহার করেন তবে আমার সেরা বোধের জন্য তারা কেবল টেবিল লকগুলি করে - কোনও রেকর্ড লক থাকে না, তারা কেবল সরলতার মাধ্যমে সবকিছু হাইপারফاس্ট রাখার চেষ্টা করে। (অন্যান্য মাইএসকিউএল টেবিলগুলি আলাদাভাবে কাজ করে)

এটি এত বড় একটি পরিবর্তন যে আমি সন্দেহ করি যে কোনও ডিবিএমএস এটি সমর্থন করবে। এটি প্রথম স্থানে টেবিলের ডেটা সহ এটি করতে সক্ষম হওয়ায় এটি একটি সুবিধা হিসাবে বিবেচিত।


InnoDB সারি কেশ ব্যবহার করে - dev.mysql.com/doc/refman/5.0/en/internal-locking.html
Eran Galperin

হ্যাঁ, মাইএসকিউএল হ্রাস। সে কারণেই আমি "স্ট্যান্ডার্ড" সারণী সম্পর্কে সুনির্দিষ্ট ছিলাম।
dkretz

আপনি লিখেছেন - স্ট্যান্ডার্ড মাইএসকিউএল টেবিলগুলি কেবল টেবিল লকগুলি করে - যা ভুল।
ইরান গাল্পেরিন

আপনি উদ্ধৃত পৃষ্ঠা থেকে মাইআইএসএএম (অর্থাত্ মাইএসকিউএল স্ট্যান্ডার্ড) সারণীগুলি সম্পর্কে এটি কীভাবে ব্যাখ্যা করবেন? "মাইএসকিউএল মাইআইএসএএম এবং স্মৃতি সারণীর জন্য টেবিল-স্তর লকিং, বিডিবি টেবিলের জন্য পৃষ্ঠা-স্তর লকিং এবং ইনোডিবি টেবিলগুলির জন্য সারি-স্তর লকিং ব্যবহার করে।"
dkretz

কিছু স্টোরেজ ইঞ্জিন সারি স্তর লকিং ব্যবহার করে এবং কিছু টেবিল স্তর লকিং ব্যবহার করে। কোনও স্ট্যান্ডার্ড স্টোরেজ ইঞ্জিন নেই (সম্ভবত আপনি
পিএইচপিএমএইডমিনে

2

অস্থায়ী সমাধান...

অন্যান্য সমাধান হতে পারে, আপনার নতুন কলাম সহ মূল টেবিলের প্রাথমিক কী সহ অন্য একটি টেবিল যুক্ত করুন।

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

আপনি যখন ডাউনটাইম পেতে সক্ষম হবেন, আপনি মূল টেবিলটি পরিবর্তন করতে পারবেন, আপনার ডিএমএল কোয়েরিগুলি সংশোধন করতে পারেন এবং আপনার তৈরি করা নতুন টেবিলটি আগে তৈরি করতে পারেন

অন্যথায়, আপনি ক্লাস্টারিং পদ্ধতি, অনুলিপি, পেরকোনা থেকে পিটি-অনলাইন-স্কিমা সরঞ্জামের জন্য যেতে পারেন


1

ইনোডব প্লাগইন ব্যবহার করে, টেবিলের বিবৃতিগুলি যা কেবলমাত্র গৌণ সূচকগুলি যুক্ত করে বা ফেলে দেয় তা "দ্রুত" সম্পন্ন করা যায়, যেমন টেবিলটি পুনর্নির্মাণ না করে।

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

আপনার অ্যাপ্লিকেশনটি সত্যই ডিজাইন করতে হবে যাতে টেবিলের বিবৃতিগুলি নিয়মিত করার প্রয়োজন হয় না; আপনি অপেক্ষা করতে প্রস্তুত না হন বা আপনি যদি ছোট টেবিলগুলি পরিবর্তন করে থাকেন তবে আপনি অবশ্যই অ্যাপ্লিকেশনটির চলমান চলাকালীন কোনও অলটার টেবলটি করতে চান না।


1

আমি দুটি পদ্ধতির একটির সুপারিশ করব:

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

  2. সিস্টেম রক্ষণাবেক্ষণ সময় আছে। হয় পরিবর্তনগুলি (মাসিক ইত্যাদি) চলাকালীন সিস্টেমটি অফলাইনে চলে যায় এবং পরিবর্তনগুলি দিনের কমপক্ষে ভারী পাচারের সময় নির্ধারিত হয় (উদাহরণস্বরূপ 3-5-00)। পরিবর্তনগুলি উত্পাদনের রোলআউটের আগে মঞ্চস্থ হয়, সুতরাং আপনার কাছে ডাউনটাইমের একটি ভাল ফিক্স উইন্ডো অনুমান থাকবে।

2A। রিডানড্যান্ট সার্ভার রয়েছে, যাতে সিস্টেমটি ডাউনটাইম হলে পুরো সাইটটি নিচে না যায়। এটি আপনাকে পুরো সাইটটিকে নীচে না নামিয়ে স্তম্ভিত ফ্যাশনে আপনার আপডেটগুলি "রোল" করতে দেয়।

বিকল্প 2 এবং 2a সম্ভাব্য হতে পারে না; এগুলি কেবল বৃহত্তর সাইট / অপারেশনের জন্য থাকে। এগুলি বৈধ বিকল্প, তবে আমি ব্যক্তিগতভাবে এখানে উপস্থাপিত সমস্ত বিকল্প ব্যবহার করেছি।


1

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

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

মূল্য চেক আউট: www.mongodb.com


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

1

সাধারণভাবে, উত্তরটি "না" হতে চলেছে। আপনি টেবিলের কাঠামো পরিবর্তন করছেন যা সম্ভবত প্রচুর আপডেটের প্রয়োজন হবে "এবং আমি অবশ্যই এটির সাথে একমত হই agree আপনি যদি প্রায়শই এটি করার প্রত্যাশা করেন তবে আমি" ডামি "কলামগুলির বিকল্প প্রস্তাব করব - VIEWপরিবর্তে ব্যবহার করুন জন্য টেবিল SELECTতথ্য ing। IIRC, একটি দৃশ্য সংজ্ঞা পরিবর্তন অপেক্ষাকৃত হালকা এবং যখন কোয়েরি পরিকল্পনা কম্পাইল করা হয় একটি দৃশ্য মাধ্যমে অপ্রত্যক্ষ্যতার সম্পন্ন করা হয়। ব্যয় যে আপনি একটি নতুন টেবিল থেকে কলাম যোগ করতে পারেন এবং করতে হবে হবে দেখতে JOINকলামে।

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

শুধু একটি ভাবনা.


1

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

মাইএসকিউএলে অপারেশনটি লেনদেনকে ব্লক করার সময় একটি নতুন টেবিলের সাথে ডেটা অনুলিপি করবে, যা মাইএসকিউএল ডিবিএর জন্য v। 5.6 এর আগে মূল ব্যথা হয়ে দাঁড়িয়েছে।

সুসংবাদটি হ'ল মাইএসকিউএল 5.6 প্রকাশের পরে থেকে এই নিষেধাজ্ঞা বেশিরভাগই সরিয়ে নেওয়া হয়েছে এবং আপনি এখন এমওয়াইএসকিউএল ডিবির সত্যিকারের শক্তি উপভোগ করতে পারবেন।


3
দেখে মনে হচ্ছে আপনি মাইএসকিএল 5.6 এর পরিবর্তনের বিষয়ে একটি রেফারেন্সের সাথে লিঙ্ক করার চেষ্টা করছেন, কিন্তু এটি কার্যকর হয়নি। অনুগ্রহপূর্বক আবার চেষ্টা করুন.
dg99

1

সানডাউনই যেমন উল্লেখ করেছেন, pt-online-schema-changeআপনি এখানে প্রশ্নটিতে যা বর্ণনা করেছেন তা করার অন্যতম সেরা সরঞ্জাম is আমি সম্প্রতি একটি লাইভ ডিবিতে প্রচুর স্কিমা পরিবর্তন করেছি এবং এটি বেশ ভালভাবে চলেছে। : আপনি আমার ব্লগ পোস্ট এখানে এটিকে সম্বন্ধে আরও পড়তে পারেন http://mrafayaleem.com/2016/02/08/live-mysql-schema-changes-with-percona/


1

আপনি স্পষ্টভাবে চেষ্টা করা উচিত pt-online-schema-change। আমি একাধিক ক্রীতদাসের সাথে এডাব্লুএস আরডিএসে মাইগ্রেশন করতে এই সরঞ্জামটি ব্যবহার করছি এবং এটি আমার পক্ষে খুব ভালভাবে কাজ করেছে। কীভাবে এটি করা যায় সে সম্পর্কে আমি একটি বিস্তৃত ব্লগ পোস্ট লিখেছিলাম যা আপনার পক্ষে সহায়ক হতে পারে।

ব্লগ: http://mrafayaleem.com/2016/02/08/live-mysql-schema-changes-with-percona/


0

ডামি কলামগুলি যদি আপনি তাদের ধরণের পূর্বাভাস (এবং সেগুলি naclable করতে পারেন) করতে পারেন তবে এটি একটি ভাল ধারণা। আপনার স্টোরেজ ইঞ্জিনটি নালগুলি কীভাবে পরিচালনা করে তা পরীক্ষা করে দেখুন।

আপনি এমনকি ফোনে, বিমানবন্দরে পাসের ক্ষেত্রে কোনও টেবিলের নাম উল্লেখ করলেও মাইআইএসএএম সবকিছু লক করে দেবে। এটি কেবল এটি করে ...

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


1
আমি একটি InnoDB টেবিলের সাথে একটি NULL কলাম যুক্ত করার চেষ্টা করেছি এবং এটির পুরো টেবিলটি পুনর্নির্মাণ করতে হবে; সাধারণ "মেটাডেটা আপডেট করুন" অপারেশন নয়।
ড্যানিয়েল

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

0

টোকুডিবি কলামগুলি যুক্ত / ড্রপ করতে এবং সূচকগুলিকে "হট" যুক্ত করতে পারে, পুরো প্রক্রিয়া জুড়ে টেবিলটি সম্পূর্ণরূপে উপলব্ধ। এটি www.tokutek.com এর মাধ্যমে উপলব্ধ


-6

আসলে তা না.

আপনি সর্বোপরি, সারণির অন্তর্নিহিত কাঠামো পরিবর্তন করছেন এবং এটি অন্তর্নিহিত সিস্টেমের জন্য বেশ গুরুত্বপূর্ণ তথ্য। আপনি (সম্ভবত) ডিস্কের চারপাশে প্রচুর ডেটা সরিয়ে নিচ্ছেন।

যদি আপনি এটি অনেক কিছু করার পরিকল্পনা করে থাকেন তবে ভবিষ্যতে ব্যবহারের জন্য উপলব্ধ "ডামি" কলামগুলির সাহায্যে কেবল টেবিলটি ছাঁটাই করা ভাল।


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