flashback data archive

چند وقت پیش یک نیازمندی برای ما بیش از پیش بوجود اومد و اون هم اینکه بتونیم اطلاعات قبلی یک جدول را در بازه زمانی بیش از 900 ثانیه که پیش فرض undo هست داشته باشیم. خوب طبیعتاً اولین چیزی که به ذهن من اومد افزایش undo retention بود. اما...

 

به همین قشنگی هم که فکر می کردیم نبود. افزایش سایز undo بیشتر از دور ریختن udno segment هایی که دیگه نیازی بهشون نیست رخ میده. منظورم اینه که اوراکل بیشتر تمایل داره که سایز udno رو تا جایی که میشه رشد بده ، بجای اینکه زمان صرف بیرون ریختن undo segmentهایی کنه که دیگه بهش احتیاج نداره.

یه مشکل دیگه که ممکن هست باهاش برخورد کنیم، us contention یا همان undo segment contention هست که با افزایش سایز udno احتمالش افزایش پیدا میکنه. خوب پس چه کنیم؟

یک گزینه باحال داریم به اسم flashback data archive که من از سایت oracle-base پیاده سازیش کردم و بهمون کمک می کنه که داده های قبلی یک جدول رو تا مدت زمان مدنظر خودمون نگه داریم و منبغ flashback اون جدول قرار می گیره. پس بجای اینکه سورس flashback یک جدول بشه undo میشه اینجایی که روی دیسک بصورت مشخص بهش معرفی می کنیم. البته امکانات دیگه ای هم بهمون میده که به قول خودش میتونه جایگزین audit دستی بشه که کاربرها میتونند ایجاد کنند.

بریم و دست به آچار بشیم:

به دیتابیس مدنظر خودمون وصل میشیم:

sys@vahiddb(5)> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED

---------- ------------------------------ ---------- ----------

2 PDB$SEED READ ONLY NO

3 VAHIDPDB READ WRITE NO

sys@vahiddb(5)> alter session set container=VAHIDPDB;

یک TABLESPACE برای همین منظور ایجاد می کنیم.

sys@vahiddb(5)> CREATE TABLESPACE fda_ts;

 

محض احتیاط چون تخمینی از حجمش نداشتم، یه دیتافایل دیگه هم بهش اضافه کردم.

حالا FLASHBACK ARCHIVE رو باید ایجاد کنیم. سه تا پارامتر باید بهش بدیم. یک اسم اون TABLESPACE، میزان QUOTA و میزان زمانی که میخواد نگه داره که میتونه به روز ، ماه یا سال باشه:

sys@vahiddb(5)> CREATE FLASHBACK ARCHIVE DEFAULT fda_7day TABLESPACE fda_ts quota 60g retention 7 day;

 Flashback archive created.

ما برای 7 روز در نظر گرفتیم.

 

حالا به اون کاربری که میخواد از این امکانات استفاده کنه باید دسترسی های زیر رو بدیم:

sys@vahiddb(5)> GRANT FLASHBACK ARCHIVE ON fda_7day to TESTFA;

 Grant succeeded.

Elapsed: 00:00:00.03

sys@vahiddb(5)> GRANT FLASHBACK ARCHIVE ADMINISTER TO TESTFA;

Grant succeeded.

Elapsed: 00:00:00.02

sys@vahiddb(5)> GRANT EXECUTE ON DBMS_FLASHBACK_ARCHIVE TO TESTFA;

Grant succeeded.

 

اگر بخوایم که بحث آدیت هم داشته باشیم، مجوز زیر رو هم باید بدیم که ما ندادیم:

--GRANT CREATE ANY CONTEXT TO TESTFA;

 

ببینیم تا حالا چه کردیم:

 

COLUMN flashback_archive_name FORMAT A22

COLUMN create_time FORMAT A20

COLUMN last_purge_time FORMAT A20

 

SELECT owner_name,

flashback_archive_name,

flashback_archive#,

retention_in_days,

TO_CHAR(create_time, 'DD-MON-YYYY HH24:MI:SS') AS create_time,

TO_CHAR(last_purge_time, 'DD-MON-YYYY HH24:MI:SS') AS last_purge_time,

status

FROM dba_flashback_archive

ORDER BY owner_name, flashback_archive_name;

 

OWNER_NAME FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME LAST_PURGE_TIME STATUS

-------------------- ---------------------- ------------------ ----------------- -------------------- -------------------- -------

SYS FDA_7DAY 1 7 26-APR-2022 13:51:00 26-APR-2022 13:51:00 DEFAULT

 

و این دستور:

 

SET LINESIZE 150

 

COLUMN flashback_archive_name FORMAT A22

COLUMN tablespace_name FORMAT A20

COLUMN quota_in_mb FORMAT A11

 

SELECT flashback_archive_name,

flashback_archive#,

tablespace_name,

quota_in_mb

FROM dba_flashback_archive_ts

ORDER BY flashback_archive_name;

 

FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB

---------------------- ------------------ -------------------- -----------

FDA_7DAY 1 FDA_TS 61440

چون جدولی که میخوایم در حال حاضر موجود هست، باید از دستور ALTER استفاده کنیم.

sys@vahiddb(5)> ALTER TABLE TESTFA.LOG_MAIN_TABLE FLASHBACK ARCHIVE FDA_7DAY;

 

اطلاعات جدولی که اضافه کردیم رو میشه اینجوری ببینیم:

COLUMN owner_name FORMAT A20

COLUMN table_name FORMAT A20

COLUMN flashback_archive_name FORMAT A22

COLUMN archive_table_name FORMAT A20

 

SELECT owner_name,

table_name,

flashback_archive_name,

archive_table_name,

sys@vahiddb(5)> status

FROM dba_flashback_archive_tables

ORDER BY owner_name, table_name;

 

OWNER_NAME TABLE_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS

-------------------- -------------------- ---------------------- -------------------- -------------

TESTFA LOG_MAIN_TABLE FDA_7DAY SYS_FBA_HIST_131131 ENABLED

 

برای لغو کردنش هم میشه دستور زیر رو زد:

 

sys@vahiddb(5)> ALTER TABLE TESTFA.LOG_MAIN_TABLE  NO FLASHBACK ARCHIVE FDA_7DAY;

 

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

منبع:

https://oracle-base.com/articles/12c/flashback-data-archive-fda-enhancements-12cr1