আপনি কীভাবে InnoDB টেবিলগুলি থেকে টুকরো টুকরো টানবেন?


13

আমার কাছে একটি ডাটাবেস রয়েছে যাতে টেবিলের সংখ্যা রয়েছে।

আমি টেবিলগুলি থেকে কিছু রেকর্ড মুছতে চাই যেখানে রেকর্ডের সংখ্যা 20K বা 50K এর বেশি নয়।

সমস্ত টেবিলগুলি ইনোডিবি। আর file_per_tableহল বন্ধ

যখন আমি বেশ কয়েকটি টেবিল থেকে রেকর্ডগুলি মুছব তখন সেখানে টেবিলগুলিতে বিভাজন থাকবে।

খণ্ড খণ্ডন করার কোনও উপায় আছে?

17 এপ্রিল আপডেট

mysql> select TABLE_NAME, TABLE_SCHEMA, Data_free from information_schema.TABLES where TABLE_SCHEMA NOT IN ('information_schema', 'mysql') and Data_Free >0;
+-----------------+--------------+-----------+
| TABLE_NAME      | TABLE_SCHEMA | Data_free |
+-----------------+--------------+-----------+
| City            | world_innodb |   5242880 |
| City_Copy       | world_innodb |   5242880 |
| Country         | world_innodb |   5242880 |
| CountryLanguage | world_innodb |   5242880 |
| a               | world_innodb |   5242880 |
| t1              | world_innodb |   5242880 |
| t2              | world_innodb |   5242880 |
+-----------------+--------------+-----------+
7 rows in set (0.00 sec)

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



1
এবং একটি নিবন্ধ ইনোডিবি : পারকোনার ব্লগ সাইট থেকে বিভাজন দেখাশোনা করুন।
ypercubeᵀᴹ

উত্তর:


14

আমি এটিকে 2010 সালের অক্টোবরে স্ট্যাকওভারফ্লোতে সম্বোধন করেছি

InnoDB অবকাঠামোতে ব্যস্ততম ফাইলটি মনে রাখবেন: / var / lib / mysql / ibdata1

এই ফাইলটিতে সাধারণত চার ধরণের তথ্য থাকে

  • সারণী ডেটা
  • সারণী সূচি
  • এমভিসিসি (মাল্টিভিশনিং কনকুরেন্সি নিয়ন্ত্রণ) ডেটা
  • সারণী মেটাডেটা (টেবিলস্পেস আইডির তালিকা)

OPTIMIZE TABLEইবদাটা ১ তে সঞ্চিত ইনোডিবি টেবিলের বিরুদ্ধে চালানো দুটি জিনিস করে:

  • টেবিলের ডেটা এবং সূচিগুলিকে আইবিডাটা 1-এর সাথে সামঞ্জস্যপূর্ণ করে তোলে, এইভাবে অ্যাক্সেস করা দ্রুত faster
  • এটি আইবডাটা 1টিকে বাড়িয়ে তোলে কারণ অবিচ্ছিন্ন ডেটা এবং সূচী পৃষ্ঠাগুলি আইবডাটা 1-এ যুক্ত হয়েছে

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

ইবদাতা 1 একবার সঙ্কুচিত করার জন্য আপনাকে নিম্নলিখিতগুলি করতে হবে:

1) মাইএসকিউএলএক এসকিউএল পাঠ্য ফাইলে সমস্ত ডাটাবেস ড্যাম্প করুন (এটিকে /root/SQLData.sql কল করুন)

2) সমস্ত ডাটাবেস ফেলে দিন (মাইএসকিএল স্কিমা ব্যতীত)

3) শাটডাউন মাইএসকিএল

4) নিম্নলিখিত লাইনগুলি /etc/my.cnf এ যুক্ত করুন

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

সিডিনোট: ইনোডাব_ফুফার_পুল_সাইজের জন্য আপনার সেট যাই হোক না কেন, নিশ্চিত করুন যে ইনোডাব_লগ_ফিল_সাইজ ইনোডাব_বফার_পুল_সাইজের 25%।

5) আইবডাটা 1, ইব_লগফিল 0 এবং আইব_লগফাইল 1 মুছুন

এই মুহুর্তে, কেবলমাত্র / var / lib / mysql তে মাইএসকিএল স্কিমা থাকা উচিত

6) মাইএসকিএল পুনরায় চালু করুন

এটি ইবদাটা 1 পুনরায় 10 বা 18 এমবি (মাইএসকিউএল এর সংস্করণ অনুসারে), আই_ব্লগফিলি 0 এবং আইবি_লগফাইল 1 প্রতিটি 1 জি তে পুনরায় তৈরি করবে

7) মাইএসকিএলে পুনরায় লোড / রুট / এসকিউএলডাটা.এসকিউএল

