مقدمه
در بسیاری از زیرساختهای سازمانی، Oracle Data Guard برای ایجاد محیط Disaster Recovery استفاده میشود. در این معماری یک دیتابیس Primary وجود دارد و یک یا چند Standby دیتابیس که از طریق Archive Log ها همواره با Primary همگام میشوند. در این مقاله با خطاهایی که مواجه شدم هم، وارد کردم تا در صورتی که به خطای مشابه من برخورد کردید، بتوانید برطرفش کنید. پس این یک راهنمای گام به گام نیست. یکبار مطالعه کنید و بعد اجرایش کنید.
گاهی لازم میشود بکاپی که از Standby Database گرفته شده است روی یک سرور جدید ریستور شود تا به عنوان یک دیتابیس مستقل مورد استفاده قرار گیرد. این سناریو در موارد زیر بسیار رایج است:
- ایجاد محیط تست از روی دیتابیس واقعی
- مهاجرت به سرور جدید
- بازیابی دیتابیس در شرایط Disaster
- تهیه نسخه کلون برای تحلیل دادهها
در این مقاله فرآیند کامل Restore و Recovery دیتابیس Oracle 19c از بکاپ Standby با استفاده از RMAN را به صورت عملی و گام به گام بررسی میکنیم. همچنین خطاهای رایج این فرآیند و نحوه حل آنها نیز توضیح داده شده است.
سناریوی مسئله
در این سناریو:
- بکاپ توسط RMAN گرفته شده است
- بکاپ از Standby Database گرفته شده
- دیتابیس مقصد روی سرور جدید ریستور میشود
- دیتابیس مقصد قرار است مستقل (Primary) شود
نکته بسیار مهم این است که وقتی بکاپ از Standby گرفته میشود:
Controlfile از نوع Standby است.
به همین دلیل در مراحل Recovery و Open باید نکات خاصی رعایت شود.
مرحله اول – ریستور دیتابیس
در ابتدا دیتابیس با RMAN ریستور میشود.
rman target /
ریستور کنترل فایل:
restore controlfile from '/backup/controlfile.bkp';
سپس دیتابیس را mount میکنیم:
alter database mount;
در این مرحله دیتابیس در وضعیت زیر قرار دارد:
MOUNTED
DATABASE_ROLE = PHYSICAL STANDBY
مرحله دوم – مشکل Standby Controlfile
اگر در این مرحله دستور زیر اجرا شود:
recover database using backup controlfile until cancel;
با خطای زیر مواجه میشویم:
ORA-01666: control file is for a standby database
دلیل این خطا این است که Controlfile از نوع Standby است و اوراکل اجازه اجرای Recovery عادی را نمیدهد.
در چنین شرایطی باید از دستور مخصوص Standby استفاده کنیم:
RECOVER STANDBY DATABASE UNTIL CANCEL;
مرحله سوم – نیاز به Archive Log
در زمان اجرای Recovery پیام زیر نمایش داده میشود:
ORA-00279: change ... needed for thread 1
ORA-00289: suggestion : +FRA
ORA-00280: change ... is in sequence #1137349
به این معنی که دیتابیس برای ادامه Recovery نیاز به Archive Log با Sequence مشخص دارد.
اگر آرشیو لاگها در اختیار نباشند، دیتابیس به خطای زیر میرسد:
ORA-01194: file 1 needs more recovery to be consistent
این خطا نشان میدهد دیتابیس هنوز Consistent نشده است.
مرحله چهارم – ریستور Archive Log ها از بکاپ
اگر Archive Log ها در بکاپ RMAN موجود باشند میتوان آنها را ریستور کرد.
ابتدا یک مسیر برای ریستور ایجاد میکنیم:
mkdir /u02/archivelog
سپس با RMAN آرشیوها را برمیگردانیم:
rman target /
سپس
RUN {
SET ARCHIVELOG DESTINATION TO '/u02/archivelog/';
RESTORE ARCHIVELOG
FROM SEQUENCE 1137349
UNTIL SEQUENCE 1137500;
}
پس از اتمام عملیات فایلها در مسیر مشخص شده ایجاد میشوند:
1_1137349_1140093505.dbf
1_1137350_1140093505.dbf
1_1137351_1140093505.dbf
مرحله پنجم – اجرای Recovery
حال میتوان Recovery را اجرا کرد:
RECOVER STANDBY DATABASE UNTIL CANCEL;
Oracle به ترتیب Archive Log ها را Apply میکند.
اگر فایل وجود داشته باشد کافی است Enter بزنیم تا فایل پیشنهادی استفاده شود.
در نهایت وقتی به آخرین لاگ رسیدیم دستور زیر را وارد میکنیم:
CANCEL
مرحله ششم – فعال کردن دیتابیس Standby
پس از پایان Recovery باید دیتابیس Standby را به Primary تبدیل کنیم.
ALTER DATABASE ACTIVATE STANDBY DATABASE;
این دستور:
- دیتابیس را از حالت Standby خارج میکند
- آن را به Primary تبدیل میکند
- Data Guard را غیرفعال میکند
مرحله هفتم – باز کردن دیتابیس
پس از Activate دیتابیس را باز میکنیم:
ALTER DATABASE OPEN;
در این مرحله دیتابیس کاملاً عملیاتی خواهد بود.
مشکل Online Redo Log
گاهی در زمان Activate با خطای زیر مواجه میشویم:
ORA-00313: open failed for members of log group
ORA-15012: ASM file does not exist
دلیل این خطا این است که مسیر Online Log ها مربوط به سرور قبلی بوده است.
در این شرایط باید:
- مدیریت فایل Standby را موقتاً غیرفعال کنیم
ALTER SYSTEM SET standby_file_management=manual;
2.گروههای Redo Log قدیمی را حذف کنیم
ALTER DATABASE DROP LOGFILE GROUP 1;
3.لاگهای جدید ایجاد کنیم
ALTER DATABASE ADD LOGFILE SIZE 2G;
4.سپس پارامتر را به حالت قبلی برگردانیم
ALTER SYSTEM SET standby_file_management=auto;
خطاهای رایج در این سناریو
خطای ORA-01666
ORA-01666: control file is for a standby database
علت:
استفاده از دستور Recover مخصوص Primary.
راه حل:
RECOVER STANDBY DATABASE
خطای ORA-01194
file needs more recovery
علت:
Archive Log های کافی Apply نشدهاند.
راه حل:
ریستور و اعمال آرشیو لاگهای بیشتر.
نکات مهم در این فرآیند
همیشه Archive Log های کافی داشته باشید
بکاپ Standby معمولاً Fuzzy Backup است و بدون Archive Log کامل قابل باز شدن نیست.