首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

闪来数据库技术

2012-07-23 
闪回数据库技术?SQL conn / as sysdba已连接。SQL select dbid,name,log_mode , open_mode from v$datab

闪回数据库技术

?

SQL> conn / as sysdba;
已连接。
SQL> select dbid,name,log_mode , open_mode from v$database;

????? DBID NAME????? LOG_MODE???? OPEN_MODE
---------- --------- ------------ ----------
1384775892 CHARIOT?? NOARCHIVELOG READ WRITE

SQL>

打开闪回开关。

SQL> alter database flashback on;


SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area? 612368384 bytes
Fixed Size????????????????? 1250428 bytes
Variable Size???????????? 184552324 bytes
Database Buffers????????? 419430400 bytes
Redo Buffers??????????????? 7135232 bytes
数据库装载完毕。
SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO

SQL>


下面配置Oracle 10g 闪回数据库的工作步骤以及内容:

?

Oracle数据库10g中使用闪回数据库操作

使用FLASHBACK DATABASE可以恢复数据库到先前的某个时间点或者某个SCN号。
在Oracle10g以前的版本中,要实现数据库恢复到过去某个时间点或者SCN号,只能够
通过数据库的不完全恢复实现。从Oracle 10g开始,可以使用FLASHBACK DATABASE
实现。

使用FLASHBACK DATABASE要比执行数据库系统的不完全恢复要快的多,

但是需要对数据库做以下的配置:
1、数据库必须运行在归档模式下
2、必须启用数据库的闪回功能
3、必须配置初始化参数DB_FLASHBACK_RETENTION_TARGET

闪回操作的语法

FLASHBACK [STANDBY | DATABASE] [数据库名称]
to SCN SCN号 | TIMESTAMP 时间表达式 | restore point 恢复点

?


配置步骤:

第一步:? 将数据库启动到MOUNT状态:

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO

SQL> select dbid,name,open_mode,log_mode from v$database;

????? DBID NAME????? OPEN_MODE? LOG_MODE
---------- --------- ---------- ------------
1384775892 CHARIOT?? MOUNTED??? NOARCHIVELOG

SQL>


第二步:首先将数据库日志运行模式调整为归档模式。


SQL> alter database archivelog;

数据库已更改。

SQL> archive log list;
数据库日志模式??????????? 存档模式
自动存档???????????? 启用
存档终点??????????? USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列???? 6
下一个存档日志序列?? 8
当前日志序列?????????? 8
SQL>


第三步: 修改初始化参数,配置闪回数据库

?

SQL> alter database flashback on;

数据库已更改。

SQL>

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

SQL>

第四步:设置一个初始化参数,与闪回时间设置相关的一个参数

SQL> show parameter db_flashback_retention_target;

NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- -----------------
db_flashback_retention_target??????? integer???? 1440

该初始化参数的意义是自从打开数据库闪回开关以后,能够在某个时间点向前闪回数据库的最大时间间隔。单位为:分钟。

默认值为1440分钟。

如何修改为2880分钟呢?


SQL> show parameter db_flashback_retention_target;

NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target??????? integer???? 1440
SQL> alter system set db_flashback_retention_target=2880;

系统已更改。

SQL> show parameter db_flashback_retention_target;

NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target??????? integer???? 2880
SQL> alter system set db_recovery_file_dest_size=4G;

系统已更改。

SQL> show parameter db_recovery_file_dest_size;

NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest_size?????????? big integer 4G
SQL>

?

?

db_recovery_file_dest??????????????? string????? d:\oracle\product\10.2.0/flash
???????????????????????????????????????????????? _recovery_area
db_recovery_file_dest_size?????????? big integer 2G


请注意由于flash_recovery_area? 区域以后会存在闪回日志,归档日志,默认情况下的数据库备份文件等等众多文件
所以2G的容量很快就会达到,当达到2G的容量是,数据库就会停顿。故障!

?


通过实验模拟几个故障,通过闪回数据库技术处理。

