UNDO自动管理和手工管理、闪回操作

undo tablespace之下 --》使用rollback segment保存数据修改前的老镜像

rollback segment的管理方法:

SQL> 
SQL> show parameter undo_management
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
SQL> show parameter undo_tablespace
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1
SQL> 
SQL> 
SQL> 
SQL> select name from v$datafile;
 
NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf
 
11 rows selected.
 
SQL> show con_name
 
CON_NAME
------------------------------
CDB$ROOT
SQL> 
SQL> alter session set container=PDB1;
 
Session altered.
 
SQL> create undo tablespace undotbs2 datafile '/u02/oradata/CDB1/pdb1/undotbs02.dbf' size 10m;
 
Tablespace created.
 
SQL> 
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
 
SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_3588498444$           UNDOTBS1                       ONLINE
_SYSSMU2_2971032042$           UNDOTBS1                       ONLINE
_SYSSMU3_3657342154$           UNDOTBS1                       ONLINE
_SYSSMU4_811969446$            UNDOTBS1                       ONLINE
_SYSSMU5_3018429039$           UNDOTBS1                       ONLINE
_SYSSMU6_442110264$            UNDOTBS1                       ONLINE
_SYSSMU7_2728255665$           UNDOTBS1                       ONLINE
_SYSSMU8_801938064$            UNDOTBS1                       ONLINE
_SYSSMU9_647420285$            UNDOTBS1                       ONLINE
_SYSSMU10_2262159254$          UNDOTBS1                       ONLINE
 
SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$          UNDOTBS2                       OFFLINE
_SYSSMU12_3550765581$          UNDOTBS2                       OFFLINE
_SYSSMU13_2003268147$          UNDOTBS2                       OFFLINE
_SYSSMU14_200385032$           UNDOTBS2                       OFFLINE
_SYSSMU15_2315478656$          UNDOTBS2                       OFFLINE
_SYSSMU16_3694721358$          UNDOTBS2                       OFFLINE
_SYSSMU17_302315325$           UNDOTBS2                       OFFLINE
_SYSSMU18_2589589835$          UNDOTBS2                       OFFLINE
_SYSSMU19_2290367767$          UNDOTBS2                       OFFLINE
_SYSSMU20_459963109$           UNDOTBS2                       OFFLINE
 
21 rows selected.
 
SQL> 
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf

12 rows selected.

SQL> create undo tablespace undotbs2 datafile '/u02/oradata/CDB1/undotbs02.dbf' size 10m;

Tablespace created.

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf

13 rows selected.

SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_1261223759$           UNDOTBS1                       ONLINE
_SYSSMU2_27624015$             UNDOTBS1                       ONLINE
_SYSSMU3_2421748942$           UNDOTBS1                       ONLINE
_SYSSMU4_625702278$            UNDOTBS1                       ONLINE
_SYSSMU5_2101348960$           UNDOTBS1                       ONLINE
_SYSSMU6_813816332$            UNDOTBS1                       ONLINE
_SYSSMU7_2329891355$           UNDOTBS1                       ONLINE
_SYSSMU8_399776867$            UNDOTBS1                       ONLINE
_SYSSMU9_1692468413$           UNDOTBS1                       ONLINE
_SYSSMU10_930580995$           UNDOTBS1                       ONLINE

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$           UNDOTBS2                       OFFLINE
_SYSSMU12_3852438105$          UNDOTBS2                       OFFLINE
_SYSSMU13_4053449264$          UNDOTBS2                       OFFLINE
_SYSSMU14_3568283922$          UNDOTBS2                       OFFLINE
_SYSSMU15_4273800205$          UNDOTBS2                       OFFLINE
_SYSSMU16_3358818169$          UNDOTBS2                       OFFLINE
_SYSSMU17_1656102559$          UNDOTBS2                       OFFLINE
_SYSSMU18_3046128593$          UNDOTBS2                       OFFLINE
_SYSSMU19_2820437463$          UNDOTBS2                       OFFLINE
_SYSSMU20_1569246834$          UNDOTBS2                       OFFLINE

21 rows selected.

SQL> 

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf

12 rows selected.

SQL> create undo tablespace undotbs2 datafile '/u02/oradata/CDB1/undotbs02.dbf' size 10m;

