امروزه تقریباً تمام وب سایت ها و اپلیکیشن های بر پایه ی دیتابیس کار می کنند.
بدون دیتابیس هیچ داده ای ذخیره نمی شود و اصلا نمی توان پروژه را به درستی راه اندازی کرد چون هر پروژه ای نیاز به دیتابیس برای فراخوانی اطلاعات دارد.
از فروشگاه های اینترنتی و شبکه های اجتماعی گرفته تا یک وب سایت شرکتی و شخصی همه ی این موارد دیتابیس دارند و اطلاعات جدید را در دیتابیس خود ذخیره می کنند.
به بیانی ساده تر می توان گفت دیتابیس قلب تپنده ی یک سیستم محسوب میشود، چون تمام اطلاعات حساس مانند اطلاعات کاربران، سفارش ها و تراکنش های مالی، محتوای متنی و چند رسانه ای و تنظیمات و پیکربندی سیستم در آن ذخیره می شود.
بنابراین فهمیدن این موضوع که دیتابیس ها جزو مواردی اند که به شدت حائز اهمیت هستند سخت نیست! فرض کنید شما یک سایت فروشگاهی دارید! در این سایت شاید شما هر روز محصول اضافه نکنید اما دیتابیس ها بواسطه ثبت سفارش های جدید و بروزرسانی قیمت ها و ثبت نام کاربران مداوم در حال تغییر هستند بنابراین کاملا واضح هست که تا چه اندازه حفظ اطلاعات بروز دیتابیس اهمیت دارد.
بروز برخی مشکلات می تواند اطلاعات دیتابیس را دچار مشکل کند و بک آپ داشتن از دیتابیس کمک می کند تا با کمترین ضرر احتمالی داده ها دوباره بازگردانی شوند! از جمله مواردی که باعث بروز مشکل در داده های دیتابیس می شود می توان به :
خطا های انسانی: ممکن است به اشتباه جدولی حذف یا داده ای تغییر یابد. تنها راه بازگرداندن اطلاعات در این شرایط، داشتن بک آپ بروز و نزدیک است.
مقابله با حملات سایبری: هکر ها میتوانند دیتابیس را آلوده یا نابود کنند. اگر نسخه پشتیبان نداشته باشید، ممکن است کل سیستم غیر قابل استفاده شود.
خرابی سخت افزار یا مشکلات سرور: هارد سرور، رم ، سی پیو و یا حتی کل سرور ممکن است دچار مشکل سخت افزاری شود. بک آپ منظم تضمین می کند که اطلاعات روی سرور جدید قابل بازیابی باشند.
بروزرسانی های پرریسک یا مهاجرت: هنگام ارتقا نسخه MySQL، انتقال به هاست جدید یا اعمال تغییرات می تواند باعث بروز مشکل در دیتابیس ها شود بنابراین داشتن بک آپ به شما این اطمینان خاطر را می دهد که اگر هم مشکلی رخ دهد قابل حل شدن می باشد.
این ها بخشی از مواردی هست که می تواند باعث شود اطلاعات دیتابیس از بین برود. به این موارد می توان مواردی مانند سیل، زلزله و آتش سوزی در دیتاسنتر ها را هم افزود که یک احتمال هست.
بنابراین بک آپ گیری پروسه ای نیست که بتوان آن را به تعویق انداخت یا ضرورتی نداشته باشد! در این آموزش قصد داریم به صورت تخصصی بک آپ گیری از دیتابیس را خدمت شما توضیح دهیم.
بک آپ گیری از دیتابیس MySQL با ابزار mysqldump:
قبلا در آموزش تهیه بک آپ از دیتابیس در phpMyAdmin نحوه بک آپ گیری از دیتابیس را در این ابزار خدمت شما توضیح دادیم! امروز در این مقاله قصد داریم نحوه بک آپ گیری از دیتابیس را در محیط SSH یا ترمینال هاست خدمت شما توضیح دهیم تا با ابزاری مانند mysqldump نسبت به تهیه بک آپ از محیط کامند لاین اقدام کنید.
برای بک آپ گیری از طریق SSH اگر به سرور دسترسی دارید می توانید با دستور ssh root@{ipserver} -p {portnumber} از ترمینال سیستم خود به سرور ssh بزنید در این دستور باید در قسمت ipserver ای پی سرور خود را وارد کنید. و اگر پورت ssh پیش فرض سرور تغییر کرده است باید در قسمت portnumber شماره پورت مدنظر خود را وارد کنید دقت داشته باشید اگر پورت ssh سرور پیش فرض و 22 هست نیاز به وارد کردن -p و شماره پورت نیست!
روش دیگر برای اتصال به محیط ssh استفاده از نرم افزار putty می باشد که قبلا در آموزش نحوه اتصال به ssh هاست خدمت شما توضیح داده شد می توانید بررسی بفرمایید.
بعد از لاگین در سرور می توانید دستورات زیر را برای تهیه بک آپ استفاده کنید.
در دستوراتی که خدمت شما عرض می شود USERNAME نام یوزردیتابیس شماست و DATABASE_NAME نام دیتابیس شما می باشد و backup.sql نام فایلی هست که قرار است محتویات دیتابیس در آن قرار بگیرد و از آن بک آپ تهیه شود که می تواند هر نام دلخواهی را داشته باشد.
نکته: بعد از زدن enter برای گرفتن بک آپ همیشه از شما درخواست پسورد می کند که باید پسورد یوزردیتابیس خود را وارد کنید.
نکته 2: در زمان بک گیری با mysqldump باید یوزر و دیتابیس بهم ادد شده باشند و تمام دسترسی ها به یوزر داده شده باشد در غیر این صورت بک آپ گیری ممکن نخواهد بود.
نکته 3: در این روش شما باید دسترسی به ssh سرور یا ترمینال هاست خود داشته باشید در بعضی شرکت ها این دسترسی داده نمی شود و شما باید قبل از خرید هاست نسبت به وجود دسترسی ssh یا ترمینال در سی پنل هاست خود اطمینان حاصل کنید.
1- بک آپ گیری از یک دیتابیس خاص:
mysqldump -u USERNAME -p DATABASE_NAME > backup.sql
اگر تنها قصد دارید از یک دیتابیس بک آپ تهیه کنید با دستور بالا می توانید از دیتابیس مدنظر خود خروجی تهیه کنید و در فایل backup.sql ذخیره کنید.
2- بک آپ گیری از ساختار جداول بدون داده:
mysqldump -u USERNAME -p -d DATABASE_NAME > structure_only.sql
اگر هم می خواهید از ساختار table ها بدون اینکه محتویات آن بک آپ گیری شود یک خروجی داشته باشید دستور بالا به شما کمک می کند.
3- بک آپ گیری از داده ها بدون جداول:
mysqldump -u USERNAME -p -t DATABASE_NAME > data_only.sql
در این دستور هم شما تمام داده ها را بدون داشتن table ها می توانید برای خود خروجی بگیرید.
4- بک آپ گیری به صورت فشرده:
mysqldump -u USERNAME -p DATABASE_NAME | gzip > backup.sql.gz
اگر دیتابیس شما حجیم هست و می خواهید به صورت فشرده بک آپ تهیه شود برای کاهش حجم نهایی فایل این شیوه بک آپ گیری به شما کمک می کند. خروجی نهایی به صورت فشرده در اختیار شما قرار بگیرد.
با دستورات بالا و دستوراتی مشابه با این دستورات شما می توانید به سادگی در محیط ترمینال سی پنل خود یا در ssh سرور نسبت به بک آپ گیری اقدام کنید.
بک آپ گیری اتوماتیک از دیتابیس با کران جاب:
شرکت های هاستینگ به صورت منظم از داده های کاربران خود بک آپ تهیه می کنند. و خود کاربران هم باید به صورت دوره ای از اطلاعات خود فول بک آپ تهیه کرده و دانلود کنند و روی سیستم های دیگر خارج از محیط هاست یا سرور خود نگه داری کنند که در صورت بروز مشکل بتوانند به سادگی بازگردانی داده داشته باشند.
اما بعضی سایت ها بخاطر بروز شدن لحظه ای دیتابیس نیاز به بک آپ هایی با فواصل کم از دیتابیس دارند برای مثال فرض کنید آخرین بک آپ برای 24 ساعت پیش توسط شرکت هاستینگ یا خود شما گرفته شده و سیستم دچار مشکل شده است! ریستور بک آپ در این شرایط باعث از دست رفتن اطلاعات زیادی در دیتابیس خواهد شد بنابراین این موضوع مهمی هست که از دیتابیس هایی که به صورت منظم و لحظه ای بروز می شوند به صورت مجزا بک آپ گیری کرد.
بک آپ گیری از دیتابیس به شیوه ای که در بالا توضیح داده شد اگرچه کاربردی و مناسب هست ولی نمی توان هر لحظه وارد سرور یا سی پنل شد و به صورت دستی بک آپ تهیه کرد در این شرایط بهترین گزینه استفاده از یک کران جاب برای بک آپ گیری منظم در بازه زمانی های مشخص (هر سه ساعت یا روزی دو بار) می باشد که این زمان بسته به نیاز شما می تواند تغییر کند و هیچ محدودیتی هم ندارد.
برای این منظور شما ابتدا یک پوشه به نام backup در مسیر اصلی سی پنل خود در File manager می سازید یا با دستور mkdir backup در ترمینال یا ssh هم می توانید این پوشه را بسازید.
سپس می توانید با دستور :
USERNAME -p'PASSWORD' DATABASE_NAME > ~/backup/db_$(date +\%Y-\%m-\%d_\%H-\%M-\%S).sql && ls -t ~/backup/db_*.sql | tail -n +4 | xargs -r rm --
که در کران جاب سی پنل ست می کنید از دیتابیس به صورت منظم بک آپ تهیه شود.
در کران جاب شما دسترسی برای ست کردن هر تایمی برای بک آپ گیری را دارید این بک آپ تا سه نسخه از دیتابیس را نگه می دارد و چهارمین بک آپ جایگزین قدیمی ترین نسخه می شود تا فضای بیش از اندازه گرفته نشود.
اگر قصد دارید تعداد بیشتری بک آپ نگه دارید فقط کافی هست در کد خود در قسمت tail -n +4 عدد چهار را به اعداد بزرگتر تبدیل کنید.
برای ست کردن کران جاب در سی پنل می توانید از آموزش قرار دادن کران جاب در سی پنل استفاده بفرمایید تا مطابق با آموزش دستور بک آپ گیری خود را در هر تایمی که مدنظر دارید برای خود تنظیم کنید.
در این آموزش نام یوزر و دیتابیس به همراه پسورد در لینک مشخص می باشد اگر برای امنیت بیشتر تمایل دارید پسورد دیتابیس شما در کران جاب قرار نگیرد می توانید از فایل .my.cnf
استفاده کنید و یوزر و پسورد را در این فایل ذخیره کنید.
مراحل ساخت و استفاده از .my.cnf :
ابتدا وارد File Manager هاست خود شوید و در روت اصلی هاست خود یک فایل به نام .my.cnf
بسازید و محتویات زیر را داخل آن قرار دهید.
[client]
user=DB_USERNAME
password=DB_PASSWORD
host=localhost
همانطور که مشخص هست در قسمت user باید نام یوزر دیتابیس خود و در قسمت password باید پسورد یوزر را وارد کنید.
برای امنیت بیشتر هم می توانید پرمیشن این فایل را روی 0600 تنظیم کنید که فقط خود شما دسترسی داشته باشید.
برای تست اینکه این فایل به درستی کار می کند کافی هست در ترمینال خود دستور زیر را وارد کنید.
mysql -e "SHOW DATABASES;"
در صورتی که خروجی ای مشابه با تصویر زیر را داشت یعنی این فایل به درستی خوانده می شود.
باید نام دیتابیس را به شما نمایش دهد.
به این شیوه شما می توانید کد خود را برای بک آپ گیری به صورت زیر تغییر دهید و فقط از نام دیتابیس استفاده کنید بدون وارد کردن یوزرنیم دیتابیس به همراه پسورد آن برای امنیت بیشتر!
دستور جدید:
mysqldump DATABASE_NAME> ~/backup/db_$(date +\%Y-\%m-\%d_\%H-\%M-\%S).sql && ls -t ~/backup/db_*.sql | tail -n +4 | xargs -r rm --
با این دستور دیگر نیاز به وارد کردن یوزر و پسورد نخواهید داشت و بک آپ گیری با توجه به تایمی که تعیین کرده اید انجام خواهد شد. برای مثال در این آموزش ما هر ده دقیقه در حال بک آپ گیری از دیتابیس هستیم.
الان اگر وارد مسیر پوشه backup خود شوید لیست دیتابیس های خود را می توانید مشاهده کنید که از دیتابیس های شما بک آپ گیری شده است و سه نسخه آخر نگهداری می شود و بک آپ جدید که گرفته می شود جایگزین قدیمی ترین بک آپ می شود.
اگر مشاهده بفرمایید بک آپ ها دقیقا هر ده دقیقه گرفته شده اند و دقیقا 3 نسخه از بک آپ ها در دسترس است! چون با هر بار تهیه بک آپ جدید قدیمی ترین حذف می شود!
شما می توانید با توجه به زمانی که تعیین می کنید بک آپ ها را در بازه زمانی های مختلف و در تعداد کمتر یا بیشتر برای خود نگه داری کنید.
ریستور بک آپ در SSH یا ترمینال هاست:
بعد از تهیه بک آپ و نگهداری آن ها در سرور های مجزا چه به صورت کران جاب و چه به صورت دستی گاهی نیاز می شود در شرایطی که مشکلی برای داده های دیتابیس رخ داد اطلاعات بازگردانی شود.
طبیعی هست در زمان ریستور بک آپ دیتابیس داده ها به زمان بک آپ گیری برمیگردد و اطلاعات جدید وارد شده حذف می شود بنابراین این موضوع بسیار مهم است که بک آپ گیری های شما در فواصل زمانی کوتاه باشد.
برای ریستور بک آپ دیتابیس می توان همانطور که در بالا توضیح داده شد از phpmyadmin هم استفاده شود ولی بهترین گزینه استفاده از ssh یا ترمینال هاست می باشد.
برای این منظور ابتدا وارد ترمینال هاست یا ssh سرور خود می شویم و در مسیری که فایل بک آپ را قرار دادیم دستور زیر را اجرا می کنیم:
mysql -u USERNAME -p DATABASE_NAME < backup.sql
به کمک دستور بالا backup.sql که نام بک آپ ماست در دیتابیس و یوزر ما ریستور خواهد شد که بعد از زدن اینتر باید پسورد یوزر دیتابیس را هم وارد کنید.
نکته : یوزر دیتابیسی که ایجاد می کنید باید دسترسی کامل به دیتابیس داشته باشد و به اصطلاح add privilege شده باشد.
نکته2 : دیتابیس شما اگر حاوی اطلاعات باشد ممکن است اطلاعات بازنویسی شود یا با خطای جداول وجود دارد رو به رو شوید بنابراین بهترین گزینه این است که یک دیتابیس جدید و خالی بسازید.
نکته3 : این دستور باید دقیقا در مسیری زده شود که بک آپ دیتابیس وجود دارد اگر در مسیر دیگری دستور اجرا می شود باید مسیر کامل بک آپ دیتابیس را بنویسید.
نکته4 : اگر بک آپ دیتابیس شما فشرده شده بود بهتر است ابتدا آن را از حالت فشرده خارج کنید و سپس دستور ریستور را اجرا کنید.
نکته 5: اگر حجم بک آپ دیتابیس بالا بود این پروسه ممکن است زمان بر شود و در صورتی که ssh یا ترمینال بسته شود این فرآيند ناتمام باقی خواهند ماند و مجدد باید انجام شود.
بنابراین با روش بالا می توان به سادگی بک آپ را ایمپورت کرد و مجدد داده ها را در دسترس قرار داد.
مزایای بک آپ گیری و ریستور دیتابیس در ترمینال نسبت به phpMyAdmin:
در بک آپ گیری و ریستور با ابزار هایی مانند mysqldump در مقایسه با phpMyAdmin می توان برتری هایی را هم ذکر کرد.
اگرچه محیط گرافیکی phpMyAdmin شاید کاربرپسند تر باشد اما در عمل و در شرایط خاص این بک آپ گیری و ریستور در ترمینال یا ssh هست که برتری های محسوسی دارد که می توان به موارد زیر اشاره کرد.
دقت داشته باشید هر دو شیوه طرفداران مخصوص به خود را دارد و در اکثر مواقع هر دو گزینه مطلوبی برای انجام کار می باشند اما می توان به صورت خلاصه موارد زیر را ذکر کرد.
1- سرعت و کارایی بالا:
در ترمینال، عملیات مستقیماً روی سرور انجام می شود و نیازی به واسط وب نیست بنابراین برای دیتابیس های بزرگ (گیگابایتی)، ترمینال خیلی سریع تر از phpMyAdmin عمل می کند و نیاز نیست برای بارگذاری یا بک آپ گیر از دیتابیس مدت زمان زیادی منتظر ماند.
2- عدم محدودیت حجم فایل:
phpMyAdmin معمولاً محدودیت آپلود فایل دارد (مثلاً 2MB تا 500MB به خاطر تنظیمات سمت سرور البته می توان این مقادیر را تا 2 گیگابایت هم افزایش داد) به همین دلیل برای دیتابیس های حجیم کارایی ندارد.
در ترمینال هیچ محدودیتی وجود ندارد و می توانید فایل های چند گیگابایتی را بدون مشکل بکاپ گیری یا ریستور کنید.
پس می توان گفت محدودیت های آپلود در phpmyadmin می توان در شرایطی که دیتابیس حجیم هست کاملا باعث بروز مشکل شود.
3- قابلیت اجرای از راه دور و خودکارسازی:
میتوانید برای بک آپ گیری کران جاب ست کنید تا به صورت خودکار این بک آپ گیری ها در بازه زمانی مشخص اتفاق بیفتد همچنین امکان انتقال مستقیم بکاپ به سرور دیگر هم بعد از بک آپ گیری فراهم هست.
4- پایداری بیشتر:
phpMyAdmin تحت وب است و ممکن است با قطع شدن اینترنت، مرورگر یا تنظیمات PHP عملیات نیمه کاره بماند و نیاز است دوباره تغییرات انجام شود و این باعث کاهش راندمان کاری می شود.
در ترمینال، مخصوصاً اگر با screen یا tmux کار کنید، عملیات حتی با قطع شدن اتصال SSH ادامه پیدا میکند.
5- امنیت بالاتر:
نیازی نیست فایل بکاپ را از طریق وب آپلود یا دانلود کنید که ممکن است با چالش هایی همراه باشد. در سرور میتوانید بکاپ را مستقیم نگه دارید یا روی سرور دیگری منتقل کنید (مثلاً با scp).
6- کنترل و انعطاف پذیری بیشتر:
میتوانید دقیقاً مشخص کنید چه چیزی بکاپ بگیرید (فقط ساختار، فقط داده ها، یا هر دو). به این صورت به سادگی می توان دقیقا به همان شیوه ای که تمایل دارید بک آپ گیری کنید و نیاز نیست هر بار از تمام داده ها بک آپ گیری کنید.
در phpmyadmin این امکان فراهم نیست و اگر بخواهید export بگیرید باید از تمام داده ها بک آپ گیری انجام شود.
7- ثبت در لاگ ها و مستندسازی:
دستورات CLI را میتوان در اسکریپت ها ذخیره کرد تا تاریخچه ای از عملیات وجود داشته باشد.
در phpMyAdmin معمولاً این تاریخچه ندارید مگر اینکه دستی یادداشت کنید.
بنابراین به صورت خلاصه می توان گفت phpMyAdmin مناسب دیتابیس های خیلی بزرگ نیست و احتمال Timeout و قطع شدن عملیات وجود دارد.
اگر دیتابیس شما از نظر حجم کوچک هست و به محیط گرافیکی علاقمند هستید phpMyAdmin برای شما کفایت می کند و مشکل را حل می کند اما اگر دیتابیس بزرگ یا حساس دارید یا نیاز به بکاپ گیری خودکار و حرفه ای دارید (mysqldump + mysql) بهترین انتخاب است.
نتیجه گیری:
بکاپ گیری از دیتابیس MySQL حیاتی است چون هر خطا، حمله، یا خرابی سخت افزار می تواند کل داده ها را از بین ببرد. داشتن بکاپ به شما امکان می دهد سریعاً سیستم را به حالت پایدار برگردانید و جلوی از دست رفتن اطلاعات حیاتی را بگیرید.
همانطور که گفته شد جدا از بک آپ گیری کامل از پروژه خود گاهی نیاز است که از دیتابیس به صورت مجزا بک آپ تهیه شود و فواصل زمانی این بک آپ گیری کوتاه باشد چون دیتابیس ها به نسبت خود سایت از آپدیت های لحظه ای برخوردار می باشند.
استفاده از کران جاب ها برای بک آپ گیری دستی از دیتابیس و انتقال آن ها به سرور دیگر گزینه ی بسیار خوبی برای این منظور می باشد.
فقط در نظر داشته باشید همیشه بک آپ گیری ها را چک کنید و اطمینان حاصل کنید بک آپ گیری به درستی در حال انجام هست. گاهی بخاطر مشکلات پیش بینی نشده پروسه بک آپ گیری متوقف می شود و شما زمانی متوجه این موضوع خواهید شد که دیر خواهد بود.
در نهایت بک آپ گیری چه به صورت دستی از phpmyadmin و چه به صورت کران جاب با ابزار mysqldump موردی هست که حتما باید به صورت منظم انجام دهید تا دچار مشکلی از بابت اطلاعات نشوید.