پشتیبان گیری از بانکهای اطلاعاتی MySQL
امروزه با همه گیر شدن سایتهای پویا، بسیاری از سرویسدهندههای وب که این نرمافزارهای کاربردی وب را اجرا میکنند، دارای تعداد زیادی بانک اطلاعاتی هستند که همانند فایلهای دیگر نیاز است تا بصورت مرتب از آنها نسخههای پشتیبان تهیه شود. گاهی اهمیت نسخههای پشتیبان از بانکهای اطلاعاتی از نسخههای پشتیبان فایل سیستم بیشتر است. دلیل آن هم روشن است، بسیاری از اطلاعات مهم در بانکهای اطلاعاتی ذخیره میشوند نه در فایل سیستم!
در مقاله حاضر اسکریپتی را ایجاد خواهیم کرد که عمل پشتیبان گیری را بطور خودکار بر روی یک سرویسدهنده ثالث در ساعات خاصی از روز انجام دهد. اتصال به سرویسدهنده ثالث میتواند بصورت اشتراکهای nfs و یا از طریق ssh صورت پذیرد.
در قدم نخست باید موارد ابتدایی و لازم برای انجام پشتیبان گیری را فراهم کرد. نخست باید بر روی سرویسدهنده بانک اطلاعاتی MySQL کاربری را ایجاد کرد که دارای حداقل دسترسی برای خواندن و ذخیره اطلاعات باشد. برای این منظور دستورات زیر را وارد میکنیم:
mainserver# mysql -u root -p
mysql> grant select,lock tables on *.* to bkuser@localhost identified by 'bkpass';
بجای bkuser و bkpass میتوانید نام کاربر و کلمه عبور مورد نظر خودتان را استفاده نمایید.
در صورتی که بخواهید تا فایلهای نسخههای پشتیبان از طریق ssh در سرویسدهنده مقصد کپی شوند، باید چند کار اضافهتر نیز انجام دهید. بدلیل اینکه ارتباط باید بصورت خودکار و بدون دخالت کاربر صورت گیرد، باید عملیاتی را انجام داد تا باعث شود تا سرویسدهنده اصلی بتواند بدون نیاز به کلمه عبور به سرویسدهنده مقصد متصل گردد. برای این کار از روش ارسال کلید عمومی ssh سرویسدهنده مقصد بر روی سرویسدهنده اصلی استفاده میشود. برای ایجاد کلیک عمومی ssh بر روی سرویسدهنده مقصد، دستور زیر را وارد نمایید:
backupserver$ ssh-keygen -t dsa -f $HOME/.ssh/id_dsa -P ''
backupserver$ chmod -R 700 .ssh/
سپس فایل id_dsa.pub موجود در شاخه ssh. را در شاخه root/.ssh/ سرویسدهنده اصلی با نام authorized_keys2 کپی نمایید:
backupserver$ scp .ssh/id_dsa.pub root@mainserver:/root/.ssh/authorized_keys2
بسته به شماره نسخه سرویسدهنده ssh ای که بر روی سرویسدهنده اصلی در حال اجراست، ممکن است نیاز داشته باشید تا نام فایل authorized_keys2 به authorized_keys تغییر داده شود. برای این منظور میتوانید یک لینک از آن به فایل authorized_keys ایجاد کنید:
mainserver# ln -s /root/.ssh/authorized_keys2 /root/.ssh/authorized_keys
نکته مهمی که باید رعایت کنید این است که کلید عمومی یک کاربر غیر از کاربر ریشه را بر روی سرویس اصلی قرار دهید تا در صورتی که احتمالا سرویسدهنده اصلی شکسته شود، امکان دسترسی کامل نفوذگر بر روی سرویسدهنده پشتیبان فراهم نگردد. برای مثال میتوانید یک کاربر با نام backup بر روی سرویس دهنده مقصد ایجاد کنید. پس از کپی کلید بر روی سرویسدهنده اصلی، مجوز آنرا برای امنیت بیشتر بر روی 600 تنظیم کنید:
mainserver# chmod 600 /root/.ssh/authorized_keys*
در مرحله بعدی شاخهای را که فایلهای پشتیبان در آن ذخیره خواهد شد را بر روی سرویسدهنده مقصد ایجاد میکنیم:
backupserver$ mkdir /home/backup/bkstore/
اکنون تمامی مقدمات برای بکارگیری اسکریپت پشتیبان گیری از بانک اطلاعاتی انجام شده است. اسکریپت مورد استفاده ما دارای ساختاری به شکل زیر است:
#!/bin/sh
DATESTAMP="`date +%Y-%m-%d`"
echo -n "Processing Auto DB Backup..."
echo
cd /var/lib/mysql/
for x in *
do
if [ $x = "my.cnf" ]; then
echo $x
echo "invalid DB..."
else
echo $x
echo "valid DB..."
mysqldump -u bkuser -pbkpass $x > /root/dbs/tmp/$x.$DATESTAMP.sql
fi
done
cd /root/dbs/
rm `find tmp/ -size 0`
echo "Compressing DB Backups..."
tar -czf dbs.$DATESTAMP.tar.gz tmp/*
rm tmp/*.sql
echo "Copying DBs..."
scp dbs.$DATESTAMP.tar.gz backup@backupserver:/home/backup/bkstore/
cd
همانطور که مشاهده میکنید، نحوه عمل این اسکریپت بسیار ساده است. اسکریپت وارد شاخه var/lib/myslq/ که در آنجا بانکهای اطلاعاتی ذخیره میشود شده و با استفاده از یک حلقه ساده for و دستور mysqldump شروع به پشتیبان گیری از بانکهای اطلاعاتی میکند. در نهایت نیز تمامی فایلها را بصورت فشرده در آورده و با استفاده از دستور scp بر روی سرویسدهنده مقصد کپی میکند. در صورتی که سرویسدهنده مقصد با استفاده از اشتراک nfs به سرویسدهنده اصلی متصل بود، تنها به یک دستور cp اکتفا میکردیم و نیازی به بکارگیری کلیدهای عمومی ssh وجود نداشت ولی امنیت در هنگام انتقال اطلاعات در حالت دوم یعنی بکارگیری ssh بیشتر است.
اسکریپت بالا را با نامی مانند mysqlbk در مسیر root/ ذخیره کرده و مجوز اجرا به آن میدهیم:
mainserver# chmod +x mysqlbk
برای اینکه عملیات پشتیبان گیری بصورت خودکار و در ساعت خاصی از روز انجام گیرد، میتوانیم از cron استفاده کنیم. دستور زیرا را تایپ کرده:
mainserver# crontab -e
سپس خط زیر را وارد میکنیم:
0 3 * * * /root/mysqlbk
از این پس هر روز در ساعت ۳ صبح عملیات پشتیبان گیری و کپی بر روی سرویسدهنده مقصد بصورت خودکار انجام خواهد شد.
برای افزایش ضریب اطمینان میتوان اسکریپت خودکاری را بر روی سرویسدهنده مقصد تعبیه کرد که فایلهای پشتیبان را به محل امن دیگری انتقال دهد.
با ایجاد تغییرات کوچکی در اسکریپت فوق میتوان از آن برای پشتیبان گیری دایرکتوریهای خانگی کاربران نیز استفاده کرد.