ত্রুটি বার্তা দ্বারা বোকা বানাবেন না দয়া করে The table 'my_table' is full
। এই বিরল দৃশ্যের ডিস্কস্পেসের সাথে একেবারেই কোনও সম্পর্ক নেই। এই টেবিলের পূর্ণ শর্তটি InnoDB এর অভ্যন্তরীণ নদীর গভীরতানির্ণয়টির সাথে সম্পর্কিত।
প্রথমে ইনোডিবি আর্কিটেকচারের এই চিত্রটি একবার দেখুন
দয়া করে নোট করুন যে সিস্টেম টেবিলস্পেস (ফাইল ইবদাটা) কেবলমাত্র 128 রোলব্যাক সেগমেন্ট এবং 1023 রোলব্যাক স্লট প্রতি রোলব্যাক সেগমেন্টে রয়েছে। এটি কোনও লেনদেনের রোলব্যাক ক্ষমতার আকারের উপর সীমাবদ্ধ করে। অন্য কথায়, যদি কোনও একক রোলব্যাক সেগমেন্টে কোনও লেনদেন সমর্থন করতে 1023 এর বেশি স্লট প্রয়োজন হয় তবে লেনদেনটি সেই শর্তটিতে পড়বে table is full
।
নিউ জার্সির রেড লবস্টার রেস্তোঁরাটির কথা ভাবুন । এটির ধারণক্ষমতা 200 জনের হতে পারে। রেস্তোঁরাটি পূর্ণ হলে, এক লাইন লোক অপেক্ষা করতে বাইরে যেতে পারে। লাইনের লোকেরা অধৈর্য হয়ে উঠলে, রেস্তোঁরা পূর্ণ থাকায় তারা চলে যেতে পারে। স্পষ্টতই, সমাধানটি নিউ জার্সিকে আরও বড় (বা আরও ডিস্কস্পেস পাওয়ার) নয় getting সমাধানটি হ'ল রেড লবস্টার রেস্তোঁরাটিকে আরও বড় করা। এইভাবে আপনি বসার ক্ষমতা ২৪০-তে বাড়িয়ে দিতে পারেন, এমনকি ২৪০ জনেরও বেশি লোক রেড লবস্টারে আসার সিদ্ধান্ত নিলে বাইরেও একটি লাইন তৈরি হতে পারে।
কেবল একটি উদাহরণ দেওয়ার জন্য, আমার কাছে সিস্টেমের টেবিলস্পেসের 2 টিবি সহ একটি ক্লায়েন্ট ছিল এবং ইনোডোবি_ফাইলে_পিটি টেবিল অক্ষম ছিল। (আইবডাটা 1-এর 346G, ইবদাটা 2-এর রিসেট)। আমি এই জিজ্ঞাসা চালানো
SELECT SUM(data_length+index+length) InnoDBDataIndexSpace
FROM information_schema.tables WHERE engine='InnoDB';
এরপরে, আমি ইবদাটা 1 এবং ইবদাটা 2 এর ফাইলগুলির যোগফল থেকে InnoDBDataIndexSpace সংগ্রহ করেছি। আমি দুটি জিনিস পেয়েছিলাম যা আমাকে অবাক করেছিল
- সিস্টেম টেবিল স্পেসের মধ্যে 106 জিবি বাকি ছিল।
- আমি একই
Table is Full
অবস্থা পেয়েছি
এর অর্থ হ'ল 106 জিবি ইনোডিবি'র অভ্যন্তরীণ নদীর গভীরতানির্ণয়ের জন্য ব্যবহার করছিল। ক্লায়েন্ট এ সময় ext3 ব্যবহার করছিল।
আমার জন্য সমাধানটি ছিল ইবদাতা 3 যুক্ত করা। আমি আমার পুরানো পোস্টে এটি নিয়ে আলোচনা করেছি "ইনোডাব_ফিল_পিটার_ টেবিল" দিয়ে "টেবিলটি ... পূর্ণ" কীভাবে সমাধান করবেন?
অন্যান্য পোস্টেও আমি এটি নিয়ে আলোচনা করেছি
মনে রাখবেন যে ইনডোডবি_ফাইলে_পিটার_সেবযোগ্য সক্ষম করা থাকলেও এই অবস্থাটি ঘটতে পারে । কিভাবে? রোলব্যাক এবং পূর্বাবস্থায় ফিরুন লগ আছে অনিয়ন্ত্রিত স্পাইক উৎস ibdata1 জন্য বৃদ্ধি হয় ।
আপনার আসল প্রশ্ন
যেহেতু আপনি কোনও টেবিলে একটি সূচক যুক্ত করছেন এবং পাচ্ছেন তাই Table is Full
, টেবিলটি অবশ্যই বিশাল হতে হবে এবং কোনও একক রোলব্যাক সেগমেন্টের ভিতরে ফিট করতে পারে না। আপনাকে অবশ্যই নিম্নলিখিতগুলি করতে হবে:
পদক্ষেপ 01
ডাম্প ফাইলে ডেটা পান
mysqldump --no-create-info mydb mytable > table_data.sql
পদক্ষেপ 02
মাইএসকিউএল এ লগইন করুন এবং এটি চালান
USE mydb
CREATE TABLE mytable_new LIKE mytable;
ALTER TABLE mytable_new ADD INDEX ... ;
ALTER TABLE mytable RENAME mytable_old;
ALTER TABLE mytable_new RENAME mytable;
পদক্ষেপ 03
ডেটা সহ অতিরিক্ত সূচী সহ টেবিলটি লোড করুন
mysql -Dmydb < table_data.sql
এখানেই শেষ.
দেখুন, সমস্যাটি হ'ল ALTER TABLE একক লেনদেন হিসাবে আপনার বিশাল টেবিলের সমস্ত সারি ইনজেক্ট করার চেষ্টা করবে। মাইএসকিএলডাম্প ব্যবহার করে তথ্যটি টেবিলের মধ্যে সন্নিবেশ করা হবে (এখন নতুন সূচকের সাহায্যে) একসাথে কয়েক হাজার সারি, একক লেনদেনে সমস্ত সারি নয়।
চিন্তা করবেন না যে কোনও কিছুর ক্ষেত্রে what if this doesn't work?
আসল টেবিলটির নাম দেওয়া হবে mytable_old
। এটি ব্যাকআপ হিসাবে কাজ করতে পারে। আপনি যখন জানবেন যে নতুন টেবিলটি আপনার জন্য কাজ করে তখন আপনি ব্যাকআপটি ড্রপ করতে পারেন।
একবার চেষ্টা করে দেখো !!!
আপডেট 2014-06-16 11:13 ইডিটি
আপনি যদি বৃহত্তর ডেটার ডাম্প সম্পর্কে উদ্বিগ্ন হন তবে কেবল এটি জিপ করুন।
আপনি একই পদক্ষেপগুলি করতে পারেন তবে নীচের হিসাবে
পদক্ষেপ 01
ডাম্প ফাইলে ডেটা পান
mysqldump --no-create-info mydb mytable | gzip > table_data.sql.gz
পদক্ষেপ 02
মাইএসকিউএল এ লগইন করুন এবং এটি চালান
USE mydb
CREATE TABLE mytable_new LIKE mytable;
ALTER TABLE mytable_new ADD INDEX ... ;
ALTER TABLE mytable RENAME mytable_old;
ALTER TABLE mytable_new RENAME mytable;
পদক্ষেপ 03
ডেটা সহ অতিরিক্ত সূচী সহ টেবিলটি লোড করুন
gzip -d < table_data.sql.gz | mysql -Dmydb
অথবা
gunzip < table_data.sql.gz | mysql -Dmydb
আপডেট 2014-06-16 12:55 ইডিটি
আমি এই সমস্যাটি সম্পর্কে আরও একটি দিক নিয়ে ভাবলাম।
যেহেতু আপনি ডিডিএল করছেন এবং ডিএমএল করছেন না, এটি সম্ভবত ইনোডিবি অভ্যন্তরীণ নদীর গভীরতানির্ণয় নয়। যেহেতু ডিডিএল ইনোডিবি-র জন্য রোলব্যাক করতে পারে না , তাই সমস্যাটি বাহ্যিক নদীর গভীরতানির্ণয় হতে হবে। এই বাহ্যিক নদীর গভীরতানির্ণয় কোথায় আটকা পড়েছে? আমি ওএসের জন্য টেম্পোর ফোল্ডারটিকে সন্দেহ করি। কেন?
140616 13:04:33 InnoDB: Error: Write to file (merge) failed at offset 3 1940914176.
InnoDB: 1048576 bytes should have been written, only 970752 were written.
InnoDB: Operating system error number 0.
InnoDB: Check that your OS and file system support files of this size.
InnoDB: Check also that the disk is not full or a disk quota exceeded.
InnoDB: Error number 0 means 'Success'.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/operating-system-error-codes.html
140616 13:04:33 [ERROR] /usr/libexec/mysqld: The table 'my_table' is full
দেখুন disk quota exceeded
? এই ডিস্ক কোটা কোথায় চাপানো হচ্ছে?
এই কোয়েরিটি চালান
SHOW GLOBAL VARIABLES LIKE 'tmpdir';
তুমি বলেছ /var/lib/mysqltmp
এবার ওএস-এ এটি চালান
df -h /var/lib/mysqltmp
কিছু আমাকে বলছে যে স্থানটি /var/lib/mysqltmp
শেষ হয়ে গেছে, সর্বোপরি, আপনার কাছে কেবল 14G বিনামূল্যে have ডিডিএল (সূচক তৈরি করতে) এর দৃষ্টিতে, একটি রোলব্যাক ঘটেছিল, ইবদাটা 1 ফাইলে নয়, লোকেশনে tmpdir
। যদি /var/lib/mysqltmp
কোথাও মাউন্ট করা হয় না, তবে অস্থায়ী ডেটা মূল বিভাজনে লেখা হচ্ছে। যদি /var/lib/mysqltmp
কোথাও মাউন্ট করা হয়, তবে সেই মাউন্টটি সারি ডেটাতে ভরা হচ্ছে। উভয় ক্ষেত্রেই ডিডিএল সম্পন্ন করার মতো পর্যাপ্ত জায়গা নেই।
আপনার এখানে দুটি বিকল্প রয়েছে
বিকল্প 1
আপনি একটি বৃহত ডিস্ক তৈরি করতে পারেন (সম্ভবত 100 + গিগাবাইট সহ) এবং /var/lib/mysqltmp
সেই বৃহত ডিস্কে মাউন্ট করতে পারেন।
বিকল্প # 2
আমার 3-পদক্ষেপের পরামর্শগুলি এখনও আপনার সীমিত ডিস্কস্পেসের সাথে কাজ করা উচিত
ধারাভাষ্য
আপনার পোস্ট করা ত্রুটি বার্তাটি লজ্জার বিষয়
InnoDB: Operating system error number 0.
InnoDB: Error number 0 means 'Success'.
এর অর্থ ওএস ঠিক আছে। এই পরিস্থিতির জন্য এটি সম্পর্কিত কোনও ত্রুটি নম্বর নেই।
আপনার আরও একটি বিষয় জানা উচিত। মাইএসকিউএল ডকুমেন্টেশন বলছে যে ইনোডিবি-র জন্য দ্রুত সূচক তৈরি এখনও ডিস্কে যায় :
সূচী তৈরির সময়, ফাইলগুলি অস্থায়ী ডিরেক্টরিতে লেখা হয় (Un ইউনিক্সে টিএমপিডিআইআর, উইন্ডোতে% টিইএমপি%, বা --tmpdir কনফিগারেশন ভেরিয়েবলের মান)। প্রতিটি অস্থায়ী ফাইল একটি কলাম ধারণ করার জন্য যথেষ্ট বড় যা নতুন সূচক তৈরি করে এবং প্রতিটি চূড়ান্ত সূচকে মিশ্রিত হওয়ার সাথে সাথেই তা সরানো হয়।
মাইএসকিউএল-এর সীমাবদ্ধতার কারণে, আপনি যখন টেম্পেরি টেবিলটিতে একটি সূচক তৈরি করেন তখন "দ্রুত সূচক তৈরি" ব্যবহার না করে সারণীটি অনুলিপি করা হয়। এটি মাইএসকিউএল বাগ # 39833 হিসাবে রিপোর্ট করা হয়েছে ।
আপডেট 2014-06-16 13:58 ইডিটি
[mysqld]
datadir = /mnt/cbsvolume1/var/lib/mysql
tmpdir = /mnt/cbsvolume1/var/lib/mysql
দয়া করে নিশ্চিত করুন /mnt/cbsvolume1/var/lib/mysql
যে 100G বা আরও বেশি বিনামূল্যে রয়েছে