我的Oracle 9i学习日志(14)-- undo数据

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

Undo segment

 

1
用于保存一个进程修改了的数据的旧值。 Undo segment 头部包含记录了当前事务使用的 undo segment 信息的一张表。一系列事务只使用一个 undo segment 存储所有数据。许多并发的事务可以使用同一个 undo segment
Undo segment 目的:事务回滚、事务恢复、读一致性。
读一致性
 

2
每个事务都会分配一个 SCN(system change number) SCN 序号只会增大。当一个查询事务开始时,系统将分配一个比将要查询的表中的 SCN 都大的一个 SCN 。在查表时如果碰到比事务 SCN 大的记录,就会去 undo segment 里查询相应的旧的记录。如果因为时间查询时间太长或其他原因,旧的记录在 undo segment 里被覆盖了的话,查询将失败。
实验 :
luo 用户在第一个终端登录:
SQL> select * from test;
 
        ID NAME
---------- --------------------
         0 hello
SQL> insert into test values(1, 'world');
 
1 row created.
SQL> select * from test;
 
        ID NAME
---------- ----------
         0 hello
         1 world
luo 在第二个终端登录:
SQL> select * from test;
 
        ID NAME
---------- --------------------
         0 hello
返回第一个终端:
 
SQL> commit;
 
Commit complete.
第二个终端:
SQL> select * from test;
 
        ID NAME
---------- --------------------
         0 hello
         1 world
Redo&undo
insert 语句为例。
 

图三
在开始执 insert 时, Oracle 在内存里产生相应的数据信息、 undo 信息,并且无论是数据,索引还是 undo 都会产生 redo 。如果这时突然断电或 crash ,内存内的数据丢失,但磁盘文件没有被修改。下次启动时不要进行恢复操作。
 

图四
在把要插入的数据写入磁盘文件之前,先写 redo 。这时如果 crash 了,下次启动将根据 redo 恢复数据。以下的 updata 操作也是同理。
 

 

图五 --- 图六
Undo segment 类型:
System undo segment :存在 system 表空间里, system 表空间专用。
Non-system undo segment :在存在多个表空间的数据库里,至少需要一个 non-system undo segment ,或手动方式管理或自动方式管理。其中手动方式管理的 undo segment 又分为 private undo segment public undo segment 两种;自动管理方式必须存在一个活动的 undo tablespace
Deferred undo segment :当表空间脱机时可能会创建 deferred undo segment 用于在表空间恢复联机时回滚事务。由 Oracle server 自动管理。
自动 undo segment 管理:
Undo data undo 表空间中被自动管理, DBA 需根据数据库的负荷给出充足的表空间大小。
参数:
SQL> show parameter undo
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_suppress_errors                 boolean     FALSE
undo_tablespace                      string      UNDOTBS1
如果管理方式是 auto 并且只存在一个 undo tablespace ,那么 undo_management  是可选项, the Oracle server will automatically choose the UNDO tablespace.
undo_retention 的值决定了 undo segment 中的数据存储的最长时间,超过这个时间则可能会被其他 undo 数据覆盖。如果 undo segment 没有足够的空间,则 undo 数据即使没过期也可能会被覆盖。这时如果有查询语句可能会导致报错: ORA-1555 snapshot too old .
创建 undo  表空间:
SQL> select tablespace_name, contents from dba_tablespaces;
 
TABLESPACE_NAME                CONTENTS
------------------------------ ---------
SYSTEM                         PERMANENT
UNDOTBS1                       UNDO
TEMP                           TEMPORARY
CWMLITE                        PERMANENT
DRSYS                          PERMANENT
EXAMPLE                        PERMANENT
INDX                           PERMANENT
ODM                            PERMANENT
TOOLS                          PERMANENT
USERS                          PERMANENT
XDB                            PERMANENT
 
TABLESPACE_NAME                CONTENTS
------------------------------ ---------
LUO                            PERMANENT
MYTEMP                         TEMPORARY
DATA02                         PERMANENT
INDEX01                        PERMANENT
RONLY                          PERMANENT
B4K                            PERMANENT
方法一:
CREATE DATABASE db01
. . .
UNDO TABLESPACE undo1 DATAFILE '/u01/oradata/undoldb01.dbf' SIZE 20M AUTOEXTEND ON
方法二:
CREATE UNDO TABLESPACE undo1 DATAFILE '/u01/oradata/undo1db01.dbf' SIZE 20M;
如果在 create database 时, undo_management 参数指定为 auto ,但是又省略了 undo tablespace 的句子,那么 Oracle 会自动创建一个 undo tablespace ,命名为 sys_undots ,对应的数据文件: $ORACLE_HOME/dbs/dbu1sid.dbf.
 
