অল্প বা কোনও ডাউনটাইম সহ খুব বড় মাইএসকিএল টেবিলগুলির কলামগুলি সংশোধন করা হচ্ছে


18

আমার পর্যায়ক্রমে mysql 5.1 এ টেবিলগুলিতে পরিবর্তন করা দরকার, বেশিরভাগ কলাম যুক্ত করা উচিত। অলটার টেবিল কমান্ড দিয়ে খুব সাধারণ। তবে আমার টেবিলগুলিতে এখন প্রায় 40 মিলিয়ন সারি রয়েছে এবং সেগুলি দ্রুত বৃদ্ধি পাচ্ছে ... সুতরাং al পরিবর্তিত টেবিলের আদেশগুলি কয়েক ঘন্টা সময় নেয়। আমি অনুমান করছি কয়েক মাসের মধ্যে তারা কয়েক দিন সময় নেবে।

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

এটি অবশ্যই মোটামুটি সাধারণ স্কেলিংয়ের সমস্যা হওয়া উচিত, প্রত্যেককে কলাম যুক্ত করা দরকার .. সাধারণত কোনও প্রোডাকশন ডিবিতে কী করা হয়? দাস -> মাস্টার মাইগ্রেশন?

আপডেট - আমি ইনডোডব স্টোরেজ ইঞ্জিন ব্যবহার করছি তা উল্লেখ করতে ভুলে গিয়েছিলাম


1
যদি কেউ এখনও উত্তর খুঁজছেন তবে .. blog.stasinginstance.com/… ^^
কোডার বেনামে

উত্তর:


10

আমার পর্যায়ক্রমে mysql 5.1 এ টেবিলগুলিতে পরিবর্তন করা দরকার, বেশিরভাগ কলাম যুক্ত করা উচিত।

না। সত্যিই না. শুধু না। এটি যখন কখনও প্রয়োজন হয় তখন এটি খুব বিরল একটি অনুষ্ঠান হওয়া উচিত ।

আপনার ডেটাটি শুরু করার সাথে সত্যই স্বাভাবিক হিসাবে ধরে নেওয়া, সমস্যা সমাধানের সঠিক উপায়টি বেস টেবিলের সাথে 1: 1 সম্পর্কযুক্ত একটি নতুন টেবিল যুক্ত করা (নতুন টেবিলে বাধ্যতামূলক নয়))

নিয়মিত কলাম যুক্ত করা হ'ল সাধারণত কোনও ডাটাবেসের সূচক যা সাধারণ হয় না - যদি আপনার স্কিমাটি স্বাভাবিক না করা হয় তবে আপনার সমস্যাটি ঠিক করতে হবে।

অবশেষে, যদি আপনার স্কিমাটি সত্যই সত্যই স্বাভাবিক হয় এবং আপনি সত্যই সত্যই কলামগুলি যুক্ত করে রাখতে পারেন তবে:

  1. আপনি ডাটাবেসে একটি টাইমস্ট্যাম্প কলাম পেয়েছেন বা এটি প্রতিলিপি লগ তৈরি করছে তা নিশ্চিত করুন
  2. টেবিলের একটি অনুলিপি (বি) তৈরি করুন
  3. বিতে নতুন কলাম যুক্ত করুন (এটি এখনও মাইসাম দিয়ে ব্লক হবে)
  4. লেনদেন অক্ষম
  5. মূল টেবিলের নাম (এ) অন্য কিছু হিসাবে রাখুন (ব্যাকআপ)
  6. মূল সারণির (এ) নাম সহ নতুন টেবিলের (বি) নামকরণ করুন
  7. অপারেশন শুরু থেকে প্রতিলিপি লগ থেকে বা ব্যাকআপ টেবিল থেকে লেনদেনগুলি পুনরায় খেলুন
  8. লেনদেন সক্ষম করুন

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

2
"টেবিলগুলি সংশোধন করা কি সত্যিই অস্বাভাবিক?" - হ্যাঁ.
সিমকিবিয়ান

