মাইএসকিউএল-এ কীভাবে বড় টেবিলের কলাম যুক্ত করবেন


13

আমি একজন পিএইচপি বিকাশকারী তাই কঠোর হবেন না। আমার কাছে একটি বড় টেবিল ~ 5.5gb ডাম্প। আমাদের প্রধানমন্ত্রী নতুন বৈশিষ্ট্য সম্পাদনের জন্য এতে নতুন কলাম তৈরি করার সিদ্ধান্ত নিয়েছেন। সারণিটি InnoDB তাই আমি যা চেষ্টা করেছি:

  1. টেবিল লক দিয়ে স্ক্রিনে টেবিল পরিবর্তন করুন। H 30 ঘন্টা এবং কিছুই নিল না। সুতরাং আমি এটি বন্ধ করে দিয়েছি। প্রথম আমি একটি ভুল করেছি কারণ আমি সমস্ত লেনদেন শেষ করি নি তবে ২ য় বার কোনও মাল্টিলক ছিল না। অবস্থা ছিল copy to tmp table

  2. যেহেতু আমারও এই টেবিলটির জন্য বিভাজন প্রয়োগ করতে হবে আমরা একই নাম এবং নতুন কাঠামোর সাথে ডাম্প তৈরি, নতুন নামকরণ এবং টেবিল তৈরি করার সিদ্ধান্ত নিয়েছি। তবে ডাম্প কঠোর অনুলিপি তৈরি করছে (কমপক্ষে আমি অন্য কিছু খুঁজে পাইনি)। সুতরাং আমি sedএটি দিয়ে একটি নতুন কলাম ডাম্প এবং এটিকে জিজ্ঞাসা করার জন্য যুক্ত করেছি। তবে কিছু অদ্ভুত ত্রুটি শুরু হয়েছিল। আমি বিশ্বাস করি এটি চরসেটের কারণে হয়েছিল। Utf-8 এ সারণী এবং ফাইলটি আমাদের পরে আসকি হয়ে যায় sed। সুতরাং আমি 30% ডেটাতে ত্রুটি পেয়েছি (অজানা কমান্ড '\' ')। সুতরাং এটিও একটি খারাপ উপায়।

এটি এবং গতির পারফরম্যান্স সম্পাদন করার জন্য অন্যান্য বিকল্পগুলি কী কী (আমি পিএইচপি স্ক্রিপ্টের সাহায্যে এটি করতে পারি, তবে এটি যুগে যুগে গ্রহণ করবে)। এক্ষেত্রে পারফরম্যান্স কী হবে INSERT SELECT

কোন অগ্রিম জন্য ধন্যবাদ।

উত্তর:


12

মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করুন । আপনি কোনও টেবিলটিতে ডান ক্লিক করতে পারেন এবং "এসকিউএল সম্পাদককে প্রেরণ করুন" -> "বিবৃতি তৈরি করুন" নির্বাচন করতে পারেন। এইভাবে কোনও সারণী "বৈশিষ্ট্য" যুক্ত করতে ভুলে যাবে না (সহ CHARSETবা সহ COLLATE)।
এই বিপুল পরিমাণে ডেটা দিয়ে আমি আপনার ব্যবহারযোগ্য টেবিল বা ডেটা স্ট্রাকচার পরিষ্কার করার পরামর্শ দিচ্ছি (একটি ভাল ডিবিএ কার্যকর হয়)। সম্ভব না হলে:

  • টেবিলটির নাম পরিবর্তন করুন ( ALTER) এবং CREATEওয়ার্কবেঞ্চ থেকে পাওয়া স্ক্রিপ্টটি দিয়ে একটি নতুন তৈরি করুন । আপনার প্রয়োজনীয় নতুন ক্ষেত্রের সাহায্যে আপনি এই ক্যোয়ারীটি বাড়িয়ে দিতে পারেন
  • পুরানো টেবিল থেকে নতুনটিতে ডেটা লোড করুন:
    SET FOREIGN_KEY_CHECKS = 0;
    SET UNIQUE_CHECKS = 0;
    SET AUTOCOMMIT = 0;
    INSERT INTO new_table (fieldA, fieldB, fieldC, ..., fieldN)
       SELECT fieldA, fieldB, fieldC, ..., fieldN
       FROM old_table
    SET UNIQUE_CHECKS = 1;
    SET FOREIGN_KEY_CHECKS = 1;
    COMMIT;

    এইভাবে আপনি রেকর্ড অনুসারে রেকর্ড চালানোর জন্য সূচীকরণ / ইত্যাদি এড়ান। টেবিলের "আপডেট" এখনও ধীর থাকবে (যেহেতু ডেটা পরিমাণে বিশাল) তবে এটি আমি ভাবার দ্রুততম উপায়।

    সম্পাদনা: উপরের নমুনা প্রশ্নের সাথে ব্যবহৃত আদেশগুলি সম্পর্কে বিশদ জানতে এই নিবন্ধটি পড়ুন ;)

