使用Strace跟踪oracle读取数据块

oracle是一个C语言程序,通过调用系统的io函数来实现io的过程,在linux下可以通过strace工具来

很方便查看进程对io函数的调用过程.

测试场景使用了rhel 5.8和oracle database 12C.

查看oracle对应的服务器进程号.

[root@o12c ~]# ps -eaf | grep beq

oracle    1611  1591  0 03:01 ?        00:00:00 oraclec12 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

root      1683  1650  0 03:02 pts/5    00:00:00 grep beq

使用strace 对进程进行跟踪

[root@o12c ~]# strace -p 1611 -o test1.out

...................

mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE, 7, 0x1ed000) = 0x2b5d0629f000

mmap(0x2b5d0629f000, 589824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0) = 0x2b5d0629f000

open("/u01/app/oracle/oradata/c12/users01.dbf", O_RDWR|O_SYNC) = 12

getrlimit(RLIMIT_NOFILE, {rlim_cur=64*1024, rlim_max=64*1024}) = 0

fcntl(12, F_DUPFD, 256)                 = 257

close(12)                               = 0

fcntl(257, F_SETFD, FD_CLOEXEC)         = 0

pread(257, "\6\242\0\0\263\0\200\1\344\215\35\0\0\0\1\4v\244\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 106496, 1466368) = 106496

times(NULL)                             = 431210068

mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE, 7, 0x2ed000) = 0x2b5d0639f000

mmap(0x2b5d0639f000, 589824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0) = 0x2b5d0639f000

