记Oracle Flashback 闪回测试(一)

本文记录了在Oracle数据库环境中进行Flashback测试的过程,包括创建测试表、插入和清空数据、修改表结构,以及遇到的无法执行闪回查询的错误。错误源于在数据删除后改变了表的列长度或类型,这为数据库管理和闪回操作提供了重要启示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因工作需要测试Oracle Flashback闪回相关技术,第一次碰到一个比较有意思的错误所有记录下来供自己参考。

闪回查询测试1.0

环境:自己搭了一套RAC环境用来测试闪回:

  1. 确认数据库是否开启归档模式
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

数据库开启闪回功能必须提前开启归档模式,如没开启则需手动开启。

  1. 确认是否开启闪回功能
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

这里会抛出一个错误,无法读取表数据,表结构已被更改

总结:此错误是无意中发现的,一般会发生在闪回查询,或闪回表时,如果删除数据后,对表中某一列的长度或类型进行修改后(增加列不会影响),尝试闪回查询会报错,无法闪回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值