Tablespace created.

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/pdbseed/system01.dbf
/u02/oradata/CDB1/pdbseed/sysaux01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdbseed/undotbs01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf
/u02/oradata/CDB1/pdb1/users01.dbf

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/pdb1/undotbs02.dbf
/u02/oradata/CDB1/undotbs02.dbf

13 rows selected.

SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_1261223759$           UNDOTBS1                       ONLINE
_SYSSMU2_27624015$             UNDOTBS1                       ONLINE
_SYSSMU3_2421748942$           UNDOTBS1                       ONLINE
_SYSSMU4_625702278$            UNDOTBS1                       ONLINE
_SYSSMU5_2101348960$           UNDOTBS1                       ONLINE
_SYSSMU6_813816332$            UNDOTBS1                       ONLINE
_SYSSMU7_2329891355$           UNDOTBS1                       ONLINE
_SYSSMU8_399776867$            UNDOTBS1                       ONLINE
_SYSSMU9_1692468413$           UNDOTBS1                       ONLINE
_SYSSMU10_930580995$           UNDOTBS1                       ONLINE

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$           UNDOTBS2                       OFFLINE
_SYSSMU12_3852438105$          UNDOTBS2                       OFFLINE
_SYSSMU13_4053449264$          UNDOTBS2                       OFFLINE
_SYSSMU14_3568283922$          UNDOTBS2                       OFFLINE
_SYSSMU15_4273800205$          UNDOTBS2                       OFFLINE
_SYSSMU16_3358818169$          UNDOTBS2                       OFFLINE
_SYSSMU17_1656102559$          UNDOTBS2                       OFFLINE
_SYSSMU18_3046128593$          UNDOTBS2                       OFFLINE
_SYSSMU19_2820437463$          UNDOTBS2                       OFFLINE
_SYSSMU20_1569246834$          UNDOTBS2                       OFFLINE

21 rows selected.

SQL> show user
USER is "SYS"
SQL> col username for a10
SQL> select s.USERNAME,t.XIDUSN,t.USED_UBLK from v$session s, v$transaction t where t.SES_ADDR=s.SADDR;

USERNAME       XIDUSN  USED_UBLK
---------- ---------- ----------
SCOTT               8         20
SCOTT               2          1

SQL> 
SQL> select name from v$rollname where usn=8;

NAME
------------------------------
_SYSSMU8_399776867$

SQL> select name from v$rollname where usn=2;

NAME
------------------------------
_SYSSMU2_27624015$

SQL> 

UNDO手工管理

SQL> 
SQL> show parameter undo_management

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
SQL> show parameter undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1
SQL> 
SQL> alter system set undo_management=manual scope=spfile
  2  ;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 
SQL> startup
ORACLE instance started.

Total System Global Area  629145392 bytes
Fixed Size                  9137968 bytes
Variable Size             184549376 bytes
Database Buffers          427819008 bytes
Redo Buffers                7639040 bytes
Database mounted.
Database opened.
SQL> show parameter undo_management

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      MANUAL
SQL> 

SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_1261223759$           UNDOTBS1                       OFFLINE
_SYSSMU2_27624015$             UNDOTBS1                       OFFLINE
_SYSSMU3_2421748942$           UNDOTBS1                       OFFLINE
_SYSSMU4_625702278$            UNDOTBS1                       OFFLINE
_SYSSMU5_2101348960$           UNDOTBS1                       OFFLINE
_SYSSMU6_813816332$            UNDOTBS1                       OFFLINE
_SYSSMU7_2329891355$           UNDOTBS1                       OFFLINE
_SYSSMU8_399776867$            UNDOTBS1                       OFFLINE
_SYSSMU9_1692468413$           UNDOTBS1                       OFFLINE
_SYSSMU10_930580995$           UNDOTBS1                       OFFLINE

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_819496071$           UNDOTBS2                       OFFLINE
_SYSSMU12_3852438105$          UNDOTBS2                       OFFLINE
_SYSSMU13_4053449264$          UNDOTBS2                       OFFLINE
_SYSSMU14_3568283922$          UNDOTBS2                       OFFLINE
_SYSSMU15_4273800205$          UNDOTBS2                       OFFLINE
_SYSSMU16_3358818169$          UNDOTBS2                       OFFLINE
_SYSSMU17_1656102559$          UNDOTBS2                       OFFLINE
_SYSSMU18_3046128593$          UNDOTBS2                       OFFLINE
_SYSSMU19_2820437463$          UNDOTBS2                       OFFLINE
_SYSSMU20_1569246834$          UNDOTBS2                       OFFLINE