আমার অপশন ঠিক আছে। এবং আমি পেয়েছি SET NAMES utf8এবং। তবে COLLATIONমেহ আইডিকি কেন 30% এর পরে ডেটা দূষিত হয় sed। আমি মনে করি বাল্ক লোডটি দ্রুত হবে তবে সম্ভবত আরও কিছু উপস্থিত রয়েছে যা আমি অনুপস্থিত। আপনাকে ধন্যবাদ মার্ক
এয়ার্সার

1
@ ইয়েরসার ডেটা দুর্নীতির অনেকগুলি কারণ থাকতে পারে: যেমন আপনি ফাইলটি একটি সম্পাদক দিয়ে খোলে যা সমস্ত অক্ষর সমর্থন করে না এবং এটি সংরক্ষণ করে। অথবা, আপনি যেভাবে ডাম্প থেকে আমদানি করার চেষ্টা করছেন তা ডেটাটিকে দূষিত করে (এটি বাগিচা এবং সঠিকভাবে ফাইলটি পড়তে পারে না)। অথবা, একই লোকটি কিছু তথ্যের অংশকে একটি অভিব্যক্তি হিসাবে চিহ্নিত করতে পারে (যেমন "জেমস \ রবিন" == "\ আর" "এক্সপ্রেশন হিসাবে) বা কমান্ড ইত্যাদি This এই কারণেই আমি কখনই ডাম্প ব্যবহার করার পরামর্শ দিই না, এমনকি বাইনারি ডেটা ডাম্প সরঞ্জাম দিয়েও না শুধুমাত্র, এমনকি dev.mysql.com/doc/refman/5.6/en/mysqldump.html (বা এমএস এসকিউএল সার্ভারের জন্য বিসিপি) দিয়েও নয় । এটি অনেক বার ভুল হয়ে গেছে ...

ইয়াপ আমি হেক্স-ব্লব দিয়ে চেষ্টা করেছি। এটা সাহায্য করে না। এছাড়াও আপনি সিড মাইএসকিএল ব্যবহার করার পরে কিছু নাম কমান্ড হিসাবে সনাক্ত করতে পারেন (সমস্ত কিছু নয়)। অদ্ভুত এবং বগি যে। আজ রাতে বাল্ক লোড চেষ্টা করবে। আশা করি 10-15 ঘন্টা এ এটি কমপক্ষে করা হবে।
আনসারস

@ ইউনেসার আশা করি এটি হবে। আপনি কেবলমাত্র ডেটার একটি অংশ যুক্ত করার চেষ্টা করতে পারেন, এর জন্য 10% বলে দিন যে এটি কতটা সময় নেয় তা দেখতে - এবং পুরো লেনদেনের জন্য একটি অনুমান আছে। যদিও এটি খুব রুক্ষ অনুমান হবে, ক্যাশে / মেমরি / যা কিছু ভরাট হয়ে / ওভারলোড হয়ে যায় তা ধীরে ধীরে যেতে পারে।

1
ধন্যবাদ মার্ক। দুর্দান্ত কাজ করেছেন। এমনকি দ্রুত ডাম্প থেকে পুনরুদ্ধার। ~ 5 ঘন্টা নিয়েছে।
এয়ার্সার

5

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

তবে বড় টেবিলগুলিতে অনলাইন পরিবর্তন করার জন্য একটি সুপরিচিত পদ্ধতি হ'ল পিটি-অনলাইন-স্কিমা-পরিবর্তন । এই সরঞ্জামটি কী করে তার সরলতর দৃষ্টিভঙ্গি ডকুমেন্টেশন থেকে অনুলিপি করা হয়েছে:

পিটি-অনলাইন-স্কিমা-পরিবর্তনটি টেবিলের খালি অনুলিপি পরিবর্তনের জন্য, এটিকে পছন্দসই হিসাবে পরিবর্তন করে এবং তারপরে মূল টেবিল থেকে নতুন সারণিতে সারিগুলি অনুলিপি করে কাজ করে। অনুলিপিটি সম্পূর্ণ হয়ে গেলে, এটি মূল টেবিলটি সরিয়ে নিয়ে যায় এবং এটিকে নতুন সাথে প্রতিস্থাপন করে। ডিফল্টরূপে এটি মূল টেবিলটিও ফেলে দেয়।

এই পদ্ধতিটি সম্পূর্ণ হতে কিছুটা সময় নিতে পারে তবে প্রক্রিয়া চলাকালীন মূল টেবিলটি সম্পূর্ণ ব্যবহারযোগ্য হবে।


আমি আজ রাতের পরে বাল্ক লোড করার চেষ্টা করব। যদি এটি কাজ না করে তবে সম্ভবত এই সরঞ্জামটির প্রয়োজন হবে। কমান্ড হিসাবে সেড ব্যবহার করার পরে কিছু প্রতীক অকার্যকর করার ফলে ত্রুটিগুলি ঘটে। উদাহরণস্বরূপ 'D\'agostini'ত্রুটি ঘটবে unknown command '\''। তবে সর্বদা নয়, 30% ক্ষেত্রে এর মতো। অদ্ভুত এবং বগি যে। হেক্স-ব্লব ডাম্পগুলির সাথে একই আসে। ধন্যবাদ ডেরেক
অনেসার

4

alter table add column, algorithm=inplace, lock=none টেবিলটি অনুলিপি না করে এবং লকিংয়ের প্রভাব ছাড়াই একটি মাইএসকিউএল 5.6 টেবিল পরিবর্তন করবে।

গতকাল সবেমাত্র এটি পরীক্ষা করা হয়েছে, জনসাধারণ 70K সারিগুলিকে একটি 280K সারি 7 পার্টিশন টেবিলের মধ্যে, প্রতিটি পার্টিশনে 10 কে সারি sertedোকিয়েছে, অন্য থ্রুপের অনুমতি দেওয়ার জন্য 5 সেকেন্ডের মধ্যে ঘুমায়।

ভর সন্নিবেশগুলি শুরু করা হয়েছে, তারপরে পৃথক সেশনে alterমাইএসকিউএল ওয়ার্কবেঞ্চে উপরের অনলাইন বিবৃতিটি শুরু alterহয়েছিল, সন্নিবেশের আগে সমাপ্ত, দুটি নতুন কলাম যুক্ত হয়েছিল এবং মাইএসকিউএল কোনও সারি অনুলিপি করে নি পরিবর্তনের ফলে কোনও সারি আসে না।


1
কেন এই উত্তরটি বেশি ভোট পাচ্ছে না ?, এটি কি কাজ করছে না?
fguillen

1

বর্তমানে, বিশাল টেবিলগুলি পরিবর্তনের জন্য সর্বোত্তম বিকল্পটি সম্ভবত https://github.com/github/gh-ost

গ-অস্ট মাইএসকিউএল-এর জন্য একটি ট্রিগারলেস অনলাইন স্কিমা মাইগ্রেশন সমাধান। এটি পরীক্ষামূলক এবং প্রসারণযোগ্যতা, গতিশীল নিয়ন্ত্রণ / পুনর্গঠন, নিরীক্ষণ এবং অনেকগুলি অপারেশনাল পার্ক সরবরাহ করে।

স্থানান্তরিত টেবিলের বিদ্যমান কাজের চাপ থেকে ডিক্লোল করে গ-অস্ট পুরো মাইগ্রেশন জুড়ে মাস্টারের উপর হালকা কাজের চাপ তৈরি করে।

এটি বিদ্যমান সমাধানগুলির সাথে বছরের অভিজ্ঞতার ভিত্তিতে ডিজাইন করা হয়েছে এবং টেবিলের স্থানান্তরগুলির দৃষ্টান্ত পরিবর্তন করে।


1

আমি মনে করি মাইডাম্পার / মাইলোডার এই জাতীয় ক্রিয়াকলাপের জন্য একটি ভাল সরঞ্জাম: প্রতিদিন আরও ভাল হচ্ছে। আপনি আপনার সিপিইউগুলি ব্যবহার করতে পারেন এবং সমান্তরালভাবে ডেটা লোড করতে পারেন: http://www.percona.com/blog/2014/03/10/new-mydumper-0-6-1- রিলেজ- অফারস- সার্ভাল- দক্ষতা- এবং- ব্যবহারযোগ্যতা বৈশিষ্ট্য /

আমি কয়েক ঘন্টা গিগাবাইট মাইএসকিউএল টেবিল লোড করতে পরিচালিত করেছি।

এখন, যখন এটি একটি নতুন কলাম যুক্ত করার কথা আসে, মাইএসকিউএল মেমরি TMPঅঞ্চলে পুরো টেবিলটি অনুলিপি করে , ALTER TABLE...যদিও মাইএসকিউএল 5.6 বলে যে এটি অনলাইনে স্কিমা পরিবর্তন করতে পারে, আমি লক ছাড়াই বিশাল টেবিলগুলির জন্য অনলাইনে সেগুলি পরিচালনা করতে পারি নি I এখনও বিতর্ক।


-2

আমি ঠিক একই সমস্যা. সামান্য পরিশ্রম:

টেবিলটি তৈরি করুন new_table নির্বাচন * পুরানো টেবিল থেকে;

নতুন_সারণযোগ্য থেকে মুছুন

টেবিল new_table এ ক্লিক করুন কলম্ব new_ কলাম ইন্ট (11);

পুরানো_সারণযোগ্য থেকে নতুন_সারণযোগ্য প্রবেশ করান *, 0 নির্বাচন করুন

পুরানো_ টেবিল ড্রপ টেবিল; টেবিলটির নতুন নাম রাখুন টেবিলের পুরানো_তালিকা;


তৈরি করার টেবিলের বিবৃতিতে কেবল এমন একটি ক্লজ কেন যুক্ত করবেন না যাতে এটি কোনও ডেটা নির্বাচন করে না? এছাড়াও টেবিলটি কেটে ফেলা আরও কার্যকর হবে তারপর ডেটা মুছে ফেলা
জো ডাব্লু

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