- 浏览: 978356 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
孤星119:
好熟悉的数据库字段啊, 上家公司做的项目每天都跟这些字段打招呼 ...
Oracle exp compress参数引起的空间浪费 -
itspace:
quxiaoyong 写道遇到个问题,网上一搜,全他妈这篇文章 ...
数据库连接错误ORA-28547 -
quxiaoyong:
遇到个问题,网上一搜,全他妈这篇文章。你转来转去的有意思吗?
数据库连接错误ORA-28547 -
hctech:
关于version count过高的问题,不知博主是否看过ey ...
某客户数据库性能诊断报告 -
itspace:
invalid 写道写的不错,我根据这个来安装,有点理解错误了 ...
AIX 配置vncserver
今天偶尔看到一个隐含参数_db_block_max_cr_dba,Oracle对它的解释是 Maximum Allowed Number of CR buffers per dba其默认值是6。
尽管是周末,一时手痒对其做一把测试,看看究竟是干嘛用的。
数据库版本为
SQL> select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
创建一张测试表
SQL> conn zhou/zhou
Connected.
SQL> create table testcr as select
SQL> create table testcr (id number);
Table created.
获得测试表testcr的file和block
SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) file_id,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block_no from testcr;
FILE_ID BLOCK_NO
---------- ----------
7 39213
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
现在会话一执行update不提交
SQL> update testcr set id=2;
1 row updated.
会话二执行
SQL> select * from testcr;
ID
----------
1
会话一查看内存中该block的情况
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 3
在会话二多次查询该表格,继续在会话一查看内存中该block的情况,发现xcur+cr刚好等于6即隐含参数_db_block_max_cr_dba值
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 5
如果在会话一查询
SQL> select * from testcr;
ID
----------
2
可以发现cr从5变为4,将会话二的cr版本置换出去
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 4
先将事务回滚
SQL> rollback;
Rollback complete.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 4
如果将内存刷出会发生什么事情呢
SQL> alter system flush buffer_cache;
System altered.
可以看到cr 状态变为free。
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
free 4
再次在会话一中查询,可以看到产生一个xcur块。
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 4
SQL> select * from testcr;
ID
----------
1
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 4
SQL> update testcr set id=5;
1 row updated.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 4
cr 1
如果在会话二执行数次查询testcr表,再在会话一中查询
SQL> /
STATUS COUNT(*)
------- ----------
xcur 1
free 4
cr 5
经过以上测试我们可以得到以下结论:
1、 隐含参数 _db_block_max_cr_dba为xcur+cr的值,并不是Oracle所说的cr在buffer cache的最大数量。
2、数据块第一次进入buffer cache的模式为xcur模式
3、update一张表格,即使这张表格在内存中,也会触发cr读,这个结论可以从10046中得到再次验证。
实验如下:
SQL> alter system flush buffer_cache;
System altered.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
free 11
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
Session altered.
SQL> update testcr set id=8;
1 row updated.
SQL> alter session set events '10046 trace name context off';
Session altered.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 11
cr 1
[ora10g@mcprod udump]$ tkprof mcstar_ora_21794.trc testcr.trc sys=no
********************************************************************************
update testcr set id=8
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 1 1 0 0
Execute 1 0.00 0.00 1 7 2 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.00 0.00 2 8 2 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 64
Rows Row Source Operation
------- ---------------------------------------------------
0 UPDATE TESTCR (cr=7 pr=1 pw=0 time=208 us)
1 TABLE ACCESS FULL TESTCR (cr=7 pr=0 pw=0 time=29 us)
这里我们不禁有个疑问为什么会产生7个cr读呢?注意到执行计划TABLE ACCESS FULL TESTCR,它会扫描高水位以下的所有block(本例中segment 头除外)
SQL> select BLOCK_ID,BLOCKS from dba_extents where OWNER='ZHOU' and SEGMENT_NAME='TESTCR';
BLOCK_ID BLOCKS
---------- ----------
39209 8
SQL> select status,count(*) from v$bh where file#=7 and block#=39212 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 1
SQL> alter system flush buffer_cache;
System altered.
SQL> alter session set db_file_multiblock_read_count=1;
Session altered.
SQL> alter session set events '10200 trace name context forever, level 1';
Session altered.
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
Session altered.
SQL> update testcr set id=9;
1 row updated.
[ora10g@mcprod udump]$ cat mcstar_ora_21794.trc|grep "Consistent read started"
Consistent read started for block 7 : 01c0992c
Consistent read started for block 7 : 01c0992d
Consistent read started for block 7 : 01c0992e
Consistent read started for block 7 : 01c0992f
Consistent read started for block 7 : 01c09930
Consistent read started for block 7 : 01c0992c
Consistent read started for block 7 : 01c0992d
Consistent read started for block 7 : 01c0992e
Consistent read started for block 7 : 01c0992f
Consistent read started for block 7 : 01c09930
注意到业务块从39212开始,因为前面几个块是segment头和位图块。
SQL> /
Enter value for 1: 01c0992c
old 1: select getbfno('&1') BFNO from dual
new 1: select getbfno('01c0992c') BFNO from dual
BFNO
------------------------------------------------------------
datafile# is:7
datablock is:39212
dump command:alter system dump datafile 7 block 39212;
尽管是周末,一时手痒对其做一把测试,看看究竟是干嘛用的。
数据库版本为
SQL> select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
创建一张测试表
SQL> conn zhou/zhou
Connected.
SQL> create table testcr as select
SQL> create table testcr (id number);
Table created.
获得测试表testcr的file和block
SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) file_id,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block_no from testcr;
FILE_ID BLOCK_NO
---------- ----------
7 39213
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
现在会话一执行update不提交
SQL> update testcr set id=2;
1 row updated.
会话二执行
SQL> select * from testcr;
ID
----------
1
会话一查看内存中该block的情况
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 3
在会话二多次查询该表格,继续在会话一查看内存中该block的情况,发现xcur+cr刚好等于6即隐含参数_db_block_max_cr_dba值
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 5
如果在会话一查询
SQL> select * from testcr;
ID
----------
2
可以发现cr从5变为4,将会话二的cr版本置换出去
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 4
先将事务回滚
SQL> rollback;
Rollback complete.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
cr 4
如果将内存刷出会发生什么事情呢
SQL> alter system flush buffer_cache;
System altered.
可以看到cr 状态变为free。
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
free 4
再次在会话一中查询,可以看到产生一个xcur块。
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 4
SQL> select * from testcr;
ID
----------
1
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 4
SQL> update testcr set id=5;
1 row updated.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 4
cr 1
如果在会话二执行数次查询testcr表,再在会话一中查询
SQL> /
STATUS COUNT(*)
------- ----------
xcur 1
free 4
cr 5
经过以上测试我们可以得到以下结论:
1、 隐含参数 _db_block_max_cr_dba为xcur+cr的值,并不是Oracle所说的cr在buffer cache的最大数量。
2、数据块第一次进入buffer cache的模式为xcur模式
3、update一张表格,即使这张表格在内存中,也会触发cr读,这个结论可以从10046中得到再次验证。
实验如下:
SQL> alter system flush buffer_cache;
System altered.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
free 11
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
Session altered.
SQL> update testcr set id=8;
1 row updated.
SQL> alter session set events '10046 trace name context off';
Session altered.
SQL> select status,count(*) from v$bh where file#=7 and block#=39213 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 11
cr 1
[ora10g@mcprod udump]$ tkprof mcstar_ora_21794.trc testcr.trc sys=no
********************************************************************************
update testcr set id=8
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 1 1 0 0
Execute 1 0.00 0.00 1 7 2 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.00 0.00 2 8 2 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 64
Rows Row Source Operation
------- ---------------------------------------------------
0 UPDATE TESTCR (cr=7 pr=1 pw=0 time=208 us)
1 TABLE ACCESS FULL TESTCR (cr=7 pr=0 pw=0 time=29 us)
这里我们不禁有个疑问为什么会产生7个cr读呢?注意到执行计划TABLE ACCESS FULL TESTCR,它会扫描高水位以下的所有block(本例中segment 头除外)
SQL> select BLOCK_ID,BLOCKS from dba_extents where OWNER='ZHOU' and SEGMENT_NAME='TESTCR';
BLOCK_ID BLOCKS
---------- ----------
39209 8
SQL> select status,count(*) from v$bh where file#=7 and block#=39212 group by status;
STATUS COUNT(*)
------- ----------
xcur 1
free 1
SQL> alter system flush buffer_cache;
System altered.
SQL> alter session set db_file_multiblock_read_count=1;
Session altered.
SQL> alter session set events '10200 trace name context forever, level 1';
Session altered.
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
Session altered.
SQL> update testcr set id=9;
1 row updated.
[ora10g@mcprod udump]$ cat mcstar_ora_21794.trc|grep "Consistent read started"
Consistent read started for block 7 : 01c0992c
Consistent read started for block 7 : 01c0992d
Consistent read started for block 7 : 01c0992e
Consistent read started for block 7 : 01c0992f
Consistent read started for block 7 : 01c09930
Consistent read started for block 7 : 01c0992c
Consistent read started for block 7 : 01c0992d
Consistent read started for block 7 : 01c0992e
Consistent read started for block 7 : 01c0992f
Consistent read started for block 7 : 01c09930
注意到业务块从39212开始,因为前面几个块是segment头和位图块。
SQL> /
Enter value for 1: 01c0992c
old 1: select getbfno('&1') BFNO from dual
new 1: select getbfno('01c0992c') BFNO from dual
BFNO
------------------------------------------------------------
datafile# is:7
datablock is:39212
dump command:alter system dump datafile 7 block 39212;
发表评论
-
buffer cache 的内部结构
2020-03-18 14:21 576BUFFER CACHE作为数据块的 ... -
Oracle OMC介绍
2020-03-18 13:19 484Oracle管理云服务(OMC)的大数据平台,自动收集的企业 ... -
参加Oracle勒索病毒防范专题培训会议
2019-09-27 17:15 5112019年7月22日,受邀参加Oracle勒索病毒防范专题培训 ... -
记一次内存换IO的Oracle优化
2019-09-27 16:50 826某客户数据库从P595物理 ... -
如何定位Oracle SQL执行计划变化的原因
2019-07-03 14:49 1458性能优化最难的是能够 ... -
如何定位Oracle SQL执行计划变化的原因
2018-10-30 09:24 1185性能优化最难的是能够 ... -
数据库性能优化目标
2018-10-08 10:59 518从数据库性能优化的场 ... -
数据库无法打开的原因及解决办法
2018-10-05 20:45 2117数据库的启动是一个相当复杂的过程。比如,Oracle在启动之前 ... -
怎么样彻底删除数据库?
2018-09-18 11:10 598Oracle提供了drop database命令用来删除数据库 ... -
Oracle减少日志量的方法
2018-09-10 10:17 865LGWR进程将LOG BUFFER中的 ... -
如何快速关闭数据库
2018-09-09 13:14 1231“一朝被蛇咬,十年怕井绳”。在没被“蛇”咬之前,很多DBA喜欢 ... -
关于《如何落地智能化运维》PPT
2018-05-17 10:19 1128在DTCC 2018发表《如何落地智能化运维》演讲,主要内容如 ... -
记录在redhat5.8平台安装oracle11.2容易忽视的几个问题
2018-05-11 19:58 577问题一:ping不通问题 在虚拟机上安装好linux系统后, ... -
《Oracle DBA实战攻略》第一章
2018-05-11 10:42 945即日起,不定期更新《OracleDBA实战攻略》一书电子版,请 ... -
Oracle 12c新特性
2018-05-11 10:33 898查询所有pdb [oracle@gj4 ~]$ sqlplu ... -
关于修改memory_target的值后数据库无法启动的问题
2017-02-28 12:24 3981操作系统:RHEL6.5 数据库版本:11.2.0.4 ... -
10g rac安装error while loading shared libraries libpthread.so.0 问题
2017-02-28 12:22 69311g rac安装在二节点跑脚本一般会报此错误: 解决这个问 ... -
记一次Oracle会话共享模式故障处理过程
2017-02-27 19:16 798故障简述 XXX第八人民医院HIS数据库7月13日11点左右从 ... -
RESMGR:cpu quantum等待事件处理过程
2017-02-27 18:23 2615由于数据库上线过程中出现大量的RESMGR:cpu quant ... -
谈谈log file sync
2014-03-19 14:18 1757数据库中的log file sync等待事件指的是,当user ...
相关推荐
o Make Oracle_HOME $ORACLE_BASE/product/version/{db|client|companion}_[n]. Examples: /u01/app/oracle/product/11.1.0/db_1 /u01/app/oracle/product/11.1.0/client_1 /u01/app/oracle/product/10.1.0.2.0/db_1...
总结来说,Oracle DBA_TAB_MODIFICATIONS 视图是数据库变更跟踪的重要工具,但它的行为取决于多种因素,包括操作类型(如 `CREATE TABLE AS` 或 `APPEND` 指令)、事务提交状态、隐含参数设置以及刷新机制。...
Oracle审计内容DBA_AUDIT_TRAIL数据字典说明,根据开启的Oracle审计功能,读取dba_audit_trail视图的审计内容包含用户名、操作时间、操作类型、SQL文本、数据库操作次数等等,此文档是对dba_audit_trail视图的中文简介,...
Oracle数据库管理员(DBA)是IT领域中的关键角色,负责维护和优化Oracle数据库系统,确保数据的安全性、可用性和性能。本压缩包“Oracle-dba.zip”提供了丰富的Oracle DBA相关资源,尤其对DBA新手而言,是一份极具...
- `DB_CACHE_SIZE`用于指定数据库中DEFAULT缓冲池的大小,这个缓冲池主要用来存储具有主块大小(由`DB_BLOCK_SIZE`初始化参数定义)的数据块。 - 数据块在被数据库读取后会被放置在内存缓冲区中,而`DB_CACHE_SIZE`...
Oracle DBA指南+10G备份与恢复+Oracle_DBA_数据库日常维护手册_常用SQL_脚本
oracle_10203_vista_w2k8_x86_production_db
oracle_db_10
oracle_db_07 安装包
DSI401是Oracle提供的一个专业课程,专注于DBA的工作内容,而"oracle_internal"则指的是Oracle数据库的内部工作原理。Oracle培训旨在提升技术人员对Oracle数据库的深入理解和操作技能。以下是基于这些关键词的Oracle...
从Oracle的系统表中,我们知道Oracle存在一个隐含参数_disable_logging可以用于禁用日志生成,这个参数显然只能用于测试目的(可以极大提高Benchmark测试的性能),禁止日志生成必然导致事务的不可恢复性,而且会导致...
Oracle RAC 修改 db_unique_name 参数 在 Oracle RAC 环境中,db_unique_name 参数是一个非常重要的参数,它决定了数据库的唯一标识。在某些情况下,我们需要修改 db_unique_name 参数,以便满足特定的需求。本文将...
2、在oracle安装路径(C:\oracle\product\10.2.0\db_1\network\ADMIN)中找tnsnames.ora 复制到C:\Oracle_instant_client_10_2路径下 3、第一次启动plsql,点击取消 设置oracle目录名为C:\Oracle_instant_client_10_2 ...
Oracle_DBA突击__帮你赢得一份DBA职位
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性...
Oracle Database 19c 是最新的长期版本,支持期限最长;19.3 - 企业版(也包括标准版 2) 适用于LINUX X64位系统。 LINUX.X64_193000_db_home文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: ...
Oracle Database 21c 是最新的版本; 21.3 - 企业版(也包括标准版 2) 适用于WINDOWS X64系统。WINDOWS.X64_213000_db_home文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle ...
Oracle Database 21c 是最新的版本; 21.3 - 企业版(也包括标准版 2) 适用于WINDOWS X64系统。WINDOWS.X64_213000_db_home文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: Oracle ...
Oracle_DBA_职业要求: 看似简单的“保障数据库系统的正常运行”实现起来却要解决一系列的问题: 保障数据库性能:保障用户快速地存取数据 保障数据安全:不被非法盗用 保障可靠的数据备份:在存储系统出现故障时...
Oracle Database 19c 是最新的长期版本,支持期限最长;19.3 - 企业版(也包括标准版 2) 适用于LINUX X64位系统。 LINUX.X64_193000_db_home文件分割成 三个 压缩包,必须集齐 三个 文件后才能一起解压一起使用: ...