21 rows selected.

SQL> 

当切换到手工管理UNDO表空间执行update语句时,遇到如下错误:

[oracle@oracle-db-19c ~]$ 
[oracle@oracle-db-19c ~]$ sqlplus scott/tiger@PDB1

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 11:04:26 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Wed Nov 23 2022 10:46:24 +08:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> show user
USER is "SCOTT"
SQL> 
SQL> set pagesize 200
SQL> set linesize 200
SQL> 
SQL> update e01 set sal=sal+1;
update e01 set sal=sal+1
       *
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS'


SQL> 

将 表e01移动到系统表空间后,可以进行表更新。

SQL> 
SQL> alter table e01 move tablespace system;

Table altered.

SQL> 
SQL> update e01 set sal=sal+1;

14 rows updated.

SQL> roll
Rollback complete.
SQL> 
SQL>

在scott用户下尝试做建表实验:

SQL> 
SQL> 
SQL> select * from tab
  2  ;

TNAME                                                                                                                            TABTYPE        CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02                                                                                                                              TABLE
T01                                                                                                                              TABLE
T03                                                                                                                              TABLE
DEPT                                                                                                                             TABLE
EMP                                                                                                                              TABLE
BONUS                                                                                                                            TABLE
SALGRADE                                                                                                                         TABLE
DETAIL_DEPT                                                                                                                      TABLE
VU10                                                                                                                             VIEW
VUTEST                                                                                                                           VIEW
E01                                                                                                                              TABLE
TEMP                                                                                                                             TABLE
TEMP02                                                                                                                           TABLE
OB1                                                                                                                              TABLE

14 rows selected.

SQL> 
SQL> 
SQL> 
SQL> create table e02 as select * from emp;
create table e02 as select * from emp
                                  *
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS'


SQL> desc e02;
ERROR:
ORA-04043: object e02 does not exist


SQL> create table e02 as select * from emp where 1=0;

Table created.

SQL> desc e02;
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 EMPNO                                                                                                                      NUMBER(4)
 ENAME                                                                                                                      VARCHAR2(10)
 JOB                                                                                                                        VARCHAR2(9)
 MGR                                                                                                                        NUMBER(4)
 HIREDATE                                                                                                                   DATE
 SAL                                                                                                                        NUMBER(7,2)
 COMM                                                                                                                       NUMBER(7,2)
 DEPTNO                                                                                                                     NUMBER(2)

SQL> 

 结论:创建空表是可以建立的,但带数据建表是不可以的。建表能成功的原因是deferred_segment_creation处于打开状态。(延迟段创建)

SQL> show parameter segment

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE
rollback_segments                    string
transactions_per_rollback_segment    integer     5
SQL>

我们尝试将这个延迟段创建关闭,看看SCOTT用户是否可以继续创建表呢?如下所示:

  • 延迟段创建关闭
[oracle@oracle-db-19c ~]$ sqlplus / as sysdba     

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 23 15:55:34 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> alter session set container=PDB1;

Session altered.

SQL> show con_name;

CON_NAME
------------------------------
PDB1
SQL> show parameter segment

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE
rollback_segments                    string
transactions_per_rollback_segment    integer     5
SQL> alter system set deferred_segment_creation=FALSE;

System altered.

SQL> show parameter segment

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     FALSE
rollback_segments                    string
transactions_per_rollback_segment    integer     5
SQL>

结论是可以单纯建表不带数据,但无法带数建表。

SQL> create table e02 as select * from emp;
create table e02 as select * from emp
                                  *
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS'


SQL> create table e03 as select * from emp where 1=0;

Table created.

SQL> select * from tab;

TNAME                                                                                                                            TABTYPE        CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
T02                                                                                                                              TABLE
T01                                                                                                                              TABLE
T03                                                                                                                              TABLE
DEPT                                                                                                                             TABLE
EMP                                                                                                                              TABLE
BONUS                                                                                                                            TABLE
SALGRADE                                                                                                                         TABLE
DETAIL_DEPT                                                                                                                      TABLE
VU10                                                                                                                             VIEW
VUTEST                                                                                                                           VIEW
E01                                                                                                                              TABLE
TEMP                                                                                                                             TABLE
TEMP02                                                                                                                           TABLE
E03                                                                                                                              TABLE
OB1                                                                                                                              TABLE

