存档
topUNDO相关统计
在日常管理中,除了要用到上一篇文章中所说的那些数据字典之外,还有一个保存统计信息的数据字典是非常重要的,那就是著名的由V$SYSSTAT、V$SESSTAT、V$MYSTAT组成的系统信息统计家族,系统统计动态视图中所包含的统计信息阵容非常庞大,其中就包含了一些与UNDO相关的统计信息:
SQL> set lines 145 pages 9999
SQL> col name for a60
SQL> SELECT * FROM v$statname WHERE NAME LIKE '%undo%' ;
STAT# NAME CLASS STAT_ID
------ ------------------------------------------------------------ ------ ----------
89 DBWR undo block writes 8 111270822
216 undo change vector size 128 1465971540
217 transaction tables consistent reads - undo records applied 128 1054055970
219 data blocks consistent reads - undo records applied 128 2915445793
228 rollback changes - undo records applied 128 3616249137
242 auto extends on undo tablespace 128 3140365462
244 total number of undo segments dropped 128 3623640507
262 global undo segment hints helped 128 1791494885
263 global undo segment hints were stale 128 3309048233
264 local undo segment hints helped 128 1047863356
265 local undo segment hints were stale 128 2070200837
266 undo segment header was pinned 128 248401831
271 IMU undo retention flush 128 2087226422
277 IMU undo allocation size 128 244193920
285 SMON posted for undo segment recovery 128 2117898593
288 SMON posted for undo segment shrink 128 579492169
16 rows selected.
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/undo-management_undo-generation-stat.html
topUNDO相关数据字典
topUNDO相关数据字典概览
9i是Oracle UNDO管理上面的一个分水岭,从手工管理到自动管理的分水岭。而与UNDO管理相关的数据字典也从手工UNDO管理的时代延续到了自动UNDO的时代,进入AUM时代之后,Oracle也新增了几个新的数据字典,但是那些延续下来的数据字典依然在UNDO的管理中发挥着重要的作用。
与UNDO相关的数据字典可以分成下面几类:
- 与UNDO管理直接相关的数据字典
- 9i之前手工管理时就存在的数据字典
- V$ROLLNAME:回滚段名称和回滚段ID对应表。
- V$ROLLSTAT:在使用AUM时,该视图保存着所有UNDO表空间中每一个已分配的回滚段当前状态以及相关的统计信息,不显示状态在OFFLINE的回滚段。
- DBA_ROLLBACK_SEGS:此字典显示所有回滚段的当前状态以及与存储空间分配相关的信息。
- 9i之后新增的数据字典
- V$UNDOSTAT:保存了某一时间段的整个UNDO表空间使用的统计信息以及UNDO自动优化的结果,默认情况下每10分钟增加一条记录,并只保留最近的576条(4天。在10g及之前版本中此记录为1008,或7天)的信息,超过期限的数据只能在DBA_HIST_UNDOSTAT中找到。此字典仅对自动UNDO管理模式有效。
- DBA_UNDO_EXTENTS:保存了UNDO表空间中所有已分配的数据区的存储空间分配情况与使用情况,是得到UNDO数据当前存在状态的一个重要的视图。
- DBA_HIST_UNDOSTAT:保存了所有V$UNDOSTAT所存在的数据的一个历史记录,10g开始新增字典。
- 9i之前手工管理时就存在的数据字典
- 与UNDO管理间接相关的数据字典
- 事务相关
- V$TRANSACTION:当前正在进行事务的信息,与UNDO管理相关的是当前事务所涉及的UNDO段,UNDO空间占用等等信息。具体的前面已经有介绍。
- UNDO表空间相关
- DBA_EXTENTS:与DBA_UNDO_EXTENTS类似。
- DBA_SEGMENTS:与DBA_ROLLBACK_SEGS类似。
- DBA_DATA_FILES:关联计算UNDO表空间大小而用。
- 事务相关
UNDO表空间实质上和其他普通表空间一样,因此适用于其他表空间的数据字典都适用于UNDO表空间。
字典V$ROLLSTAT和V$UNDOSTAT在名字上面看起来有点rollback segment与UNDO segment的感觉,但是实际上这两个视图的差别还是很大的,V$ROLLSTAT记录的是整个UNDO表空间各个回滚段使用情况的统计,属于横向的;而V$UNDOSTAT记录的则是各个时间段上面整个UNDO使用情况的统计,属于纵向的。
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/undo-management_data-dictionary.html
本文主要是对UNDO管理中的一些概念进行强调说明,以及整理了一些UNDO管理中常用的数据字典等等做出详细的介绍。本文不会对UNDO的一些基本概念做详尽的介绍,如果你对于UNDO机制了解的还是不是很清楚的话请先阅读Oracle Concepts, Chapter 9 Data Concurrency and Consistency和Oracle Administrator’s Guide, Chapter 15 Managing Undo以及Oracle9i&10g编程艺术:深入数据库体系结构,第9章 redo与undo。
top实验版本
Oracle数据库版本:
SQL> SELECT * FROM V$VERSION; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production PL/SQL Release 11.1.0.7.0 - Production CORE 11.1.0.7.0 Production TNS for Linux: Version 11.1.0.7.0 - Production NLSRTL Version 11.1.0.7.0 - Production
操作系统版本:
SQL> !uname -a Linux orainst.desktop.mycompany.com 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/undo-management_auto-undo-management.html
《深度对比Oracle与SQL Server》PDF版下载地址
在线版
PDF版
CSDN下载:http://download.csdn.net/source/2314938
ITPUB下载:http://www.itpub.net/thread-1299140-1-1.html
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/oracle-sql-server-comparison_pdf-download.html
topError Log与Alert Log
SQL Server维护着一个运行期间的操作日志,这个日志包括了启动信息、恢复事件、用户操作、备份信息、配置变更、非法登录、错误、警告信息等等。每次SQL Server服务启动的时候都会生成一个新的日志文件,这个日志就是SQL Server中著名的Error Log。
这个日志是DBA进行错误诊断的一个主要的信息来源。默认情况下SQL Server会保留6个日志文件,老的文件先被先行删掉,这个默认值是可以修改的。当前使用错误日志的名字是ERRORLOG(没有扩展名),紧随其后的名字为ERRORLOG.1,接着是ERRORLOG.2,依此类推。

