رسیدگی به خرابی Online Redo Log – بخش دوم

مقدمه
در بخش قبل،به تعریف Redo Log Groupها و کاربرد آنها پرداختیم و همچنین وضعیتهای مختلفی که یک گروه و یک Member میتواند داشته باشد را بررسی کردیم و در ادامه سناریوهای مختلف از دست رفتن یک Member از یک گروه با هر وضعیتی را بررسی کردیم.
با توجه به اهمیت گروههای Online Redo Log در پایگاهداده اوراکل، تلاش کردیم در این بخش سناریوهای مطرح شده در بخش قبل را برای از دست رفتن یک گروه در وضعیت Open بودن پایگاهداده و همچنین درصورتی که پایگاهداده Up نباشد بررسی کنیم.

رسیدگی به خرابی Online Redo Log بخش اول

سناریوهای خرابی یک گروه
زمانی که گروه در وضعیت INACTIVE و پایگاهداده Up میباشد
زمانی که یک گروه در وضعیت Inactive دچار خراب میشود، برای دیدن خرابی، باید Alert Log را مانیتور کرد و سپس در جهت رفع مشکل پیش آمده اقدامات لازم را انجام داد.
بررسی وضعیت پایگاهداده با مانیتور کردن Alert Log.

$ less /oracle/app/diag/rdbms/orcl19c/orcl19c/trace/alert_orcl19c.log

با خرابی یک گروه در وضعیت ذکر شده، مشکل جدی پیش نخواهد آمد، اما بهتر است با مانیتور کردن و اقدام به موقع مشکل پیش آمده را بررسی و حل نموده تا از مخاطرات احتمالی با خرابی دیگر گروهها جلوگیری کنیم.
در مواقعی که یک گروه خراب میشود و یا از دست میرود درصورتی که تعداد گروهها کم باشد ممکن است پایگاهداده دچار Lock شود. جهت حل مشکل پیش آمده و بازیابی گروه میتوانیم از دستور زیر استفاده کنیم. این دستور مشابه با دستورات حذف و ساخت مجدد گروه میباشد اما تفاوت در آن است درصورتی که تعداد گروهها دو عدد باشد هنگام حذف یکی از آنها، با خطا مواجه خواهیم شد اما این دستور بدون خطا انجام خواهد شد.

sql> alter database clear logfile group n;

درصورتی که Archive نشده باشد میبایست از دستور زیر استفاده کنیم.

Sql> alter database clear unarchived logfile group n;

جهت بررسی وضعیت Archive گروهها میتوان از کوئری زیر استفاده کرد

Sql> SELECT group#, status, archived, thread#, sequence# FROM v$log;

درصورتی که هنگام اجرای دستور Clear با ارور مواجه شدید، مانند ارور I/O، میتوانید بطور دستی گروه را حذف و سپس ایجاد نمایید. ابتدا برای حذف از دستور زیر استفاده میکنیم
Sql> alter database drop logfile group n;
و سپس جهت ایجاد گروه جدید از دستور زیر استفاده میکنیم

alter database add logfile group (‘/directory/file’) SIZE K|M|G;

لازم بذکر است اگر تعداد گروهها دو عدد میباشد، ابتدا گروه جدید را ایجاد نمایید و سپس گروه موردنظر را حذف کنید.

زمانی که گروه در وضعیت INACTIVE و پایگاهداده Down میباشد
امکان دارد گروهی در وضعیت Inactive قرار داشته باشد و دچار خرابی یا حذف شود و قبل از این که ما متوجه آن بشویم یا آن را بازیابی کنیم پایگاهداده Shutdown شود و هنگام Start آن متوجه خطای آن و از دست رفتن یکی از گروههای Online Redo Log بشویم.
بررسی وضعیت پایگاهداده با مانیتور کردن Alert Log.
$ less /oracle/app/diag/rdbms/orcl19c/orcl19c/trace/alert_orcl19c.log
در صورتی که پایگاهداده را Start کردیم و با خطا مواجه شدهایم ابتدا آن را در مد Mount میبریم.

Sql> startup nomount

Sql> alter database mount

سپس مانند سناریو پیشین، گروه را با دستور Clear بازیابی و متناسب با وضعیت Archive گروه از دستور Clear استفاده میکنیم.

Archived

sql> alter database clear logfile group n;

Not Archive

Sql> alter database clear unarchived logfile group n;

و در نهایت پایگاهداده را Open میکنیم.

Sql> alter database open;

