1.Truncate表
oracle 10g 恢复
Fy_Recover_Data是利用Oracle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包,由纯PLSQL编写
linux下使用终端,如下:
1.windows下输入以下网址:
http://www.hellodba.com/Download/FY_Recover_Data.zip
2.解压下载下来的FY_Recover_Data.pck
[oracle@rac1 ~]$ unzip FY_Recover_Data.zip?
解压后得到一个文件FY_Recover_Data.pck
3.使用sys用户执行解压后的脚本(我这里解压后的文件在/home/oracle/)
SQL> @/home/oracle/FY_Recover_Data.pck
这个脚本实际是在sys用户下创建了一个名为FY_Recover_Data的package
4.执行 exec fy_recover_data.recover_truncated_table('SCOTT','T'); 注:执行上的SQL产生2个表空间FY_REC_DATA、FY_RST_DATA 5.使用sys用户把恢复的数据从scott.t$$中插回scott.t表 注:scott.t$$中是scott.t表truncate之前的数据 SQL> insert into scott.t select * from scott.t$$; 13 rows created. SQL> commit; Commit complete. 可以看到被truncate的数据已经恢复。
6.使用sys用户删除恢复时产生的2个表空间及数据文件
SQL> drop tablespace fy_rec_data including contents and datafiles;
Tablespace dropped.
SQL> drop tablespace fy_rst_data including contents and datafiles;
Tablespace dropped.
2.drop表
1.从oracle10g开始删除数据库表的时候并不是真正删除,而是放到了recyclebin中,这个过程类似 windows里面删除的文件会被临时放到回收站中。
2.删除的表系统会自动给他重命名就是你看到的 【BIN$】开头的名字
通过 show recyclebin 命令可以查看被删掉的表的详细信息,或者查询
select * from recyclebin;
3.收回表的命令
flashback table 原表名 to before drop;
4.情况回收站的命令:
purge recyclebin;
5.如果不想删除的表经过回收站
drop table 表名 purge;
或者停用数据库的回收战功能
10.1版本中,修改隐藏参数 _recyclebin
alter system set “_recyclebin” = false;
10.2版本中
alter system set recyclebin = off;
6.清空默认生成的表名,可以通过以下命令
drop table ‘BIN$qLechQyAZbzgVAAjfT4Z9Q==$0’ purge
闪回:后进先出
7.恢复同一个 schema 下准备闪回的表已有同名的对象存在,闪回 drop 需要重命名.
SQL> flashback table t1 to before drop rename to test_old;
案例
如果一个表上面有索引和约束,drop 后再闪回表,索引和约束还在吗?
create table t (id int,name char(10));
alter table t add constraint pk_t primary key(id);
insert into t values (1,‘sohu’);
insert into t values (2,‘sina’);
commit;
SQL> select * from t;
看一眼约束和索引
SQL> select * from user_indexes;
SQL> select * from user_constraints;
再看约束和索引
SQL> select * from user_indexes; 索引回来了,有效(考点),但乱码
SQL> select * from user_constraints; 约束也在,有效(考点),但乱码
分别重命名索引和约束
SQL> alter index "BIN$yF3hbvIbioTgQAB/AQAJlg==$0" rename to pk_t; SQL> alter table t rename constraint "BIN$yF3hbvIaioTgQAB/AQAJlg==$0" to pk_t;
.闪回查询 (DML 误操作)
as of timestamp to_timestamp(‘2020-07-17 09:30:00’, ‘yyyy-mm-dd hh24:mi:ss’)
4.闪回存储过程、包(sys用户)
1.找回ID SELECT obj# FROM obj$ AS OF TIMESTAMP TO_TIMESTAMP('2020-07-24 14:30:00', 'YYYY-MM-DD HH24:MI:SS') WHERE NAME = 'PKG_COG' 2.通过ID反查 SELECT source FROM source$ AS OF TIMESTAMP TO_TIMESTAMP('2020-07-24 14:30:00', 'YYYY-MM-DD HH24:MI:SS') where obj# = 138324;
3.脚本输出
–输出脚本命令
set echo off;
set feedback off;
set verify off;
set term off;
set trimspool on;
set linesize 3000;
–set pagesize 999;
set newpage none;
set heading off;
spool /oracle/scr/wpp.sql; --输出指定目录的文件
@/home/oracle/scr/test.sql; --执行SQL脚本(sql语句查询)
SQL> @/home/oracle/scr/wdd.sql
5.闪回表 (undo)
1.闪回表通常是把表的状态回退到以前的某个时刻或者 SCN 上。(其实向前向后都能闪),自动恢复相关的属性,包括索引、触发器等。前提是对表启用行移动。
语法:flashback table <table_name> to timestamp | scn
原理:利用的是Undo表空间的undo数据,闪回表到某个时间点或某个SCN,适用于Delete
SQL>delete student;
SQL>commit;
SQL>alter table student enable row movement;
SQL>flashback table student to scn XXXXX
闪回查询确认过去的这个时间点是不是我们想要的数据:
select * from fb_1 as of scn 973099;
执行闪回,可以执行多次闪回操作:
flashback table fb_1 to scn 973099;
或
SYS@ORCL> flashback table scott.t to timestamp to_timestamp(‘2020-08-19 01:20:00’,‘yyyy-mm-dd hh24:mi:ss’);
2.查询系统当前SCN两条命令
SQL> select current_scn from v$database;