Oracle中与SQL Server Error Log等价的是Alert Log文件,Alert Log包含了数据启动关闭、实例恢复、配置变更、内部错误、初始化参数等等信息。
和SQL Server不一样的是,Oracle Alert Log不会在每次实例启动的时候都创建一个新的文件,不管这个Alert Log文件会增长到多大,Oracle都只会维护这一个文件。Alert Log的名字为alert_<instance>.log,其中的<instance>是Oracle实例名。Oracle DBA和SQL Server DBA一样是通过这么一个Alert Log来获得错误诊断所需要的信息。

SQL Server的Error Log和Oracle的Alert Log都是ASCII文本格式的,可以使用任意的文本编辑器打开(译注:Oracle 11g开始提供XML格式的错误日志文件,需要使用ADR打开查看,此前生成文本格式文件的功能依然保留着)。SQL Server Management Studio(Windows界面)也可以用来查看Error Log,Oracle中则可以通过Enterprise Manager Database Control(Web界面)来查Alert Log的内容。
SQL Server的Error Log文件存放的地方由注册表键值决定,默认的位置通常是SQL Server安装目录中的LOG目录之下。而Oracle中Alert Log的位置由初始化参数
BACKGROUND_DUMP_DEST决定,默认情况下通常是在$ORACLE_HOME下面的bdump目录中。
译者:马齿苋 | 链接:http://www.dbabeta.com/2010/oracle-sql-server-comparison-iv.html
作者:Sadequl Hussain | 原文:http://www.sql-server-performance.com/articles/dba/oracle_sql_server_comparison_iv_p1.aspx
top数据库实例结构
当Oracle实例启动之后,所看到的就是在服务器内存上的一个个不同内存块加上产生的与这些内存交互的后台进程。Oracle文档将这些内存结构和进程收的很详细。
由Oracle实例所占用的内存块成为SGA(System Global Area),它的大小可以通过调整Oracle初始化参数(initialisation parameter)进行修改,在SGA里边至少会创建3个不同的区域,它们分别是:
- 数据块缓存区(Database Buffer Cache)
- 这里缓存的是数据块。和SQL Server一样,用户不会直接的访问数据文件上的数据:当读取数据时,相关的数据块会从数据文件中拷贝到内存中;修改数据时也是修改内存中的数据,然后再由单独的进程将数据缓存区中被修改的数据写入到数据库中。
- 重做日志缓存(Redo Log Buffer)
- SGA中的这个区域连续的记录着数据缓存区数据修改的记录,重做日志缓存中的内容会被写入到在线日志文件中去。
- 共享池(Shared Pool)
- SGA中有一大块的内存用作共享池,共享池等价于SQL Server中的执行缓存(Procedure Cache)。它的主要作用就是缓存数据库中最近执行过的SQL语句。共享池由下面的模块组成:
- 数据字典缓存(Dictionary Cache)
- 数据字典缓存缓存了Oracle最近使用的数据字典信息。
- 库缓存(Library Cache)
- 这个区域包含了最近执行的SQL和PL/SQL语句和对应的执行计划。SQL区还能进一步分成共享区和私有区:共享SQL区保存的语句可以由多个用户使用而私有区保存的则是跟各个连接对应的绑定变量的信息。PL/SQL是Oracle对于行业标准SQL的程序扩展,当PL/SQL程序执行时,它的代码会拷贝到库缓存中的共享PL/SQL区中。除了缓存执行代码和执行计划外,库缓存还包含锁、阀以及字符集等信息。
根据你所使用的组件的不一样,Oracle的SGA中也可能存在其它一些可选的内存区域。在Oracle中使用Java应用时要使用到Java池(Java Pool),Oracle内置的备份恢复工具RMAN(Recovery Manager)要用到大池(Large Pool),当使用Oracle高级队列机制时要用到流池(Steams Pool)。
译者:马齿苋 | 链接:http://www.dbabeta.com/2010/oracle-sql-server-comparison-ii.html
作者:Sadequl Hussain | 原文:http://www.sql-server-performance.com/articles/dba/oracle_sql_server_comparison_ii_p1.aspx
一般的公司通常会在他们的信息系统架构中引入多种数据库平台,同时引入三到四种不同的RDBMS解决方案的中大型公司也并不少见,当然这些公司里面的DBA们通常也需要同时拥有管理多种不同平台的技能了。
只在一种平台上展开工作的数据库专家们也通常会期待着在他们的下一份工作中能学到点不一样的东西,那些有勇气的人们则愿意花时间、金钱和精力去学习新的东西,也有其他因为换了新公司或者是为了找新的工作而去学习新的系统的人们,毋庸置疑的一点就是公司老板和人力专家们会更加青睐于那些拥有多个领域经验的求职者。
依我个人的经验来看,在学习一个新的数据平台的时候,最好的方法就是在新的环境中去发现那些你已知的东西,这样学习起来会简单很多。当然,当中也会遇到一些全新的概念需要去学习,或者是忘掉一些你现在已知的概念,但不管怎么说你不是从零开始的。比如说一个做SQL Server开发人员在要写Oracle存储过程的时候可能会先去找那些内置的函数然后比较它们之间不同点,她也可能会去比较变量声明以及错误处理的异同。
本系列文章中我将尝试对Microsoft SQL Server和Oracle RDBMS(以10g及以后的版本为主)进行一个深入的比较。我会主要集中于这两种数据库之间架构上的比较,当然不要期望我会给你一个详尽的比较清单,但是我会尽我所能的让你看清这两种当今世上应用最广的数据库之间的相同和相异之处。本文是以一个SQL Server DBA的角度去构思和写作的,不过相信这对Oracle专家门了解SQL Server这一面也是很有参考价值的。
废话少说,开工吧。
译者:马齿苋 | 链接:http://www.dbabeta.com/2010/oracle-sql-server-comparison-i.html
作者:Sadequl Hussain | 原文:http://www.sql-server-performance.com/articles/dba/oracle_sql_server_comparison_p1.aspx
topNULL是什么
NULL,字典的解释是空值。
如果你对ASCII表还有印象的话应该记得ASCII的第一个字符就是NUL(00),在C/C++语言中它被用来作为一个字符串的结尾,通常表示为”\00″,因此从ASCII码的意义上说NULL还是算是“看得见摸得着”的东西。
但是当NULL放到SQL当中的时候,它的意义就会有些不同了,在SQL中,NULL就是空,但又不仅仅是空,实际上NULL代表着的是未知、是空洞、是虚无缥缈。这一点SQL Server和Oracle都达成了共识,且看SQL Server中对于NULL的描述:
空值一般表示数据未知、不适用或将在以后添加数据。
在Oracle中的描述也是类似的:
null
Absence of a value in a column of a row. Nulls indicate missing, unknown, or inapplicable data.
既然NULL代表的是未知,那当然就不能用常规等于或者是不等于来判断说一个值是否为NULL了,当然也就不能说NULL等于NULL,因为你是不能去判断两个未知是否相等,那是没有意义的。
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/null-in-sqlserver-and-oracle.html
在Oracle 11g之前,数据库产生的日志文件都是文本格式的,要查看或者是监视一个文件的变化都是很简单的一件事情,但是从11g开始,Oracle引入了一个新的管理各种日志文件和报警文件的系统,被称为Automatic Diagnostic Repository(ADR),日志文件默认情况下不再以文本格式保存,而是代之于xml文件,比如说下面的listener状态的输出结果:
$lsnrctl status l_orcl_001 LSNRCTL for Linux: Version 11.1.0.7.0 - Production on 09-APR-2010 03:16:22 Copyright (c) 1991, 2008, Oracle. All rights reserved. Connecting to (address=(protocol=tcp)(host=orcl-a-dg.db.mycompany.com)(port=33333)(queuesize=32)) STATUS of the LISTENER ------------------------ Alias L_orcl_001 Version TNSLSNR for Linux: Version 11.1.0.7.0 - Production Start Date 08-APR-2010 09:04:25 Uptime 0 days 18 hr. 11 min. 57 sec Trace Level off Security ON: Local OS Authentication SNMP ON Listener Parameter File /oraclebase/product/11.1.0.7/network/admin/listener.ora Listener Log File /oraclebase/diag/tnslsnr/oratest-a/l_orcl_001/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oratest-a.pek4.mycompany.com)(PORT=33333))) Services Summary... Service "orcl" has 1 instance(s). Instance "orcl", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/tail-in-adrci.html
topSCN是什么
在《Concepts》中是这么描述SCN的:
A system change number (SCN) is a logical, internal timestamp used by Oracle Database. SCNs order events that occur within the database, which is necessary to satisfy the ACID properties of a transaction. Oracle Database uses SCNs to mark the SCN before which all changes are known to be on disk so that recovery avoids applying unnecessary redo. The database also uses SCNs to mark the point at which no redo exists for a set of data so that recovery can stop.
怎么理解这个“SCN(系统变更号)是供Oracle数据库使用的一个逻辑的、内部的时间戳”呢?要理解这个先需要理解Oracle中的事务(Transaction)和数据一致性(Data Consistency)的概念。
先说说数据一致性的概念。数据一致性指的是数据的可用性。比如说管理一个财务的系统,需要从A账户将100元转入到B账户,正常的操作是从A账户减去100元,然后给B账户加上100元,如果这两步操作都正常完成了,那我们可以说完成转账操作之后的数据是一致可用的;但是如果在操作的过程中出了问题,A账户的100元给减掉了,但是B账户却没有加上100元,这样的情况下产生的结果数据就有问题了,因为部分操作的失败导致了数据的不一致而不可用,在实际中肯定是要避免这种让数据不一致的情况发生的。在Oracle数据库中,保证数据一致性的方法就是事务。
事务是一个逻辑的、原子性的作业单元,通常由一个或者是多个SQL组成,一个事务里面的所有SQL操作要么全部失败回滚(Rollback),要么就是全部成功提交(Commit)。就像上面转账的例子,为保证数据的一致性,就需要将转账的两步操作放在一个事务里面,这样不管哪个操作失败了,都需要将所有已进行的操作回滚,以保证数据的可用性。进行事务管理是数据库区别于别的文件系统的一个最主要的特征,在数据库中事务最主要的作用就是保证了数据的一致性,每次事务的提交都是将数据库从一种一致性的状态带入到另外一种一致性的状态中,SCN就是用来对数据库的每个一致状态进行标记的,每当数据库进入到一个新的一致的状态,SCN就会加1,也就是每个提交操作之后,SCN都会增加。也许你会想为什么不直接记录事务提交时候的时间戳呢?这里面主要是涉及了两个问题,一个是时间戳记录的精度有限,再一个就是在分布式系统中记录时间戳会存在系统时钟同步的问题,详细的讨论可以查看Ordering Events in Oracle。
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/scn-basics.html
近期评论