6、ASM(自动存储管理)
6.1. ASM Fast Mirror Resync
在10g的ASM中如果因为某些硬件故障(比如接口线,比如光纤卡,比如电源)导致Diskgroup中的某些磁盘无法正常读取,这些磁盘将处于offline状态,在offline之后不久ASM就会把这些磁盘从Diskgroup中删除,并且尝试利用冗余的extent来重新在其它磁盘中构建数据,这是一个比较耗时且耗资源的操作。当我们修复了磁盘,再将它们重新加回磁盘组中,又将是另外一次的数据重整操作。如果我们仅仅是例行的维护硬件,因为磁盘中的数据并没有真正的损坏,我们只是将磁盘取出来过一会儿再加回去,那么这样的两次数据重整操作无疑是没有必要的,在11g中ASM的Fast Mirror Resync功能允许我们设置磁盘的repair时间,在repair时间内ASM将不会尝试在磁盘间重新分配extent。
ALTER DISKGROUP dgroup SET ATTRIBUTE 'DISK_REPAIR_TIME'='3H';
上述命令可以设置当磁盘组dgroup中的磁盘失效和重新有效之间的时间在3小时内的话,ASM就不会重新构建extent,当磁盘重新有效之后,ASM需要做的只是将这3小时内更改的extent重新同步到刚才失效的这些磁盘中就可以了。
6.2. ASM Preferred Mirror Read
我们知道在10g中ASM总是会去读取Primary extent,这样做的目的是为了更好的分散IO,但是在某些环境中,一个ASM磁盘组中的磁盘对于某一个特定的节点来说,有些是Local Disk而有些则是Remote Disk,从Remote Disk中读取数据效率会低于Local Disk,但是在10g中我们无法要求从哪组磁盘中读取数据,在11g中新增的ASM_PREFERRED_READ_FAILURE_GROUPS参数帮助我们完成了这个功能。给每个实例设置优先读取的Failure Group就可以了。
6.3. ASM扩展性的增强
对于外部冗余(External redundancy),ASM可以最大支持到140PB了,而在10g中这个数字仅仅是35TB。
7、Server Result Cache
Cache始终是提升性能的重要技术, 在Oracle 11g中增加了一种Server Result Cache, MySQL的Query Cache是根据SQL的文本来匹配的, 只有Query的文本一模一样时才可以共享, 而Oracle的Server Result Cache则只要执行计划一样或部份一样, 并且生命周期一样, 则就可以共享了。 当下面的表数据改变了, Oracle会自动清除这个Cache, 以确保查询结果的正确性。 在以读为主要的系统中, 宣称性能可以提升一倍。
这块内存从SGA中分配, 由RESULT_CACHE_MAX_SIZE控制。 Oracle允许你在系统, 会话, 表和语句级(Hint:result_cache)控制是否使用Server Result Cache技术。 Oracle提供一个PL/SQL包及相应视图来管理这个Cache区域。
对于同样的操作,如果能在多个process或者session间共享结果,对于性能优化自然是非常有帮助的。从oracle7开始提供的share pool,可以让同样的SQL可以解析一次,执行多次,有效的减少了多个session执行相同SQL语句时的硬解析,如果应用很好的使用了绑定变量,那么共享SQL对于系统整体性能的提升是不言而喻的。
那么,除了能共享SQL和执行计划,还能共享什么?直接共享SQL执行后的结果,使得相同或者部分相同的SQL语句甚至只需要执行一次,以后再次执行时就直接得到结果?没错,Oracle11g的新特性Server Result Cache就能提供这样功能。Oracle在白皮书上宣布,对于读频繁的系统,通过该特性,甚至有可能提升系统性能200%,对于大量报表的数据仓库项目来说,这个特性应该是一个不错的消息。
Server Result Cache通过在SGA中分配一个缓冲区来保存查询结果,Oracle引入了一个新的初始化参数来控制这个cache的大小:result_cache_max_size。可以在system、session、table或者语句级别来设置cache的使用。在语句级可以使用一个新的hint来控制是否缓存查询结果。另外,Oracle还提供了一个新的PL/SQL用来监控和管理Server Result Cache,比如可以清空整个cache的内容或者清空某个查询的结果,也可以生成cache的使用报告等。
既然使用了cache,自然会有cache查找和cache数据清除算法的问题。估计查找还会是通过hash算法,这样还需要引入几个相关的latch。Cache中的数据,也应该是通过LRU或者类似LRU的算法来管理其生命期。
Server Result Cache不仅仅能缓存整个查询的结果,也能缓存查询中某部分操作的结果,比如缓存一次排序的结果,就可以避免再次执行时的排序操作。对于一些比较耗资源的查询操作,缓存结果应该能很好的提升性能。
通过在服务端和客户端引入对于查询结果的缓存机制,Oracle11g或许能极大的提高查询性能。对于一些读比较频繁的系统,比如数据仓库应用,Oracle11g或者更值得期待。
8、提升性能 Consistent Client Cache
Cache始终是提升性能的重要技术。 除了在前面讲的Server Result Cache, Oracle 11g还增加了一种Client Cache. 这是一种在Oracle Client端的缓冲技术, 通过将中间结果或整个表缓冲在客户端, 当客户端发出查询请求时, Oracle可以直接在这个缓冲区中返回记录, 而不需要去和数据库打交道, 可以大大地着少和服务器端的网络来回, 降底服务器上的SQL调用, 根据Benchmarks测试, 对于只读或极少更新的表, 总的消耗时间可以降低500%, 而服务器上的CPU时间可以降低200%.
通过OCI接口,在Client端也可以缓存查询结果。典型的场景就是我们在应用服务器端缓存查询结果,这样在前端执行该查询时,甚至不需要到数据库中去执行该查询。客户端结果缓存在OCI进程中,可以被该进程中的多个session或者线程共享。
要使用这个Cache功能, 也很简单, 首先要使用Oracle 11g的OCI客户端, 如: JDBC-OCI, ODBC, ODB.NET, PHP, Perl等, 无须要去更改现有的程序代码; 其次需要在数据库端指定CLIENT_RESULT_CACHE_SIZE参数来指定这一块Cache的大小, 如果为0则表示禁用。 当该参数大于0时,该特性被启用,同样的,该特性也可以在system、session、table或者语句级来设置。通过在服务端设置参数而不是客户端设置,可以集中的管理该特性,但是也可以在各个客户端单独进行设置,客户端的设置将覆盖服务端的设置。
9、如何使用ADRCI
9.1.关于 ADR Command Interpreter (ADRCI)
一个存放数据库诊断日志、跟踪文件的目录,称作ADR base,对应初始化参数DIAGNOSTIC_DEST,如果设置了ORACLE_BASE环境变量,DIAGNOSTIC_DEST等于ORACLE_BASE,如果没有设置ORACLE_BASE,则等与ORACLE_HOME/log。
关于ADRCI:ADRCI Command-Line Utility 命令行工具,使用该工具查看ADR中的日志和跟踪信息,查看健康报告;还可以将相关错误日志和信息打包成zip文件,以便提供给oracle support分析。在ADRCI工具中可以执行很多命令,另外可以象sqlplus一样执行脚本。
9.2.开始使用ADRCI
9.2.1运行ADRCI,$ORACLE_HOME/bin/adrci
代码:
[root@ractest ~]# su - oracle
[oracle@ractest ~]$ which adrci
~/11g/bin/adrci
[oracle@ractest ~]$ adrci
ADRCI: Release 11.1.0.4.0 - Beta on Thu Jul 12 05:39:29 2007
Copyright (c) 1982, 2006, Oracle. All rights reserved.
ADR base = "/home/oracle"
adrci》
退出ADRCI,在adrci》提示符下敲入exit或者quit , 回车大小写敏感:在adrci中命令大小写不敏感
代码:
adrci》SHOW tracefile
diag/rdbms/orcl/orcl/trace/orcl_ora_20187.trc
diag/rdbms/orcl/orcl/trace/orcl_fbar_11388.
但使用搜索串的时候是敏感的,比如:
SHOW TRACEFILE %mmon%
9.2.2.如何得到帮助信息:
(1)得到adrci中的命令列
代码:
adrci》help
HELP [topic]
Available Topics:
CREATE REPORT
……
(2)也可以使用adrci –help来得到adrci的命令使用和选项。如:
代码:
[oracle@ractest ~]$ adrci -help
Syntax:
adrci [-help] [script=script_filename]
[exec = "one_command [;one_command;…]"]
Options Description (Default)
-----------------------------------------------------------------
script script file name (None)
help help on the command options (None)
exec exec a set of commands (None)
-----------------------------------------------------------------
(3)如何得到特定命令的帮助信息:
adrci》HELP SHOW TRACEFILE
Usage: SHOW TRACEFILE [file1 file2 …] [-rt | -t]
[-i inc1 inc2 …] [-path path1 path2 …]
……
9.2.3.使用ADRCI进行批处理命令或者脚本
(1) 使用exec选项,用分号将命令隔开
这里文档中有个小问题,文档中写ADRCI EXEC="COMMAND[; COMMAND]…",
只能在windows平台这样写,在unix/linux平台下必须用小写来执行。
代码:
adrci》show homes;show base; echo '20070712'
ADR Homes:
diag/rdbms/orcl/orcl
ADR base is "/home/oracle"
20070712
adrci》
adrci》
adrci》exit
[oracle@ractest ~]$ adrci exec="show homes;echo '20070712';echo '';show base; "
ADR Homes:
diag/rdbms/orcl/orcl
20070712
ADR base is "/home/oracle"
(2) 使用script选项。adrci SCRIPT=adrci_script.txt
代码:
[oracle@ractest ~]$ cat /tmp/a
show homes;
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$ cat /tmp/a
fadsfdsa
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$ cat /tmp/a
show trace;
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$ cat /tmp/a
SET HOMEPATH /home/oracle/diag/rdbms/orcl/orcl;show trace;
[oracle@ractest ~]$ adrci script=/tmp/a
[oracle@ractest ~]$
9.3.使用ADRCI查看Oracle数据库后台报警日志(alert_sid.log)和跟踪文件
注意:以下大部分命令都需要用Ctrl+C 来结束,并返回到adrci命令行
1.查看完整alert信息:
adrci》SHOW ALERT
2. 查看最新alert信息:
adrci》 SHOW ALERT –TAIL
查看最新20条alert信息:
adrci》 SHOW ALERT -TAIL 20
只查看600的错误
adrci》SHOW ALERT -P "MESSAGE_TEXT LIKE '%ORA-600%'"
查看ORA-错误信息,注意这里的参数很好,比较人性化,可以帮助提供错误时间
以下该命令的帮助:
代码:
adrci》help show alert
Usage: SHOW ALERT [-p <predicate_string>] [-tail [num]] [-v]
[-file <alert_file_name>]
Purpose: Show alert messages.
Options:
[-p <predicate_string>]: The predicate string must be double quoted.
The fields in the predicate are the fields in the alert message's
XML schema. To get the field definitions, use command:
"describe&
3.查看跟踪文件
常用的有:
(1)列出所有跟踪文件: SHOW TRACEFILE
(2)模糊查询跟踪文件,比如某个进程的,注意这里区分大小写 SHOW TRACEFILE
%mmon%
(3)可以指定某个路径 SHOW TRACEFILE %mmon% -PATH /home/steve/temp
(4)象ls那样按时间排序 SHOW TRACEFILE -RT
9.4.其他体验和说明
9.4.1关于在adrci中执行os命令,可以直接在adrci中执行os命令。
所以当发出一个不存在的命令的时候,错误信息也就是系统返回的了。
代码:
adrci》id
uid=10000(oracle) gid=1001(dba) groups=1001(dba),1002(oinstall)
context=user_u:system_r:unconfined_t
adrci》host date
DIA-48415: Syntax error found in string [host date] at column [9]
adrci》host
[oracle@ractest ~]$ exit
exit
adrci》! -------------这样不行
/bin/bash: -c: line 0: syntax error near unexpected token `newline'
/bin/bash: -c: line 0: `!'
Additional information: 512
adrci》! date -------------这就可以
Thu Jul 12 06:20:40 CST 2007
--------------------------------------------------------------------
[oracle@ractest ~]$ ksh
$ adrci
ADRCI: Release 11.1.0.4.0 - Beta on Thu Jul 12 06:28:14 2007
Copyright (c) 1982, 2006, Oracle. All rights reserved.
ADR base = "/home/oracle"
adrci》abc
/bin/bash: abc: command not found
--------明明在ksh下,却返回bash的错误…
Additional information: 32512
adrci》ksh
$ abc
ksh: abc: not found
9.4.2.确认了在adrci中使用的alert是log.xml,而非alert_orcl.log
对alert进行置空(> file),adrci不受影响;
对log.log进行置空,adrci返回的错误挺吓人的:internal error code,
跟00600一个风格啊……应该是某些tag找不到,就报这么狠的错误
代码:
adrci》show alert
ADR Home = /home/oracle/diag/rdbms/orcl/orcl:
**********************************************************
DIA-48001: internal error code, arguments: [17183],
[0x84B178C], [], [], [], [], [], []
DIA-48154: reached end of file for alert log
DIA-48102: encountered the end-of-file when reading&nb
9.4.3.在adrci中不能使用退格(backspace)怎么办
跟sqlplus一样,有下面几种选择:
用del键;
使用Ctrl+backspace;
使用Ctrl+u删除整行(bash下);
在os命令行下stty erase ^h (可以直接写到oracle的。profile/.bash_profile下面)
9.4.4.另外adrci一个重要的功能是查看Incident和对Incident打包的功能。
10、RMAN
RMAN除了单纯的备份恢复功能,已经被赋予了越来越多的责任,比如创建Standby数据库,比如跨平台传输表空间中的表空间转换。Oracle11g的RMAN倒是没有太多飞跃性的更新。
10.1. 自定义archivelog删除策略
我们知道在11g之前,只有backupset的删除策略可以定义,比如保留多长时间的备份或者保留多少份有效备份,而删除归档日志只有在delete命令中定义删除全部备份完毕的或者删除从哪一个时间点到哪一个时间点的。而在11g中我们已经可以通过configure命令来定义归档日志的删除策略的,比如增加了下面的语法,只有在磁带上备份了2次的归档日志才会被delete命令删除。
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DEVICE TYPE sbt;
当然,仅仅是增加语法那就只能称为比较无聊的新功能了,除了configure语法之外,现在在11g中通过APPLIED ON STANDBY关键字可以定义只有对于所有的standby站点都已经applied的归档日志才会被删除,或者定义所有被成功传送到standby站点的归档日志就可以被删除。而以前这些都需要DBA自己撰写脚本从数据字典中查询到相关信息然后再通过脚本删除。
10.2. 直接通过网络复制数据库
在11g之前如果要使用duplicate命令来复制一份数据库,那么则需要源数据库,需要在目标机器上的一份有效备份,需要目标数据库,在11g中这一切被大大简化。通过FROM ACTIVE DATABASE关键字,我们只需要有一个源数据库,就可以简单地通过网络在另外一台机器上复制一个相同的数据库了。Oracle会通过一系列Memory Script在内存中recover并且open目标数据库。
另外,在11g之前,duplicate数据库是不会自动复制spfile的,而现在,我们通过下面的语句,就可以让Oracle在复制过程中自动生成一份spfile,并且其中的初始化参数允许额外定义。
DUPLICATE TARGET DATABASE
TO aux_db
FROM ACTIVE DATABASE
SPFILE PARAMETER_VALUE_CONVERT '/u01', '/u02'
SET SGA_MAX_SIZE = '200M'
SET SGA_TARGET = '125M'
SET LOG_FILE_NAME_CONVERT = '/u01','/u02'
DB_FILE_NAME_CONVERT '/u01','/u02';
在11g中使用duplicate复制一个数据库的准备步骤只需要目标数据库(AUXILIARY实例):
a. 通过一个最简单的pfile把实例启动到nomount状态,这个pfile中只需要包含DB_NAME和REMOTE_LOGIN_PASSWORFILE参数即可
b. password文件必须事先建好,而且SYS密码需要跟source数据库中相同,这个通过orapwd可以轻松完成
c. 目录结构需要事先创建好并且具有正确的权限
10.3. 并行备份大文件
现在Oracle数据库中单个数据文件可以最大到128T,而在以前的版本中RMAN的最小备份单位就是datafile,那么对于以后可能出现的这种超大数据文件,RMAN备份就几乎无法操作了。在11g中,通过backup命令中的SECTION SIZE关键字,我们可以对数据文件指定section了,每个section都作为一个独立单位来处理,每个数据文件可以最多指定256个section。
Section的好处在于,
一可以并行备份多个section,提高备份速度;
二可以分多个时间分别备份一个大文件的多个section,时间上化整为零,更具有操作性。
10.4. RMAN Catalog管理性增强
IMPORT CATALOG命令允许我们将一个catalog库中的信息转储到另外一个catalog库,这在以前完全需要手工操作。
推出Virtual Recovery Catalogs概念,这是VPD的实例应用,对于一个集中管理的catalog设置多个用户的虚拟catalog,每个用户只能管理自己的数据,安全性的进一步提高。
11、两个特性
11.1 归档日志压缩
其中一个是归档日志压缩的功能。通过设置初始化参数 log_archive_dest_n 中 compression 选项,可以对归档文件进行压缩生成。对于网络传输比较吃紧的环境,这个功能会很有价值。
11.2 物理 Standby 可以联机查询
11g 据说也可以对物理的 Standby 进行联机查询,前提条件是激活 Redo Apply 。10g 之前,物理 Standby 都是要么恢复状态,要么 Read Only 状态。如果能够边恢复边查询的话,那么简直是一个比较完美的 IO 分布的技术方案了。SharePlex 之类的产品市场会又小不少。
12、Database和SQL重演
Database Replay是指在产品环境的数据库上捕获所有负载,并可以将之传送至Standby数据库或由备份恢复的测试库上,在测试环境中重演主库的环境,这使得升级或者软件更新可以进行预先的"真实"测试,或者可以通过测试环境完全再现真实环境的负载及运行情况。
在我看来,这是Oracle向后追溯能力的又一增强,在Oracle10g中,我们知道Oracle通过v$session_wait_history视图,ASH特性等,实现将数据库的等待事件向后追溯,现在通过Database Replay特性,Oracle可以将整个数据库的负载捕获、记录并实现Replay,也就是整个数据库的向后追溯能力。
这一特性提供的再现现场能力,极大的丰富了我们发现并解决数据库问题的手段,将为数据库管理带来更多的方便之处。
当然使用这一特性会带来一定的性能负担,Oracle说这一负担在5%左右。
这一特性的简化版本就是SQL Replay,即只捕获SQL负载,通过SQL负载应用再现SQL影响:
Oracle已经有了一系列的Flashback,现在又有了Replay;Flashback可以向后闪回,Replay可以向前推演,Oracle给用户提供的手段越来越多,期待这一特性在正式版中能够有完美的展现。
13、Server Connection Pool
在应用服务器这一层, 我们已经使用Connection Pool了, 可以有效地降低服务器上的连接的数量, 不过还是有不足之处的。 当你的访问量达到一定的规模时, 你会发现一台或几台应用服务器根本就解决不了问题, 在有些世界级的网站中, 应用服务器的数量可能是上千台的, 当每个应用服务器产生4-5个连接时, 你会发现Oracle服务器端便有了4-5千个物理连接。 象PHP程序, 要求每一个Web Server进程都至少有一个连接。 因此Oracle在11g中引入了Database Resident Connection Pool的功能, 这样客户端就可以不管连接池了, 由Oracle在服务器端进行连接共享控制。
通过增加一个后台进程CMON(Connection Monitor)来管理连接, 应用发出连接请求时, 实际上是连接到CMON进程, 然后由CMON进程分配一个已经连接好的后台进程, 当客户端连接关闭后, 这个后台进程又交由CMON进程管理。 估计PHP这类的Web程序要有福气了, 不需要去实现连接池的代码了。
14、其他地方
14.1 RAC节点通信协议的改进。
11g中的协议比较智能, 可以根据节点的负荷作出动态的调整, 大大减少节点之间的消息传递量。
14.2 边恢复边Open的Physical Standby -- Highly Available Reader Farms
这个功能肯定很受大公司的欢迎, 因为以前的Data Guard不能做到这样, 当Open时同主库的延迟会越来越大, 而在11g中则不存在这样的延迟, 因此可以建几个这样的Standby来分担读操作, 估计Shareplex或Realsync这样的软件市场要受到一定的影响了, 我对Log的研究也变得越来越没有价值了。
14.3 面向OLTP的压缩表
在新的压缩技术中, Oracle可以去掉了压缩表的诸多限制, 使之可以适合OLTP的环境。 这样Oracle可以充分利用闲的CPU的资源(CPU越来越历害了), 以降低IO的消耗(IO的提高还是很慢)。