منبع اصلی نوشتار زیر در این لینک قرار دارد

فایل ibdata1 و رشد اندازه آن در MySQL

در MySQL زمانی که از InnoDB استفاده می شود، تمامی اشیا پایگاه داده (مانند جداول و ایندکس ها) درون System Tablespace ذخیره می شوند. فایل ibdata1 که در محل پیشفرض فایل های MySQL قرار دارد شامل تمامی اشیا پایگاه داده می شود.

 بنابراین با داشتن یک پایگاه داده بزرگ، اندازه این فایل به طور مداوم و پی در پی در حال رشد خواهد بود. از دستور زیر می توان برای پیدا کردن اندازه فایل استفاده کرد.

ls -lh ibdata1
du -hs ibdata1

System Tablespace در MySQL متشکل از یک یا چند فایل ibdata است که برای ذخیره سازی فرا داده های مربوط به اشیا مربوط به InnoDB (دیتا دگشنری ها)، ذخیره سازی Undo Log ها، Change Buffer و doublewrite buffer استفاده می شود.

در مقابل این رویکرد ویژگی File-Per-Table Tablespaces وجود دارد که هر یک از جدوال و اشیای مربوط به InnoDB درون یک فایل مجرا با پسوند ibd. ذخیره می شوند. هر فایل با پسوند ibd. معرف یک Tablespace مجزا است. این ویژگی توسط متغیر سیستمی innodb_file_per_table کنترل می شود. اگر مقدار این متغیر ON باشد، یعنی ویژگی File-Per-Table Tablespaces فعال می باشد. (به صورت پیشفرض در MySQL این ویژگی فعال است).

show variables like 'innodb_file_per_table';

با فعال بودن innodb_file_per_table، جدوال درون Tablespace خودشان ذخیره می شوند ولی داده های مربوط به خود InnoDB درون System Tablespace ذخیره می شوند که شامل موارد زیر هستند:

  • data dictionary
  • bufferdoublewrite
  • change buffer
  • bufferundo logs

مقایسه اداره شدن فضای در System Tablespace با Tablespace خاص هر حدول

در System Tablespace زمانی که یک جدول پاک شود (مثلا ۲۰ گیگابایت فضا را اشغال کرده باشد)  و اگر اندازه فایل ibdata1 برابر ۱۰۰ گیگابایت باشد، با پاک شدن این ۲۰ گیگابایت اندازه فایل به ۸۰ گیگابایت کاهش پیدا نمی کند بلکه همان ۱۰۰ گیگابایت باقی می ماند. اگر مجدد جدولی به با اندازه ۵۰ گیگابایت پس از پاک شدن ۲۰ گیگابایت قبلی به MySQL اضافه شود، اندازه آن ۱۵۰ گیگابایت نمی شود بلکه از فضای آزاد درون آن استفاده می شود.

بنابراین مشکل استفاده از System Tablespace برای ذخیره سازی تمامی جداول و ایندکس ها و اشیا پایگاه داده در این است که نمی توان از فضای آزاد شده توسط پاک شدن (DROP) اشیا استفاده مجدد کرد. در مقابل این روش، ویژگی File-Per-Table Tablespaces وجود دارد. همانطور که گفته شد با فعال کردن (ON بودن) متغیر innodb_file_per_table ، این ویژگی فعال می شود.

مقدار متغیر innodb_file_per_table در MySQL های فعلی برابر ON است و بنابراین ویژگی File-Per-Table Tablespaces فعال است. در مقابل، در این روش می توان از فضای آزاد شده توسط DROP کردن جدوال استفاده مجدد کرد. مظور از فضای ذخیره سازی، فضای Storage اختصاص داده شده به MySQL است.

بنابراین در روش استفاده از System Tablespace و فایل (های) اختصاص داده شده به آن هموازه اندازه فایل (ها) در حال رشد است و حتی با پاک کردن جدولی با اندازه زیاد (مثلا ۲۰ گیگابایت) بازهم فضای اختصاص داده شده به فایل آزاد نخواهد شد. به صورت پیشفرض در زیر دایرکتوری محل ذخیره فایل های MySQL فایل ibdata1 وجود دارد که مربوط به System Tablespace است.

بهبود کارایی I/O با استفاده از ویزگی File-Per-Table Tablespaces

در System Tablespace چون تمامی جداول و ایندکس ها درون یک فایل ذخیره می شوند، عملا کارایی و انجام عملیات I/O کاهش پیدا می کند. ولی در ویژگی File-Per-Table Tablespaces چون هر جدول Tablespace خودش را دارد، بنابراین می توان هر جدول را بر روی یک Storage مجزا قرار داد. این زمانی مهم است که اندازه جدوال بسیار بزرگ باشد.

در  MySQL 5.6 به بعد می توان در زمان ایجاد یک جدول مسیر (محل) ذخیره سازی آنرا نیز مشخص کرد. در واقع فایل های مربوط به جدول را در خارج از Data Directory ایجاد می کنیم. (محل پیشفرض فایل های MySQL). همچنین به راحتی می توان تنها یک جدول را به جای کل پایگاه داده انتقال داد.

اطلاعات بیشتر را می توانید از اینجا مطالعه کنید. ویژگی File-Per-Table Tablespaces مربوط به InnoDB است. برای درک بهتر ابتدا با دستور زیر یک پایگاه داده به نام testdb ایجاد کنید. با ایجاد شدن این پایگاه داده یک دایرکتوری در محل پیشفرض فایل های MySQL ایجاد می شود.

CREATE DATABASE testdb;

mysql_innodb_files1

سپس با دستورهای زیر یک جدول به نام test_table درون پایگاه داده testdb ایجاد کنید. با ایجاد جدول دو فایل به نام test_table.frm و test_table.idb درون دایرکتوری testdb ایجاد خواهند شد.

USE testdb;
CREATE TABLE test_table (id INTEGER, name VARCHAR(30));

mysql_innodb_files2

مطالب مربوط به معماری پایگاه داده MySQL را می توانید از اینجا مطالعه کنید.



برچسب ها : ,