15 rows selected.

SQL>

 回滚段的手工管理:

create rollback segment rbs1 tablespace UNDOTBS1;
create rollback segment rbs2 tablespace UNDOTBS1;
create rollback segment rbs3 tablespace UNDOTBS1;

alter system set rollback_segments='RBS1',‘RBS2’, 'RBS3' scope=spfile;

SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_3588498444$           UNDOTBS1                       OFFLINE
_SYSSMU2_2971032042$           UNDOTBS1                       OFFLINE
_SYSSMU3_3657342154$           UNDOTBS1                       OFFLINE
_SYSSMU4_811969446$            UNDOTBS1                       OFFLINE
_SYSSMU5_3018429039$           UNDOTBS1                       OFFLINE
_SYSSMU6_442110264$            UNDOTBS1                       OFFLINE
_SYSSMU7_2728255665$           UNDOTBS1                       OFFLINE
_SYSSMU8_801938064$            UNDOTBS1                       OFFLINE
_SYSSMU9_647420285$            UNDOTBS1                       OFFLINE
_SYSSMU10_2262159254$          UNDOTBS1                       OFFLINE

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
_SYSSMU11_2950309372$          UNDOTBS2                       OFFLINE
_SYSSMU12_3550765581$          UNDOTBS2                       OFFLINE
_SYSSMU13_2003268147$          UNDOTBS2                       OFFLINE
_SYSSMU14_200385032$           UNDOTBS2                       OFFLINE
_SYSSMU15_2315478656$          UNDOTBS2                       OFFLINE
_SYSSMU16_3694721358$          UNDOTBS2                       OFFLINE
_SYSSMU17_302315325$           UNDOTBS2                       OFFLINE
_SYSSMU18_2589589835$          UNDOTBS2                       OFFLINE
_SYSSMU19_2290367767$          UNDOTBS2                       OFFLINE
_SYSSMU20_459963109$           UNDOTBS2                       OFFLINE

21 rows selected.

SQL> create rollback segment rbs1 tablespace UNDOTBS1;

Rollback segment created.

SQL> 
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_3588498444$           UNDOTBS1                       OFFLINE
_SYSSMU2_2971032042$           UNDOTBS1                       OFFLINE
_SYSSMU3_3657342154$           UNDOTBS1                       OFFLINE
_SYSSMU4_811969446$            UNDOTBS1                       OFFLINE
_SYSSMU5_3018429039$           UNDOTBS1                       OFFLINE
_SYSSMU6_442110264$            UNDOTBS1                       OFFLINE
_SYSSMU7_2728255665$           UNDOTBS1                       OFFLINE
_SYSSMU8_801938064$            UNDOTBS1                       OFFLINE
_SYSSMU9_647420285$            UNDOTBS1                       OFFLINE
_SYSSMU10_2262159254$          UNDOTBS1                       OFFLINE

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
RBS1                           UNDOTBS1                       OFFLINE
_SYSSMU11_2950309372$          UNDOTBS2                       OFFLINE
_SYSSMU12_3550765581$          UNDOTBS2                       OFFLINE
_SYSSMU13_2003268147$          UNDOTBS2                       OFFLINE
_SYSSMU14_200385032$           UNDOTBS2                       OFFLINE
_SYSSMU15_2315478656$          UNDOTBS2                       OFFLINE
_SYSSMU16_3694721358$          UNDOTBS2                       OFFLINE
_SYSSMU17_302315325$           UNDOTBS2                       OFFLINE
_SYSSMU18_2589589835$          UNDOTBS2                       OFFLINE
_SYSSMU19_2290367767$          UNDOTBS2                       OFFLINE
_SYSSMU20_459963109$           UNDOTBS2                       OFFLINE

22 rows selected.

SQL>

