دامیومنت
Setup and Maintenance for Oracle Flashback Database
مقدمه
اوراکل با استفاده از فایلهای redo میتواند تا زمانی که فایلهای redo برای دادههای موردنظر شما دوبارهنویسی نشده باشند بدون داشتن backup دیتاهای حذف شده شما را برگرداند.
SQL> drop user mahdi cascade;
User dropped.
SQL> create user mahdi identified by qwerty512;
User created.
SQL> grant dba, connect to mahdi;
Grant succeeded.
SQL> connect mahdi
Enter password:
Connected.
SQL> password
Changing password for MAHDI
Old password:
New password:
Retype new password:
Password changed
SQL> create table t1(id number, name varchar2(20));
Table created.
SQL> insert into t1 values(1, 'mohammad');
1 row created.
SQL> insert into t1 values(2, 'mahdi');
1 row created.
SQL> insert into t1 values(3, 'mohsen');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t1;
ID NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen
SQL> delete from t1 where id=2;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from t1;
ID NAME
---------- --------------------
1 mohammad
3 mohsen
SQL> SELECT * FROM t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:55', 'YYYY-MM-
DD HH24:MI:SS');
ID NAME
---------- --------------------
1 mohammad
3 mohsen
SQL> SELECT * FROM t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:50', 'YYYY-MM-
DD HH24:MI:SS');
no rows selected
SQL> SELECT * FROM t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:51', 'YYYY-MM-
DD HH24:MI:SS');
ID NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen
نکته: توجه داشته باشید اگر بخواهید محدودیتی برای flashback نداشته باشید فقط در صورتی که هارد پرسرعت و فضای کافی ذخیرهسازی در اختیار دارید میتوانید دیتابیس را در حالت archive قرار دهید. برای قرار دادن دیتابیس در حالت archive میتوانید به صورت زیر عمل کنید:
SQL> connect sys as sysdba
Enter password:
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3240239104 bytes
Fixed Size 2407880 bytes
Variable Size 1879048760 bytes
Database Buffers 1342177280 bytes
Redo Buffers 16605184 bytes
Database mounted.
نکته: در موقع flashback میتوانید از دستوراتی نظیر where نیز استفاده کنید:
SQL> SELECT * FROM mahdi.t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:51', 'YY
YY-MM-DD HH24:MI:SS') WHERE id>0;
ID NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen
ذخیره اطلاعات
برای ذخیره اطلاعات میتوانید به شکل زیر عمل کنید:
SQL> create table t3(id number, name varchar2(20));
Table created.
SQL> INSERT INTO T3 SELECT * FROM mahdi.t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05
-12 16:51', 'YYYY-MM-DD HH24:MI:SS');
3 rows created.
SQL> select * from t3;
ID NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen
SQL> commit
2 ;
Commit complete.
پیداکردن اختلاف بین ۲ جدول
برای اینکار میتوانید از minus به شکل زیر استفاده کنید:
SQL> select * from t3 minus select * from mahdi.t1;
ID NAME
---------- --------------------
2 mahdi
نکته: minus یعنی مجموعه اول را از مجموعه دوم کم کن و خروجی را نمایش بده.
س: اگر ساختار جدول تغییر کرد میتوان با استفاده از flashback اطلاعات را بازیابی کرد؟
ج: خیر، چون فیلدهایی که در اون بازه زمانی در redo موجود بودهاند با ساختار مشخصی از جدول ثبت شدهاند و اگر بخواهیم در یک جدولی که ساختار یکسانی با آنچه ثبت شده است اطلاعات را ذخیره کنیم به مشکل برخواهیم خورد چون اطلاعات دیگر منطبق بر CTL فایلها نیست.
س: وقتی flashback را enable میکنیم اجازه میدیم که flashback از redo فایل archive بگیره؟
ج: بله