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

دایرکتوری داده (Datadir) چیست؟
به زبان خیلی ساده، دایرکتوری داده یا 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 نیاز داریم؟
اهمیت انتقال پوشه دیتابیس MySQL زمانی مشخص میشود که شما با محدودیتهای فیزیکی سختافزار روبرو میشوید. در دنیای میزبانی وب، امنیت و پایداری حرف اول را میزند؛ بنابراین جداسازی مسیر دادهها از فایلهای سیستمی یک استاندارد حرفهای محسوب میشود.
دلایل اصلی این جابجایی عبارتند از:
- مدیریت فضا: جلوگیری از کرش کردن سیستمعامل به دلیل پر شدن پارتیشن اصلی.
- افزایش سرعت: انتقال دادهها به دیسکهای پرسرعت اختصاصی (مانند RAID 10 یا NVMe).
- امنیت و بکآپ: امکان تهیه Snapshot جداگانه از پارتیشن دادهها بدون درگیری با فایلهای سیستمعامل.
- مقیاسپذیری: افزودن هاردهای جدید به سرور و اختصاص آنها صرفاً به دیتابیسهای سنگین.
پیشنیازهای انتقال مسیر MySQL
قبل از اینکه دست به ترمینال ببرید، باید اطمینان حاصل کنید که شرایط زیر مهیا است. هرگونه اشتباه در این مرحله میتواند منجر به خرابی دیتابیس (Database Corruption) شود.
چکلیست پیش از شروع:
- ✅ دسترسی root: شما باید کاربر ریشه باشید یا دسترسی sudo داشته باشید.
- ✅ بررسی حجم فعلی دیتابیس:
sudo du -sh /var/lib/mysql - ✅ بررسی فضای خالی روی مقصد
df -h /mnt/data - ✅ فضای مقصد: پارتیشن جدید باید فضای کافی (حداقل 1.5 برابر حجم فعلی) داشته باشد.
- ✅ بکآپ کامل: حتماً یک نسخه پشتیبان تهیه کنید.
- ✅ توقف سرویس: انتقال دادهها در حالی که MySQL در حال نوشتن است، ممنوع است!