SQL> show parameter rollback

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback         string      LOW
rollback_segments                    string
transactions_per_rollback_segment    integer     5
SQL> 
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_3588498444$           UNDOTBS1                       OFFLINE
_SYSSMU2_2971032042$           UNDOTBS1                       OFFLINE
_SYSSMU3_3657342154$           UNDOTBS1                       OFFLINE
_SYSSMU4_811969446$            UNDOTBS1                       OFFLINE
_SYSSMU5_3018429039$           UNDOTBS1                       OFFLINE
_SYSSMU6_442110264$            UNDOTBS1                       OFFLINE
_SYSSMU7_2728255665$           UNDOTBS1                       OFFLINE
_SYSSMU8_801938064$            UNDOTBS1                       OFFLINE
_SYSSMU9_647420285$            UNDOTBS1                       OFFLINE
_SYSSMU10_2262159254$          UNDOTBS1                       OFFLINE
RBS1                           UNDOTBS1                       OFFLINE
_SYSSMU11_2950309372$          UNDOTBS2                       OFFLINE
_SYSSMU12_3550765581$          UNDOTBS2                       OFFLINE
_SYSSMU13_2003268147$          UNDOTBS2                       OFFLINE
_SYSSMU14_200385032$           UNDOTBS2                       OFFLINE
_SYSSMU15_2315478656$          UNDOTBS2                       OFFLINE
_SYSSMU16_3694721358$          UNDOTBS2                       OFFLINE
_SYSSMU17_302315325$           UNDOTBS2                       OFFLINE
_SYSSMU18_2589589835$          UNDOTBS2                       OFFLINE
_SYSSMU19_2290367767$          UNDOTBS2                       OFFLINE
_SYSSMU20_459963109$           UNDOTBS2                       OFFLINE

22 rows selected.

SQL> 
SQL> 
SQL> alter system set rollback_segments='RBS1' scope=spfile;

System altered.

SQL> startup force
Pluggable Database opened.
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU1_3588498444$           UNDOTBS1                       OFFLINE
_SYSSMU2_2971032042$           UNDOTBS1                       OFFLINE
_SYSSMU3_3657342154$           UNDOTBS1                       OFFLINE
_SYSSMU4_811969446$            UNDOTBS1                       OFFLINE
_SYSSMU5_3018429039$           UNDOTBS1                       OFFLINE
_SYSSMU6_442110264$            UNDOTBS1                       OFFLINE
_SYSSMU7_2728255665$           UNDOTBS1                       OFFLINE
_SYSSMU8_801938064$            UNDOTBS1                       OFFLINE
_SYSSMU9_647420285$            UNDOTBS1                       OFFLINE
_SYSSMU10_2262159254$          UNDOTBS1                       OFFLINE
RBS1                           UNDOTBS1                       ONLINE
_SYSSMU11_2950309372$          UNDOTBS2                       OFFLINE
_SYSSMU12_3550765581$          UNDOTBS2                       OFFLINE
_SYSSMU13_2003268147$          UNDOTBS2                       OFFLINE
_SYSSMU14_200385032$           UNDOTBS2                       OFFLINE
_SYSSMU15_2315478656$          UNDOTBS2                       OFFLINE
_SYSSMU16_3694721358$          UNDOTBS2                       OFFLINE
_SYSSMU17_302315325$           UNDOTBS2                       OFFLINE
_SYSSMU18_2589589835$          UNDOTBS2                       OFFLINE
_SYSSMU19_2290367767$          UNDOTBS2                       OFFLINE
_SYSSMU20_459963109$           UNDOTBS2                       OFFLINE

22 rows selected.

SQL> 

 提供对DML操作的闪回处理

闪回查询:

SQL> select * from e01;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 02-APR-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL> update e01 set sal = 1;

14 rows updated.

SQL> commit;

Commit complete.

SQL> rollback;

Rollback complete.

SQL> select * from e01;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80          1                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81          1        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81          1        500         30
      7566 JONES      MANAGER         7839 02-APR-81          1                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81          1       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81          1                    30
      7782 CLARK      MANAGER         7839 09-JUN-81          1                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87          1                    20
      7839 KING       PRESIDENT            17-NOV-81          1                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81          1          0         30
      7876 ADAMS      CLERK           7788 02-APR-87          1                    20
      7900 JAMES      CLERK           7698 03-DEC-81          1                    30
      7902 FORD       ANALYST         7566 03-DEC-81          1                    20
      7934 MILLER     CLERK           7782 23-JAN-82          1                    10