********************************************************************************************************************
实验一:? 删除 drop table scott.emp; 表,然后找回。
********************************************************************************************************************


1、查询SCOTT用户的EMP表,确认其存在。
2、确认系统时间,精确到秒

SQL> alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';

会话已更改。

SQL> select sysdate from dual;

SYSDATE
-------------------
2010-06-08:11:39:51

SQL>

3、删除EMP表

SQL> drop table scott.emp;

表已删除。

SQL> select * from scott.emp;
select * from scott.emp
??????????????????? *
第 1 行出现错误:
ORA-00942: 表或视图不存在


SQL>

如何找回表?

?


这个时候可以采用闪回数据库技术找回表。

闪回的步骤:

第一步:正常关闭数据库,然后将数据库加载到MOUNT状态

shutdown immediate;

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area? 612368384 bytes
Fixed Size????????????????? 1250428 bytes
Variable Size???????????? 192940932 bytes
Database Buffers????????? 411041792 bytes
Redo Buffers??????????????? 7135232 bytes
数据库装载完毕。
SQL>


第二步:查询数据库能够闪回到最前的最大时间点。


SQL> alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';

会话已更改。

SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd:hh24:mi:ss')
? 2? from v$flashback_database_log;

TO_CHAR(OLDEST_FLAS
-------------------
2010-06-08:11:26:26

SQL>

通过记录发现,在2010-06-08:11:26:26到2010-06-08:11:39:51之间,SCOTT用户的EMP表是存在的。

第三步:

执行闪回

flashback database to timestamp? to_date('2010-06-08:11:26:26','yyyy-mm-dd:hh24:mi:ss');


SQL> flashback database to timestamp? to_date('2010-06-08:11:26:26','yyyy-mm-dd:hh24:mi:ss');

闪回完成。

SQL>

第四步:通过RESETLOGS选项打开数据库

SQL> alter database open resetlogs;

数据库已更改。

SQL> set linesize 150;
SQL> select * from scott.emp;

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE?????????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
????? 7369 SMITH????? CLERK?????????? 7902 1980-12-17:00:00:00?????? 9000??????????????????? 20
????? 7499 ALLEN????? SALESMAN??????? 7698 1981-02-20:00:00:00?????? 1600??????? 300???????? 30
????? 7521 WARD?????? SALESMAN??????? 7698 1981-02-22:00:00:00?????? 1250??????? 500???????? 30
????? 7566 JONES????? MANAGER???????? 7839 1981-04-02:00:00:00?????? 9000??????????????????? 20
????? 7654 MARTIN???? SALESMAN??????? 7698 1981-09-28:00:00:00?????? 1250?????? 1400???????? 30
????? 7698 BLAKE????? MANAGER???????? 7839 1981-05-01:00:00:00?????? 2850??????????????????? 30
????? 7782 CLARK????? MANAGER???????? 7839 1981-06-09:00:00:00?????? 2450??????????????????? 10
????? 7788 SCOTT????? ANALYST???????? 7566 1987-04-19:00:00:00?????? 9000??????????????????? 20
????? 7839 KING?????? PRESIDENT??????????? 1981-11-17:00:00:00?????? 5000??????????????????? 10
????? 7844 TURNER???? SALESMAN??????? 7698 1981-09-08:00:00:00?????? 1500????????? 0???????? 30
????? 7876 ADAMS????? CLERK?????????? 7788 1987-05-23:00:00:00?????? 9000??????????????????? 20

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE?????????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
????? 7900 JAMES????? CLERK?????????? 7698 1981-12-03:00:00:00??????? 950??????????????????? 30
????? 7902 FORD?????? ANALYST???????? 7566 1981-12-03:00:00:00?????? 9000??????????????????? 20
????? 7934 MILLER???? CLERK?????????? 7782 1982-01-23:00:00:00?????? 1300??????????????????? 10

已选择14行。

SQL>

?

误删除的数据库表已经找回。


********************************************************************************************************************
实验二:? 截断表,然后找回。 truncate table ***?
********************************************************************************************************************

SQL> select sysdate from dual;

SYSDATE
-------------------
2010-06-08:11:52:29

SQL>

SQL> select sysdate from dual;

SYSDATE
-------------------
2010-06-08:11:52:29

SQL> truncate table scott.emp;

表被截断。

SQL> select sysdate from dual;

SYSDATE
-------------------
2010-06-08:11:52:55

SQL>

在 2010-06-08:11:52:29与2010-06-08:11:52:55 之间通过truncate命令截断了表中的数据。

现在需要找回数据。

数据库数据库的步骤:

?

第一步: 正常关闭数据库,然后将数据库加载到MOUNT状态


SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area? 612368384 bytes
Fixed Size????????????????? 1250428 bytes
Variable Size???????????? 197135236 bytes
Database Buffers????????? 406847488 bytes
Redo Buffers??????????????? 7135232 bytes
数据库装载完毕。
SQL>


第二步:? 可以选在执行闪回数据库操作的方式

1、执行基于时间点的闪回
2、执行基于SCN的闪回

select oldest_flashback_scn from v$flashback_database_log;

SQL> select oldest_flashback_scn from v$flashback_database_log;

OLDEST_FLASHBACK_SCN
--------------------
????????????? 733900


决定执行基于时间点的闪回


flashback database to timestamp? to_date('2010-06-08:11:52:29','yyyy-mm-dd:hh24:mi:ss');


SQL> flashback database to timestamp? to_date('2010-06-08:11:52:29','yyyy-mm-dd:hh24:mi:ss');

闪回完成。

SQL> alter database open resetlogs;

数据库已更改。

SQL> select * from scott.emp;

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????????? 9000??????????????????? 20
????? 7499 ALLEN????? SALESMAN??????? 7698 20-2月 -81?????????? 1600??????? 300???????? 30
????? 7521 WARD?????? SALESMAN??????? 7698 22-2月 -81?????????? 1250??????? 500???????? 30
????? 7566 JONES????? MANAGER???????? 7839 02-4月 -81?????????? 9000??????????????????? 20
????? 7654 MARTIN???? SALESMAN??????? 7698 28-9月 -81?????????? 1250?????? 1400???????? 30
????? 7698 BLAKE????? MANAGER???????? 7839 01-5月 -81?????????? 2850??????????????????? 30
????? 7782 CLARK????? MANAGER???????? 7839 09-6月 -81?????????? 2450??????????????????? 10
????? 7788 SCOTT????? ANALYST???????? 7566 19-4月 -87?????????? 9000??????????????????? 20
????? 7839 KING?????? PRESIDENT??????????? 17-11月-81?????????? 5000??????????????????? 10
????? 7844 TURNER???? SALESMAN??????? 7698 08-9月 -81?????????? 1500????????? 0???????? 30
????? 7876 ADAMS????? CLERK?????????? 7788 23-5月 -87?????????? 9000??????????????????? 20

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81??????????? 950??????????????????? 30
????? 7902 FORD?????? ANALYST???????? 7566 03-12月-81?????????? 9000??????????????????? 20
????? 7934 MILLER???? CLERK?????????? 7782 23-1月 -82?????????? 1300??????????????????? 10

已选择14行。

SQL>


*******************************************************************************************************
对于使用drop table table_name误删除了表,更为快捷的处理方法
********************************************************************************************************

普通用户删除了表


SQL> conn scott/tiger;
已连接。
SQL> select * from emp;

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????????? 9000??????????????????? 20
????? 7499 ALLEN????? SALESMAN??????? 7698 20-2月 -81?????????? 1600??????? 300???????? 30
????? 7521 WARD?????? SALESMAN??????? 7698 22-2月 -81?????????? 1250??????? 500???????? 30
????? 7566 JONES????? MANAGER???????? 7839 02-4月 -81?????????? 9000??????????????????? 20
????? 7654 MARTIN???? SALESMAN??????? 7698 28-9月 -81?????????? 1250?????? 1400???????? 30
????? 7698 BLAKE????? MANAGER???????? 7839 01-5月 -81?????????? 2850??????????????????? 30
????? 7782 CLARK????? MANAGER???????? 7839 09-6月 -81?????????? 2450??????????????????? 10
????? 7788 SCOTT????? ANALYST???????? 7566 19-4月 -87?????????? 9000??????????????????? 20
????? 7839 KING?????? PRESIDENT??????????? 17-11月-81?????????? 5000??????????????????? 10
????? 7844 TURNER???? SALESMAN??????? 7698 08-9月 -81?????????? 1500????????? 0???????? 30
????? 7876 ADAMS????? CLERK?????????? 7788 23-5月 -87?????????? 9000??????????????????? 20

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81??????????? 950??????????????????? 30
????? 7902 FORD?????? ANALYST???????? 7566 03-12月-81?????????? 9000??????????????????? 20
????? 7934 MILLER???? CLERK?????????? 7782 23-1月 -82?????????? 1300??????????????????? 10

已选择14行。

SQL> drop table emp;

表已删除。

SQL> select * from emp;
select * from emp
????????????? *
第 1 行出现错误:
ORA-00942: 表或视图不存在


SQL>


如何找回?

采用闪回删除表技术,几秒钟之内就可以解决问题。

SQL> flashback table emp to before drop;

闪回完成。

SQL> select * from emp;

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????????? 9000??????????????????? 20
????? 7499 ALLEN????? SALESMAN??????? 7698 20-2月 -81?????????? 1600??????? 300???????? 30
????? 7521 WARD?????? SALESMAN??????? 7698 22-2月 -81?????????? 1250??????? 500???????? 30
????? 7566 JONES????? MANAGER???????? 7839 02-4月 -81?????????? 9000??????????????????? 20
????? 7654 MARTIN???? SALESMAN??????? 7698 28-9月 -81?????????? 1250?????? 1400???????? 30
????? 7698 BLAKE????? MANAGER???????? 7839 01-5月 -81?????????? 2850??????????????????? 30
????? 7782 CLARK????? MANAGER???????? 7839 09-6月 -81?????????? 2450??????????????????? 10
????? 7788 SCOTT????? ANALYST???????? 7566 19-4月 -87?????????? 9000??????????????????? 20
????? 7839 KING?????? PRESIDENT??????????? 17-11月-81?????????? 5000??????????????????? 10
????? 7844 TURNER???? SALESMAN??????? 7698 08-9月 -81?????????? 1500????????? 0???????? 30
????? 7876 ADAMS????? CLERK?????????? 7788 23-5月 -87?????????? 9000??????????????????? 20

???? EMPNO ENAME????? JOB????????????? MGR HIREDATE????????????? SAL?????? COMM???? DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81??????????? 950??????????????????? 30
????? 7902 FORD?????? ANALYST???????? 7566 03-12月-81?????????? 9000??????????????????? 20
????? 7934 MILLER???? CLERK?????????? 7782 23-1月 -82?????????? 1300??????????????????? 10

已选择14行。

SQL>


回收站的问题。


SQL> drop table emp;

表已删除。

SQL> show recyclebin;
ORIGINAL NAME??? RECYCLEBIN NAME??????????????? OBJECT TYPE? DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP????????????? BIN$AZ1Y5c5AROmmf37vcByCXg==$0 TABLE??????? 2010-06-08:12:02:30
SQL> flashback table emp to before drop;

闪回完成。

SQL> show recyclebin;
SQL>

在Oracle10g数据库中,如果普通用户采用drop table table_name删除了某一张数据库表,则该表被放到了一个叫做
回收站的容器中。数据没有变换,仅仅改变了表名称,用户不能查询了。


只需要采用flashback table *** to before drop 即可找回。


彻底删除表,如何操作

drop table table_name purge;


采用闪回数据库技术即可找回。

热点排行