সারণীতে ব্যর্থ হওয়া মাইএসকিউএল সূচক তৈরির পরিমাণ পূর্ণ


10

আপডেট: tl; dr: সমস্যাটি মাইএসকিউএল TMPDIRসূচকগুলি তৈরি করার সময় ব্যবহার করে । এবং আমার TMPDIRএকটাই ছিল ডিস্ক স্পেসের বাইরে চলে।

আসল প্রশ্ন:

আমি একটি ইনোডিবি টেবিলে একটি সূচক যুক্ত করার চেষ্টা করছি এবং একটি পেয়ে যাচ্ছি table is full error। আমার কাছে পর্যাপ্ত ডিস্কের জায়গা রয়েছে এবং মাইএসকিউএল কনফিগারেশনে ফাইল-প্রতি-সারণী = 1 রয়েছে। সারণির ডেটা 85 জিবি এবং আমি ধরে নিই যে সূচিটি 20GB - 30GB এর কাছাকাছি হবে এবং এর থেকে আমার কাছে ডিস্কের অনেক বেশি জায়গা রয়েছে। আমি ext3ও ব্যবহার করছি তাই ওএস দৃষ্টিকোণ থেকে ফাইলের আকার সীমাতে কোনও সমস্যা আছে বলে আমি মনে করি না।

লগ করা ত্রুটিটি দেখতে এরকম দেখাচ্ছে:

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

কী কারণে এটি ঘটছে এবং আমি কীভাবে সমাধান করতে পারি?

তৈরি টেবিল:

`CREATE TABLE `my_table` (
 `uid_from` bigint(11) NOT NULL,
 `uid_to` bigint(11) NOT NULL,
 `counter` int(11) NOT NULL,
 `updated` date NOT NULL,
 PRIMARY KEY (`uid_to`,`uid_from`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8`

যেমনটি ডেটা 87.4 গিগাবাইট এবং আমি অনুমান করি যে প্রায় 1.5B সারি রয়েছে।

SHOW GLOBAL VARIABLES LIKE 'tmpdir';
Variable_name   Value
tmpdir  /tmp

[root@web ~]# df -h /tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       40G   24G   14G  64% /

1
"InnoDB: আপনার ওএস এবং ফাইল সিস্টেমটি এই আকারের ফাইল সমর্থন করে দেখুন In - আপনি এটি পরীক্ষা করেছেন? আপনি ext2 ব্যবহার করছেন? , ext3? XFS? ব্যবহারকারীর জন্য কোটা পরীক্ষা করেছেন?
ফিলি

@ ফিল দু'জনকে চেক করেছেন। আমি ext3 ব্যবহার করছি এবং প্রায় ইতিবাচক আমি এখানে ডিস্কের জায়গার সমস্যা নেই। হঞ্চ হ'ল এটি কোনও লগ তার সীমা বা অন্য কিছুতে পৌঁছানোর সাথে কিছু করার, তবে কীভাবে যাচাই করা এবং ঠিক করা যায় তা আসলে কোনও ধারণা নেই।
নওম

আমি ভাবছি "(মার্জ)" ফাইলটি কী?
আকুজিনস্কি

@akuzminsky হুম আমার কি ধারণা নেই। আমি কেবল পিএইচপিএমইএডমিন থেকে একটি নতুন সূচক তৈরি চালিয়েছি।
নওম

টিএমপিডিআইআরের জন্য +1, এটি আমার সার্ভারেও সমস্যা ছিল।
চাদ ই।

উত্তর:


8

ত্রুটি বার্তা দ্বারা বোকা বানাবেন না দয়া করে The table 'my_table' is full। এই বিরল দৃশ্যের ডিস্কস্পেসের সাথে একেবারেই কোনও সম্পর্ক নেই। এই টেবিলের পূর্ণ শর্তটি InnoDB এর অভ্যন্তরীণ নদীর গভীরতানির্ণয়টির সাথে সম্পর্কিত।

প্রথমে ইনোডিবি আর্কিটেকচারের এই চিত্রটি একবার দেখুন

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 বা আরও বেশি বিনামূল্যে রয়েছে


ডাম্প (85GB ডেটা) থেকে প্রথম স্থানে টেবিলটি তৈরি করতে আমার কয়েক সপ্তাহ লেগেছে took এটি আবারও করা ছাড়া অন্য কোনও উপায় আছে কি? আপনি সম্ভবত টেবিল বিভক্ত করার সুপারিশ করবেন?
নোম

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

তবে এই টেবিলটি তৈরি করা (আবার) চিরকালের জন্য গ্রহণ করবে। রোলব্যাক বিকল্পটি অক্ষম করার সময় কোনও তৈরি সূচক চালানোর কোনও উপায়?
নওম

একটি সূচক তৈরি করা ডিডিএল নয় ডিএমএল। আপনি ডিডিএল আচরণ পরিবর্তন করতে পারবেন না। এজন্য আমার পোস্টে ডিএমএল কৌশলগুলি ব্যবহার করা হয়েছে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

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