پشتیبان گیری داغ (Hot Backup) از پایگاه داده MySQL با Percona XtraBackup – از صفر تا صد


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