چند وقت پیش یک نیازمندی برای ما بیش از پیش بوجود اومد و اون هم اینکه بتونیم اطلاعات قبلی یک جدول را در بازه زمانی بیش از 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