因工作需要测试Oracle Flashback闪回相关技术,第一次碰到一个比较有意思的错误所有记录下来供自己参考。
闪回查询测试1.0
环境:自己搭了一套RAC环境用来测试闪回:
- 确认数据库是否开启归档模式
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /oradata/archive
Oldest online log sequence 26
Next log sequence to archive 27
Current log sequence 27
数据库开启闪回功能必须提前开启归档模式,如没开启则需手动开启。
- 确认是否开启闪回功能
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
本文不再赘述如何开启闪回,如果输出为YES则表示闪回已开启,下一步我们就可以开启测试Flashback Query!
创建测试表
SQL> create table mytable1(
2 id number(10),
3 name number(10)
4 );
插入测试数据
SQL> insert into mytable1 values(1,2);
1 row created.
重复执行这条命令
然后查看表数据
SQL> select * from mytable1;
ID NAME
---------- ----------
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
11 rows selected.
查看表结构
SQL> desc mytable1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(10)
NAME NUMBER(10)
清空表数据
SQL> truncate table mytable1;
Table truncated.
这里其实有两种方法清空表数据:
SQL>truncate table [表名];
SQL>delete table [表名];
两种方法清空表数据的区别
delete:会产生rollback,如果删除大数据量的表速度会很慢,同时会占用很多的rollback segments。
truncate: 是DDL操作,不产生rollback,速度快。
修改表结构
alter table mytable1 modify (name varchar(10));
再查看表结构
SQL> desc mytable1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(10)
NAME VARCHAR2(10)
插入测试数据
insert into mytable1 values(1,'Tom');
insert into mytable1 values(2,'Jack');
insert into mytable1 values(3,'Roes');
insert into mytable1 values(4,'Make');
insert into mytable1 values(5,'Lilei');
insert into mytable1 values(6,'Mike');
insert into mytable1 values(7,'Apple');
SQL> select * from mytable1;
ID NAME
---------- ----------
1 Tom
2 Jack
3 Roes
4 Make
5 Lilei
6 Mike
7 Apple
7 rows selected.
执行闪回查询
SQL> select * from tom.mytable1 as of timestamp (systimestamp - interval '5' minute);
select * from tom.mytable1 as of timestamp (systimestamp - interval '5' minute)
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
这里会抛出一个错误,无法读取表数据,表结构已被更改
总结:此错误是无意中发现的,一般会发生在闪回查询,或闪回表时,如果删除数据后,对表中某一列的长度或类型进行修改后(增加列不会影响),尝试闪回查询会报错,无法闪回。