1
না, তবে যে কেউ তর্ক করতে পারে যে যদি নিয়মিত ঘটে - একটি বড় সফ্টওয়্যার আপগ্রেডের অংশ হিসাবে নয় - তবে সমস্ত টেবিলের প্রথম স্থানে থাকা উচিত তা বুঝতে না পেরে কাউকে বরখাস্ত করা দরকার। এখানে সমস্যা / কৌশলটি "নিয়মিত", "প্রতি মাস দু'বার একবার" নয়।
টমটম

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

4
টেবিল পরিবর্তন করতে অচল ??? সম্ভবত বড় সংস্থাগুলিতে, তবে
চৌকস

12

আমাকে সম্প্রতি এটি করতে হয়েছিল। আমাজন যা সুপারিশ করেছিল তা পারকোনা টুলকিট ব্যবহার করছিল। আমি এটি ডাউনলোড করেছি এবং এর মতো কিছু চালাতে সক্ষম হয়েছি:

./pt-online-schema-change h=databasenameHostName,D=databasename,t=tablename --recursion-method=none --execute --user username --password password --alter "MODIFY someColumn newDataType"

এবং এটি দুর্দান্ত কাজ করে। এটি আপনাকে জানায় যে প্রক্রিয়াতে কত সময় বাকী রয়েছে।

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


পেরকোনা টিমের পিটি-অনলাইন-স্কিমা-পরিবর্তন সরঞ্জাম দ্বারা প্রয়োজনীয়, আরডিএস প্যারামিটার গ্রুপগুলির মাধ্যমে (এসইটি গ্লোবাল লগ_বিন_স্ট্রাস্ট_ফ্রাকশন_ক্রিটারস = 1 আরডিএসে কাজ করে না), লগইন_বিন_স্রষ্ট_ফানশন_ক্রিটর বৈশিষ্ট্য সক্ষম করার জন্য একটি সংক্ষিপ্ত লিখন-আপ রয়েছে। আরও বিশদ: percona.com/blog/2016/07/01/pt-online-schema-change-amazon-rds
ব্যবহারকারী1652110

এটি আমার জন্য কাজ করেছে
আদিআইই

4

সিমকিবিয়ান কিছু শক্ত সুপারিশ সরবরাহ করে

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

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

শেষ পর্যন্ত, যদি আপনার ডেটা সেটটি এত বেশি বাড়তে থাকে তবে আপনাকে ওলটিপি এবং ওএলএপি ডাটাবেসের মধ্যে সংরক্ষণাগারটিও বিবেচনা করতে হবে । আপনি যদি সঠিকভাবে ডিজাইন করেন তবে আপনার লেনদেনের ডেটাসেটটি এত বড় হওয়া উচিত নয়।


2

ম্যানুয়াল থেকে: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

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

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


সুতরাং আমি এটি করেছি এবং আমার সাইটের অংশগুলি অক্ষম করেছি যা টেবিলটিতে লিখুন যা আমি এখনই সংশোধন করছি। এখনও অবধি আমি বেশ কয়েকটি "লক ওয়েট টাইমআউট অতিক্রম করেছি; ব্যর্থতা পুনরায় চালু করার চেষ্টা করুন" ব্যতিক্রম, এটি খুব খারাপ নয়। তবে, তারা পুরোপুরি পড়া অপারেশনগুলিতে ছিল ...

0

আমি একই পরিস্থিতিতে আছি যেখানে আমার লেনদেনের টেবিলের 1 টি পরিবর্তন করতে হবে যা প্রায় 65 জিবি is আমি 2 সমাধান শুনতে

  1. সরাসরি এগিয়ে যান এবং এটিকে চালাতে দিন (ঘন্টা বা দিনের এক্স সংখ্যা)
  2. আপনি ডাটাবেসে একটি টাইমস্ট্যাম্প কলাম পেয়েছেন বা এটি প্রতিলিপি লগ তৈরি করছে তা নিশ্চিত করুন
    • টেবিলের একটি অনুলিপি (বি) তৈরি করুন
    • বিতে নতুন কলাম যুক্ত করুন (এটি এখনও মাইসাম দিয়ে ব্লক হবে)
    • লেনদেন অক্ষম
    • মূল টেবিলের নাম (এ) অন্য কিছু হিসাবে রাখুন (ব্যাকআপ)
    • মূল সারণির (এ) নাম সহ নতুন টেবিলের (বি) নামকরণ করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.