زمانی که گروه در وضعیت ACTIVE و پایگاهداده Up میباشد
گروههای Active به دلیل اینکه در زمان Instance Recovery مورد نیاز هستند از اهمیت بیشتر نسبت به گروههای Inactive برخوردارند. به همین دلیل از دست رفتن این گروهها میتواند منجربه از دست رفتن دیتا شود.
در زمانی که خرابی در این گروهها رخ میدهد و پایگاهداده Up میباشد، میتوان با بررسی وضعیت پایگاهداده توسط مانیتور کردن Alert Log متوجه این اتفاق شد.
$ less /oracle/app/diag/rdbms/orcl19c/orcl19c/trace/alert_orcl19c.log
با استفاده از دستور زیر، تمامی تغییرات را برروی دیتافایلها ثبت میکنیم تا گروه را از وضعیت Active خارج میکنیم و دیگر در Instance Recovery مورد استفاده قرار نگیرد.

Sql> ALTER SYSTEM checkpoint;

سپس مانند سناریوی گذشته، گروه را بازیابی میکنیم.

Archived

sql> alter database clear logfile group n;

Not Archive

Sql> alter database clear unarchived logfile group n;

هماهنطور که پیشتر گفته شد میتوان گروه را حذف و مجدد ایجاد کرد.

Sql> alter database drop logfile group n;

درنظر داشته باشید اگر دو گروه وجود دارد ابتدا گروه جدید ایجاد و سپس گروه موردنظر حذف شود.

Sql> alter database add logfile group (‘/directory/file’) SIZE K|M|G;

زمانی که گروه در وضعیت ACTIVE و پایگاهداده Down میباشد
زمانی که یک گروه در وضعیت Active دچار خرابی شده و پایگاهداده از دسترس خارج شده باشد را بررسی میکنیم. درصورتی که Flashback فعال باشد میتوان به آخرین SCN درست برگشت. اما درصورتی که Flashback فعال نباشد باید از طریق بکاپ، پایگاهداده را به یک SCN درست برگرداند. در این سناریو ما با استفاده از RMAN Backup پایگاهداده را به SCN درست برمیگردانیم.
لازم به ذکر است در صورتی که این شرایط رخ دهد و لاگهای آن Archive نشده باشند، درنتیجه منجربه از دست دادن دیتا خواهد شد.
ابتدا پایگاهداده را به حالت Mount استارت میکنیم.

RMAN> startup mount;

سپس SCN درست را با استفاده از فیلد first_change# در کوئری زیر بدست میآوریم.(رکورد مرتبط با گروه اسیب دیده)

Sql> SELECT group#, status, archived, thread#, sequence#, first_change# FROM v$log;

در اینجا SCN بدست آمده 1047253 میباشد.
پایگاهداده را تا SCN بدست آمده بازیابی میکنیم.

RMAN> run{

restore database until scn 1047253;

recover database until scn 1047253;

}

در آخر پایگاهداده را Open میکنیم.

Sql> alter database open resetlogs;

زمانی که گروه در وضعیت CURRENT و پایگاهداده Up میباشد
گروه Current ، گروهی میباشد lgwr درحال نوشتن برروی آن هست و همچنین به دلیل اینکه در زمان Instance Recovery مورد نیاز میباشد از اهمیت بسیار زیادی نسبت سایر گروهها برخوردار است. به همین دلیل از دست رفتن این گروهها قطعا منجربه از دست رفتن دیتا میشود.
در زمانی که خرابی در این گروهها رخ میدهد و پایگاهداده Up میباشد، میتوان با بررسی وضعیت پایگاهداده توسط مانیتور کردن Alert Log متوجه این اتفاق شد.

$ less /oracle/app/diag/rdbms/orcl19c/orcl19c/trace/alert_orcl19c.log

ابتدا عملیات سوییچ را انجام میدهیم تا پایگاهداده برروی گروه دیگری لاگها را بنویسد تا مخاطرات احتمالی کمتر شود.

Sql> alter system switch logfile;

در اینجا گروه به وضعیت Active تغییر میکند. پس از عملیات سوییچ گروه را از وضعیت Active خارج میکنیم.

Sql> ALTER SYSTEM checkpoint;

سپس گروه را بازیابی میکنیم.

Archived

sql> alter database clear logfile group n;

Not Archive

Sql> alter database clear unarchived logfile group n;

یا میتوان به روش حذف و بازسازی گروه عمل کرد.

Sql> alter database drop logfile group n;

Sql> alter database add logfile group (‘/directory/file’) SIZE K|M|G;

زمانی که گروه در وضعیت CURRENT و پایگاهداده Down میباشد

در این سناریو نیز دیتا از دست میرود، این سناریو کاملا مشابه به قسمت 3.4 مستند می باشد و رفتاری مشابه آن دارد که میتوانید برای بررسی و پیادهسازی، به آن رجوع فرمایید. لازم به ذکر است اقدامات دیگری مانند تغییر Controlfile نیز برای Up شدن پایگاهداده وجود دارد اما نمیتواند مانع از دست رفتن دیتا شود که بهتر است با اقدامات پیشگیرانه در سطح سخت افزاری و نرم افزاری از بروز این مخاطرات جلوگیری شود.