আইবডাটা 1 বৃদ্ধি পাবে তবে কেবল টেবিল মেটাডেটা থাকে। আসলে, কয়েক বছর ধরে এটি খুব ধীরে ধীরে বৃদ্ধি পাবে। আপনার যদি নিম্নলিখিতগুলির এক বা একাধিকটি থাকে তবে দ্রুত ইবদাতা 1 দ্রুত বৃদ্ধির একমাত্র উপায়:

  • DDL অনেক ( CREATE TABLE, DROP TABLE, ALTER TABLE)
  • প্রচুর লেনদেন
  • প্রতি লেনদেনে প্রতিশ্রুতিবদ্ধ করতে প্রচুর পরিবর্তন

প্রতিটি InnoDB টেবিল ইবদাটা 1 এর বাইরে থাকবে

মনে করুন আপনার কাছে একটি আইএনডিবিবি টেবিল আছে যার নাম mydb.mytable। আপনি যদি / var / lib / mysql / mydb এ যান তবে আপনি টেবিলের প্রতিনিধিত্বকারী দুটি ফাইল দেখতে পাবেন

  • mytable.frm (স্টোরেজ ইঞ্জিন শিরোনাম)
  • mytable.ibd (টেবিল ডেটা এবং mydb.mytable জন্য সারণী সূচীর হোম)

আইবডাটা 1-এ আর কখনও ইনোডিবি ডেটা এবং সূচি থাকবে না।

/Etc/my.cnf- এ ইনোডোবি_ফাইলে_পিটার / টেবিল বিকল্পের সাহায্যে আপনি চালাতে পারবেন OPTIMIZE TABLE mydb.mytable;এবং ফাইল /var/lib/mysql/mydb/mytable.ibd আসলে সঙ্কুচিত হবে।

আমি আমার কেরিয়ারে মাইএসকিউএল ডিবিএ হিসাবে অনেকবার এটি করেছি

আসলে, আমি প্রথমবার এটি করার পরে, আমি একটি 50 জিবি ইবদাতা 1 ফাইলটি 500 এমবিতে ভেঙে ফেলেছি।

একবার চেষ্টা করে দেখো. আপনার যদি এই বিষয়ে আরও প্রশ্ন থাকে তবে আমাকে ইমেল করুন। আমাকে বিশ্বাস কর. এটি স্বল্পমেয়াদে এবং দীর্ঘ মেয়াদে কাজ করবে !!!

আপডেট 2012-04-19 09:23 ইডিটি

উপরের পদক্ষেপগুলি চালনার পরে, আপনি কীভাবে সারণিগুলি ডিফ্র্যাগমেন্টেশন করা দরকার তা কীভাবে নির্ধারণ করতে পারেন? এটি সন্ধান করা সম্ভব তবে আপনার এটির স্ক্রিপ্ট থাকবে।

এখানে একটি উদাহরণ দেওয়া আছে: ধরুন আপনি টেবিলটি রেখেছেন mydb.mytable। ইনোডাব_ফিল_পিটার_সামগ্রী সক্ষম করার সাথে আপনার /var/lib/mysql/mydb/mytable.ibd ফাইলটি রয়েছে

আপনাকে দুটি সংখ্যা পুনরুদ্ধার করতে হবে

ওএস থেকে ফাইলসাইজ করুন: আপনি ওএস থেকে ফাইলসাইজ নির্ধারণ করতে পারেন

ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print $5}'

তথ্য থেকে ফাইল ফাইল করুন: আপনি এই জাতীয় তথ্য_সেমিমা থেকে ফাইলাইজগুলি সনাক্ত করতে পারেন।

SELECT (data_length+index_length) tblsize FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable';

ওএস মান থেকে কেবল INFORMATION_SCHEMA মান বিয়োগ করুন এবং INFORMATION_SCHEMA মান দ্বারা পার্থক্যটি ভাগ করুন।

সেখান থেকে আপনি সিদ্ধান্ত নেবেন যে টেবিলটি ডিফ্র্যাগ করার জন্য কোন শতাংশ প্রয়োজনীয় বলে মনে করছেন। অবশ্যই, আপনি নিম্নলিখিত কমান্ডগুলির একটি ব্যবহার করে এটিকে ডিফ্র্যাগ করেছেন:

OPTIMIZE TABLE mydb.mytable;

অথবা

ALTER TABLE mydb.mytable ENGINE=InnoDB;

আমি মনে করি না / var / lib / mysql / ibdata1 খুব ব্যস্ত আপনি যদি প্রস্তাবিত ইনোডব_ফিল_পিটার_ট্যাবল = 1 বিকল্পটি ব্যবহার করেন
ক্র্যাকারজ্যাক 9

1
@ ক্র্যাকারজ্যাক 9 আইবডাটা 1 এতে যা যা ঘটেছিল তার কারণে এটি অবিশ্বাস্যভাবে সুপারবুসি: 1) ডাবল রাইফ বাফার ইনফো, 2) সেকেন্ডারি ইনডেক্সগুলির জন্য বাফার সন্নিবেশ করান, 3) ডেটা ডিকশনারি, 4) রোলব্যাক সেগমেন্টস, 5) টেবিল স্পেসটি পূর্বাবস্থায় ফিরিয়ে আনুন। এই জিনিসগুলির চিত্রিত উপস্থাপনের জন্য দয়া করে স্ক্রিবড.ডক / ৩৩৩৩3749৯৪ / এক্সট্রাডিবি- ইনডোনালবি-ইনটার্নালস-ইন-ড্রয়িং করুন । এমনকি InnoDB টেবিলগুলির জন্য ডেটা এবং সূচী পৃষ্ঠাগুলি অপসারণের পরেও, আইবডাটা 1 উচ্চ লেনদেনের পরিবেশে এখনও উল্লেখযোগ্যভাবে বৃদ্ধি পেতে পারে।
রোল্যান্ডোমাইএসকিউএলডিবিএ


