آموزش صفر تا صد بکاپ خودکار از دیتابیس در سرور لینوکس
هرچیزی که برای بکاپ گرفتن از دیتابیس یک سرور لینوکس لازمه رو توضیح میدم تا بتونید سریع و بدون دردسر از سرورتون بکاپ بگیرید

سلام. این اولین نوشته من در وبسایت مسترادیب به نشانی MrAdib.com هست. طی روزهای اخیر که مصادف با عید ۱۴۰۰ بود، مشکلاتی برای زیرساخت ابرآروان پیش اومد و حمله هکرها منجر به صدمه دیدن سرورهای رایانش_ابری آروان شد و حواشی بسیاری رو در پی داشت.
اما در این میان مهمترین مسالهای که نظرم رو جلب کرد اینکه تعداد زیادی از کسب و کارها از سرورها و دیتابیسهای خودشون هیچ نسخه پشتیبانی نداشتند و از دسترس خارج شدن سرورهاشون منجر به قطع سرویس اونها شد. سرویسهایی که بعضی از اونها مشتریان قابل توجهی داشتند و این موضوع رو عجیبتر میکرد. الان حدود یک هفته از این اتفاق میگذره و هنوز برخی نتونستن حتی سایت خودشون رو مجدد راهاندازی کنند و معلوم نیست این ماجرا تا کی ادامه خواهد داشت!
همچنین لازمه بدونید ما برای دیتابیس میتونیم دونوع بکاپ داشته باشید. ما درباره بکاپ در بازه زمانی مثلا ساعتی، روزانه و ماهیانه داریم صحبت میکنیم که سادهتر قابل پیادهسازی هست و وجودش برای هر سروری الزامی است. بکاپ زنده از دیتابیس یا ریپلیکیش در دیتابیس نیاز خاصتری بوده و شاید در آینده در مقالهای مجزا در اینباره توضیح بدم!
بکاپ خودکار از مایاسکیوال MySQL
با طی کردن مراحل زیر میتونید یاد بگیرید که چطور از دیتابیس مایاسکیوال MySQL خودتون بکاپ بگیرید و اون رو به یک مکان امن خارج از سرور فعلی منتقل کنید. توصیه میشه نسخه بکاپ برای شرایط بحران حداقل ۲۰۰ کیلومتر از نسخه اصلی فاصله داشته باشه. پس بهتره اون رو در یک دیتاسنتر دیگه ترجیحا در یک شهر دیگه نگهدارید.
ساخت یوزر دیتابیس با دسترسی فقط خواندن برای بکاپگیری
وارد سرور خودتون بشید و با یوزری که دارید وارد مایاسکیو ال بشید. ما فرض میگیریم که یوزر دیتابیس شما روت هست. مراحل زیر رو به ترتیب انجام بدید.
از طریق محیط دستوری MySQL و کامندلاین
دستور زیر رو بزنید تا یوزر روت وارد بشید. اگه یوزر دیگهای دارید اون رو وارد کنید.
sudo mysql -u root -p
دستور زیر یه یوزر به نام dumper با پسورد PUT_YOUR_PASSWORD_HERE میسازه. یوزر و پسورد رو به دلخواه خودتون تغییر بدید.
CREATE USER 'dumper'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PUT_YOUR_PASSWORD_HERE';
دسترسی خواندن، پروسس و قفل کردن جداول رو به این یوزر بدید. توجه کنید اگه اسم یوزر رو توی دستور بالا تغییر دادید توی پایینی هم تغییر رو اعمال کنید.
GRANT SELECT, PROCESS, LOCK TABLES ON *.* TO 'dumper'@'localhost';
کد زیر رو بزنید تا سطوح دسترسی تنظیم شده اعمال بشه.
flush privileges;
از محیط اسکیوال خارج بشید.
exit;
از طریق phpmyadmin