14 rows selected.

SQL> select * from e01 as of timestamp(sysdate-5/1440);

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 02-APR-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL> alter table e01 enable row movement;

Table altered.

SQL> flashback table e01 to timestamp(sysdate-5/1440);

Flashback complete.

SQL> select * from e01;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 02-APR-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL>

最多可以闪回15分钟,900秒。

SQL> select * from e01 as of timestamp(sysdate-15/1440);

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 02-APR-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL>

闪回版本查询

SQL> update e01 set sal=sal+100 where deptno=10;

3 rows updated.

SQL> commit;

Commit complete.

SQL> update e01 set sal=sal*1.1 where deptno=30;

6 rows updated.

SQL> commit;

Commit complete.

SQL> update e01 set sal=3;

14 rows updated.

SQL> commit;

Commit complete.

SQL> select * from e01;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80          3                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81          3        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81          3        500         30
      7566 JONES      MANAGER         7839 02-APR-81          3                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81          3       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81          3                    30
      7782 CLARK      MANAGER         7839 09-JUN-81          3                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87          3                    20
      7839 KING       PRESIDENT            17-NOV-81          3                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81          3          0         30
      7876 ADAMS      CLERK           7788 02-APR-87          3                    20
      7900 JAMES      CLERK           7698 03-DEC-81          3                    30
      7902 FORD       ANALYST         7566 03-DEC-81          3                    20
      7934 MILLER     CLERK           7782 23-JAN-82          3                    10

14 rows selected.

SQL> --闪回版本查询
SQL> select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369;
select versions_startscn,versions_endscn,versions_operation,versions_xid,sal from e01 versions between scn_minvalue and maxvalue where empno=7369
                                                                                                       *
ERROR at line 1:
ORA-00905: missing keyword


SQL> select 
  2  versions_startscn,
  3  versions_endscn,
  4  versions_operation,
  5  versions_xid,
  6  sal 
  7  from e01 
  8  versions between scn minvalue and maxvalue 
  9  where empno=7369;

VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID            SAL
----------------- --------------- - ---------------- ----------
         17826843                 U 03000300BC030000          3
         17826652        17826843 I 070010006E030000        800
         17826652                 D 070010006E030000          1
         17825320        17826652 U 03002000BB030000          1
                         17825320                           800

SQL> 
SQL> col versions_starttime for a25;
SQL> col versions_endtime for a25;
SQL> select
  2  versions_starttime
  3  versions_endtime, 
  4  --versions_startscn,
  5  --versions_endscn,
  6  versions_operation,
  7  versions_xid,
  8  sal 
  9  from e01 
 10  versions between scn minvalue and maxvalue 
 11  where empno=7369;

VERSIONS_ENDTIME          V VERSIONS_XID            SAL
------------------------- - ---------------- ----------
23-NOV-22 09.55.07 PM     U 03000300BC030000          3
23-NOV-22 09.50.16 PM     I 070010006E030000        800
23-NOV-22 09.50.16 PM     D 070010006E030000          1
                                                      1

SQL> --闪回版本查询
SQL> select * from e01 as of scn 17826652;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 02-APR-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL> flashback table e01 to scn 17826652;

Flashback complete.

SQL> select * from e01;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 24-JAN-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 02-APR-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL> 

注意注意: 要想做闪回表的操作,必须先开行移动,如果不打开行移动,将无法进行闪回操作。

SQL> alter table e01 enable row movement;

Table altered.

开启追加日志数据模式:

SQL> 
SQL> alter database add supplemental log data;

Database altered.

SQL> 
SQL> 
SQL> update e01 set sal=sal*1.15 where deptno=30;

6 rows updated.

SQL>

SQL> select
  2  --versions_starttime
  3  --versions_endtime, 
  4  versions_startscn,
  5  versions_endscn,
  6  versions_operation,
  7  versions_xid,
  8  sal 
  9  from e01 
 10  versions between scn minvalue and maxvalue 
 11  where empno=7844;

VERSIONS_STARTSCN VERSIONS_ENDSCN V VERSIONS_XID            SAL
----------------- --------------- - ---------------- ----------
         17846142                 I 02000B0061030000       1500
         17846142                 D 02000B0061030000          3
                         17846142                             3

SQL> 

闪回事务查询


