راهنمای بهینهسازی و مدیریت حجم دیتابیس SQLite در سرورهای اوبونتو
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۲۲ ۱۱:۵۵
آدرس: www.dntips.ir
VACUUM و تکنیکهای پیشرفته مدیریت فضا ویژه توسعهدهندگان بکاند خواهیم پرداخت.DELETE بر روی یک جدول در SQLite اجرا میشود، سیستم مدیریت پایگاه داده به منظور بهینهسازی عملکرد I/O (ورودی/خروجی) و افزایش سرعت تراکنشها، فضا را بلافاصله به سیستمعامل سرور بازنمیگرداند. در عوض، صفحاتی که دادههای آنها حذف شده است، به عنوان صفحات آزاد (Free Pages) نشانهگذاری میشوند. این صفحات در یک لیست داخلی به نام Free-list نگهداری میشوند تا در عملیات درج (INSERT) بعدی مجدداً مورد استفاده قرار گیرند.VACUUM است که ساختار فایل دیتابیس را بازسازی کرده، صفحات آزاد را حذف و فضای بلااستفاده را به سیستمعامل (Ubuntu) پس میدهد.Database Size = page_count * page_sizePRAGMA page_count; PRAGMA page_size;
cd /path/to/your/database/folder
sqlite3 فایل خود را باز کنید:sqlite3 your_database_name.db
.dbinfo
VACUUM;
.quit یا .exit و یا کلیدهای ترکیبی Ctrl + D استفاده کنید. (نکته: دستورات نقطهای نیازی به سمیکالن ; ندارند).sqlite3 your_database_name.db 'VACUUM;'
VACUUM INTO معرفی شده است. این دستور به جای بازسازی فایل زنده، یک نسخه کپی کاملاً بهینهسازی شده و فشرده در مسیری مجزا ایجاد میکند. این تکنیک بهترین روش برای پشتیبانگیری (Backup) بدون ریسک خراب شدن فایل اصلی است:sqlite3 your_database_name.db "VACUUM INTO 'optimized_database.db';"
الزامات کلیدی پیش از اجرا:
VACUUM یک کپی موقت از دیتابیس ایجاد میکند. بنابراین سرور شما باید حداقل به اندازه حجم فعلی دیتابیس (و ترجیحاً ۲ برابر آن) فضای خالی داشته باشد. وضعیت دیسک را با دستور df -h بررسی کنید.SQLITE_BUSY دریافت خواهند کرد. این کار را در ساعات کمترافیک سرور انجام دهید.dbstat فعال است که امکان مانیتورینگ دقیق صفحات تخصیص یافته به هر جدول را فراهم میکند.SELECT
name AS table_name,
SUM(pgsize) / 1024.0 / 1024.0 AS size_mb
FROM dbstat
WHERE type = 'table'
GROUP BY name
ORDER BY size_mb DESC;SELECT
name,
type,
SUM(pgsize) / 1024.0 / 1024.0 AS size_mb
FROM dbstat
GROUP BY name, type
ORDER BY size_mb DESC;dbstat باشد، با خطای no such table: dbstat مواجه میشوید. در این حالت، بهترین راهکار عملیاتی، اکسپورت گرفتن از ساختار دیتابیس و بررسی متنی حجم جداول است:sqlite3 your_database.db .dump > backup.sql
| علت احتمالی | توضیح فنی | راهکار رفع مشکل | دستور رفع مشکل |
| فعال بودن حالت WAL | در مود Write-Ahead Logging، تغییرات در فایل log. ذخیره شده و تراکنشهای باز مانع بازنشانی فضا میشوند. | موقتاً ژورنال مود را تغییر دهید: | PRAGMA journal_mode=delete; |
| باگهای نسخههای قدیمی پس از DROP COLUMN | در نسخههای قدیمیتر از 3.44.0، پس از حذف ستون، لایه متادیتا فضا را به درستی آزاد نمیکرد. | آپدیت نسخه SQLite یا بازسازی با دستور: | sqlite3 old.db .dump | sqlite3 new.db |
| کش لایه سیستمعامل (Page Cache) | اوبونتو اطلاعات مربوط به سایز فایل روی دیسک را کش میکند و تغییرات را آنی نشان نمیدهد. | چند لحظه تامل کرده و دستور مانیتورینگ لینوکس را مجدد اجرا کنید: | ls -lh |
Microsoft.Data.Sqlite در فواصل زمانی مشخص (مثلاً از طریق یک لایه BackgroundService یا ابزار Quartz.NET در ساعتهای کمبار سرور)، دستور VACUUM را مستقیماً بر روی کانکشن استرینگ دیتابیس اجرا کنید تا پایداری و کارایی فضای دیسک سرور به صورت خودکار و بدون دخالت ادمین سیستم تضمین شود.