آموزش تغییر مسیر دیتابیس MySQL در لینوکس (گامبهگام)
در این بخش همراه تیم وبداده باشید تا به صورت عملی و تصویری، دیتابیس را به یک مسیر جدید (مثلاً /mnt/data/mysql) منتقل کنیم. ما از سناریوی واقعی روی اوبونتو 24.04 استفاده میکنیم.
🔸 سناریو:
1🖥️ سیستمعامل: Ubuntu 24.04 LTS
2🗄️ سرویس: MySQL 8.0
3💾 مسیر جدید: /mnt/data/mysql
1- متوقف کردن سرویس MySQL
ابتدا باید موتور دیتابیس را خاموش کنیم تا هیچ فایلی در حال تغییر نباشد.
sudo systemctl stop mysql تایید توقف سرویس
sudo systemctl status mysql 
2- ساخت و آمادهسازی دایرکتوری مقصد
sudo mkdir -p /mnt/data/mysql sudo chown mysql:mysql /mnt/data/mysql sudo chmod 750 /mnt/data/mysql 3- انتقال فیزیکی دادهها با rsync
برای کپی کردن فایلها، هرگز از cp معمولی استفاده نکنید! ما به استفاده از rsync برای انتقال دیتابیس نیاز داریم تا تمام Permissionها و Ownershipها حفظ شوند.
⚠️ نکته مهم: حتماً از slash انتهایی در مسیر مبدا استفاده کنید:
دستور صحیح (توجه به / انتهایی)
sudo rsync -av --exclude='*.sock' --exclude='*.pid' \
/var/lib/mysql/ /mnt/data/mysql/ توضیح سوئیچها:
- -a: مخفف Archive است و تمام ویژگیهای فایل را حفظ میکند
- -v: روند پیشرفت را به شما نشان میدهد
- –exclude: فایلهای socket و PID را کپی نمیکند
# بدون slash انتهایی (اشتباه است!)
sudo rsync -av /var/lib/mysql /mnt/data
# نتیجه: /mnt/data/mysql/mysql (تو در تو!) 4- تغییر نام پوشه قدیمی (برای احتیاط)
به جای حذف سریع، پوشه قدیمی را تغییر نام میدهیم تا اگر مشکلی پیش آمد، راه بازگشت داشته باشیم.
sudo mv /var/lib/mysql /var/lib/mysql_backup 5- آموزش ویرایش تنظیمات MySQL
حالا باید به 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 مسیرهای معمول:
- Ubuntu/Debian:
/etc/mysql/mysql.conf.d/mysqld.cnf - CentOS/RHEL/AlmaLinux:
/etc/my.cnfیا/etc/my.cnf.d/mysql-server.cnf - MariaDB:
/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 عبور از لایههای امنیتی (AppArmor و SELinux)
اینجاست که اکثر مدیران سرور با شکست مواجه میشوند! حتی اگر فایلها را درست کپی کنید، لایههای امنیتی لینوکس اجازه دسترسی MySQL به خارج از مسیر پیشفرض را نمیدهند.
تنظیم AppArmor (مخصوص Ubuntu و Debian)
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 تنظیم SELinux (مخصوص CentOS و AlmaLinux)
اگر از خانواده 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 در لینوکس را به پایان رساندید. 🚀
پاکسازی نهایی (بعد از 48-72 ساعت اطمینان)
# ساخت Backup فشرده از پوشه قدیمی (اختیاری)
sudo tar -czf /root/mysql_old_backup_$(date +%F).tar.gz /var/lib/mysql_backup
# حذف پوشه قدیمی
sudo rm -rf /var/lib/mysql_backup مزایا و معایب تغییر مسیر دیتابیس MySQL در لینوکس
ما به عنوان متخصص سرور موظف هستیم حقایق را به شما بگوییم:
| مزایا | معایب و ریسکها |
|---|---|
| رفع قطعی مشکل فضای دیسک | ریسک از دست رفتن داده در صورت نداشتن بکآپ |
| افزایش عملکرد در صورت استفاده از SSD | پیچیدگی در عیبیابی خطاهای امنیتی (AppArmor/SELinux) |
| سازماندهی بهتر فایلهای سرور | نیاز به Down-time کوتاه در زمان انتقال |
نتیجهگیری: مدیریت هوشمندانه دیتابیس با وبداده
تغییر دادن مسیر دایرکتوری MySQL در لینوکس یک انتخاب نیست، بلکه برای سرورهایی که با رشد مداوم داده مواجه هستند، یک ضرورت است. در این مقاله آموختیم که چگونه با استفاده از ابزار قدرتمند rsync و پیکربندی صحیح لایههای امنیتی مانند AppArmor، دیتابیس خود را به مکانی امنتر و وسیعتر منتقل کنیم.
به یاد داشته باشید که زیرساخت قدرتمند، نیمی از مسیر موفقیت کسبوکار شماست. اگر به دنبال سروری هستید که محدودیتهای سختافزاری شما را به حداقل برساند، سرویسهای وبداده بهترین انتخاب برای شماست.
✅ چرا وبداده؟
- بهرهگیری از هاردهای فوقسریع NVMe نسل جدید
- پشتیبانی فنی 24 ساعته برای حل مشکلات دیتابیس
- آپتایم 99.9٪ برای کسبوکارهای حساس
در صورتی که در هر یک از مراحل انتقال با چالشی روبرو شدید، حتماً در بخش نظرات با ما در ارتباط باشید؛ کارشناسان ما در سریعترین زمان ممکن به شما پاسخ خواهند داد. امیدوارم این مقاله از بلاگ وبداده برای شما مفید بوده باشد. ☁️🚀
سوالات متداول از آموزش تغییر دادن مسیر دایرکتوری MySQL در لینوکس
1- آیا این روش برای MariaDB هم کار میکند؟
بله، فرآیند برای MariaDB دقیقاً مشابه است، فقط ممکن است نام سرویس به جای mysql به صورت mariadb باشد.
2- بعد از انتقال، MySQL استارت نمیشود. چه کار کنم؟
اولین قدم بررسی لاگها با دستور sudo journalctl -xeu mysql است. معمولاً مشکل از تنظیم پرمیشنهای پوشه MySQL یا محدودیتهای AppArmor است.
3- آیا میتوانم دیتابیس را به یک درایو شبکه (NFS) منتقل کنم؟
بله، اما توصیه نمیشود؛ زیرا تاخیر شبکه (Latency) به شدت سرعت دیتابیس شما را کاهش میدهد.
4- چقدر زمان برای این انتقال لازم است؟
بستگی به حجم دیتابیس شما دارد. برای یک دیتابیس ۱۰ گیگابایتی روی پورت ۱ گیگابیت، حدود ۳ تا ۵ دقیقه زمان کپی نیاز است.