select
--versions_starttime
--versions_endtime, 
versions_startscn,
versions_endscn,
versions_operation,
versions_xid,
sal 
from e01 
versions between scn minvalue and maxvalue 
where empno=7844;

---闪回事务查询,sys用户才可以查询

SQL> select undo_sql from flashback_transaction_query where xid='02000B0061030000';

UNDO_SQL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

















16 rows selected.

SQL> 

数据的串行访问:(都是从UNDO读取的数据)

设置事务隔离级来模拟数据串行访问

SQL> set transaction isolation level serializable;

Transaction set.

SQL>

画面1:

[oracle@oracle-db-19c ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 24 09:51:46 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> conn scott/tiger@PDB1;
Connected.
SQL> show con_name;

CON_NAME
------------------------------
PDB1
SQL> set transaction isolation level serializable;

Transaction set.

SQL> select distinct sal from e01;

       SAL
----------
         1

SQL> select distinct sal from e01;

       SAL
----------
         1

SQL> 

画面2:

[oracle@oracle-db-19c ~]$ sqlplus scott/tiger@PDB1

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 24 10:01:22 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Thu Nov 24 2022 09:52:09 +08:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> show con_name;

CON_NAME
------------------------------
PDB1
SQL> 
SQL> select distinct sal from e01;

       SAL
----------
         1

SQL> update e01 set sal=2;

57344 rows updated.

SQL> select distinct sal from e01;

       SAL
----------
         2

SQL> commit;

Commit complete.

SQL> set transaction isolation level serializable;

Transaction set.

SQL> select distinct sal from e01;

       SAL
----------
         2

SQL> 

回退保实例

打开回退强度保实例的作用是,老镜像不到15分钟是不允许被覆盖

SQL> set transaction isolation level serializable;

Transaction set.

SQL>

SQL> alter tablespace UNDOTBS2 RETENTION GUARANTEE;

Tablespace altered.

SQL>

SQL> select tablespace_name,retention from dba_tablespaces where contents='UNDO';

TABLESPACE_NAME                RETENTION
------------------------------ -----------
UNDOTBS1                       NOGUARANTEE
UNDOTBS2                       NOGUARANTEE

SQL>

[oracle@oracle-db-19c ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 24 09:57:26 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> 
SQL> 
SQL> set pagesize 200
SQL> set linesize 200
SQL> 
SQL> select tablespace_name,retention from dba_tablespaces where contents='UNDO';

TABLESPACE_NAME                RETENTION
------------------------------ -----------
UNDOTBS1                       NOGUARANTEE
UNDOTBS2                       NOGUARANTEE

SQL> alter tablespace UNDOTBS2 RETENTION GUARANTEE;

Tablespace altered.

SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
temp_undo_enabled                    boolean     FALSE
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1
SQL> select tablespace_name,retention from dba_tablespaces where contents='UNDO';

TABLESPACE_NAME                RETENTION
------------------------------ -----------
UNDOTBS1                       NOGUARANTEE
UNDOTBS2                       GUARANTEE

SQL>

恢复到原本状态:
drop tablespace UNDOTBS2 including contents and datafiles;

SQL> select name from v$tablespace;

NAME
------------------------------
SYSAUX
SYSTEM
UNDOTBS1
USERS
TEMP01
SYSTEM
SYSAUX
UNDOTBS1
TEMP
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
TEMP02
UNDOTBS2
UNDOTBS2

17 rows selected.

SQL> alter session set container=PDB1;

Session altered.

SQL> drop tablespace TEMP02 including contents and datafiles;

Tablespace dropped.

SQL> 
SQL> alter system set undo_tablespace=undotbs2;

System altered.

SQL> 
SQL> 
SQL> alter system set undo_tablespace=undotbs1;

System altered.

SQL> drop tablespace UNDOTBS2 including contents and datafiles;

Tablespace dropped.

SQL> alter session set container=CDB$ROOT;

Session altered.

SQL> drop tablespace UNDOTBS2 including contents and datafiles;

Tablespace dropped.

SQL> select name from v$tablespace;

NAME
------------------------------
SYSAUX
SYSTEM
UNDOTBS1
USERS
TEMP01
SYSTEM
SYSAUX
UNDOTBS1
TEMP
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS

14 rows selected.

SQL> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值