راه‌اندازی دیتابیس Oracle از بکاپ Standby (RMAN) روی سرور جدید

مقدمه

در بسیاری از زیرساخت‌های سازمانی، 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 ها مربوط به سرور قبلی بوده است.

در این شرایط باید:

  1. مدیریت فایل 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 کامل قابل باز شدن نیست.