pread(257, "\6\242\0\0\301\0\200\1\347\215\35\0\0\0\2\4!H\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 1581056) = 122880

times(NULL)                             = 431210068

pread(257, "\6\242\0\0\321\0\200\1\351\215\35\0\0\0\2\4Di\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 1712128) = 122880

times(NULL)                             = 431210068

pread(257, "\6\242\0\0\341\0\200\1\353\215\35\0\0\0\2\4\276\361\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 1843200) = 122880

times(NULL)                             = 431210068

pread(257, "\6\242\0\0\361\0\200\1\355\215\35\0\0\0\2\4\245\2\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 1974272) = 122880

times(NULL)                             = 431210068

pread(257, "\6\242\0\0\1\1\200\1\357\215\35\0\0\0\2\4%\214\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 2105344) = 122880

times(NULL)                             = 431210068

pread(257, "\6\242\0\0\21\1\200\1\361\215\35\0\0\0\2\4\243\257\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 2236416) = 122880

times(NULL)                             = 431210068

pread(257, "\6\242\0\0!\1\200\1\363\215\35\0\0\0\2\4zY\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 2367488) = 122880

首先调用open函数,读取表空间的数据文件返回句柄12,然后使用fcntl进行文件句柄复制和其他操作,原来的文件句柄12被关闭.接下来使用pread函数来读取文件.附带也证明了一点就是oracle服务器进程负责去读取数据文件,而写数据文件是通过后台进程dbwr来完成的.

接下来我们打开sql trace,通过sql trace文件和strace文件对应,过程更加直观.

[root@o12c ~]# ps -eaf | grep beq

oracle    1916  1915  0 03:16 ?        00:00:00 oraclec12 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

SQL>  alter session set events '10046 trace name context forever,level 8';

Session altered.

[root@o12c ~]# strace -p 1916 -e write=all -e all -o test2.out

open("/u01/app/oracle/oradata/c12/users01.dbf", O_RDWR|O_SYNC) = 15

getrlimit(RLIMIT_NOFILE, {rlim_cur=64*1024, rlim_max=64*1024}) = 0

fcntl(15, F_DUPFD, 256)                 = 257

close(15)                               = 0

fcntl(257, F_SETFD, FD_CLOEXEC)         = 0

write(12, "WAIT #47487286861640: nam='Disk "..., 129) = 129

| 00000  57 41 49 54 20 23 34 37  34 38 37 32 38 36 38 36  WAIT #47 48728686 |

| 00010  31 36 34 30 3a 20 6e 61  6d 3d 27 44 69 73 6b 20  1640: na m='Disk  |

| 00020  66 69 6c 65 20 6f 70 65  72 61 74 69 6f 6e 73 20  file ope rations  |

| 00030  49 2f 4f 27 20 65 6c 61  3d 20 31 36 30 20 46 69  I/O' ela = 160 Fi |

| 00040  6c 65 4f 70 65 72 61 74  69 6f 6e 3d 32 20 66 69  leOperat ion=2 fi |

| 00050  6c 65 6e 6f 3d 36 20 66  69 6c 65 74 79 70 65 3d  leno=6 f iletype= |

| 00060  32 20 6f 62 6a 23 3d 39  32 30 31 37 20 74 69 6d  2 obj#=9 2017 tim |

| 00070  3d 31 33 39 36 31 32 30  36 33 33 36 35 37 35 33  =1396120 63365753 |

| 00080  31                                                1                 |

write(12, "\n", 1)                      = 1

| 00000  0a                                                .                 |

pread(257, "#\242\0\0\262\0\200\1F\216\35\0\0\0\1\4\346\312\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192, 1458176) = 8192

write(12, "WAIT #47487286861640: nam='db fi"..., 120) = 120

| 00000  57 41 49 54 20 23 34 37  34 38 37 32 38 36 38 36  WAIT #47 48728686 |

| 00010  31 36 34 30 3a 20 6e 61  6d 3d 27 64 62 20 66 69  1640: na m='db fi |

| 00020  6c 65 20 73 65 71 75 65  6e 74 69 61 6c 20 72 65  le seque ntial re |

| 00030  61 64 27 20 65 6c 61 3d  20 38 37 36 20 66 69 6c  ad' ela=  876 fil |

| 00040  65 23 3d 36 20 62 6c 6f  63 6b 23 3d 31 37 38 20  e#=6 blo ck#=178  |

| 00050  62 6c 6f 63 6b 73 3d 31  20 6f 62 6a 23 3d 39 32  blocks=1  obj#=92 |

| 00060  30 31 37 20 74 69 6d 3d  31 33 39 36 31 32 30 36  017 tim= 13961206 |

| 00070  33 33 36 35 38 35 34 34                           33658544          |

write(12, "\n", 1)                      = 1

| 00000  0a                                                .                 |

mmap(0x2b307eeeb000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0) = 0x2b307eeeb000

pread(257, "\6\242\0\0\263\0\200\1\344\215\35\0\0\0\1\4v\244\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 106496, 1466368) = 106496

times(NULL)                             = 431298669

times(NULL)                             = 431298669

write(12, "WAIT #47487286861640: nam='SQL*N"..., 124) = 124

| 00000  57 41 49 54 20 23 34 37  34 38 37 32 38 36 38 36  WAIT #47 48728686 |

| 00010  31 36 34 30 3a 20 6e 61  6d 3d 27 53 51 4c 2a 4e  1640: na m='SQL*N |

| 00020  65 74 20 6d 65 73 73 61  67 65 20 74 6f 20 63 6c  et messa ge to cl |

| 00030  69 65 6e 74 27 20 65 6c  61 3d 20 33 20 64 72 69  ient' el a= 3 dri |

| 00040  76 65 72 20 69 64 3d 31  36 35 30 38 31 35 32 33  ver id=1 65081523 |

| 00050  32 20 23 62 79 74 65 73  3d 31 20 70 33 3d 30 20  2 #bytes =1 p3=0  |

| 00060  6f 62 6a 23 3d 2d 31 20  74 69 6d 3d 31 33 39 36  obj#=-1  tim=1396 |

| 00070  31 32 30 36 33 33 36 35  36 38 37 38              12063365 6878     |

write(12, "\n", 1)                      = 1

| 00000  0a                                                .                 |

getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 54991}, ru_stime={0, 37994}, ...}) = 0

open("/u01/app/oracle/oradata/c12/users01.dbf", O_RDWR|O_SYNC) = 15

getrlimit(RLIMIT_NOFILE, {rlim_cur=64*1024, rlim_max=64*1024}) = 0

fcntl(15, F_DUPFD, 256)                 = 257

close(15)                               = 0

fcntl(257, F_SETFD, FD_CLOEXEC)         = 0

write(12, "WAIT #47487286861640: nam='Disk "..., 129) = 129

| 00000  57 41 49 54 20 23 34 37  34 38 37 32 38 36 38 36  WAIT #47 48728686 |

| 00010  31 36 34 30 3a 20 6e 61  6d 3d 27 44 69 73 6b 20  1640: na m='Disk  |

| 00020  66 69 6c 65 20 6f 70 65  72 61 74 69 6f 6e 73 20  file ope rations  |

| 00030  49 2f 4f 27 20 65 6c 61  3d 20 31 36 30 20 46 69  I/O' ela = 160 Fi |

| 00040  6c 65 4f 70 65 72 61 74  69 6f 6e 3d 32 20 66 69  leOperat ion=2 fi |

| 00050  6c 65 6e 6f 3d 36 20 66  69 6c 65 74 79 70 65 3d  leno=6 f iletype= |

| 00060  32 20 6f 62 6a 23 3d 39  32 30 31 37 20 74 69 6d  2 obj#=9 2017 tim |

| 00070  3d 31 33 39 36 31 32 30  36 33 33 36 35 37 35 33  =1396120 63365753 |

| 00080  31                                                1                 |

write(12, "\n", 1)                      = 1

| 00000  0a                                                .                 |

pread(257, "#\242\0\0\262\0\200\1F\216\35\0\0\0\1\4\346\312\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192, 1458176) = 8192

write(12, "WAIT #47487286861640: nam='db fi"..., 120) = 120

| 00000  57 41 49 54 20 23 34 37  34 38 37 32 38 36 38 36  WAIT #47 48728686 |

| 00010  31 36 34 30 3a 20 6e 61  6d 3d 27 64 62 20 66 69  1640: na m='db fi |

| 00020  6c 65 20 73 65 71 75 65  6e 74 69 61 6c 20 72 65  le seque ntial re |

| 00030  61 64 27 20 65 6c 61 3d  20 38 37 36 20 66 69 6c  ad' ela=  876 fil |

| 00040  65 23 3d 36 20 62 6c 6f  63 6b 23 3d 31 37 38 20  e#=6 blo ck#=178  |

| 00050  62 6c 6f 63 6b 73 3d 31  20 6f 62 6a 23 3d 39 32  blocks=1  obj#=92 |

| 00060  30 31 37 20 74 69 6d 3d  31 33 39 36 31 32 30 36  017 tim= 13961206 |

| 00070  33 33 36 35 38 35 34 34                           33658544          |

write(12, "\n", 1)                      = 1

| 00000  0a                                                .                 |

mmap(0x2b307eeeb000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0) = 0x2b307eeeb000

pread(257, "\6\242\0\0\263\0\200\1\344\215\35\0\0\0\1\4v\244\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 106496, 1466368) = 106496

times(NULL)                             = 431298669

write(12, "WAIT #47487286861640: nam='direc"..., 126) = 126

| 00000  57 41 49 54 20 23 34 37  34 38 37 32 38 36 38 36  WAIT #47 48728686 |

| 00010  31 36 34 30 3a 20 6e 61  6d 3d 27 64 69 72 65 63  1640: na m='direc |

| 00020  74 20 70 61 74 68 20 72  65 61 64 27 20 65 6c 61  t path r ead' ela |

| 00030  3d 20 32 30 33 20 66 69  6c 65 20 6e 75 6d 62 65  = 203 fi le numbe |

| 00040  72 3d 36 20 66 69 72 73  74 20 64 62 61 3d 31 37  r=6 firs t dba=17 |

| 00050  39 20 62 6c 6f 63 6b 20  63 6e 74 3d 31 33 20 6f  9 block  cnt=13 o |

| 00060  62 6a 23 3d 39 32 30 31  37 20 74 69 6d 3d 31 33  bj#=9201 7 tim=13 |

| 00070  39 36 31 32 30 36 33 33  36 36 31 31 34 31        96120633 661141   |

write(12, "\n", 1)                      = 1

| 00000  0a                                                .                 |

mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE, 7, 0x1e9000) = 0x2b307ef7b000

mmap(0x2b307ef7b000, 589824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0) = 0x2b307ef7b000

pread(257, "\6\242\0\0\301\0\200\1\347\215\35\0\0\0\2\4!H\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 122880, 1581056) = 122880

times(NULL)                             = 431298669

打开trace文件来看对应的direct path read 事件

select count(*) from c##frank.t1

END OF STMT

PARSE #47487286861640:c=68989,e=250226,p=20,cr=361,cu=0,mis=1,r=0,dep=0,og=1,plh=3724264953,tim=1396120633656121

EXEC #47487286861640:c=0,e=66,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=3724264953,tim=1396120633656660

WAIT #47487286861640: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1396120633656878

WAIT #47487286861640: nam='Disk file operations I/O' ela= 160 FileOperation=2 fileno=6 filetype=2 obj#=92017 tim=1396120633657531

WAIT #47487286861640: nam='db file sequential read' ela= 876 file#=6 block#=178 blocks=1 obj#=92017 tim=1396120633658544

WAIT #47487286861640: nam='direct path read' ela= 203 file number=6 first dba=179 block cnt=13 obj#=92017 tim=1396120633661141

WAIT #47487286861640: nam='direct path read' ela= 275 file number=6 first dba=193 block cnt=15 obj#=92017 tim=1396120633661688

WAIT #47487286861640: nam='direct path read' ela= 149 file number=6 first dba=209 block cnt=15 obj#=92017 tim=1396120633662062

WAIT #47487286861640: nam='direct path read' ela= 170 file number=6 first dba=225 block cnt=15 obj#=92017 tim=1396120633662610

WAIT #47487286861640: nam='direct path read' ela= 141 file number=6 first dba=241 block cnt=15 obj#=92017 tim=1396120633662915

WAIT #47487286861640: nam='direct path read' ela= 137 file number=6 first dba=257 block cnt=15 obj#=92017 tim=1396120633663278

第一个direct path read事件,对应之前的一个io函数,只有在io函数执行完成,才能输出时间,所以sql trace的等待事件都是在事件发生完成后才会输出

mmap(0x2b307eeeb000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0) = 0x2b307eeeb000

pread(257, "\6\242\0\0\263\0\200\1\344\215\35\0\0\0\1\4v\244\0\0\1\0\0\0qg\1\0\335\215\35\0"..., 106496, 1466368) = 106496

times(NULL)                             = 431298669

WAIT #47487286861640: nam='direct path read' ela= 203 file number=6 first dba=179 block cnt=13 obj#=92017 tim=1396120633661141

可以看出是读取了13个块,每个块是8KB大小. 13*8*1024=106496 个字节,刚好和前一个函数返回的字节数对应。

strace分析mysql_使用Strace跟踪oracle读取数据块相关推荐

  1. oracle读取数据方式,关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  2. 从Oracle读取数据并用python处理过程记录(构建BARRA因子遇到的问题)

    第一次用pycharm运行python语句,第一次从Oracle读数据,出现了无数的bug..把过程记录一下以提升效率 1.数据读取并处理成dataframe格式:用逐行查询的方式 import cx ...

  3. oracle块空间的使用,Oracle管理存储架构(二)--Oracle管理数据块空间

    1.数据块的概念 数据块是数据库中最小的分配单元,块是数据库使用的最小的I/O单元,由一个或多个操作系统block组成. 数据块由block header .free space .data 组成,o ...

  4. oracle对数据块的存取,简单了解数据在Oracle文件中的存储

    2010-02-13 目的: 1. 了解数据块转储 2. 简单认证数据在ORACLE文件的存储 测试环境: VM+Win2003+Oracle11g DB_BLOCK_SIZE 8k C:\Docum ...

  5. oracle form中实现隐藏,Oracle Form数据块实现同时只有一个人锁定修改数据

    在上一篇中文章中,如果建立了数据块的四个触发器,并在触发器中调用了程序单元中对应数据块名的包,则在这个包中还需调用专门用于实现插入行.锁定行.更新行.删除行的包MAIN_PVT.在这个包MAIN_PV ...

  6. Oracle根据数据块ITL查找UNDO前镜像

    <pre name="code" class="sql">v$transaction: 列出了没有提交的活动事务2. XID的结构eg SQL> ...

  7. Oracle数据块原理深入剖析

    数据块(Oracle Data Blocks),本文简称为"块",是Oracle最小的存储单位,Oracle数据存放在"块"中.一个块占用一定的磁盘空间.特别注 ...

  8. 解析oracle的dump文件,读懂数据块dump文件信息

    尊重作者著作,转自http://blog.csdn.net/guoyjoe/article/details/8567076 -------------------------------------- ...

  9. spark连接Oracle数据库,Spark通过jdbc采用分区的方式从oracle读数据

    spark通过jdbc可以从oracle中直接读取数据,返回dataframe.有时由于数据量较大,我们可以采用分区方式通过jdbc多线程并行从oracle中读取数据. - oracle中的数据如下 ...

最新文章

  1. BAT“上山下乡”,用AI“打入政府”
  2. R语言大小写转换函数(tolower, toupper, casefold,chartr)实战
  3. bottle框架学习(八)之Mysql数据库的操作
  4. VTK:Math之1DTupleInterpolation
  5. 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是Li, 1<= i<= n。这n 个程序的读取概率分别是p1,p2,...,pn,且pi+p2+...+pn =
  6. 初识ABP vNext(1):开篇计划基础知识
  7. 转:什么是 Base64编码
  8. python 物理引擎 摩擦力_参赛作品2-phenom的2D物理引擎
  9. 现实世界中正在用Java解决的难题
  10. 有关计算机编程论文,有关计算机程序的论文范文
  11. php7安装memcached,PHP5.6与PHP7的memcached安装
  12. SGU[222] Little Rooks
  13. 安卓rom制作教程_【教程】安卓手机刷入第三方ROM通用教程
  14. js-鼠标经过显示下拉菜单
  15. Hive安装超详细教程
  16. FireFox 插件xpi文件签名2
  17. windows下如何创建bat文件
  18. 玩游戏计算机缺失msvcp140,游戏缺少msvcp140.dll错误提示怎么办解决方法
  19. iOS小技能: UIKit
  20. XCode使用googletest(包括googlemock)

热门文章

  1. 解读人工智能的2021:回顾那些激动人心的重大突破
  2. jmeter性能测试脚本录制不了的几种情况
  3. Java压缩图片大小
  4. SpringSecurity(安全)
  5. VirtualBox中Windows 7虚拟机无法全屏显示怎么办?
  6. componentDidMount,react
  7. 数据库关系代数操作与扩展操作
  8. L1正则化与L2正则化详解
  9. 服务器ping返回信息,如何ping服务器线路?ping命令的用法
  10. php购物车页面如何做,HTML代码实现简易购物车