改变 undo 表空间 :
与其他表空间一样, undo 表空间可以增删数据文件,重命名,数据文件离线与联机, begin backup end backup
切换 undo 表空间:
可以有多个 undo 表空间,但只有一个是活动的。命令: ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2; 可以切换当前活动 undo 表空间。
注意:切换表空间后,如果原来的表空间中还有有用的数据,如:事务没用提交,那么原来的表空间还会被使用一段时间(可能是由于 undo_retention 的时间限制),直到所有数据无效。
SQL> select * from test ;
 
        ID NAME
---------- ----------
         0 hello
         1 world
 
SQL> insert into test values(2, 'aaa');
 
1 row created.
SQL> alter system set undo_tablespace='myundo1';
 
System altered.
SQL> commit;
 
Commit complete.
 
SQL> select * from test;
 
        ID NAME
---------- ----------
         0 hello
         1 world
         2 aaa
删除 undo 表空间:
如果 undo 表空间在使用,则不能被 drop
Undo 数据统计信息 :
查看当前未提交事务占用的 undo block 数量:
SQL> select addr, used_ublk from v$transaction;
 
ADDR      USED_UBLK
-------- ----------
5AB34700          1
 
SQL> select begin_time,end_time, undoblks from v$undostat;
下面视图每十分钟记录一次这段时间内使用的 undo block 数量。
BEGIN_TIM END_TIME    UNDOBLKS
--------- --------- ----------
02-APR-10 02-APR-10         17
02-APR-10 02-APR-10         19
01-APR-10 02-APR-10         17
01-APR-10 01-APR-10         18
01-APR-10 01-APR-10         18
01-APR-10 01-APR-10         24
01-APR-10 01-APR-10         17
01-APR-10 01-APR-10         19
01-APR-10 01-APR-10         19
01-APR-10 01-APR-10         19
01-APR-10 01-APR-10         14
如果 undo 空间过小,当一个事务需要的 undo 空间不够时则事务处理失败。
估算 undo tablespace 大小:
三个参考值: (UR)undo_retention (UPS) 每秒产生 undo block 的数量、 (DBS) 块大小。
估算每秒产生 undo block 块数量方法:
方法一:取最大值,
SQL> select max(undoblks / ((end_time - begin_time)*24*3600)) from v$undostat;
 
MAX(UNDOBLKS/((END_TIME-BEGIN_TIME)*24*3600))
---------------------------------------------
                                          .04
方法 2 :取平均值
SQL> select sum(undoblks) / sum((end_time - begin_time)*24*3600) from v$undostat;
 
SUM(UNDOBLKS)/SUM((END_TIME-BEGIN_TIME)*24*3600)
------------------------------------------------
                                      .030844624
Segment 大小  =  每秒块数量 *undo_retention*db_block_size
Undo 配额:
须额外的包才能提供此功能。
相关视图:
  DBA_ROLLBACK_SEGS
  V$ROLLNAME
  V$ROLLSTAT
  V$UNDOSTAT
  V$SESSION
  V$TRANSACTION
练习:
Connect as user  SYSTEM/MANAGER , and list the undo segments in tablespace  UNDOTBS .
解析: SQL> select segment_name, tablespace_name from dba_rollback_segs;
 
Create undo tablespace  UNDO2 , size 15M, in  $HOME/ORADATA/u03 . List the undo
segments in tablespace  UNDO2 .
In a new telnet session start SQL*Plus and connect as user  HR  and run script
lab10_03.sql  to insert a row into table  DEPARTMENTS . Do not commit, roll back, or exit the session.
解析:见上次习题 1.
 
In the session in which you are connected as  SYS , using the  ALTER SYSTEM  command,switch the  UNDO  tablespace from  UNDOTBS  to  UNDO2 , using  SCOPE=BOTH.
As  SYS drop tablespace  UNDOTBS.  Use the  INCLUDING CONTENTS AND DATAFILES  clause . What happened?
List the undo segments in tablespace  UNDOTBS  and their status. Compare this
list to the list in step 1.
Hint:  Query  DBA_ROLLBACK_SEGS  data dictionary view.
In the session connected as  HR , roll back the transaction and exit the session.
In the session connected as  SYS drop tablespace  UNDOTBS . What happened?
As  SYS issue the following command:
ALTER SYSTEM SET undo_retention=0 SCOPE=memory;
Now drop tablespace  UNDOTBS . What happened?
Note:  There still may be a delay before the tablespace is dropped.









本文转自 d185740815 51CTO博客,原文链接:http://blog.51cto.com/luotaoyang/290721,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
10天前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
9天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
9天前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
9天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
9天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。
|
1月前
|
Oracle 关系型数据库 网络安全
Oracle 19c 安装教程学习
Oracle 19c 安装教程学习
57 2
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
13天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
123 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
226 3
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1633 14

推荐镜像

更多