联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
作为新一代dba(包括我),很少有机会能够接触到ORACLE 8.0.5数据库.今天无意中获得该版本软件安装包,赶紧安装截图出来和大家分享.
ORACLE 8.0.5完整安装截图下载oracle_8.0.5_install_pic
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
作为新一代dba(包括我),很少有机会能够接触到ORACLE 8.0.5数据库.今天无意中获得该版本软件安装包,赶紧安装截图出来和大家分享.
ORACLE 8.0.5完整安装截图下载oracle_8.0.5_install_pic
联系:手机/微信(+86 17813235971) QQ(107644445)
标题:cache buffer lru chain latch等待事件
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
cache buffer lru chain latch官方解释
The cache buffer lru chain latch is acquired in order to introduce a new block into the buffer cache and when writing a buffer back to disk, specifically when trying to scan the LRU (least recently used) chain containing all the dirty blocks in the buffer cache.
cache buffer lru chain latch可能原因
想查看或者修改LRU+LRUW的进程,始终要持有cache buffers lru chain latch。 若在此过程中发生争用,则要等待latch:cache buffers lru chain 事件。 总结出来如下两种情况会导致cache buffers lru chain latch: 1.进程欲读取还没有装载到内存上的块时,通过查询LRU 列分配到所需空闲缓冲区,在此过程中需要cache buffers lru chain latch。 2.DBWR 为了将脏缓冲区记录到文件上,查询LRUW 列,将相应缓冲区移动到LRU 列的过程中也要获得cache buffers lru chain latch。 2.1)DBWR在如下情况下将脏缓冲区记录到文件里。 2.2)Oracle 进程为了获得空闲缓冲区,向DBWR 请求记录脏缓冲区时; 2.3)Oracle进程为执行Parallel Query 或Tablespace Backup,Truncate/Drop 等工作,请求记录相关对象的脏缓冲区时; 2.4)周期性或管理上的原因检查点(checkpointing)被执行时。 2.5)Oracle 为了保障将通过FAST_START_MTTR_TARGET(或LOG_CHECKPOINT_TIMEOUT)指定的时间的恢复,周期性执行检查点。 2.6)管理员执行检查点命令或根据日志文件切换,也会发生检查点。
cache buffers lru chain latch争用的最重要的原因是过多请求空闲缓冲区。低效的SQL语句是过多请求空闲缓冲区的最典型情况,若多个会话同时执行低效的SQL语句,则在查询空闲缓冲区过程中和记录脏缓冲区的过程中,为了获取buffers lru chain latch发生争用。多个会话同时扫描不同表或索引时,发生cache buffers lru chain latch争用的概率高。多个会话将各不相同的块载入到内存过程中,确保空闲缓冲区的请求会增多,因此发生对工作组争用的概率将提高。特别是因为数据修改频繁,以至于脏缓冲区数量多,正因此DBWR 因为检查点而查询LRUW 列的次数频繁,所以cache buffers lru chain latch争用将更加严重。cache buffers lru chain latch争用的另一个重要特点就是伴随着物理I/O。若是低效的索引扫描引起的问题,则同时发生db file sequential read 等待和lru chain latch争用;若是不必要的全表扫描引起的问题,则同时发生db file scattered read 等待和lru chain latch争用。事实上,cache buffers chains latch争用和cache buffers lru chain latch争用同时发生的情况较多,因为复杂的应用程序将复合地应用上述模式。data buffer过小或检查点周期过短时,也会增加cache buffers lru chain latch争用;但是现在的数据库的data buffer都不会太小,而检查点周期一般使用缺省值,所以通常定位cache buffers lru chain latch的原因还是在低效的SQL语句上
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
关于CACHE BUFFERS CHAINS描述
CACHE BUFFERS CHAINS latch is acquired when searching for data blocks cached in the buffer cache. Since the Buffer cache is implemented as a sum of chains of blocks, each of those chains is protected by a child of this latch when needs to be scanned. Contention in this latch can be caused by very heavy access to a single block. This can require the application to be reviewed.
产生CACHE BUFFERS CHAINS原因
The main cause of the cache buffers chains latch contention is usually a hot block issue. This happens when multiple sessions repeatedly access one or more blocks that are protected by the same child cache buffers chains latch.
CACHE BUFFERS CHAINS 处理方法
1) Examine the application to see if the execution of certain DML and SELECT statements can be reorganized to eliminate contention on the object.
处理方法如下: --通过报告确定latch: cache buffers chains 等待 Top 5 Timed Events Avg %Total ~~~~~~~~~~~~~~~~~~ wait Call Event Waits Time (s) (ms) Time Wait Class ------------------------------ ------------ ----------- ------ ------ ---------- latch: cache buffers chains 74,642 35,421 475 6.1 Concurrenc CPU time 11,422 2.0 log file sync 34,890 1,748 50 0.3 Commit latch free 2,279 774 340 0.1 Other db file parallel write 18,818 768 41 0.1 System I/O ------------------------------------------------------------- --找出逻辑读高sql SQL ordered by Gets DB/Inst: Snaps: 1-2 -> Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code. -> Total Buffer Gets: 265,126,882 -> Captured SQL account for 99.8% of Total Gets CPU Elapsed Buffer Gets Executions per Exec %Total Time (s) Time (s) SQL Id -------------- ------------ ------------ ------ -------- --------- ------------- 256,763,367 19,052 13,477.0 96.8 ######## ######### a9nchgksux6x2 Module: JDBC Thin Client SELECT * FROM SALES .... 1,974,516 987,056 2.0 0.7 80.31 110.94 ct6xwvwg3w0bv SELECT COUNT(*) FROM ORDERS .... --逻辑读大对象 Segments by Logical Reads -> Total Logical Reads: 265,126,882 -> Captured Segments account for 98.5% of Total Tablespace Subobject Obj. Logical Owner Name Object Name Name Type Reads %Total ---------- ---------- -------------------- ---------- ----- ------------ ------- DMSUSER USERS SALES TABLE 212,206,208 80.04 DMSUSER USERS SALES_PK INDEX 44,369,264 16.74 DMSUSER USERS SYS_C0012345 INDEX 1,982,592 .75 DMSUSER USERS ORDERS_PK INDEX 842,304 .32 DMSUSER USERS INVOICES TABLE 147,488 .06 ------------------------------------------------------------- 处理思路: 1.Look for SQL that accesses the blocks in question and determine if the repeated reads are necessary. This may be within a single session or across multiple sessions. 2.Check for suboptimal SQL (this is the most common cause of the events) look at the execution plan for the SQL being run and try to reduce the gets per executions which will minimize the number of blocks being accessed and therefore reduce the chances of multiple sessions contending for the same block.
Note:1342917.1 Troubleshooting ‘latch: cache buffers chains’ Wait Contention
2) Decrease the buffer cache -although this may only help in a small amount of cases.
3) DBWR throughput may have a factor in this as well.If using multiple DBWR’s then increase the number of DBWR’s.
4) Increase the PCTFREE for the table storage parameters via ALTER TABLE or rebuild. This will result in less rows per block.
找出热点对象 First determine which latch id(ADDR) are interesting by examining the number of sleeps for this latch. The higher the sleep count, the more interesting the latch id(ADDR) is: SQL> select CHILD# "cCHILD" , ADDR "sADDR" , GETS "sGETS" , MISSES "sMISSES" , SLEEPS "sSLEEPS" from v$latch_children where name = 'cache buffers chains' order by 5, 1, 2, 3; Run the above query a few times to to establish the id(ADDR) that has the most consistent amount of sleeps. Once the id(ADDR) with the highest sleep count is found then this latch address can be used to get more details about the blocks currently in the buffer cache protected by this latch. The query below should be run just after determining the ADDR with the highest sleep count. SQL> column segment_name format a35 select /*+ RULE */ e.owner ||'.'|| e.segment_name segment_name, e.extent_id extent#, x.dbablk - e.block_id + 1 block#, x.tch, l.child# from sys.v$latch_children l, sys.x$bh x, sys.dba_extents e where x.hladdr = '&ADDR' and e.file_id = x.file# and x.hladdr = l.addr and x.dbablk between e.block_id and e.block_id + e.blocks -1 order by x.tch desc ; Example of the output : SEGMENT_NAME EXTENT# BLOCK# TCH CHILD# -------------------------------- ------------ ------------ ------ ---------- SCOTT.EMP_PK 5 474 17 7,668 SCOTT.EMP 1 449 2 7,668 Depending on the TCH column (The number of times the block is hit by a SQL statement), you can identify a hot block. The higher the value of the TCH column, the more frequent the block is accessed by SQL statements.
5) Consider implementing reverse key indexes (if range scans aren’t commonly used against the segment)
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
发现监听进程监听8080和2100端口
--监听端口 [oracle@xifenfei ~]$ netstat -nap|grep tnslsnr (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 29866/tnslsnr tcp 0 0 0.0.0.0:1521 0.0.0.0:* LISTEN 29866/tnslsnr tcp 0 0 0.0.0.0:2100 0.0.0.0:* LISTEN 29866/tnslsnr --进程名称 [oracle@xifenfei ~]$ ps -ef|grep 29866 oracle 29866 1 0 00:20 pts/0 00:00:00 /u01/oracle/9.2.0/db_1/bin/tnslsnr LISTENER -inherit
查看监听状态
[oracle@xifenfei ~]$ lsnrctl status LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 08-MAY-2012 00:26:50 Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xifenfei)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 9.2.0.4.0 - Production Start Date 08-MAY-2012 00:20:47 Uptime 0 days 0 hr. 6 min. 3 sec Trace Level off Security OFF SNMP OFF Listener Parameter File /u01/oracle/9.2.0/db_1/network/admin/listener.ora Listener Log File /u01/oracle/9.2.0/db_1/network/log/listener.log Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xifenfei)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xifenfei)(PORT=8080))(Presentation=HTTP)(Session=RAW)) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xifenfei)(PORT=2100))(Presentation=FTP)(Session=RAW)) Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... Service "xffXDB" has 1 instance(s). Instance "xff", status READY, has 1 handler(s) for this service... Service "xifenfei" has 2 instance(s). Instance "xff", status UNKNOWN, has 1 handler(s) for this service... Instance "xff", status READY, has 1 handler(s) for this service... The command completed successfully --从这里可以看出oracle的listener确实监听了8080和2100端口
查看listener.ora文件
[oracle@xifenfei ~]$ more /u01/oracle/9.2.0/db_1/network/admin/listener.ora # LISTENER.ORA Network Configuration File: /u01/oracle/9.2.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xifenfei)(PORT = 1521)) ) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/oracle/9.2.0/db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = xifenfei) (ORACLE_HOME = /u01/oracle/9.2.0/db_1) (SID_NAME = xff) ) ) --从中确认未监听8080和2100端口,看来这两个端口是在动态注册监听的时候加入进去的. --我们知道oracle的xdb组件可能会启用http和ftp功能,这两个功能可能会开启响应端口,我们分析xdb组件.
查看xdb组件是否工作正常
SQL> select 2 comp_name, status, version from 3 DBA_REGISTRY where 4 comp_name='Oracle XML Database'; COMP_NAME STATUS VERSION ------------------------------ ---------------------- ---------- Oracle XML Database VALID 9.2.0.4.0 SQL> select count(*) from dba_objects where owner='XDB' and status='INVALID'; COUNT(*) ---------- 0 SQL> show parameter dispatchers; NAME TYPE VALUE ------------------------------------ ---------------------- ------------------------------ dispatchers string (PROTOCOL=TCP) (SERVICE=xffXDB) max_dispatchers integer 5 mts_dispatchers string (PROTOCOL=TCP) (SERVICE=xffXDB) mts_max_dispatchers integer 5 --查询证明xdb组件应该工作正常
查看xdb中ftp和http启动相关端口
SQL> select dbms_xdb.GETFTPPORT() from dual; select dbms_xdb.GETFTPPORT() from dual * ERROR at line 1: ORA-00904: "DBMS_XDB"."GETFTPPORT": invalid identifier SQL> select dbms_xdb.GETHTTPPORT() from dual; select dbms_xdb.GETHTTPPORT() from dual * ERROR at line 1: ORA-00904: "DBMS_XDB"."GETHTTPPORT": invalid identifier --9i中为提供上述查询端口的相关程序. SQL> set long 10000 SQL> set pagesize 0 SQL> SELECT dbms_xdb.cfg_get FROM dual; --从中找到类此这样记录,确实ftp启用2100端口,http启用8080端口 <ftpconfig> <ftp-port>2100</ftp-port> <ftp-listener>local_listener</ftp-listener> <ftp-protocol>tcp</ftp-protocol> <session-timeout>6000</session-timeout> </ftpconfig> <httpconfig> <http-port>8080</http-port> <http-listener>local_listener</http-listener> <http-protocol>tcp</http-protocol> <session-timeout>6000</session-timeout> <server-name>XDB HTTP Server</server-name> </httpconfig> --到这里我们可以确定是由于xdb组件中的ftp和http功能自动注册导致监听了2100和8080端口
修改xdb中监听ftp和http端口
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),' 2 /xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8888)); Call completed. SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), 2 '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2222)); Call completed. SQL> commit; Commit complete. SQL> exec dbms_xdb.cfg_refresh; PL/SQL procedure successfully completed. SQL> exit Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.4.0 - Production [oracle@xifenfei ~]$ lsnrctl status LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 08-MAY-2012 00:57:13 Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xifenfei)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 9.2.0.4.0 - Production Start Date 08-MAY-2012 00:20:47 Uptime 0 days 0 hr. 36 min. 26 sec Trace Level off Security OFF SNMP OFF Listener Parameter File /u01/oracle/9.2.0/db_1/network/admin/listener.ora Listener Log File /u01/oracle/9.2.0/db_1/network/log/listener.log Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xifenfei)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xifenfei)(PORT=8888))(Presentation=HTTP)(Session=RAW)) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xifenfei)(PORT=2222))(Presentation=FTP)(Session=RAW)) Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... Service "xffXDB" has 1 instance(s). Instance "xff", status READY, has 1 handler(s) for this service... Service "xifenfei" has 2 instance(s). Instance "xff", status UNKNOWN, has 1 handler(s) for this service... Instance "xff", status READY, has 1 handler(s) for this service... The command completed successfully
xdb中ftp和http监听
SQL> alter system reset dispatchers scope=spfile sid='*'; System altered. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 353441008 bytes Fixed Size 451824 bytes Variable Size 184549376 bytes Database Buffers 167772160 bytes Redo Buffers 667648 bytes Database mounted. Database opened. SQL> show parameter dispatchers; NAME TYPE VALUE ------------------------------------ ---------------------- --------- dispatchers string max_dispatchers integer 5 mts_dispatchers string mts_max_dispatchers integer 5 --SELECT dbms_xdb.cfg_get FROM dual;中信息 <ftpconfig> <ftp-port>2222</ftp-port> <ftp-listener>local_listener</ftp-listener> <ftp-protocol>tcp</ftp-protocol> <session-timeout>6000</session-timeout> </ftpconfig> <httpconfig> <http-port>8888</http-port> <http-listener>local_listener</http-listener> <http-protocol>tcp</http-protocol> <session-timeout>6000</session-timeout> <server-name>XDB HTTP Server</server-name> </httpconfig> [oracle@xifenfei dbs]$ lsnrctl status LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 08-MAY-2012 01:10:07 Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xifenfei)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 9.2.0.4.0 - Production Start Date 08-MAY-2012 00:20:47 Uptime 0 days 0 hr. 49 min. 20 sec Trace Level off Security OFF SNMP OFF Listener Parameter File /u01/oracle/9.2.0/db_1/network/admin/listener.ora Listener Log File /u01/oracle/9.2.0/db_1/network/log/listener.log Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xifenfei)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC))) Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... Service "xifenfei" has 2 instance(s). Instance "xff", status UNKNOWN, has 1 handler(s) for this service... Instance "xff", status READY, has 1 handler(s) for this service... The command completed successfully --证明已经关闭了xdb 组件的ftp/http监听
xdb组件中的ftp/http监听在9i数据库中,只要你安装了xdb组件,会自动启用这功能.
在10g及其11g中默认不启用.所以为了你的数据库安全,如果不使用这些功能,建议手工关闭
active databa 列表
[db2inst1@xifenfei ~]$ db2 list active databases Active Databases Database name = XIFENFEI Applications connected currently = 1 Database path = /home/db2inst1/db2inst1/NODE0000/SQL00003/
查看db2各个组件内存分配
[db2inst1@xifenfei ~]$ db2mtrk -i -p -v -d Tracking Memory on: 2012/05/07 at 22:13:44 Memory for instance Other Memory is of size 10682368 bytes FCMBP Heap is of size 786432 bytes Database Monitor Heap is of size 327680 bytes Total: 11796480 bytes Memory for database: XIFENFEI Backup/Restore/Util Heap is of size 65536 bytes Package Cache is of size 196608 bytes Other Memory is of size 131072 bytes Catalog Cache Heap is of size 65536 bytes Buffer Pool Heap (1) is of size 72482816 bytes Buffer Pool Heap (System 32k buffer pool) is of size 851968 bytes Buffer Pool Heap (System 16k buffer pool) is of size 589824 bytes Buffer Pool Heap (System 8k buffer pool) is of size 458752 bytes Buffer Pool Heap (System 4k buffer pool) is of size 393216 bytes Shared Sort Heap is of size 65536 bytes Lock Manager Heap is of size 10551296 bytes Database Heap is of size 13172736 bytes Application Heap (13) is of size 65536 bytes Application Heap (12) is of size 65536 bytes Application Heap (11) is of size 65536 bytes Application Heap (10) is of size 65536 bytes Application Heap (9) is of size 65536 bytes Applications Shared Heap is of size 196608 bytes Total: 99549184 bytes Memory for agent 33 Other Memory is of size 196608 bytes Total: 196608 bytes Memory for agent 32 Other Memory is of size 196608 bytes Total: 196608 bytes Memory for agent 31 Other Memory is of size 196608 bytes Total: 196608 bytes Memory for agent 30 Other Memory is of size 196608 bytes Total: 196608 bytes Memory for agent 19 Other Memory is of size 393216 bytes Total: 393216 bytes
查看内存统计(9.5及其以后版本)
[db2inst1@xifenfei ~]$ db2pd -dbptnmem -db xff Database XFF not activated on database partition 0. Option -dbptnmem is an instance scope option. The database option has been ignored. Database Partition 0 -- Active -- Up 0 days 00:05:30 -- Date 2012-05-07-22.16.43.375064 Database Partition Memory Controller Statistics Controller Automatic: Y Memory Limit: 775904 KB Current usage: 306560 KB HWM usage: 306816 KB Cached memory: 78144 KB Individual Memory Consumers: Name Mem Used (KB) HWM Used (KB) Cached (KB) ======================================================== APPL-XIFENFEI 40000 40000 39488 DBMS-db2inst1 31936 31936 4992 FMP_RESOURCES 22528 22528 0 PRIVATE 6272 6272 0 LCL-p8353 128 128 0 LCL-p8353 128 128 0 DB-XIFENFEI 205568 205568 33664
查看内存段粗略信息
可以通过-db database 指定具体数据库
[db2inst1@xifenfei ~]$ db2pd -memset Database Partition 0 -- Active -- Up 0 days 00:18:39 -- Date 2012-05-07-22.29.52.410789 Memory Sets: Name Address Id Size(Kb) Key DBP Type Unrsv(Kb) Used(Kb) HWM(Kb) Cmt(Kb) Uncmt(Kb) DBMS 0x10000000 32769 31936 0xF5EDE61 0 0 4992 11648 11648 11648 20288 FMP 0x11F30000 65538 22592 0x0 0 0 2 0 192 22592 0 Trace 0x00000000 0 8510 0xF5EDE74 0 -1 0 8510 0 8510 0 --指定数据库名称 [db2inst1@xifenfei ~]$ db2pd -memset -db xifenfei Database Partition 0 -- Database XIFENFEI -- Active -- Up 0 days 01:26:18 -- Date 2012-05-07-23.56.47.325997 Memory Sets: Name Address Id Size(Kb) Key DBP Type Unrsv(Kb) Used(Kb) HWM(Kb) Cmt(Kb) Uncmt(Kb) XIFENFEI 0xA62E9000 1015815 205632 0x0 0 1 33664 96832 96832 96832 108800 AppCtl 0xB2BB9000 983046 40064 0x0 0 12 0 576 832 832 39232 App38 0x00000000 0 0 0x0 0 0 0 0 0 0 0 App37 0x00000000 0 0 0x0 0 0 0 0 0 0 0 App36 0x00000000 0 0 0x0 0 0 0 0 0 0 0 App35 0x00000000 0 0 0x0 0 0 0 0 0 0 0 App34 0x000E8005 950277 128 0x0 0 4 0 128 0 128 0
查看内存段具体信息
[db2inst1@xifenfei ~]$ db2pd -mempool Database Partition 0 -- Active -- Up 0 days 00:18:48 -- Date 2012-05-07-22.30.01.008074 Memory Pools: Address MemSet PoolName Id Overhead LogSz LogUpBnd LogHWM PhySz PhyUpBnd PhyHWM Bnd BlkCnt CfgParm 0x10000AA4 DBMS fcm 74 0 0 608414 0 0 655360 0 Ovf 0 n/a 0x100009F0 DBMS fcmsess 77 65440 845168 1118208 845168 983040 1179648 983040 Ovf 3 n/a 0x1000093C DBMS fcmchan 79 65440 159488 405504 159488 327680 458752 327680 Ovf 3 n/a 0x10000888 DBMS fcmbp 13 65440 590592 860160 590592 786432 917504 786432 Ovf 3 n/a 0x100007D4 DBMS fcmctl 73 186304 1176241 3118764 1176241 1376256 3145728 1376256 Ovf 11 n/a 0x10000720 DBMS monh 11 122592 144003 368640 144251 327680 393216 327680 Ovf 18 MON_HEAP_SZ 0x1000066C DBMS resynch 62 26928 104080 1703936 104080 196608 1703936 196608 Ovf 2 n/a 0x100005B8 DBMS apmh 70 2672 459104 4325376 459636 524288 4325376 524288 Ovf 25 n/a 0x10000504 DBMS kerh 52 112 276828 3997696 276828 327680 3997696 327680 Ovf 65 n/a 0x10000450 DBMS bsuh 71 65408 2235556 8978432 2266560 2359296 8978432 2359296 Ovf 44 n/a 0x1000039C DBMS sqlch 50 0 1681833 1703936 1681833 1703936 1703936 1703936 Ovf 203 n/a 0x100002E8 DBMS krcbh 69 0 106248 65536 106352 131072 65536 131072 Ovf 14 n/a 0x10000234 DBMS eduah 72 1904 2816016 2816048 2816016 2818048 2818048 2818048 Ovf 1 n/a 0x11F30234 FMP undefh 59 8048 122900 22971520 122900 131072 23003136 131072 Phy 1 n/a --指定数据库名称 [db2inst1@xifenfei ~]$ db2pd -mempool -db xifenfei Database Partition 0 -- Database XIFENFEI -- Active -- Up 0 days 00:05:29 -- Date 2012-05-07-22.35.58.149684 Memory Pools: Address MemSet PoolName Id Overhead LogSz LogUpBnd LogHWM PhySz PhyUpBnd PhyHWM Bnd BlkCnt CfgParm 0xA62E9E28 XIFENFEI utilh 5 0 2120 24313856 2544 65536 24313856 65536 Ovf 10 UTIL_HEAP_SZ 0xA62E9CC0 XIFENFEI pckcacheh 7 29216 115799 Unlimited 117211 196608 Unlimited 196608 Ovf 4 PCKCACHESZ 0xA62E9C0C XIFENFEI xmlcacheh 93 50944 80008 20971520 80008 131072 20971520 131072 Ovf 1 n/a 0xA62E9B58 XIFENFEI catcacheh 8 0 59488 Unlimited 59488 65536 Unlimited 65536 Ovf 9 CATALOGCACHE_SZ 0xA62E99F0 XIFENFEI bph 16 114464 72118000 Unlimited 72118000 72482816 Unlimited 72482816 Ovf 535 n/a 0xA62E9888 XIFENFEI bph 16 32 782592 Unlimited 782592 851968 Unlimited 851968 Ovf 5 n/a 0xA62E9720 XIFENFEI bph 16 32 520448 Unlimited 520448 589824 Unlimited 589824 Ovf 3 n/a 0xA62E95B8 XIFENFEI bph 16 32 389376 Unlimited 389376 458752 Unlimited 458752 Ovf 2 n/a 0xA62E9450 XIFENFEI bph 16 32 323840 Unlimited 323840 393216 Unlimited 393216 Ovf 2 n/a 0xA62E939C XIFENFEI shsorth 18 0 8860 28770304 8860 65536 28770304 65536 Ovf 16 SHEAPTHRES_SHR 0xA62E92E8 XIFENFEI lockh 4 32 10487424 10616832 10487424 10551296 10616832 10551296 Ovf 1 LOCKLIST 0xA62E9234 XIFENFEI dbh 2 419040 12439291 24903680 12441635 13172736 24903680 13172736 Ovf 739 DBHEAP 0xB2BB966C AppCtl apph 1 0 7452 1048576 7452 65536 1048576 65536 Phy 17 APPLHEAPSZ 0xB2BB95B8 AppCtl apph 1 0 7452 1048576 7452 65536 1048576 65536 Phy 17 APPLHEAPSZ 0xB2BB9504 AppCtl apph 1 0 7452 1048576 8864 65536 1048576 65536 Phy 17 APPLHEAPSZ 0xB2BB9450 AppCtl apph 1 0 7452 1048576 7452 65536 1048576 65536 Phy 17 APPLHEAPSZ 0xB2BB92E8 AppCtl apph 1 0 7726 1048576 18084 65536 1048576 65536 Phy 20 APPLHEAPSZ 0xB2BB9234 AppCtl appshrh 20 2048 127088 20480000 144484 196608 20512768 196608 Phy 25 application shared
联系:手机/微信(+86 17813235971) QQ(107644445)
标题:使用dblink导致的/*+ OPAQUE_TRANSFORM */
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
数据库版本
--目标端 SQL> select * from v$version; BANNER ----------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for 32-bit Windows: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production --源端 SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi PL/SQL Release 10.2.0.4.0 - Production CORE 10.2.0.4.0 Production TNS for Linux: Version 10.2.0.4.0 - Production NLSRTL Version 10.2.0.4.0 - Production
目标端创建dblink
SQL> create database link dblink_xff connect to test identified by 2 test using 'ip/mcrm'; 数据库链接已创建。
dblink查询操作测试
--目标端 SQL> select count(*) from t_xifenfei@dblink_xff; COUNT(*) ---------- 50645 --源端 SQL> select sql_text from v$sql where lower(sql_text) like '%t_xifenfei%' and sql_text not like '%lower(%' and sql_text not like '%OPT_DYN_SAMP%'; SQL_TEXT ------------------------------------------------------------------- SELECT COUNT(*) FROM "T_XIFENFEI" "A1" SELECT /*+ FULL(P) +*/ * FROM "T_XIFENFEI" P
dblink创建空表测试
--目标端 SQL> create table chf.t_xifenfei as select * from t_xifenfei@dblink_xff where 1=0; 表已创建。 --源端 SQL> select sql_text from v$sql where lower(sql_text) like '%t_xifenfei%' and sql_text not like '%lower(%' and sql_text not like '%OPT_DYN_SAMP%'; SQL_TEXT ---------------------------------------------------------------------------- SELECT /*+ FULL(P) +*/ * FROM "T_XIFENFEI" P
dblink创建表插入数据
--目标端 SQL> create table chf.t_xifenfei_new as select * from t_xifenfei@dblink_xff; 表已创建。 --源端 SQL> select sql_text from v$sql where lower(sql_text) like '%t_xifenfei%' and sql_text not like '%lower(%' and sql_text not like '%OPT_DYN_SAMP%'; SQL_TEXT -------------------------------------------------------------------------------- SELECT /*+ FULL(P) +*/ * FROM "T_XIFENFEI" P SELECT "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID","DATA_OBJECT_ID","OBJE CT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMPORARY","GENERATED", "SECONDARY" FROM "T_XIFENFEI" "T_XIFENFEI"
dblink insert select插入数据测试
--目标端 SQL> insert into chf.t_xifenfei 2 select * from t_xifenfei@dblink_xff; 已创建 50645 行。 --源端 SQL> select sql_text from v$sql where lower(sql_text) like '%t_xifenfei%' and sql_text not like '%lower(%' and sql_text not like '%OPT_DYN_SAMP%'; SQL_TEXT -------------------------------------------------------------------------------- SELECT /*+ FULL(P) +*/ * FROM "T_XIFENFEI" P SELECT /*+ OPAQUE_TRANSFORM */ "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID ","DATA_OBJECT_ID","OBJECT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS", "TEMPORARY","GENERATED","SECONDARY" FROM "T_XIFENFEI" "T_XIFENFEI"
除掉OPAQUE_TRANSFORM 提示
--目标端 SQL> alter session set events '22825 trace name context forever, level 1' ; 会话已更改。 SQL> insert into chf.t_xifenfei 2 select * from t_xifenfei@dblink_xff; 已创建 50645 行。 --源端 SQL> select sql_text from v$sql where lower(sql_text) like '%t_xifenfei%' and sq l_text not like '%lower(%' and sql_text not like '%OPT_DYN_SAMP%'; SQL_TEXT -------------------------------------------------------------------------------- SELECT /*+ FULL(P) +*/ * FROM "T_XIFENFEI" P SELECT "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID","DATA_OBJECT_ID","OBJE CT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMPORARY","GENERATED", "SECONDARY" FROM "T_XIFENFEI" "T_XIFENFEI"
通过dblink的相关实验可以得出,在 insert-as-remote-select的时候,源端库上会出现/*+ OPAQUE_TRANSFORM */的hint提示.该hint的作用是:给出源端目标端要求的数据类型的明确信息(The OPAQUE_TRANSFORM hint is to help with the transformation of datatype when certain type of operations are done within the database).屏蔽盖hint的方法是设置event:22825 trace name context forever, level 1(官方文档还提供了另外两种hint的方式屏蔽这个,但是我测试均未成功)
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
AIX默认安装ksh,对于习惯了bash的人来说,不能tab自动补全,不能翻上/下,感觉使用起来很不方便,在ksh中不能直接实现这些功能,可以使用另外的方法来完成
一.安装bash程序,使用起来就和bash一样
二.ksh中通过其他方法完成
翻上/下条功能
1、在主目录中 vi .profile
2、添加一行:export EDITOR=vi
3、保存.profile,重新登陆;或者source ~/.profile
现在如果要使用翻上/下条功能,只需要按下esc键,然后使用j/k翻上/下即可;如果要退回到输入功能,直接输入i,然后输入即可.其实所有操作就是和vi中的操作一样.
自动补全功能
使用esc+\
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
在最近的一次数据库异常恢复过程中遇到不少问题,把重点记录下
ORA-00704/ORA-01555错误
Fri May 4 21:04:21 2012 select ctime, mtime, stime from obj$ where obj# = :1 Fri May 4 21:04:21 2012 Errors in file /oracle/admin/standdb/udump/perfdb_ora_1286288.trc: ORA-00704: bootstrap process failure ORA-00704: bootstrap process failure ORA-00604: error occurred at recursive SQL level 1 ORA-01555: snapshot too old: rollback segment number 40 with name "_SYSSMU40$" too small Error 704 happened during db open, shutting down database USER: terminating instance due to error 704 Instance terminated by USER, pid = 1286288 ORA-1092 signalled during: alter database open resetlogs... 这里的提示可以看出obj$基表中有事务存在,查询这个表的时候,要去找40号回滚段中相关数据;通过非常规方法, 查找到40号回滚段的状态是offliine了(这个查询出来的信息和是否使用隐含参数无关). 问题原因,为什么40号回滚段变得offline? Fri May 4 17:36:26 2012 alter tablespace undotbs offline Fri May 4 17:36:26 2012 ORA-1109 signalled during: alter tablespace undotbs offline... Fri May 4 17:37:29 2012 alter database datafile '/dev/rundodbs01' offline drop Fri May 4 17:37:29 2012 Completed: alter database datafile '/dev/rundodbs01' offline drop 因为强制offline 了file# 2文件导致(一个undo表空间文件) 解决方法: 1.bbed提交事务 因为现在生产的trace文件中未有关于obj$ 未提交事务的记录,做10046也为发现该记录,如果要使用bbed修改该事务, 那需要dump obj$相关的数据块(在mount状态下dump),然后找到相关事务,再修改 2.强制让file# 2 online 因为在resetlogs前file#2 已经offline掉了,所以要使得该文件能够成功online,需要先推进scn
ORA-00600[krhpfh_03-1209]
SQL> recover database until cancel; ORA-00283: recovery session canceled due to errors ORA-00600: internal error code, arguments: [krhpfh_03-1209], [2], [782415504], [782428968], [3987078030], [2379], [0], [0] ORA-01110: data file 2: '/dev/rundodbs01' 问题原因: 数据库处于非归档模式下,连续三次resetlogs,引起该bug 解决办法: 重建控制文件 但是这里问题出现了,因为file# 2的resetlogs scn和其他数据文件不一致,导致在file# 2 online的前提下,无法重建. 这样就处在了一个循环中(需要online file# 2 又要重建控制文件),这样的问题,可以通过bbed修改file# 2的resetlogs scn完成 或者先让file# 2 offline(没有加drop)掉,重建控制文件(除掉file# 2的文件记录)
ORA-00600[25025]
SMON: enabling cache recovery Fri May 4 22:36:36 2012 Errors in file /oracle/admin/standdb/udump/perfdb_ora_1167402.trc: ORA-00600: internal error code, arguments: [25025], [2], [], [], [], [], [], [] Fri May 4 22:36:38 2012 Errors in file /oracle/admin/standdb/udump/perfdb_ora_1167402.trc: ORA-00600: internal error code, arguments: [25025], [2], [], [], [], [], [], [] Fri May 4 22:36:38 2012 Error 600 happened during db open, shutting down database USER: terminating instance due to error 600 Instance terminated by USER, pid = 1167402 错误原因: 因为有undo文件不在undo对应的表空间中,而我们的file# 2文件确实是undo文件,而且重建控制文件时候未加入进来 解决办法: undo_management = AUTO undo_tablespace = UNDODBS(file# 2属于该表空间) 修改为 undo_management = MANUAL undo_tablespace = SYSTEM 或者bbed修改file# 2的header,然后重建控制文件
ORA-00600[4137]
Errors in file /oracle/admin/standdb/bdump/perfdb_smon_1290564.trc: ORA-00600: internal error code, arguments: [4137], [], [], [], [], [], [], [] Fri May 4 23:20:52 2012 create undo tablespace undotbs3 datafile '/dev/rundodbs21' size 20400M Fri May 4 23:23:47 2012 Errors in file /oracle/admin/standdb/bdump/perfdb_smon_1290564.trc: ORA-00600: internal error code, arguments: [4137], [], [], [], [], [], [], [] Fri May 4 23:23:48 2012 Errors in file /oracle/admin/standdb/bdump/perfdb_pmon_1520126.trc: ORA-00474: SMON process terminated with error Fri May 4 23:23:48 2012 PMON: terminating instance due to error 474 Instance terminated by PMON, pid = 1520126 错误原因: _smon_internal_errlimit(limit of SMON internal errors) SMON遇到了内部错误,最大允许100次, 不断计数增长,达到100的时候,数据库smon进程自动down掉,从而导致数据库down 解决办法: 1.临时解决办法:设置_smon_internal_errlimit一个较大值 3.根本解决办法:使用undo隐含参数,删除有问题undo 回滚段和undo表空间或者使用10513 事件
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
相关参数
SQL> select * from v$version; BANNER --------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production SQL> show parameter optimizer_mode; NAME TYPE VALUE ------------------------------------ ---------------------- ---------------- optimizer_mode string ALL_ROWS SQL> show parameter cursor_sharing; NAME TYPE VALUE ------------------------------------ ---------------------- ---------------- cursor_sharing string EXACT SQL> select a.ksppinm name,b.ksppstvl value,a.ksppdesc description 2 from x$ksppi a,x$ksppcv b 3 where a.inst_id = USERENV ('Instance') 4 and b.inst_id = USERENV ('Instance') 5 and a.indx = b.indx 6 and upper(a.ksppinm) LIKE upper('%¶m%') 7 order by name 8 / Enter value for param: _optim_peek_user_binds old 6: and upper(a.ksppinm) LIKE upper('%¶m%') new 6: and upper(a.ksppinm) LIKE upper('%_optim_peek_user_binds%') NAME VALUE DESCRIPTION -------------------------------- ------------------------ ---------------------------------- _optim_peek_user_binds TRUE enable peeking of user binds
创建模拟表
SQL> create table t_xifenfei(id number,name varchar2(30)); Table created. SQL> begin 2 for i in 1..100000 loop 3 insert into t_xifenfei values(i,'xifenfei'); 4 end loop; 5 commit; 6 end; 7 / PL/SQL procedure successfully completed. SQL> update t_xifenfei SET name='www.xifenfei.com' where mod(id,20000)=0; 5 row updated. SQL> commit; Commit complete. SQL> create index i_xifenfei on t_xifenfei(name); Index created.
默认收集统计信息,查看执行计划
SQL> exec DBMS_STATS.gather_table_stats(user,'T_XIFENFEI',CASCADE=>TRUE); PL/SQL procedure successfully completed. SQL> set autot trace exp SQL> select id from t_xifenfei where name='xifenfei'; Execution Plan ---------------------------------------------------------- Plan hash value: 548923532 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 50000 | 683K| 103 (1)| 00:00:02 | |* 1 | TABLE ACCESS FULL| T_XIFENFEI | 50000 | 683K| 103 (1)| 00:00:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("NAME"='xifenfei') SQL> select id from t_xifenfei where name='www.xifenfei.com'; Execution Plan ---------------------------------------------------------- Plan hash value: 548923532 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 50000 | 683K| 103 (1)| 00:00:02 | |* 1 | TABLE ACCESS FULL| T_XIFENFEI | 50000 | 683K| 103 (1)| 00:00:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("NAME"='www.xifenfei.com') --这里可以发现,对于这样少量的列的情况,没有选择一个合适的执行计划
准确收集统计信息
SQL> exec DBMS_STATS.gather_table_stats(user,'T_XIFENFEI',CASCADE=>TRUE, 2 method_opt => 'FOR ALL COLUMNS SIZE 254',estimate_percent => 100); PL/SQL procedure successfully completed.
再次查看执行计划
SQL> select id from t_xifenfei where name='www.xifenfei.com'; Execution Plan ---------------------------------------------------------- Plan hash value: 1926396081 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 14 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T_XIFENFEI | 1 | 14 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | I_XIFENFEI | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("NAME"='www.xifenfei.com') Statistics ---------------------------------------------------------- 0 recursive calls 1 db block gets 320 consistent gets 0 physical reads 0 redo size 418 bytes sent via SQL*Net to client 419 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 5 rows processed SQL> select id from t_xifenfei where name='xifenfei'; 99995 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 548923532 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 99999 | 1367K| 103 (1)| 00:00:02 | |* 1 | TABLE ACCESS FULL| T_XIFENFEI | 99999 | 1367K| 103 (1)| 00:00:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("NAME"='xifenfei') Statistics ---------------------------------------------------------- 0 recursive calls 1 db block gets 6970 consistent gets 0 physical reads 0 redo size 1455968 bytes sent via SQL*Net to client 73745 bytes received via SQL*Net from client 6668 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 99995 rows processed --通过这里可以看出在完整的收集表和index包括直方图信息后,数据库执行计划正常 --也说明一点:在数据列分布不均匀的时候,依靠数据库自动收集直方图还是不怎么拷贝.
使用AUTOTRACE测试
SQL> set autot trace exp SQL> var a varchar2(30); SQL> exec :a := 'www.xifenfei.com'; PL/SQL procedure successfully completed. SQL> select id from t_xifenfei where name=:a; Execution Plan ---------------------------------------------------------- Plan hash value: 548923532 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 50000 | 683K| 103 (1)| 00:00:02 | |* 1 | TABLE ACCESS FULL| T_XIFENFEI | 50000 | 683K| 103 (1)| 00:00:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("NAME"=:A) --这里可以发现11g的Bind Variable Peeking 没有使用正确的执行计划,其实这个是AUTOTRACE本身的bug导致
收集下面sql执行计划(peeking测试需要)get_plan.sql脚本
SQL> select * from t_xifenfei where name='wwww.xifenfei.com' and id=100; no rows selected SQL> @get_plan.sql Rollback complete. Enter value for hash_value: 2708637417 select * from t_xifenfei where name='wwww.xifenfei.com' and id=100 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 2 (100)| | |* 1 | TABLE ACCESS BY INDEX ROWID| T_XIFENFEI | 1 | 14 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | I_XIFENFEI | 3 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("ID"=100) 2 - access("NAME"='wwww.xifenfei.com') SQL> select * from t_xifenfei where name='xifenfei' and id=100; ID NAME ---------- ------------------------------------------------------------ 100 xifenfei 1 row selected. SQL> @get_plan.sql Rollback complete. Enter value for hash_value: 1355242984 select * from t_xifenfei where name='xifenfei' and id=100 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 103 (100)| | |* 1 | TABLE ACCESS FULL| T_XIFENFEI | 1 | 14 | 103 (1)| 00:00:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(("ID"=100 AND "NAME"='xifenfei')) --这里可以看到,两个执行计划都我们希望的
测试peeking功能
SQL> alter system flush shared_pool; System altered. SQL> select * from t_xifenfei where name='xifenfei' and id=100; ID NAME ---------- ------------------------------------------------------------ 100 xifenfei 1 row selected. SQL> @get_plan.sql Rollback complete. Enter value for hash_value: 2860562673 select * from t_xifenfei where name='xifenfei' and id=100 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 103 (100)| | |* 1 | TABLE ACCESS FULL| T_XIFENFEI | 1 | 14 | 103 (1)| 00:00:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(("ID"=100 AND "NAME"='xifenfei')) SQL> var b varchar2(30); SQL> exec :b := 'www.xifenfei.com'; PL/SQL procedure successfully completed. SQL> select * from t_xifenfei where name=:b and id=100; no rows selected SQL> @get_plan.sql Rollback complete. Enter value for hash_value: 4157424768 select * from t_xifenfei where name=:b and id=100 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 103 (100)| | |* 1 | TABLE ACCESS FULL| T_XIFENFEI | 1 | 14 | 103 (1)| 00:00:02 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(("ID"=100 AND "NAME"=:B)) --重新硬解析 SQL> alter system flush shared_pool; System altered. SQL> var b varchar2(30); SQL> exec :b := 'www.xifenfei.com'; PL/SQL procedure successfully completed. SQL> select * from t_xifenfei where name=:b and id=100; no rows selected SQL> @get_plan.sql Rollback complete. Enter value for hash_value: 4157424768 select * from t_xifenfei where name=:b and id=100 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 2 (100)| | |* 1 | TABLE ACCESS BY INDEX ROWID| T_XIFENFEI | 1 | 14 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | I_XIFENFEI | 6 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("ID"=100) 2 - access("NAME"=:B) SQL> var b varchar2(30); SQL> exec :b := 'xifenfei'; PL/SQL procedure successfully completed. SQL> select * from t_xifenfei where name=:b and id=100; ID NAME ---------- ------------------------------------------------------------ 100 xifenfei 1 row selected. SQL> @get_plan.sql Rollback complete. Enter value for hash_value: 4157424768 select * from t_xifenfei where name=:b and id=100 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 2 (100)| | |* 1 | TABLE ACCESS BY INDEX ROWID| T_XIFENFEI | 1 | 14 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | I_XIFENFEI | 6 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("ID"=100) 2 - access("NAME"=:B) --虽然oracle 11g宣称在在Bind Variable Peeking上增强了很多, --但是这里的实验,依然证明他存在问题,导致执行计划不正确
通过整体实验过程,证明几个问题:
1.默认的的DBMS_STATS收集统计信息不一定使得所有执行计划均正确,特别在数据很不均匀分布时.
2.AUTOTRACE不能跟踪Bind Variable Peeking
3.Bind Variable Peeking是在硬解析时候生效,虽然11g进行了改善,但是有些时候效果还是不明显,如果数据很不均匀,在发现sql语句很多不合适的时候,建议先删除该sql的执行计划,让其再次硬解析,碰碰运气,如果一直效果不好,建议不适用绑定参数形式(正确的执行计划,更多的硬解析)
4._optim_peek_user_binds参数可以关闭Bind Variable Peeking功能,很不推荐.
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
1.检查Oracle XML Database组件
SQL> select comp_name, status, version from DBA_REGISTRY where comp_name='Oracle XML Database'; COMP_NAME STATUS VERSION ------------------------- ---------------------- ------------------------------ Oracle XML Database VALID 11.2.0.3.0 SQL> select count(*) from dba_objects where owner='XDB' and status='INVALID'; COUNT(*) ---------- 0
2.配置xdb的ftp和http
[oracle@rac1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Tue May 1 12:05:27 2012 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SQL> execute dbms_xdb.sethttpport(8080); PL/SQL procedure successfully completed. SQL> execute dbms_xdb.setftpport(2100); PL/SQL procedure successfully completed. SQL> commit; Commit complete. SQL> select dbms_xdb.GETFTPPORT() from dual; DBMS_XDB.GETFTPPORT() --------------------- 2100 SQL> select dbms_xdb.GETHTTPPORT() from dual; DBMS_XDB.GETHTTPPORT() ---------------------- 8080 --根据你的需求,可以选择一个即可 SQL> show parameter dispatchers; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------- dispatchers string (PROTOCOL=TCP) (SERVICE=XFFXDB) --dispatchers参数会自动配置,这里需要说明,MOS中说的sidxdb是不恰当的,我这里是db_namexdb --因为我这里是rac,sid为XFF1,总之相信自动配置
3.查看监听
[oracle@rac1 ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 01-MAY-2012 12:09:14 Copyright (c) 1991, 2011, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production Start Date 01-MAY-2012 11:51:13 Uptime 0 days 0 hr. 18 min. 1 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/11.2.0/grid/network/admin/listener.ora Listener Log File /u01/app/gridbase/diag/tnslsnr/rac1/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.31)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.33)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=8080))(Presentation=HTTP)(Session=RAW)) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=2100))(Presentation=FTP)(Session=RAW)) Services Summary... Service "+ASM" has 1 instance(s). Instance "+ASM1", status READY, has 1 handler(s) for this service... Service "XFF" has 1 instance(s). Instance "XFF1", status READY, has 1 handler(s) for this service... Service "XFFXDB" has 1 instance(s). Instance "XFF1", status READY, has 1 handler(s) for this service... The command completed successfully --以下两条监听是自动增加上去,如果没有自动增加,需要手工增加并且重启或者重新加载监听 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=8080))(Presentation=HTTP)(Session=RAW)) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=2100))(Presentation=FTP)(Session=RAW))
4.ftp基本操作
[oracle@rac1 ~]$ ftp -n ftp> open rac1 2100 Connected to rac1. 220- rac1 Unauthorised use of this FTP server is prohibited and may be subject to civil and criminal prosecution. 220 rac1 FTP Server (Oracle XML DB/Oracle Database) ready. 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type ftp> user system xifenfei 331 pass required for SYSTEM 230 SYSTEM logged in ftp> ls 227 Entering Passive Mode (192,168,1,31,181,5) 150 ASCII Data Connection drw-r--r-- 2 SYS oracle 0 SEP 18 17:49 OLAP_XDS drw-r--r-- 2 SYS oracle 0 SEP 18 17:47 home drw-r--r-- 2 SYS oracle 0 SEP 18 18:02 images drw-r--r-- 2 SYS oracle 0 SEP 18 17:49 olap_data_security drw-r--r-- 2 SYS oracle 0 SEP 18 17:43 public drw-r--r-- 2 SYS oracle 0 SEP 18 17:44 sys -rw-r--r-- 1 SYS oracle 0 MAY 01 04:06 xdbconfig.xml drw-r--r-- 2 SYS oracle 0 SEP 18 17:49 xds 226 ASCII Transfer Complete ftp> cd sys 250 CWD Command successful ftp> cd asm 250 CWD Command successful ftp> ls 227 Entering Passive Mode (192,168,1,31,98,133) 150 ASCII Data Connection drw-r--r-- 2 SYS oracle 0 MAY 01 04:14 XIFENFEI drw-r--r-- 2 SYS oracle 0 MAY 01 04:14 DATA 226 ASCII Transfer Complete ftp> cd xifenfei 250 CWD Command successful ftp> ls 227 Entering Passive Mode (192,168,1,31,151,70) 150 ASCII Data Connection drw-r--r-- 2 SYS oracle 0 MAY 01 04:15 XFF drw-r--r-- 2 SYS oracle 0 MAY 01 04:15 ASM 226 ASCII Transfer Complete ftp> cd xff 250 CWD Command successful ftp> ls 227 Entering Passive Mode (192,168,1,31,100,14) 150 ASCII Data Connection drw-r--r-- 2 SYS oracle 0 MAY 01 04:15 DATAFILE drw-r--r-- 2 SYS oracle 0 MAY 01 04:15 CONTROLFILE drw-r--r-- 2 SYS oracle 0 MAY 01 04:15 ONLINELOG drw-r--r-- 2 SYS oracle 0 MAY 01 04:15 TEMPFILE drw-r--r-- 2 SYS oracle 0 MAY 01 04:15 PARAMETERFILE -rw-r--r-- 1 SYS oracle 3584 MAY 01 04:15 spfileXFF.ora 226 ASCII Transfer Complete ftp> cd xff/datafile 250 CWD Command successful ftp> ls 227 Entering Passive Mode (192,168,1,31,30,63) 150 ASCII Data Connection -rw-r--r-- 1 SYS oracle 744497152 MAY 01 04:20 SYSTEM.256.776961315 -rw-r--r-- 1 SYS oracle 618668032 MAY 01 04:20 SYSAUX.257.776961315 -rw-r--r-- 1 SYS oracle 83894272 MAY 01 04:20 UNDOTBS1.258.776961317 -rw-r--r-- 1 SYS oracle 6291456 MAY 01 04:20 user_dd.dbf -rw-r--r-- 1 SYS oracle 26222592 MAY 01 04:20 UNDOTBS2.264.776961693 -rw-r--r-- 1 SYS oracle 157294592 MAY 01 04:20 xifenfei01.dbf 226 ASCII Transfer Complete ftp> get xifenfei01.dbf local: xifenfei01.dbf remote: xifenfei01.dbf 227 Entering Passive Mode (192,168,1,31,143,34) 150 ASCII Data Connection 550- Error Response ORA-31198: Mismatch in number of bytes transferred due to non-binary mode 550 End Error Response 270340 bytes received in 0.053 seconds (5e+03 Kbytes/s) ftp> binary 200 Type set to I. ftp> get xifenfei01.dbf local: xifenfei01.dbf remote: xifenfei01.dbf 227 Entering Passive Mode (192,168,1,31,9,112) 150 BIN Data Connection 226 BIN Transfer Complete 157294592 bytes received in 14 seconds (1.1e+04 Kbytes/s) --主要需要设置为二进制传输模式,默认是ASCII方式的,可能会报错 ftp> quit 221 QUIT Goodbye.
这篇文章主要参考How to configure XDB for using ftp and http protocols with ASM [ID 357714.1],但是在自己试验过程中,发现文档中有些地方不太合适,这里做个补充说明:
1.ftp服务端不需要启动(这里只是用到了操作系统的ftp客户端功能,如果使用其他客户端工具,连操作系统客户端都省了)
2.dispatchers 中的SERVICE=
3.ftp和http两个功能,只需要配置一个即可(选择你需要的)
4.下图展示的是通过http方式访问结果(system用户登录)