یکی از اصلیترین چالشهایی که هنگام کار با پایگاههای داده فعال مواجه میشویم، تهیه «پشتیبانهای داغ» (Hot Backups) از آنها است. منظور از پشتیبان داغ پشتیبانی است که در آن سرویس پایگاه داده متوقف نمیشود یا پایگاه داده به حالت «فقط خواندنی» (Read-Only) در نمیآید. توجه داشته باشید که کپی کردن صرفِ فایلهای پایگاه داده، باعث میشود یک رونوشت از پایگاه داده داشته باشیم که دچار ناسازگاری درونی باشد، یعنی قابل استفاده نباشد، یا این که تراکنشهایی که در طی فرایند کپی کردن رخ دادهاند، از دست رفته است. از سوی دیگر متوقف کردن پایگاه داده برای پشتیبانگیریهای زمانبندیشده، باعث میشود که بخشهایی از اپلیکیشن که با پایگاه داده ارتباط دارند، از کار بیافتند. Percona XtraBackup یک نرمافزار متن-باز است که برای رفع این مشکل استفاده میشود و پشتیبانهای کامل یا افزایشی از سرورهای پایگاه داده MySQL، MariaDB و Percona تهیه میکند که به نام پشتیبان داغ نیز نامیده میشوند.
برخلاف پشتیبانهای منطقی که از نرمافزارهایی مانند mysqldump استفاده میکنند؛ XtraBackup پشتیبانهای فیزیکی از فایلهای پایگاه داده تهیه میکند، یعنی از فایلهای دادهای کپی میگیرد. سپس به لاگ تراکنشهای پشتیبانهای فیزیکی مراجعه میکند تا هر تراکنش جاری که در طی زمان ایجاد پشتیبانها کامل نشده بود را مجدداً پشتیبانگیری کند. در نتیجه پشتیبانهای منسجمی از پایگاه داده در حال اجرا ایجاد میشود. این پشتیبان پایگاه داده که حاصل میشود را میتوان با استفاده از rsync یا یک سیستم پشتیبانگیری مانند Bacula در مکان ریموت ذخیره ساخت.
در این راهنما شیوه اجرای یک پشتیبان کامل داغ از پایگاههای داده MySQL یا MariaDB با استفاده از Percona XtraBackup روی سرور اوبونتو 14.04 و همچنین CentOS 7 را بررسی میکنیم. فرایند بازیابی پایگاه داده از یک پشتیبان نیز مورد بررسی قرار گرفته است.
پیشنیازها
در این راهنما میبایست اجزای زیر را داشته باشیم:
- دسترسی Superuser روی یک سیستم اوبونتو 14.04 (یا CentOS 7)
- یک نسخه در حال اجرا از پایگاه داده MySQL یا MariaDB
- دسترسی به کاربر مدیر (root) پایگاه داده
ضمناً برای اجرای پشتیبانگیری داغ از پایگاه داده، سیستم پایگاه داده باید از موتور ذخیرهسازی InnoDB استفاده کند. دلیل این مسئله آن است که XtraBackup از لاگ تراکنشهایی که InnoDB انجام داده است استفاده میکند. اگر پایگاههای داده شما از موتور ذخیرهسازی MyISAM استفاده میکنند، میتوانید همچنان از XtraBackup استفاده کنید؛ اما پایگاه داده در طی انتهای پشتیبانگیری برای مدتی کوتاه قفل میشود.
بررسی موتور ذخیرهسازی
اگر از موتور ذخیرهسازی که پایگاه دادهتان استفاده میکند، مطمئن نیستید، میتوانید به روشهای مختلف آن را بررسی کنید. یک روش برای این کار استفاده از کنسول MySQL برای انتخاب پایگاه داده مورد نظر و سپس نمایش خروجی وضعیت یکی از جدولها است. ابتدا دستور زیر را تایپ کنید تا به کنسول MySQL وارد شوید:
1 |
mysql -u root –p |
سپس رمز عبور root را برای MySQL وارد نمایید. وقتی اعلان MySQL ظاهر شد، پایگاه دادهای که میخواهید بررسی کنید را انتخاب نمایید. مطمئن شوید که در دستور زیر، نام پایگاه داده خود را جایگزین کردهاید:
1 |
USE database_name; |
سپس وضعیت جدولها را در خروجی نمایش دهید:
1 |
SHOW TABLE STATUS\G; |
موتور مورد استفاده در هر ردیف از پایگاه داده نمایش مییابد:
1 2 3 4 5 6 7 8 9 10 11 |
Example Output: ... *************************** 11. row *************************** Name: wp_users Engine: <span style="color: #ff0000;">InnoDB</span> ... |
زمانی که مطمئن شدید میتوانید از کنسول خارج شوید:
1 |
Exit |
نصب Percona XtraBackup
شیوه نصب XtraBackup روی سرور اوبونتو 14.04 و CentOS 7 تا حدودی متفاوت است. در ادامه هر یک از این موارد را جداگانه ارائه میکنیم.
نصب روی اوبونتو 14.04
سادهترین روش نصب Percona XtraBackup استفاده از apt-get است. ابتدا کلید ریپازیتوری Percona را با دستور زیر به سیستم اضافه کنید:
1 |
sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A |
سپس ریپازیتوری آن را به منابع apt خود بیفزایید:
1 2 3 |
sudo sh -c "echo 'deb http://repo.percona.com/apt trusty main' > /etc/apt/sources.list.d/percona.list" sudo sh -c "echo 'deb-src http://repo.percona.com/apt trusty main' >> /etc/apt/sources.list.d/percona.list" |
دستور زیر را اجرا کنید تا منابع apt بهروزرسانی شوند:
1 |
sudo apt-get update |
در نهایت میتوانید با اجرای دستور زیر XtraBackup را نصب کنید:
1 |
sudo apt-get install percona-xtrabackup |
نصب روی CentOS 7
روی CentOS 7 سادهترین روش برای نصب percona-xtrabackup استفاده از yum است، چون ریپازیتوری percona یک RPM برای آن ارائه کرده است:
1 |
sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm |
سپس میتوانید با اجرای دستور زیر Percona XtraBackup را نصب کنید:
1 |
sudo yum install percona-xtrabackup |
هر گونه اعلان تأییدی که ظاهر میشود را بپذیرید تا فرایند نصب تکمیل شود.
XtraBackup به طور عمده شامل برنامه XtraBackup و اسکریپت پرل innobackupex است که از آن برای ایجاد پشتیبانهای پایگاههای داده خود استفاده خواهیم کرد.
آمادهسازیهای اولیه
پیش از این که برای اولین بار از XtraBackup استفاده کنید، باید سیستم و کاربر MySQL را آمادهسازی نمایید تا XtraBackup بتواند از آنها استفاده کند. در بخش بعدی این مراحل را توضیح دادهایم.
کاربر سیستم
به جز در مواردی که بخواهید از کاربر root سیستم استفاده کنید، باید برخی آمادهسازیهای اولیه انجام دهید تا مطمئن شوید که XtraBackup میتواند به طرز صحیحی اجرا شود. ما فرض میکنیم که شما به عنوان کاربری وارد سیستم شدهاید که XtraBackup را اجرا خواهد کرد و دسترسی superuser نیز دارید. کاربر سیستم خود را به گروه mysql اضافه کنید:
1 |
sudo gpasswd -a <span style="color: #ff0000;">username</span> mysql |
زمانی که چنین کردید ابتدا یک دایرکتوری ایجاد کنید که برای ذخیرهسازی پشتیبانهایی که XtraBackup ایجاد میکند استفاده خواهد شد:
1 2 3 |
sudo mkdir -p /data/backups sudo chown -R <span style="color: #ff0000;">username</span>: /data |
دستور chown تضمین میکند که این کاربر میتواند در دایرکتوری پشتیبان بخواند و بنویسید.
کاربر MySQL
XtraBackup نیازمند نوعی کاربر MySQL است که هنگام ایجاد پشتیبانها مورد استفاده قرار دهد. اینک یک چنین کاربری ایجاد میکنیم. وارد کنسول MySQL شوید و دستور زیر را اجرا کنید:
1 |
mysql -u root –p |
رمز عبور root MySQL را نیز در ادامه وارد کنید.
در زمانی که اعلان MySQL ظاهر شد، یک کاربر جدید ایجاد کرده و رمز عبوری برای آن تأیید کنید. در این مثال ما از نام کاربری «bkpuser» و رمز عبور «bkppassword» استفاده میکنیم. دقت داشته باشید که این موارد را در استفاده عملی خود تغییر دهید:
1 |
CREATE USER '<span style="color: #ff0000;">bkpuser</span>'@'localhost' IDENTIFIED BY '<span style="color: #ff0000;">bkppassword</span>'; |
سپس به کاربر جدید mysql خود دسترسیهای بارگذاری مجدد، قفل کردن و ایجاد کپی از همه پایگاههای داده را میدهیم:
1 2 3 |
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO '<span style="color: #ff0000;">bkpuser</span>'@'localhost'; FLUSH PRIVILEGES; |
اینها کمترین دسترسیهایی هستند که XtraBackup برای اجرای پشتیبانهای کامل نیاز دارد. زمانی که کار خود را به پایان بردید، از کنسول MySQL خارج شوید.
1 |
Exit |
اینک آماده هستیم تا پشتیبان کاملی از پایگاه داده خود تهیه کنیم.
اجرای پشتیبانگیری کامل داغ
در این بخش مراحلی که برای ایجاد پشتیبان کامل داغ از پایگاه داده MySQL با استفاده از XtraBackup مورد نیاز است را بررسی میکنیم. پس از مطمئن شدن از این که مجوزهای (permission) فایل پایگاه داده صحیح هستند؛ از XtraBackup برای ایجاد پشتیبان استفاده میکنید و سپس آن را آمادهسازی میکنیم.
بهروزرسانی مجوزهای Datadir
در سرور اوبونتو 14.04 و همچنین CentOs 7 فایلهای داده MySQL در مسیر var/lib/mysql/ ذخیره میشوند که گاهی اوقات datadir نیز نامیده میشود. به طور پیشفرض دسترسی به datadir به کاربر mysql محدود شده است. XtraBackup به دسترسی به این دایرکتوری برای ایجاد فایلهای پشتیبانی نیاز دارد. از این رو چند دستور اجرا زیرا را کنید تا مطمئن شوید که کاربر سیستمی که قبلاً به عنوان بخشی از گروه mysql ایجاد کردهاید، مجوزهای لازم را در اختیار دارد:
اوبونتو 14.04
1 2 3 |
sudo chown -R mysql: /var/lib/mysql sudo find /var/lib/mysql -type d -exec chmod 770 "{}" \; |
CentOS 7
1 2 3 |
sudo chown -R mysql: /var/lib/mysql sudo find /var/lib/mysql -type d -exec chmod 775 "{}" \; |
اگر کاربری را که ایجاد کردید در همان نشست (session) به گروه mysql اضافه کرده باشید، باید مجدداً وارد سیستم شوید تا عضویتهای گروه کاربران تغییر یابد.
ایجاد پشتیبان
اکنون آماده هستیم که پشتیبانهای خود را ایجاد کنیم. زمانی که پایگاه داده MySQL در حال اجرا است، از نرمافزار innobackupex بدین منظور استفاده میکنیم. دستور زیر را پس از بهروزرسانی رمز عبور و نام کاربر برای ورود به MySQL اجرا کنید:
1 |
innobackupex --user=<span style="color: #ff0000;">bkpuser</span> --password=<span style="color: #ff0000;">bkppassword</span> --no-timestamp /data/backups/new_backup |
بدین ترتیب پشتیبانی از پایگاه داده در مکان تعیین شده /data/backups/new_backup ایجاد خواهد شد:
1 2 3 4 5 6 7 |
innobackupex output innobackupex: Backup created in directory '/data/backups/new_backup' 150420 13:50:10 innobackupex: Connection to database server closed 150420 13:50:10 innobackupex: completed OK! |
به طور جایگزین میتوانید فلگ no-timestamp– را حذف کنید تا XtraBackup یک دایرکتوری پشتیبان بر اساس زمان کنونی مانند زیر ایجاد کند:
1 |
innobackupex --user=<span style="color: #ff0000;">bkpuser</span> --password=<span style="color: #ff0000;">bkppassword</span> /data/backups |
دستور فوق یک پشتیبان از پایگاه داده در یک زیردایرکتوری که به طور خودکار ایجاد شده است، تهیه میکند:
1 2 3 4 5 6 7 |
innobackupex output — no timestamp innobackupex: Backup created in directory '/data/backups/<span style="color: #ff0000;">2015-04-20_13-50-07</span>' 150420 13:50:10 innobackupex: Connection to database server closed 150420 13:50:10 innobackupex: completed OK! |
هر کدام از دو روش فوق را که انتخاب کنید در هر صورت، میبایست در آخرین خط خروجی عبارت «innobackupex: completed OK!» نشان داده شود. یک پشتیبانگیری موفق باعث میشود یک کپی از datadir پایگاه داده ایجاد شود که باید پیش از استفاده، آمادهسازی شود.
آمادهسازی پشتیبان
آخرین گام برای ایجاد یک پشتیبان داغ با استفاده از XtraBackup آمادهسازی آن است. این گام شامل «replaying» لاگ تراکنشها و اعمال تراکنشهای ارسال نشده روی پشتیبان است. آمادهسازی پشتیبان باعث میشود که دادهها مسنجم باقی بمانند و قابل بازیابی باشند.
اگر مثال خود را پی بگیریم، باید پشتیبانی را که در دایرکتوری data/backups/new_backup/ ایجاد کردهایم، آمادهسازی کنیم. در دستور زیر دایرکتوری خودتان را جایگزین کنید:
1 |
innobackupex --apply-log /data/backups/new_backup |
در این مورد نیز باید پیام «innobackupex: completed OK!» را در آخرین خط خروجی مشاهده کنید.
پشتیبان پایگاه دادهای که ایجاد کردید، آماده استفاده برای بازیابی پایگاه داده است. ضمناً اگر یک سیستم پشتیبانگیری از فایلها مانند Bacula داشته باشید، این پشتیبان از پایگاه داده باید به عنوان بخشی از گزینش پشتیبان شما تعیین شود. در بخش بعدی شیوه بازیابی پایگاه داده از فایلهای پشتیبانی که هم اینک ایجاد کردیم را بررسی میکنیم.
اجرای بازیابی پشتیبان
بازیابی کردن یک پایگاه داده با XtraBackup نیازمند این است که پایگاه داده متوقف شود و همچنین datadir نیز خالی باشد. با استفاده از دستور زیر سرویس MySQL را متوقف کنید:
اوبونتو
1 |
sudo service mysql stop |
CentOS 7
1 |
sudo systemctl stop mariadb |
1 2 3 |
mkdir /tmp/mysql mv /var/lib/mysql/* /tmp/mysql/ |
1 |
innobackupex --copy-back /data/backups/<span style="color: #ff0000;">new_backup</span> |
فایلهای بازیابی شده در datadir احتمالاً به کاربری تعلق دارند که فرایند بازیابی را اجرا کرده است. مالکیت را به mysql تغییر دهید تا MySQL بتواند فایلها را خوانده و بنویسد:
1 |
sudo chown -R mysql: /var/lib/mysql |
اکنون میتوانید سرویس MySQL را آغاز کنید:
اوبونتو 14.04
1 |
sudo service mysql start |
CentOS 7
1 |
sudo systemctl start mariadb |
سخن پایانی
اینک که توانستهاید با بهرهگیری از Percona XtraBackup پشتیبانهای داغ از پایگاه داده MySQL خود تهیه کنید، چند نکته وجود دارند که باید در نظر داشته باشید.
پیش از همه توصیه میشود که این فرایند را خودکارسازی کنید به طوری که پشتیبانها به صوت خودکار بر اساس یک زمانبندی ایجاد شوند. دوم باید کپیهایی ریموت از فایلهای پشتیبان تهیه کنید تا در مواردی که مشکلی برای سرور پیش میآید، بتوانید از آنها استفاده کنید. بدین منظور میتوانید از چیزی مانند rsync یا یک سیستم پشتیبانگیری از فایل شبکه مانند Bacula استفاده کنید. در نهایت باید با مباحث چرخش پشتیبانها (حذف پشتیبانهای قدیمی بر اساس جدول زمانبندی) و ایجاد پشتیبانهای افزایشی (با Percona XtraBackup) جهت صرفهجویی در فضای دیسک نیز آشنا باشید.
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای پایگاه داده و سیستم های مدیریت اطلاعات
- آموزش پشتیبانگیری از بانک اطلاعاتی و تهیه فایل نصبی در C#
- مجموعه آموزشهای مهندسی نرم افزار
- سرور پشتیبان برای یک وب اپلیکیشن — راهنمای جامع
- پشتیبان گیری از سرور اوبونتو ۱۴.۴ با باکولا (Bacula) — به زبان ساده
- پشتیبانگیری و بازیابی فایلها در سیستمعامل لینوکس
==