
به اشتراک بگذارید

به اشتراک بگذارید
تغییر مسیر دیتابیس MySQL در لینوکس یکی از حیاتیترین مهارتهایی است که هر مدیر سرور باید در جعبه ابزار خود داشته باشد. دیتابیسها قلب تپنده هر اپلیکیشن وب هستند و با رشد کسبوکار، حجم دادهها نیز به طور تصاعدی افزایش مییابد؛ اما اغلب سرورهای مجازی (VPS) با یک پارتیشن روت (/) محدود ارائه میشوند که پس از مدتی با فایلهای حجیم MySQL پر میشود.
| سناریو | نیاز به تغییر مسیر | اولویت |
|---|---|---|
| پر شدن پارتیشن root | انتقال به هارد دوم یا پارتیشن /home | بحرانی |
| ارتقا به SSD/NVMe | انتقال دادهها برای افزایش سرعت I/O | بالا |
| تفکیک دادهها | جداسازی سیستمعامل از دادههای دیتابیس | متوسط |
حتماً زمانی که این مقاله را باز کردهاید، با هشدار کمبود فضای دیسک مواجه شدهاید یا قصد دارید زیرساخت دیتابیس خود را بهینهسازی کنید. ما در این آموزش گامبهگام، از صفر تا صد فرآیند انتقال را به زبان ساده اما حرفهای بررسی میکنیم تا هیچ دادهای را از دست ندهید؛ پس همراه ما باشید تا این چالش فنی را به یک فرصت برای بهبود سرور تبدیل کنیم. 😉👇
آنچه در این مقاله میخوانید:

به زبان خیلی ساده، دایرکتوری داده یا datadir همان انبار مرکزی MySQL است که تمام جداول، ایندکسها و اطلاعات خام شما در آنجا ذخیره میشود. در سیستمعاملهای توزیع لینوکس (مانند Ubuntu یا CentOS)، این مسیر به صورت پیشفرض روی /var/lib/mysql تنظیم شده است. اگر MySQL را مثل یک کتابخانه تصور کنید، datadir دقیقاً همان قفسههایی است که کتابها (دادهها) در آن قرار دارند.
ساختار پیشفرض به این صورت است:
MySQL Server
⬇️
Configuration (my.cnf)
⬇️
Data Directory [/var/lib/mysql]
├─ Database_1 (Tables, Indexes)
├─ Database_2 (Tables, Indexes)
└─ mysql.sock (Socket File)
اهمیت انتقال پوشه دیتابیس MySQL زمانی مشخص میشود که شما با محدودیتهای فیزیکی سختافزار روبرو میشوید. در دنیای میزبانی وب، امنیت و پایداری حرف اول را میزند؛ بنابراین جداسازی مسیر دادهها از فایلهای سیستمی یک استاندارد حرفهای محسوب میشود.
دلایل اصلی این جابجایی عبارتند از:
قبل از اینکه دست به ترمینال ببرید، باید اطمینان حاصل کنید که شرایط زیر مهیا است. هرگونه اشتباه در این مرحله میتواند منجر به خرابی دیتابیس (Database Corruption) شود.
چکلیست پیش از شروع:
sudo du -sh /var/lib/mysql df -h /mnt/data 
در این بخش همراه تیم وبداده باشید تا به صورت عملی و تصویری، دیتابیس را به یک مسیر جدید (مثلاً /mnt/data/mysql) منتقل کنیم. ما از سناریوی واقعی روی اوبونتو 24.04 استفاده میکنیم.
🔸 سناریو:
1🖥️ سیستمعامل: Ubuntu 24.04 LTS
2🗄️ سرویس: MySQL 8.0
3💾 مسیر جدید: /mnt/data/mysql
ابتدا باید موتور دیتابیس را خاموش کنیم تا هیچ فایلی در حال تغییر نباشد.
sudo systemctl stop mysql تایید توقف سرویس
sudo systemctl status mysql 
sudo mkdir -p /mnt/data/mysql sudo chown mysql:mysql /mnt/data/mysql sudo chmod 750 /mnt/data/mysql برای کپی کردن فایلها، هرگز از cp معمولی استفاده نکنید! ما به استفاده از rsync برای انتقال دیتابیس نیاز داریم تا تمام Permissionها و Ownershipها حفظ شوند.
⚠️ نکته مهم: حتماً از slash انتهایی در مسیر مبدا استفاده کنید:
دستور صحیح (توجه به / انتهایی)
sudo rsync -av --exclude='*.sock' --exclude='*.pid' \
/var/lib/mysql/ /mnt/data/mysql/ توضیح سوئیچها:
# بدون slash انتهایی (اشتباه است!)
sudo rsync -av /var/lib/mysql /mnt/data
# نتیجه: /mnt/data/mysql/mysql (تو در تو!) به جای حذف سریع، پوشه قدیمی را تغییر نام میدهیم تا اگر مشکلی پیش آمد، راه بازگشت داشته باشیم.
sudo mv /var/lib/mysql /var/lib/mysql_backup حالا باید به MySQL بگوییم که خانه جدیدش کجاست. این کار با تغییر datadir در فایل my.cnf انجام میشود.
🔍 پیدا کردن فایل کانفیگ اصلی:
فایل کانفیگ MySQL در توزیعهای مختلف، مسیرهای متفاوتی دارد:
روش 1: جستجوی خودکار
mysql --help | grep "Default options" -A 1 روش 2: بررسی دستی
ls -la /etc/mysql/my.cnf
ls -la /etc/my.cnf مسیرهای معمول:
/etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf یا /etc/my.cnf.d/mysql-server.cnf/etc/mysql/mariadb.conf.d/50-server.cnfویرایش فایل:
# Ubuntu/Debian
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# CentOS/RHEL
sudo nano /etc/my.cnf در بخش [mysqld]، خط زیر را پیدا کرده و آدرس جدید را جایگزین کنید:
[mysqld]
datadir = /mnt/data/mysql اینجاست که اکثر مدیران سرور با شکست مواجه میشوند! حتی اگر فایلها را درست کپی کنید، لایههای امنیتی لینوکس اجازه دسترسی MySQL به خارج از مسیر پیشفرض را نمیدهند.
AppArmor یک لایه امنیتی است که دسترسی برنامهها به فایلها را محدود میکند.
روش 1: ویرایش پروفایل Local (توصیه میشود): ویرایش پروفایل محلی
sudo nano /etc/apparmor.d/local/usr.sbin.mysqld محتوای زیر را به فایل اضافه کنید:
# Allow data dir access
/mnt/data/mysql/ r,
/mnt/data/mysql/** rwk, سپس AppArmor را reload کنید:
sudo systemctl reload apparmor روش 2: استفاده از Alias (جایگزین): ویرایش فایل alias
sudo nano /etc/apparmor.d/tunables/alias خط زیر را به انتهای فایل اضافه کنید:
alias /var/lib/mysql/ -> /mnt/data/mysql/, سپس:
sudo systemctl restart apparmor 🔍 بررسی وضعیت AppArmor:
sudo aa-status | grep mysql اگر از خانواده RedHat استفاده میکنید، باید Contextهای امنیتی را بروزرسانی کنید.
بررسی وضعیت SELinux:
sestatus نصب ابزار مورد نیاز:
CentOS/RHEL 8 و بالاتر
sudo yum install policycoreutils-python-utils -y CentOS/RHEL 7
sudo yum install policycoreutils-python -y تنظیم Context:
تعریف context جدید
sudo semanage fcontext -a -t mysqld_db_t "/mnt/data/mysql(/.*)?" اعمال تغییرات
sudo restorecon -R -v /mnt/data/mysql اعمال تغییرات
ls -lZ /mnt/data/mysql حالا وقت آن است که ثمره کارمان را ببینیم. سرویس را استارت میکنیم:
sudo systemctl start mysql بررسی وضعیت
sudo systemctl status mysql 🔍 در صورت بروز خطا:
sudo tail -50 /var/log/mysql/error.log sudo journalctl -xeu mysql.service خطاهای رایج:
Permission denied → مشکل در chown یا chmodCan't find ./mysql/plugin.frm → مسیر datadir اشتباه استAccess denied by AppArmor → پروفایل درست تنظیم نشدهبرای اطمینان از اینکه MySQL واقعاً از مسیر جدید استفاده میکند، وارد کنسول MySQL شوید:
mysql -u root -p سپس این کوئریها را اجرا کنید:
-- بررسی مسیر datadir
SELECT @@datadir;
-- باید نمایش دهد: /mnt/data/mysql/
-- تست ساخت دیتابیس جدید
CREATE DATABASE test_migration;
USE test_migration;
CREATE TABLE test (id INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
INSERT INTO test (id) VALUES (1);
SELECT * FROM test;
-- بررسی دیتابیسهای قبلی
SHOW DATABASES;
-- حذف دیتابیس تست
DROP DATABASE test_migration; تست فیزیکی:
# بررسی فایلهای جدید
ls -lh /mnt/data/mysql/
# مشاهده فایل دیتابیس تست
ls -lh /mnt/data/mysql/test_migration/ اگر خروجی /mnt/data/mysql/ را نشان داد، تبریک میگوییم! شما با موفقیت عملیات تغییر مسیر دیتابیس MySQL در لینوکس را به پایان رساندید. 🚀
# ساخت Backup فشرده از پوشه قدیمی (اختیاری)
sudo tar -czf /root/mysql_old_backup_$(date +%F).tar.gz /var/lib/mysql_backup
# حذف پوشه قدیمی
sudo rm -rf /var/lib/mysql_backup ما به عنوان متخصص سرور موظف هستیم حقایق را به شما بگوییم:
| مزایا | معایب و ریسکها |
|---|---|
| رفع قطعی مشکل فضای دیسک | ریسک از دست رفتن داده در صورت نداشتن بکآپ |
| افزایش عملکرد در صورت استفاده از SSD | پیچیدگی در عیبیابی خطاهای امنیتی (AppArmor/SELinux) |
| سازماندهی بهتر فایلهای سرور | نیاز به Down-time کوتاه در زمان انتقال |
تغییر دادن مسیر دایرکتوری MySQL در لینوکس یک انتخاب نیست، بلکه برای سرورهایی که با رشد مداوم داده مواجه هستند، یک ضرورت است. در این مقاله آموختیم که چگونه با استفاده از ابزار قدرتمند rsync و پیکربندی صحیح لایههای امنیتی مانند AppArmor، دیتابیس خود را به مکانی امنتر و وسیعتر منتقل کنیم.
به یاد داشته باشید که زیرساخت قدرتمند، نیمی از مسیر موفقیت کسبوکار شماست. اگر به دنبال سروری هستید که محدودیتهای سختافزاری شما را به حداقل برساند، سرویسهای وبداده بهترین انتخاب برای شماست.
✅ چرا وبداده؟
در صورتی که در هر یک از مراحل انتقال با چالشی روبرو شدید، حتماً در بخش نظرات با ما در ارتباط باشید؛ کارشناسان ما در سریعترین زمان ممکن به شما پاسخ خواهند داد. امیدوارم این مقاله از بلاگ وبداده برای شما مفید بوده باشد. ☁️🚀
بله، فرآیند برای MariaDB دقیقاً مشابه است، فقط ممکن است نام سرویس به جای mysql به صورت mariadb باشد.