ذخیرهکردن اطلاعات یوزر و پسورد برای بکاپگیری خودکار
حالا که یوزر جدید ساختین بهتره که اطلاعات اون رو ذخیره کنید تا نیازی نباشه که یوزر و پسورد رو توی کامند هربار پاس بدیم. دستور زیر رو بزنید تا فایل تنظیمات عمومی مایاسکیوال باز بشه
sudo nano ~/.my.cnf
حالا کافیه سه خط زیر رو توش کپی کنید. طبیعیه که یوزر و پسورد رو اگه (لطفا تغییرش بدید!) تغییر دادید اینجا هم باید مقدار جایگزین شده رو بزارید
[mysqldump]
user=dumper
password=PUT_YOUR_PASSWORD_HERE
برای ذخیره کردن و خروج از این فایل کافیه ctrl+x رو بزنید و در پاسخ به سوال آیا ذخیره کنم دکمه y رو فشار بدید.
بکاپ گرفتن از دیتابیس
حالا که یوزر مورد نظرمون رو ساختیم، با یه دستور یک خطی میتونیم از همه دیتابیسهایی که روی این سرور داریم بکاپ بگیریم. از اونجایی که رمز رو هم ذخیره کردیم هیچی نمیپرسه و توی آدرسی که بهش دادیم ساخت بکاپ رو شروع میکنه که بسته به حجم دیتابیس کمی طول میکشه
بکاپ از یک دیتابیس خاص
mysqldump -v --column-statistics=0 --quick --single-transaction YOUR_DATABASE_NAME > /home/backup-$(date +%Y%m%d-%H%M%S).sql
بکاپ از همه دیتابیسها
mysqldump -v --column-statistics=0 --quick --single-transaction --all-databases > backup-$(date +%Y%m%d-%H%M%S).sql
بکاپ از همه دیتابیسها و فشردهسازی
برای دیتابیس نمونهای که روی این سیستم دارم بکاپ عادی از دیتابیسها ۱.۷ گیگابایت فضا اشغال کرد. در حالی که فشردهسازی حجم اون رو ۷۰ مگابایت کاهش داد. برای بکاپ بهدلیل جلوگیری از هدر رفتن بیدلیل فضا توصیه میشه که از مدل فشردهشده استفاده کنید.
mysqldump -v --column-statistics=0 --quick --single-transaction --all-databases | gzip > backup-$(date +%Y%m%d-%H%M%S).sql.gz
ارسال فایلهای بکاپ به یک سرور جدید
بکاپ گرفته شده در این سرور امن نیست. چون با از دسترس خارج شدن این سرور ما بکاپ خودمون رو از دست خواهیم داد. پس بهتره اون رو به یک سرور دیگه یا محلی مناسب انتقال بدیم. برای این کار در لینوکس میتونید از دستور rsync استفاده کنیم. اگه از اوبونتو استفاده میکنید که بهصورت پیشفرض نصب هست ولی در برخی از توزیعهای لینوکس لازمه که نصبش کنید که از طریق دستور زیر میتونید اون رو نصب کنید
apt-get install rsync
چون میخوایم تنظیم رو بهگونهای انجام بدیم که خودکار بکاپ ارسال بشه لازمه که اطلاعات دسترسی به سرور بکاپ(سرور مقصد یا B) رو توی سرور اصلی (سرور دیتابیس یا A) ذخیره کنیم. از اونجایی که استفاده از رمز ایمن نیست، پس یه کلید SSH میخوایم بسازیم. پس توی سرور اصلی دستور زیر رو بزنید. دو سه تا سوال میپرسه که میتونید با فشردن اینتر از اونها بگذرید.
ssh-keygen
حالا وقتشه که یکبار رمز رو وارد کنیم تا ذخیره بشه. پس دستور زیر رو بزنید تا به سرور A اجازه بدیم به سرور B دسترسی داشته باشه. لازم به ذکر هست که خوبه یه یوزر ساده و بدون دسترسی خاص توی سرور B بسازید و از اون استفاده کنید. ما اینجا برای سادهتر شدن آموزش از یوزر روت استفاده کردیم. همچنین آیپی 1.2.3.4 رو با آیپی سرور خودتون جایگزین کنید.
ssh-copy-id [email protected]
بعد از وارد کردن دستور بالا، اگه اولین باره باید yes رو بزنید و بعدش ازتون رمز این یوزر توی سرور B رو میخواد که وارد کنید. حالا سرور A بدون رمز میتونه به سرور B وصل بشه.
نمونه استفاده از دستور rsync
دستور زیر از پورت ssh 22 برای انتقال آدرس اول یا مبدا به آدرس دوم یا مقصد استفاده میکنه. فلگهای استفاده شده که بعد از دستور لیست شدن بهترتیب
- a مربوط به حالت آرشیو
- v مربوط به نمایش جزئیات روند انتقال
- r مربوط به انتقال زیرپوشهها
- t مربوط به حفظ کردن تاریخ ویرایش فایلهاست
rsync -avrt --delete --rsh='ssh -p 22' /home/backup-file.sql /target_server/path/
طبق پیشنهاد آقای احمد رفیعی، بهتره که دستور rsync رو توی سرور مقصد اجرا کنید که بسته به مدل پیادهسازی شما و اگه سرور اصلی دسترسی مستقیم به اینترنت رو داره میشه از این مدل استفاده کرد. البته توجه داشته باشید که اگر نفوذ به سرور شما رخ بده و هکر دسترسی پیدا کنه، در هر دو صورت امکان خرابکاری در بکاپ وجود داره و این روش برای چنین حالتی بهینه نشده است. در این حالت باید جای آدرسها رو باهم تغییر بدید شبیه به نمونه کد زیر خواهید داشت. همچنین لازمه این دستور rsync رو در سرور بکاپ در یک کرونجاب قرار بدید تا بهصورت منظم نسبت به تهیه بکاپ اقدام کنه
rsync -avrt --delete /primary_server/home/backup-file.sql /home/backup/
ایجاد یک فایل برای انجام بکاپ و انتقال با هم
برای اینکه روند بکاپ گرفتن خودکار بشه لازمه که فایلی برای انجام این دستوران با هم بسازیم پس دستور زیر رو وارد میکنیم تا ادیتور باز بشه
sudo nano /home/mysql-auto-backup/backup.sh
حالا هر خط از کدهای زیر رو کپی کرده و توی این فایل قرار میدیم. خطا اول اسم فایل رو تنظیم میکنه که برای اینکه فایلها تکراری نباشه تاریخ و ساعت رو به اسم فایل اضافه کردم
FILENAME=backup-$(date +%Y%m%d-%H%M%S).sql.gz
خط زیر از همه دیتابیسها بکاپ میگیره و اون رو فشرده کرده و توی فایلی که بالا اسمش رو ساختیم قرار میده
mysqldump --column-statistics=0 --quick --single-transaction --all-databases | gzip > /home/mysql-auto-backup/$FILENAME
خط زیر هم فایل ساخته شده رو به آدرس سرور مدنظرمون منتقل میکنه
rsync -avrt --delete /home/mysql-auto-backup/$FILENAME [email protected]:/home/mysql-auto-backup/
برای ذخیره کردن و خروج از این فایل کافیه ctrl+x رو بزنید و در پاسخ به سوال آیا ذخیره کنم دکمه y رو فشار بدید. الان با هر بار فراخوانی این فایل تمام چیزهایی که برای بکاپ از دیتابیس لازم داریم با هم اجرا میشن
تنظیم کرونجاب برای اجرای بکاپ در بازه زمانی
به مرحله آخر رسیدیم. فایل ما آماده شده و تنها کافیه که اون رو به کرونجاب معرفی کنیم تا در بازه زمانیای که خودمون تنظیم کردیم اجرا بشه. دستور زیر رو بزنید تا فایل کرونجاب باز بشه
nano /etc/crontab
حالا کافیه خط زیر رو کپی کرده و توی این فایل قرار بدید. این خط بهمعنی اجرای اسکریپت ما در هر یک ساعت هست. اگر بازه زمانی دیگری مدنظر شماست میتونید با مراجعه به این سایت اون رو بسازید و جایگزین کنید
0 * * * * root sh /home/mysql-auto-backup/backup.sh >/dev/null 2>&1
برای ذخیره کردن و خروج از این فایل کافیه ctrl+x رو بزنید و در پاسخ به سوال آیا ذخیره کنم دکمه y رو فشار بدید.
تلاش کردم که آموزش بالا ساده باشه تا کمک کوچکی به شما برای بکاپگیری خودکار و جلوگیری از صدمه دیدن کسب و کارتون کرده باشم. ولی از اونجایی که احساس کردم همین هم شاید سخت باشه این رو ارتقا دادم و یه اسکریپت آماده بکاپ خودکار از سرور لینوکس ساختم تا بتونید راحتتر از اینها بکاپ بگیرید.