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 NOGUARANTEESQL>
[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>