| MYISAMCHK(1) | MariaDB Database System | MYISAMCHK(1) |
نام (NAME)
myisamchk - ابزار نگهداری جدولهای MyISAM
خلاصه دستور (SYNOPSIS)
myisamchk [options] tbl_name ...
توضیحات (DESCRIPTION)
ابزار myisamchk اطلاعاتی را درباره جدولهای پایگاهداده به دست میآورد یا آنها را بررسی، تعمیر یا بهینهسازی میکند. myisamchk با جدولهای MyISAM کار میکند (جدولهایی که برای ذخیره دادهها و نمایهها دارای فایلهای .MYD و .MYI هستند).
استفاده از myisamchk برای جدولهای افرازبندیشده (partitioned) پشتیبانی نمیشود.
احتیاط
بهتر است پیش از انجام عملیات تعمیر جدول، یک نسخه پشتیبان از آن تهیه کنید؛ تحت شرایط خاصی ممکن است این عملیات باعث از دست رفتن دادهها شود. خطاهای سامانه فایل از جمله این موارد احتمالی هستند.
ابزار myisamchk را به این صورت فراخوانی کنید:
shell> myisamchk [options] tbl_name ...
بخش options مشخص میکند که میخواهید myisamchk چه کاری انجام دهد. این گزینهها در بخشهای بعدی توضیح داده شدهاند. همچنین میتوانید با اجرای myisamchk --help فهرستی از گزینهها را مشاهده کنید.
بدون مشخص کردن هیچ گزینهای، myisamchk صرفاً به عنوان عملیات پیشفرض، جدول شما را بررسی میکند. برای دریافت اطلاعات بیشتر یا درخواست از myisamchk جهت انجام اقدامات اصلاحی، گزینهها را مطابق توضیحات بخشهای بعد مشخص کنید.
مقدار tbl_name جدول پایگاهدادهای است که میخواهید بررسی یا تعمیر کنید. اگر myisamchk را در جایی غیر از دایرکتوری پایگاهداده اجرا میکنید، باید مسیر دایرکتوری پایگاهداده را مشخص کنید، زیرا myisamchk اطلاعی از مکان قرارگیری پایگاهداده ندارد. در واقع، برای myisamchk اهمیتی ندارد که فایلهای مورد نظر حتماً در یک دایرکتوری پایگاهداده باشند. میتوانید فایلهای مربوط به یک جدول را در مکان دیگری کپی کرده و عملیات بازیابی را روی آنها انجام دهید.
در صورت تمایل میتوانید نام چندین جدول را در خط فرمان myisamchk قید کنید. همچنین میتوانید با مشخص کردن نام فایل نمایهٔ یک جدول (فایلی با پسوند .MYI)، آن جدول را تعیین کنید. این کار به شما امکان میدهد تا با استفاده از الگوی *.MYI تمام جدولهای موجود در یک دایرکتوری را مشخص کنید. برای نمونه، اگر در دایرکتوری پایگاهداده هستید، میتوانید تمام جدولهای MyISAM موجود در آن را به این شکل بررسی کنید:
shell> myisamchk *.MYI
اگر در دایرکتوری پایگاهداده نیستید، میتوانید با مشخص کردن مسیر دایرکتوری، تمام جدولهای موجود در آن را بررسی کنید:
shell> myisamchk /path/to/database_dir/*.MYI
حتی میتوانید با استفاده از نویسه عام در مسیر دایرکتوری دادههای MariaDB، تمام جدولها را در تمام پایگاههای داده بررسی کنید:
shell> myisamchk /path/to/datadir/*/*.MYI
روش توصیهشده برای بررسی سریع تمام جدولهای MyISAM به این صورت است:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
اگر میخواهید تمام جدولهای MyISAM را بررسی کرده و جدولهای آسیبدیده را تعمیر کنید، میتوانید از دستور زیر استفاده کنید:
shell> myisamchk --silent --force --fast --update-state \
--key_buffer_size=64M --sort_buffer_size=64M \
--read_buffer_size=1M --write_buffer_size=1M \
/path/to/datadir/*/*.MYI
این دستور فرض میکند که بیش از 64MB حافظه آزاد در اختیار دارید. برای اطلاعات بیشتر درباره تخصیص حافظه در myisamchk، بخش “MYISAMCHK MEMORY USAGE” را ببینید.
مهم
باید اطمینان حاصل کنید هنگام اجرای myisamchk، هیچ برنامه دیگری از جدولها استفاده نمیکند. موثرترین روش برای انجام این کار، متوقف کردن سرور MariaDB هنگام اجرای myisamchk یا قفل کردن تمام جدولهایی است که myisamchk روی آنها اجرا میشود..PP در غیر این صورت، هنگامی که myisamchk را اجرا میکنید، ممکن است پیام خطای زیر را نمایش دهد:
warning: clients are using or haven't closed the table properly
این بدان معناست که شما در حال تلاش برای بررسی جدولی هستید که توسط برنامه دیگری (مانند سرور mariadbd) بهروزرسانی شده که هنوز فایل را نبسته است یا بدون بستن درست فایل متوقف شده است؛ این وضعیت گاهی میتواند منجر به خرابی یک یا چند جدول MyISAM شود.
اگر mariadbd در حال اجرا است، باید آن را با استفاده از FLUSH TABLES وادار کنید تا هرگونه تغییرات جدول را که هنوز در حافظه میانگیر (بافر) شدهاند تخلیه کند. سپس باید اطمینان حاصل کنید که هنگام اجرای myisamchk هیچ کاربری از جدولها استفاده نمیکند.
با این حال، سادهترین راه برای جلوگیری از این مشکل، استفاده از CHECK TABLE به جای myisamchk برای بررسی جدولها است.
myisamchk از گزینههای زیر پشتیبانی میکند، که میتوانند در خط فرمان یا در گروه [myisamchk] فایل پیکربندی مشخص شوند.
گزینههای عمومی MYISAMCHK (MYISAMCHK GENERAL OPTIONS)
گزینههای شرح داده شده در این بخش را میتوان برای هر نوع عملیات نگهداری جدول که توسط myisamchk انجام میشود به کار برد. بخشهای پس از این، گزینههایی را شرح میدهند که تنها به عملیاتهای خاصی مانند بررسی یا تعمیر جدول مربوط میشوند.
نمایش پیام راهنما و خروج. گزینهها بر پایه نوع عملیات گروهبندی شدهاند.
نمایش پیام راهنما و خروج. گزینهها در یک فهرست واحد ارائه میشوند.
نوشتن گزارش اشکالزدایی. یک رشته متداول برای debug_options به صورت 'd:t:o,file_name' است. مقدار پیشفرض 'd:t:o,/tmp/myisamchk.trace' است.
حالت بیصدا. نوشتن خروجی تنها هنگامی که خطا رخ میدهد. میتوانید از -s دو بار (-ss) استفاده کنید تا myisamchk بسیار ساکت عمل کند.
حالت پرگو. چاپ اطلاعات بیشتر درباره کاری که برنامه انجام میدهد. این گزینه میتواند همراه با -d و -e استفاده شود. برای دریافت خروجی حتی بیشتر، از -v به دفعات (-vv، -vvv) استفاده کنید.
نمایش اطلاعات نسخه و خروج.
به جای پایان دادن همراه با خطا در صورتی که جدول قفل است، پیش از ادامه منتظر بمانید تا قفل جدول باز شود. اگر در حال اجرای mariadbd با قفلگذاری خارجی غیرفعال هستید، جدول تنها توسط یک دستور دیگر از myisamchk میتواند قفل شود.
گزینههای پیشفرض از هیچ فایل گزینهای خوانده نشوند.
گزینههای پیشفرض تنها از فایل دادهشده خوانده شوند.
این فایل پس از خوانده شدن فایلهای سراسری خوانده شود.
شما همچنین میتوانید متغیرهای زیر را با استفاده از نحو --var_name=value تنظیم کنید:
| متغیر | مقدار پیشفرض |
| decode_bits | 9 |
| ft_max_word_len | وابسته به نسخه |
| ft_min_word_len | 4 |
| ft_stopword_file | فهرست توکار |
| key_buffer_size | 523264 |
| key_cache_block_size | 1024 |
| myisam_block_size | 1024 |
| read_buffer_size | 262136 |
| sort_buffer_size | 2097144 |
| sort_key_blocks | 16 |
| stats_method | nulls_unequal |
| write_buffer_size | 262136 |
متغیرهای ممکن برای myisamchk و مقادیر پیشفرض آنها را میتوان با دستور myisamchk --help بررسی کرد:
sort_buffer_size زمانی استفاده میشود که کلیدها با مرتبسازی کلیدها بازسازی شوند، که حالت عادی در هنگام استفاده از --recover است.
key_buffer_size زمانی استفاده میشود که در حال بررسی جدول با --extend-check هستید، یا هنگامی که کلیدها با درج سطربهسطر در جدول تعمیر میشوند (مانند درجهای عادی). بازسازی از طریق بافر کلید در موارد زیر استفاده میشود:
اگر خواهان تعمیر سریعتری هستید، متغیرهای key_buffer_size و sort_buffer_size را روی حدود ۲۵٪ از حافظه در دسترس خود تنظیم کنید. میتوانید هر دو متغیر را روی مقادیر بزرگی قرار دهید، زیرا در هر زمان تنها یکی از آنها استفاده میشود.
متغیر myisam_block_size اندازهای است که برای بلوکهای ایندکس استفاده میشود.
متغیر stats_method بر نحوه رفتار با مقادیر NULL برای جمعآوری آمار ایندکس در هنگام تعیین گزینه --analyze اثر میگذارد. این متغیر مانند متغیر سیستمی myisam_stats_method عمل میکند. برای اطلاعات بیشتر، توضیحات myisam_stats_method را در Section 5.1.4, “Server System Variables” و Section 7.4.7, “MyISAM Index Statistics Collection” ببینید.
متغیرهای ft_min_word_len و ft_max_word_len حداقل و حداکثر طول کلمه را برای ایندکسهای FULLTEXT مشخص میکنند. ft_stopword_file نام فایل کلمات توقف (stopword) را مشخص میکند. این موارد باید تحت شرایط زیر تنظیم شوند.
اگر از myisamchk برای انجام عملیاتی استفاده کنید که ایندکسهای جدول را تغییر میدهد (مانند repair یا analyze)، ایندکسهای FULLTEXT با استفاده از مقادیر پیشفرض پارامترهای تماممتن برای حداقل و حداکثر طول کلمه و فایل stopword بازسازی میشوند، مگر اینکه خلاف آن را تعیین کنید. این موضوع میتواند منجر به شکست پرسوجوها شود.
این مشکل از آنجا ناشی میشود که این پارامترها فقط برای سرور شناختهشده هستند. آنها در فایلهای ایندکس MyISAM ذخیره نمیشوند. برای جلوگیری از این مشکل، در صورتی که حداقل یا حداکثر طول کلمه یا فایل stopword را در سرور تغییر دادهاید، همان مقادیر ft_min_word_len، ft_max_word_len و ft_stopword_file را به myisamchk بدهید که برای mariadbd استفاده میکنید. برای مثال، اگر حداقل طول کلمه را برابر با ۳ قرار دادهاید، میتوانید یک جدول را با myisamchk به این صورت تعمیر کنید:
shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
برای اطمینان از اینکه myisamchk و سرور از مقادیر یکسانی برای پارامترهای تماممتن استفاده میکنند، میتوانید هر کدام را در هر دو بخش [mariadbd] و [myisamchk] از یک فایل تنظیمات (option file) قرار دهید:
[mariadbd] ft_min_word_len=3 [myisamchk] ft_min_word_len=3
یک جایگزین برای استفاده از myisamchk استفاده از عبارتهای REPAIR TABLE، ANALYZE TABLE، OPTIMIZE TABLE یا ALTER TABLE است. این عبارتها توسط سرور انجام میشوند که مقادیر مناسب پارامترهای تماممتن را برای استفاده میداند..SH "گزینههای بررسی MYISAMCHK (MYISAMCHK CHECK OPTIONS)"
دستور myisamchk از گزینههای زیر برای عملیات بررسی جدول پشتیبانی میکند:
بررسی جدول برای یافتن خطاها. اگر هیچ گزینهای را برای تعیین صریح نوع عملیات مشخص نکنید، این عملیات پیشفرض است.
فقط جدولهایی را بررسی میکند که از زمان آخرین بررسی تغییر کردهاند.
جدول را بسیار دقیق و کامل بررسی میکند. اگر جدول اندیسهای زیادی داشته باشد، این کار بسیار کُند خواهد بود. این گزینه فقط باید در موارد بحرانی استفاده شود. در حالت عادی، myisamchk یا myisamchk --medium-check باید بتوانند وجود هرگونه خطا در جدول را مشخص کنند.
اگر از --extend-check استفاده میکنید و حافظهٔ زیادی در اختیار دارید، تنظیم متغیر key_buffer_size روی مقداری بزرگ، به اجرای سریعتر عملیات تعمیر کمک میکند.
برای شرح قالب خروجی، بخش “MYISAMCHK TABLE INFORMATION” را ببینید.
فقط جدولهایی را بررسی میکند که بهدرستی بسته نشدهاند.
در صورتی که myisamchk خطایی در جدول پیدا کند، عملیات تعمیر را بهطور خودکار انجام میدهد. نوع تعمیر همان موردی است که با گزینهٔ --recover یا -r مشخص میشود. وضعیتها نیز مانند گزینهٔ --update-state بهروزرسانی خواهند شد.
چاپ آمار و اطلاعات توصیفی دربارهٔ جدولی که بررسی میشود.
بررسیای انجام میدهد که از عملیات --extend-check سریعتر است. این گزینه فقط 99.99% از تمام خطاها را پیدا میکند که در اکثر موارد کافی است.
جدول را بهعنوان بررسیشده علامتگذاری نمیکند. این گزینه زمانی مفید است که از myisamchk برای بررسی جدولی استفاده میکنید که توسط برنامهٔ دیگری بدون قفلگذاری در حال استفاده است، مانند mariadbd هنگامی که با غیرفعال بودن قفلگذاری خارجی (external locking) اجرا شده باشد.
اطلاعاتی را در فایل .MYI ذخیره میکند تا مشخص شود چه زمانی جدول بررسی شده و آیا دچار خرابی (crash) شده است یا خیر. از این گزینه باید برای بهرهمندی کامل از گزینهٔ --check-only-changed استفاده شود، اما اگر سرور mariadbd در حال استفاده از جدول است و آن را با قفلگذاری خارجیِ غیرفعال اجرا کردهاید، نباید این گزینه را به کار ببرید.
دستور myisamchk از گزینههای زیر برای عملیات تعمیر جدول پشتیبانی میکند (عملیاتی که هنگام تعیین گزینهای مانند --recover یا --safe-recover انجام میشوند):
یک نسخهٔ پشتیبان از فایل .MYD به صورت file_name-time.BAK تهیه میکند.
دایرکتوری محل نصب مجموعههای نویسه (character sets).
اطلاعات چکسام (checksum) را برای جدول اصلاح میکند.
کلیدهای ناموجود را ایجاد میکند. با این فرض که فایل داده صحیح است و تعداد سطرهای ذخیرهشده در فایل ایندکس نیز درست است. گزینهٔ --quick را فعال میکند.
حداکثر طول فایل داده (هنگام ایجاد مجدد فایل داده زمانی که “پر” است).
تعمیری انجام میدهد که تلاش میکند هر سطر ممکن را از فایل داده بازیابی کند. بهطور معمول، این کار سطرهای نامعتبر و زائد (garbage) زیادی را نیز پیدا میکند. از این گزینه استفاده نکنید مگر آنکه چارهٔ دیگری نداشته باشید.
برای شرح قالب خروجی، به بخش “MYISAMCHK TABLE INFORMATION” مراجعه کنید.
به جای لغو عملیات، فایلهای واسط و موقت قدیمی (فایلهایی با نامهایی مانند tbl_name.TMD) را بازنویسی میکند. یک گزینهٔ --force دیگر اضافه کنید تا از خطاهای 'myisam_sort_buffer_size is too small' جلوگیری شود. در این حالت تلاش میشود تعمیر با مقدار دادهشدهٔ myisam_sort_buffer_size انجام شود و بافرهای مدیریتی به تعداد مورد نیاز بهصورت پویا تخصیص یابند.
برای myisamchk، مقدار این گزینه یک مقدار بیتی است که مشخص میکند کدام ایندکسها بهروزرسانی شوند. هر بیت دودویی از مقدار گزینه متناظر با یک ایندکس جدول است، که در آن اولین ایندکس بیت 0 است. مقدار گزینهٔ 0 بهروزرسانی تمام ایندکسها را غیرفعال میکند که میتواند برای درج (insert) سریعتر دادهها به کار رود. ایندکسهای غیرفعالشده را میتوان با استفاده از myisamchk -r مجدداً فعال کرد.
اگر myisamchk نتواند حافظهٔ لازم برای نگهداری سطرهای بزرگتر از طول مشخصشده را تخصیص دهد، از آنها رد میشود.
با اصلاح صرفاً فایل نمایه و نه فایل داده، تعمیر سریعتری انجام میدهد. میتوانید این گزینه را دو بار مشخص کنید تا myisamchk را مجبور کند در صورت وجود کلیدهای تکراری، فایل داده اصلی را تغییر دهد. نکته: جدولهایی که فایل داده آنها خراب شده است را نمیتوان با این گزینه تعمیر کرد.
تعمیری انجام میدهد که تقریباً میتواند هر مشکلی را به جز کلیدهای یکتایی که یکتا نیستند (که خطایی بسیار نامحتمل در جدولهای MyISAM است) برطرف کند. اگر میخواهید جدولی را بازیابی کنید، این نخستین گزینهای است که باید امتحان کنید. تنها در صورتی باید --safe-recover را امتحان کنید که myisamchk گزارش دهد جدول با استفاده از --recover قابل بازیابی نیست. (در حالت بسیار نامحتمل که --recover شکست بخورد، فایل داده دستنخورده باقی میماند.)
اگر حافظه زیادی در اختیار دارید، باید مقدار sort_buffer_size را افزایش دهید.
تعمیری را با استفاده از یک روش بازیابی قدیمی انجام میدهد که تمام سطرها را به ترتیب میخواند و همه درختهای نمایه را بر اساس سطرهای پیدا شده بهروزرسانی میکند. این روش یک مرتبه بزرگی کُندتر از --recover است، اما میتواند چند مورد بسیار نامحتمل را مدیریت کند که --recover قادر به حل آنها نیست. این روش بازیابی همچنین فضای دیسک بسیار کمتری نسبت به --recover مصرف میکند. در حالت عادی، ابتدا باید با استفاده از --recover تعمیر را انجام دهید، و سپس تنها در صورتی که --recover شکست خورد از --safe-recover استفاده کنید.
اگر حافظه زیادی دارید، باید مقدار key_buffer_size را افزایش دهید.
تطبیق (collation) مورد استفاده برای مرتبسازی نمایههای جدول را مشخص میکند. نام مجموعه نویسه (character set) از بخش نخست نام تطبیق استنباط میشود.
برنامه myisamchk را وادار میکند تا برای حل و تفکیک کلیدها از مرتبسازی استفاده کند، حتی اگر فایلهای موقت بسیار بزرگ شوند.
مسیر دایرکتوری مورد استفاده برای ذخیرهسازی فایلهای موقت. اگر این گزینه تنظیم نشده باشد، myisamchk از مقدار متغیر محیطی TMPDIR استفاده میکند. tmpdir میتواند روی فهرستی از مسیرهای دایرکتوری تنظیم شود که بهصورت متوالی و چرخشی (round-robin) برای ایجاد فایلهای موقت استفاده میشوند. نویسه جداکننده میان نامهای دایرکتوری در Unix دونقطه (“:”) و در Windows، NetWare و OS/2 نقطه-ویرگول (“;”) است.
جدولی را که با myisampack بستهبندی شده است، از حالت فشرده خارج میکند.
دستور myisamchk از گزینههای زیر برای اقداماتی غیر از بررسی و تعمیر جدولها پشتیبانی میکند:
توزیع مقادیر کلید را تحلیل میکند. این کار با تواناتر ساختن بهینهساز پیوند (join optimizer) در انتخاب بهتر ترتیب پیوند جدولها و اندیسهایی که باید استفاده شوند، عملکرد پیوند (join) را بهبود میبخشد. برای بهدست آوردن اطلاعات درباره توزیع کلید، از دستور myisamchk --description --verbose tbl_name یا عبارت SHOW INDEX FROM tbl_name استفاده کنید.
رکوردی را پیدا میکند که بلوکِ واقع در آفست (offset) دادهشده متعلق به آن است.
اطلاعاتی توصیفی درباره جدول چاپ میکند. مشخص کردن گزینه --verbose به صورت یک یا دو بار، اطلاعات بیشتری تولید میکند. بخش “MYISAMCHK TABLE INFORMATION” را ببینید.
شمارهگذاری AUTO_INCREMENT را برای رکوردهای جدید مجبور میکند از مقدار دادهشده شروع شود (یا مقداری بیشتر، در صورتی که رکوردهایی از قبل با مقادیر AUTO_INCREMENT به این بزرگی وجود داشته باشند). اگر value مشخص نشده باشد، شمارههای AUTO_INCREMENT برای رکوردهای جدید از بزرگترین مقدار موجود در جدول به علاوه یک شروع میشوند.
بلوکهای درخت اندیس را به ترتیب از زیاد به کم (high-low) مرتب میکند. این کار پویشها (seeks) را بهینهسازی کرده و پیمایشهای جدول (table scans) را که از اندیسها استفاده میکنند سریعتر میسازد.
رکوردها را بر اساس یک اندیس خاص مرتب میکند. این کار دادههای شما را بسیار موضعیتر (localized) کرده و ممکن است به عملیاتهای SELECT مبتنی بر محدوده و ORDER BY که از این اندیس استفاده میکنند سرعت ببخشد. (اولین باری که از این گزینه برای مرتبسازی جدول استفاده میکنید، ممکن است بسیار کند باشد.) برای تعیین شمارههای اندیس یک جدول، از SHOW INDEX استفاده کنید که اندیسهای جدول را به همان ترتیبی که myisamchk میبیند نمایش میدهد. شمارهگذاری اندیسها از ۱ آغاز میشود.
اگر کلیدها فشرده نشده باشند (PACK_KEYS=0)، طول یکسانی دارند؛ بنابراین هنگامی که myisamchk رکوردها را مرتب کرده و جابهجا میکند، صرفاً آفستهای رکورد را در اندیس بازنویسی مینماید. اگر کلیدها فشرده باشند (PACK_KEYS=1)، myisamchk باید ابتدا بلوکهای کلید را از حالت فشرده خارج کرده، سپس اندیسها را دوباره ایجاد کند و بلوکهای کلید را مجدداً فشرده سازد. (در این حالت، ایجاد مجدد اندیسها سریعتر از بهروزرسانی آفستها برای هر اندیس است.)
مشخص میکند که کد جمعآوری آمار اندیس چگونه باید با مقادیر NULL رفتار کند. مقادیر ممکن برای name عبارتند از "nulls_unequal" (پیشفرض)، "nulls_equal" (شبیهسازی رفتار MySQL 4)، و "nulls_ignored".
برای دریافت توصیفی از یک جدول MyISAM یا آمارهای مربوط به آن، از دستورهای نشاندادهشده در اینجا استفاده کنید. خروجی این دستورها در ادامه این بخش توضیح داده شده است.
دستور myisamchk را در “حالت توصیف” (describe mode) اجرا میکند تا توصیفی از جدول شما ارائه دهد. اگر سرور MariaDB را با غیرفعال بودن قفلگذاری خارجی (external locking) اجرا کنید، ممکن است myisamchk برای جدولی که در حین اجرای آن بهروزرسانی میشود، خطا گزارش کند. با این حال، از آنجا که myisamchk در حالت توصیف تغییری در جدول ایجاد نمیکند، هیچ خطری برای از بین رفتن دادهها وجود ندارد.
افزودن -v باعث اجرای myisamchk در حالت پرگویی (verbose) میشود تا اطلاعات بیشتری درباره جدول تولید کند. افزودن -v برای بار دوم اطلاعات باز هم بیشتری تولید خواهد کرد.
تنها مهمترین اطلاعات یک جدول را نمایش میدهد. این عملیات کُند است زیرا باید تمام جدول را بخواند.
این گزینه مشابه -eis عمل میکند، اما مراحل انجام کار را نیز گزارش میدهد.
آرگومان tbl_name میتواند نام یک جدول MyISAM یا نام فایل نمایه (index file) آن باشد، همانگونه که در myisamchk(1) توضیح داده شده است. همچنین میتوان چندین آرگومان tbl_name را وارد کرد.
فرض کنید جدولی به نام person دارای ساختار زیر باشد. (گزینه جدول MAX_ROWS به این دلیل گنجانده شده است تا در خروجی نمونه myisamchk که در ادامه آمده، برخی مقادیر کوچکتر شده و خوانایی قالب خروجی راحتتر باشد.)
CREATE TABLE person ( id INT NOT NULL AUTO_INCREMENT, last_name VARCHAR(20) NOT NULL, first_name VARCHAR(20) NOT NULL, birth DATE, death DATE, PRIMARY KEY (id), INDEX (last_name, first_name), INDEX (birth) ) MAX_ROWS = 1000000;
همچنین فرض کنید اندازه فایلهای داده و نمایه جدول به صورت زیر باشد:
-rw-rw---- 1 mysql mysql 9347072 Aug 19 11:47 person.MYD -rw-rw---- 1 mysql mysql 6066176 Aug 19 11:47 person.MYI
نمونهای از خروجی myisamchk -dvv:
MyISAM file: person
Record format: Packed
Character set: latin1_swedish_ci (8)
File-version: 1
Creation time: 2009-08-19 16:47:41
Recover time: 2009-08-19 16:47:56
Status: checked,analyzed,optimized keys
Auto increment key: 1 Last value: 306688
Data records: 306688 Deleted blocks: 0
Datafile parts: 306688 Deleted data: 0
Datafile pointer (bytes): 4 Keyfile pointer (bytes): 3
Datafile length: 9347072 Keyfile length: 6066176
Max datafile length: 4294967294 Max keyfile length: 17179868159
Recordlength: 54
table description:
Key Start Len Index Type Rec/key Root Blocksize
1 2 4 unique long 1 99328 1024
2 6 20 multip. varchar prefix 512 3563520 1024
27 20 varchar 512
3 48 3 multip. uint24 NULL 306688 6065152 1024
Field Start Length Nullpos Nullbit Type
1 1 1
2 2 4 no zeros
3 6 21 varchar
4 27 21 varchar
5 48 3 1 1 no zeros
6 51 3 1 2 no zeros
توضیحات مربوط به انواع اطلاعاتی که myisamchk تولید میکند در ادامه آورده شده است. “Keyfile” به فایل نمایه (index file) اشاره دارد. “Record” و “row” مترادف یکدیگرند، همانطور که “field” و “column” نیز هممعنی هستند.
بخش ابتدایی توصیف جدول شامل این مقادیر است:.sp
نام فایل MyISAM (شاخص).
قالب استفادهشده برای ذخیره ردیفهای جدول. مثالهای قبلی از Fixed length استفاده میکنند. سایر مقادیر ممکن عبارتاند از Compressed و Packed. (مقدار Packed مطابق با چیزی است که SHOW TABLE STATUS بهعنوان Dynamic گزارش میدهد.)
مجموعه نویسهٔ پیشفرض جدول.
نسخهٔ قالب MyISAM. در حال حاضر همیشه 1 است.
زمانی که فایل داده ایجاد شده است.
زمانی که فایل شاخص/داده آخرین بار بازسازی شده است.
پرچمهای وضعیت جدول. مقادیر ممکن عبارتاند از: crashed، open، changed، analyzed، optimized keys و sorted index pages.
شماره کلید مرتبط با ستون AUTO_INCREMENT جدول، و تازهترین مقدار تولیدشده برای این ستون. در صورتی که چنین ستونی وجود نداشته باشد، این فیلدها ظاهر نمیشوند.
تعداد ردیفهای موجود در جدول.
تعداد بلوکهای حذفشدهای که هنوز فضای رزروشده دارند. برای به حداقل رساندن این فضا میتوانید جدول خود را بهینهسازی کنید. ببینید: بخش 6.6.4، “MyISAM Table Optimization”.
برای قالب ردیف پویا (dynamic-row)، این مقدار نشاندهنده تعداد بلوکهای داده موجود است. برای یک جدول بهینهسازیشده بدون ردیفهای تکهتکهشده (fragmented)، این مقدار با Data records یکسان است.
میزان بایتهای دادههای حذفشده که هنوز آزاد نشدهاند. برای به حداقل رساندن این فضا میتوانید جدول خود را بهینهسازی کنید. ببینید: بخش 6.6.4، “MyISAM Table Optimization”.
اندازهٔ اشارهگر فایل داده، به بایت. این مقدار معمولاً ۲، ۳، ۴ یا ۵ بایت است. بیشتر جدولها با ۲ بایت کار میکنند، اما این مورد هنوز از سمت MariaDB قابل کنترل نیست. برای جدولهای ثابت (fixed)، این مقدار یک نشانی سطر است. برای جدولهای پویا (dynamic)، این مقدار یک نشانی بایت است.
اندازهٔ اشارهگر فایل شاخص، به بایت. این مقدار معمولاً ۱، ۲ یا ۳ بایت است. بیشتر جدولها با ۲ بایت کار میکنند، اما این مقدار بهطور خودکار توسط MariaDB محاسبه میشود. این همیشه نشانی یک بلوک است.
حداکثر طولی که فایل دادهٔ جدول میتواند داشته باشد، به بایت.
حداکثر طولی که فایل شاخص جدول میتواند داشته باشد، به بایت.
میزان فضایی که هر سطر اشغال میکند، به بایت.
بخش table description از خروجی شامل فهرستی از تمام کلیدهای جدول است. برای هر کلید، myisamchk برخی اطلاعات سطحپایین را نمایش میدهد:
شمارهٔ این کلید. این مقدار تنها برای ستون اول کلید نمایش داده میشود. اگر این مقدار وجود نداشته باشد، سطر مربوط به ستون دوم یا ستونهای بعدیِ یک کلید چندستونی است. برای جدول نشاندادهشده در مثال، دو سطرِ table description برای شاخص دوم وجود دارد. این نشان میدهد که آن یک شاخص چندبخشی با دو بخش است.
این بخش از شاخص در کجای سطر آغاز میشود.
طول این بخش از شاخص. برای اعداد فشرده (packed)، این مقدار همیشه باید برابر با طول کامل ستون باشد. برای رشتهها، ممکن است از طول کامل ستون شاخصگذاریشده کوتاهتر باشد، زیرا میتوانید پیشوندی از یک ستون رشتهای را شاخصگذاری کنید. طول کل یک کلید چندبخشی، مجموع مقادیر Len برای تمام بخشهای کلید است.
آیا یک مقدار کلید میتواند چندین بار در شاخص تکرار شود یا خیر. مقادیر ممکن عبارتاند از unique یا multip. (چندگانه).
این بخش از شاخص چه نوع دادهای دارد. این یک نوع دادهٔ MyISAM است با مقادیر ممکنِ packed، stripped یا empty.
نشانی بلوک ریشهٔ شاخص.
اندازهٔ هر بلوک شاخص. این مقدار بهطور پیشفرض ۱۰۲۴ است، اما هنگام ساخت MariaDB از کد منبع، این مقدار ممکن است در زمان کامپایل تغییر یابد.
این یک مقدار آماری است که توسط بهینهساز استفاده میشود. این مقدار مشخص میکند به ازای هر مقدار در این نمایه، چند سطر وجود دارد. یک نمایهٔ یکتا همواره مقداری برابر با 1 دارد. این مقدار ممکن است پس از بارگذاری جدول (یا تغییرات عمده در آن) با myisamchk -a بهروزرسانی شود. اگر بههیچوجه بهروزرسانی نشود، مقدار پیشفرض 30 در نظر گرفته میشود.
بخش پایانی خروجی، اطلاعاتی دربارهٔ هر ستون ارائه میدهد:
شمارهٔ ستون.
موقعیت بایتی ستون در سطرهای جدول.
طول ستون به بایت.
برای ستونهایی که میتوانند NULL باشند، MyISAM مقادیر NULL را به صورت یک پرچم درون یک بایت ذخیره میکند. بسته به اینکه چه تعداد ستون با قابلیت پذیرش NULL وجود دارد، ممکن است یک یا چند بایت برای این منظور استفاده شود. مقادیر Nullpos و Nullbit در صورت خالی نبودن، مشخص میکنند کدام بایت و بیت حاوی پرچمی است که نشان میدهد آیا ستون NULL است یا خیر.
موقعیت و تعداد بایتهای مورد استفاده برای ذخیرهٔ پرچمهای NULL در خط مربوط به فیلد 1 نشان داده شده است. به همین دلیل است که برای جدول person با وجود داشتن تنها پنج ستون، شش خط Field وجود دارد.
نوع داده. این مقدار ممکن است شامل هر یک از توصیفکنندههای زیر باشد:
تمام سطرها مقدار یکسانی دارند.
فضای خالی پایانی ذخیره نشود.
فضای خالی پایانی ذخیره نشود و فشردهسازی فضای خالی پایانی برای همهٔ مقادیر انجام نگیرد.
فضای خالی پایانی ذخیره نشود. مقادیر خالی ذخیره نشوند.
ستون به یک ENUM تبدیل شد.
پُرارزشترین N بایت در مقدار همواره 0 هستند و ذخیره نمیشوند.
صفرها را ذخیره نمیکند.
مقادیر صفر با استفاده از یک بیت ذخیره میشوند.
شماره درخت هافمن (Huffman tree) مرتبط با ستون.
تعداد بیتهای استفادهشده در درخت هافمن.
فیلدهای Huff tree و Bits در صورتی نمایش داده میشوند که جدول با myisampack فشرده شده باشد. برای نمونهای از این اطلاعات، myisampack(1) را ببینید.
نمونهای از خروجی myisamchk -eiv:
Checking MyISAM file: person Data records: 306688 Deleted blocks: 0 - check file-size - check record delete-chain No recordlinks - check key delete-chain block_size 1024: - check index reference - check data record references index: 1 Key: 1: Keyblocks used: 98% Packed: 0% Max levels: 3 - check data record references index: 2 Key: 2: Keyblocks used: 99% Packed: 97% Max levels: 3 - check data record references index: 3 Key: 3: Keyblocks used: 98% Packed: -14% Max levels: 3 Total: Keyblocks used: 98% Packed: 89% - check records and index references *** LOTS OF ROW NUMBERS DELETED *** Records: 306688 M.recordlength: 25 Packed: 83% Recordspace used: 97% Empty space: 2% Blocks/Record: 1.00 Record blocks: 306688 Delete blocks: 0 Record data: 7934464 Deleted data: 0 Lost space: 256512 Linkdata: 1156096 User time 43.08, System time 1.68 Maximum resident set size 0, Integral resident set size 0 Non-physical pagefaults 0, Physical pagefaults 0, Swaps 0 Blocks in 0 out 7, Messages in 0 out 0, Signals 0 Voluntary context switches 0, Involuntary context switches 0 Maximum memory usage: 1046926 bytes (1023k)
خروجی myisamchk -eiv شامل اطلاعات زیر است:
تعداد ردیفهای موجود در جدول.
چه تعداد از بلوکهای حذفشده همچنان فضای رزروشده دارند. میتوانید جدول خود را بهینهسازی کنید تا این فضا به حداقل برسد. بخش 6.6.4، “MyISAM Table Optimization” را ببینید.
شماره کلید.
چند درصد از بلوکهای کلید استفاده شدهاند. هنگامی که یک جدول بهتازگی با myisamchk بازسازماندهی شده باشد، این مقادیر بسیار بالا هستند (بسیار نزدیک به حداکثر نظری).
برنامه MariaDB تلاش میکند مقادیر کلیدی را که پسوند مشترک دارند فشردهسازی (pack) کند. این قابلیت تنها برای نمایهها (indexes) روی ستونهای CHAR و VARCHAR قابل استفاده است. برای رشتههای نمایهگذاریشده طولانی که بخشهای ابتدایی (سمت چپ) مشابهی دارند، این کار میتواند فضای استفادهشده را بهطور چشمگیری کاهش دهد. در مثال پیشین، کلید دوم 40 بایت طول دارد و 97% کاهش فضا بهدست آمده است.
چه تعداد ردیف در جدول وجود دارد.
میانگین طول ردیف. این مقدار برای جدولهای با ردیفهای با طول ثابت، طول دقیق ردیف است، زیرا تمام ردیفها طول یکسانی دارند.
MariaDB فاصلههای خالی را از انتهای رشتهها حذف میکند. مقدار Packed نشاندهنده درصد صرفهجویی حاصل از این کار است.
چند درصد از فایل داده مورد استفاده قرار گرفته است.
چند درصد از فایل داده استفادهنشده است.
میانگین تعداد بلوکها در هر ردیف (یعنی یک ردیف قطعهقطعهشده از چند پیوند تشکیل شده است). این مقدار برای جدولهای با قالب ثابت همواره 1.0 است. این مقدار باید تا حد ممکن نزدیک به 1.0 باقی بماند. اگر بیش از اندازه بزرگ شد، میتوانید جدول را بازسازماندهی کنید. ببینید: بخش 6.6.4، “بهینهسازی جدولهای MyISAM”.
چه تعداد بلوک (پیوند) استفاده شده است. برای جدولهای با قالب ثابت، این مقدار برابر با تعداد ردیفها است.
چه تعداد بلوک (پیوند) حذف شده است.
چه تعداد بایت از فایل داده استفاده شده است.
چه تعداد بایت در فایل داده حذف شده (استفادهنشده) است.
اگر طول یک ردیف پس از بهروزرسانی کوتاهتر شود، مقداری فضا هدر میرود. این مقدار مجموع تمام این اتلافها برحسب بایت است.
هنگامی که از قالب جدول پویا استفاده میشود، قطعات ردیف با اشارهگرها (هرکدام ۴ تا ۷ بایت) به یکدیگر پیوند داده میشوند. Linkdata مجموع فضای ذخیرهسازی استفادهشده توسط تمام این اشارهگرها است.
تخصیص حافظه هنگام اجرای myisamchk بسیار حائز اهمیت است. myisamchk بیشتر از مقداری که برای متغیرهای مرتبط با حافظهٔ آن تنظیم شده است، حافظه مصرف نمیکند. اگر قصد دارید از myisamchk روی جدولهای بسیار بزرگ استفاده کنید، ابتدا باید مشخص کنید که مایلید چه مقدار حافظه مصرف کند. مقدار پیشفرض برای انجام عملیات تعمیر تنها حدود ۳ مگابایت است. با استفاده از مقادیر بزرگتر، میتوانید کاری کنید که myisamchk سریعتر عمل کند. برای نمونه، اگر بیش از ۳۲ مگابایت رم (RAM) دارید، میتوانید از گزینههایی مانند این موارد استفاده کنید (علاوه بر هر گزینهٔ دیگری که ممکن است مشخص نمایید):
shell> myisamchk --sort_buffer_size=16M \
--key_buffer_size=16M \
--read_buffer_size=1M \
--write_buffer_size=1M ...
استفاده از --sort_buffer_size=16M احتمالاً برای بیشتر موارد کافی خواهد بود.
توجه داشته باشید که myisamchk از فایلهای موقت در TMPDIR استفاده میکند. اگر TMPDIR به یک فایلسیستم مستقر در حافظه رم اشاره کند، خطاهای کمبود حافظه (out of memory) بهسادگی ممکن است رخ دهند. در صورت بروز این مشکل، myisamchk را همراه با گزینهٔ --tmpdir=path اجرا کنید تا دایرکتوری واقع روی یک فایلسیستم با فضای بیشتر مشخص شود.
هنگام انجام عملیات تعمیر، myisamchk به مقدار زیادی فضای دیسک نیز نیاز دارد:
(largest_key + row_pointer_length) × number_of_rows × 2
میتوانید طول کلیدها و مقدار row_pointer_length را با دستور myisamchk -dv tbl_name بررسی کنید (بخش “MYISAMCHK TABLE INFORMATION” را ببینید). مقادیر row_pointer_length و number_of_rows همان مقادیر Datafile pointer و Data records در توضیحات جدول هستند. برای تعیین مقدار largest_key، خطوط Key را در توضیحات جدول بررسی کنید. ستون Len نشاندهندهٔ تعداد بایتها برای هر بخش از کلید است. برای یک نمایه چندستونه، اندازه کلید برابر با مجموع مقادیر Len برای تمام بخشهای کلید است.
اگر در طول
تعمیر با
کمبود فضای
دیسک مواجه
شدید،
میتوانید
به جای --recover
گزینهٔ --safe-recover
را امتحان
کنید..SH
"کپیرایت
و تکثیر (COPYRIGHT)"
کپیرایت 2007-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc., 2010-2025 MariaDB Foundation
این مستندات یک نرمافزار آزاد است؛ شما میتوانید آن را تنها تحت شرایط «مجوز عمومی همگانی گنو» (GNU General Public License) همانطور که توسط بنیاد نرمافزار آزاد منتشر شده است، بازتوزیع کرده یا تغییر دهید؛ نسخه ۲ مجوز.
این مستندات به این امید که مفید واقع شود توزیع شده است، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابلیت فروش یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر به GNU General Public License مراجعه کنید.
شما باید به همراه این برنامه نسخهای از GNU General Public License را دریافت کرده باشید؛ در غیر این صورت، به Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA نامه بنویسید یا از http://www.gnu.org/licenses بازدید کنید.
همچنین ببینید (SEE ALSO)
برای اطلاعات بیشتر، لطفاً به مستندات MariaDB مراجعه کنید که بهصورت برخط در https://mariadb.com/docs در دسترس است.
نویسندگان (AUTHORS)
MariaDB Foundation (http://www.mariadb.org).
| 5 March 2025 | MariaDB 11.8 |