আমি বুঝতে পারি নি যে এটি এখনও এত বেশি ব্যবহৃত হয়েছিল। ব্যাপকভাবে প্রশংসা করেছিল!
ক্র্যাকারজ্যাক

@ রোল্যান্ডোমাইএসকিউএলডিবিএ আপনার সময় পেলে আপনি কি গাদা পপ করতে পারেন?
ypercubeᵀᴹ

5

যদি আপনি ঘন ঘন সারিগুলি মুছে ফেলেন (বা ভেরিয়েবল-দৈর্ঘ্যের ডেটা ধরণের সাহায্যে সারিগুলি আপডেট করেন), আপনি ফাইল সিস্টেম বিভাজনের মতো একইভাবে আপনার ডেটা ফাইলগুলিতে প্রচুর অপচয়যোগ্য স্থান দিয়ে শেষ করতে পারেন।

আপনি যদি innodb_file_per_tableবিকল্পটি ব্যবহার না করে থাকেন তবে কেবলমাত্র এটির জন্য আপনি যা করতে পারেন তা হ'ল ডেটাবেস রফতানি এবং আমদানি করা, একটি সময় এবং ডিস্ক-নিবিড় পদ্ধতি।

তবে আপনি যদি ব্যবহার করেন তবে আপনি innodb_file_per_tableএই স্থানটি সনাক্ত এবং পুনরায় দাবি করতে পারবেন!

5.1.21 এর আগে, ফ্রি স্পেস কাউন্টারটি তথ্য_সেমি.টিবেবলের টেবিল_কমেন্ট কলাম থেকে পাওয়া যায়। কমপক্ষে 100 এম (প্রকৃতপক্ষে 97.65 এম) ফাঁকা জায়গা সহ টেবিলগুলি সনাক্ত করতে এখানে কিছু এসকিউএল রয়েছে:

টেবিল_সেমিমা, টেবিলের নাম, টেবিল_কমেন্ট থেকে তথ্য_চেমি.টিবল নির্বাচন
করুন যেখানে ইঞ্জিন পছন্দ করুন 'ইনোডিবি' এবং টেবিল_কমেন্ট রিলাইক করুন 'ইনোডিবি বিনামূল্যে: ([0-9] {6,})। *';

5.1.21 দিয়ে শুরু করে, এটি ডেটা_ফ্রি কলামে স্থানান্তরিত করা হয়েছে (একটি আরও উপযুক্ত জায়গা):

টেবিল_সেমিমা, টেবিলের নাম, ডেটা_ফ্রি / 1024/1024 হিসাবে তথ্য_চেমা.টায়বল থেকে ডাটা_ফ্রি_এমবি নির্বাচন করুন যেখানে ইঞ্জিন পছন্দ করুন 'ইনোডিবি' এবং ডেটা_ফ্রি> 100 * 1024 * 1024;

আপনি টেবিলটি পুনর্নির্মাণ করে হারিয়ে যাওয়া জায়গাটি পুনরায় দাবি করতে পারেন। এটি করার সর্বোত্তম উপায় হ'ল কিছু পরিবর্তন না করেই 'অল্টার টেবিল' ব্যবহার করা:

ALTER TABLE `TableName` ENGINE=InnoDB;

আপনি যদি কোনও ইনোডিবি টেবিলে 'অনুকূলিতকরণ টেবিল' চালনা করেন তবে পর্দার আড়ালে মাইএসকিউএল এটি করে। এটি একটি পঠিত লক তৈরি করবে তবে পুরো টেবিল লক নয় not এটি কতক্ষণ সময় নেয় তা পুরোপুরি নির্ভর করে টেবিলের ডেটার পরিমাণের উপর (তবে ডেটা ফাইলের আকারের নয়)। আপনার যদি মুছে ফেলা বা আপডেটগুলির একটি উচ্চ ভলিউম সহ একটি টেবিল থাকে তবে আপনি এই মাসিক বা এমনকি সাপ্তাহিক চালাতে চাইতে পারেন।


আরও একটি বিষয় আমি ডেটা_ফ্রি> 100 * 1024 * 1024 এর অর্থ কী তা বুঝতে অক্ষম .. এবং যখন আমি ফলাফলটি দেখলাম তখন আমি সিদ্ধান্ত নিতে পারছি না যে টেবিলটি খণ্ডিত কি না .. ?? কোনও উপায় আছে যাতে আমি বলতে পারেন টেবিলটি খণ্ডিত বা খণ্ডিত নয়?
আব্দুল মানাফ

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