Tips: AUL License, DBA Tools

Linux下获取IO压力数据

Posted by anysql on 2010-06-18

    Linux 2.6内核版本后, 在proc文件系统中, 加入了存入磁盘IO访问数据的文件diskstats, 查看文件就可以获得某一时刻的累计访问值.

$ cat /proc/diskstats
  ……
  8    0 sda 130767120 478199 2848404253 865895766 …
  8    1 sda1 58 740 1598 96 2 0 4 0 0 96 96
  8    2 sda2 4031326 3249 64502142 3693948 5273723 …
  8    3 sda3 142 3261 4030 865 538334 302764 …
  8    4 sda4 1 0 2 3 0 0 0 0 0 3 3
  8    5 sda5 57717 8304 2083594 152577 2023051 …
  8    6 sda6 3283 617 126914 18536 1965077 …
  8    7 sda7 31 1062 1348 164 0 0 0 0 0 121 164
  8    8 sda8 63475 1067 1170446 364557 1050986 …
  8    9 sda9 409 1423 4454 2141 579616 2614979 …
  8  10 sda10 30 352 1668 130 0 0 0 0 0 125 130
  ……

    在实际的编程中, 有两个问题要处理, 一个是如何找出磁盘, 并将分区过滤掉, 因为Linux会同步更新磁盘分区及磁盘的数据, 如果不加区分, 数据就会不准确, 这个可以通第2列及第3列加以区分, 第二列为16的倍数的表示是磁盘而非分区, 第三列是磁盘名字, 一般的系统中磁盘都是小写的sd开头的. 对于普通的scsi磁盘, 只要找出第二列是16的倍数, 并且第三列前两个字母是”sd”的, 就表示是真正的磁盘, 比如前面的数据中, 只能取第一行. 为什么是16的倍数, 估计和一块盘最多有16个分区有关吧.

    磁盘中, 第四列后的都是性能数据, 各列的官方解释如下.

Field  1 — # of reads completed
    This is the total number of reads completed successfully.
Field  2 — # of reads merged, field 6 — # of writes merged
    Reads and writes which are adjacent to each other may be merged for
    efficiency.  Thus two 4K reads may become one 8K read before it is
    ultimately handed to the disk, and so it will be counted (and queued)
    as only one I/O.  This field lets you know how often this was done.
Field  3 — # of sectors read
    This is the total number of sectors read successfully.
Field  4 — # of milliseconds spent reading
    This is the total number of milliseconds spent by all reads (as
    measured from __make_request() to end_that_request_last()).
Field  5 — # of writes completed
    This is the total number of writes completed successfully.
Field  7 — # of sectors written
    This is the total number of sectors written successfully.
Field  8 — # of milliseconds spent writing
    This is the total number of milliseconds spent by all writes (as
    measured from __make_request() to end_that_request_last()).
Field  9 — # of I/Os currently in progress
    The only field that should go to zero. Incremented as requests are
    given to appropriate struct request_queue and decremented as they finish.
Field 10 — # of milliseconds spent doing I/Os
    This field is increases so long as field 9 is nonzero.
Field 11 — weighted # of milliseconds spent doing I/Os
    This field is incremented at each I/O start, I/O completion, I/O
    merge, or read of these stats by the number of I/Os in progress
    (field 9) times the number of milliseconds spent doing I/O since the
    last update of this field.  This can provide an easy measure of both
    I/O completion time and the backlog that may be accumulating.

    另一个问题, 当Linux接到存贮时, 可能会有多条通路, 形成很多的虚盘, 这时不能取虚盘的性能数据, 比如连到EMC的存贮时, 第三列的名字应当为emcpower开头, 而不是sd开头了. 在Linuxmon程序中, 可以通过disk参数, 指定磁盘的前缀名字.

$ linuxmon.bin disk=emcpower
… Read RTim Writ WTim Busy Time
…  70    0  57    0    0  39
…  65    0  55    0    0  40
…  100    0  162    0    0  112
…  70    0  57    0    0  36
…  65    0  70    0    0  64
…  76    0  55    0    0  33
…  105    2  98    0    0  74
…  65    0  54    0    0  38
…  155    0  102    0    0  85
…  76    0  63    0    0  49
…  64    0  54    0    0  38
…  53    0  34    0    0  22

    如果上面的理解有问题, 欢迎指出来, 正在学习之中, 有理解错误也是难免的.

不可靠的EXP远程备份

Posted by anysql on 2010-05-28

    前天接到一个求助电话, 说是一个dmp文件不能导入, 一开始经验性地认为可能是ftp传文件的模式问题, 后来对方再三确认不是这个问题, 就让人家将dmp文件传给我看一下, 在导入指定用户时遇到了不正常的dmp文件结束错误.

    虽然因为写AUL而对数据文件块格式比较清楚, 但DMP文件如果乱了却是没有什么招的, 虽然如此, 试着导入几次无果后, 还是用UltraEdit以十六进制打开了DMP文件, 看到DMP文件中有SH等Oracle Demo用户的表, 于是指定导入SH用户试试, 居然全部导入, 然后报了一个不正常的dmp文件结束错误.

    这时明白了最终的原因, 这个DMP文件不全, 也就是只给了完整DMP文件的一部份, 于是在DMP文件中查找所有的”CONNECT”字符, 没有发现用户表所在的用户名, 就告诉用户这个DMP文件不全, 只导出了部份, 有没有更大的DMP文件. 但心中明白了一些原委, 一般情况下在安装Oracle时都会装很多的Demo用户, 并且一般会使用具有DBA权限的用户(给常用的帐户授于DBA权限), 所以进行导出时, 虽然连到了准确的用户, 但还是因为拥有DBA权限而做了全库导出, 每次都优先导出了那一堆Demo用户的数据, 而不是用户的真正数据.

    进一步与用户确认, 原来用户为了做灾备, 对这个并不重要的数据, 用Internet的连接来做EXP备份, 猜想由于国内互联网的不稳定性, 经常导到一半或更少时就断开了, 造成了一个不全的EXP备份. 然后以为有EXP备份, 没有确认就将系统重新格掉重装Oracle了, 引起了这一悲剧.

    上一次去做现场服务时, 发现只用EXP做备份的情况还是比较多的存在, 这下要小心了, 至少要判断EXP命令的返回值, 最好是做EXP备份的导入验证, 以确保这个唯一的备份是有效的, 当然更好的是咨询专业人员采用更好的备份策略.

    如果你正在用Internet连接做远程备份, 千万要小心了!

图形版Oracle数据迁移工具

Posted by anysql on 2010-05-12

    同样用Delphi为Oracle间的数据迁移工具(DataCopy)做了一个图形版, 这个工具允许将源库上一个SQL的查结果, 不生成中间文件, 直接导入到目标Oracle数据库中, 由于不生成中间文件, 并且用Oracle内部格式, 导入速度要比文本导入快, 也支持Direct模式, 可以和SQL*Loader, exp/imp, expdp/impdp等工具相比拼, 将来10GB的网络普及的话, 这样的工具迁移巨量数据就飞快了.

    用这个工具还可以比较方便地进行US7ASCII库到ZHS16GBK库的数据迁移, 有此类需求的不妨试一下. (附: ITPub上的图形化教程)

图形版Oracle文本导出工具

Posted by anysql on 2010-05-11

    一直都有网友建议, AnySQL怎么不出一些图形化的工具, 命令行的一开始难以让人入手, 因为编程能力的问题, 一直没有做图形化的工具, 不过从现在开始, 会将图形化工具的开发列入非常重要的计划中. 就从使用人数最多的Oracle快速文本导出功能开始吧, 不管你是Oracle DBA或其他种类数据库的DBA, 还是程序开发人员, 都有可能有从Oracle中导出文本的需求, 比如从Oracle中导出大量数据给Sybase IQ, NCR Teradata, Greepulm等.

    这次发布的图形版(SQLULDR2 Windows), 是用Delphi写的界面, 最新的程序员都不知道Delphi为何物了, 写界面程序真的很好用, 但文本导入的核心则是用SQLULDR2 Windows SDK, 还是用OCI(Oracle C语言接口)写的, 依旧保持了最高的性能, 希望大家能喜欢.

    因为突然间能用Delphi写图形界面, 此前只用Java写过图形界面, 太高兴了, 以至于功能没有完全写好就迫不及待地发布程序了, 如果关心这个图形版, 请经常从本站重新下载进行升级以获得最新的功能.

    补充: 最后更新日期2010/05/12, 界面基本定型, 欢迎更新.

批量数据查询需求

Posted by anysql on 2010-05-07

    经常会接收到开发人员的批量数据查询需求, 什么是批量数据查询需求? 指的是开发人员给你一堆ID, 比如员工编号, 要求查出这些ID对应的记录, 比如员工记录. 提供的格式通常是一行一个ID, 可以指定任意多个, 进行查询. 说了一堆, 还是举个例子来说明一下吧.

    以SCOTT用户的员工表(EMP)为例, 我们在查询页面中, 提供了一个文本输入区, 让查询人员指定多个员工编号.

    在点击查询后, 要能得到如下结果.


EMPNO ENAME JOB MGR SAL
7369 SMITH CLERK 7902 1100
7499 ALLEN SALESMAN 7698 1600
7521 WARD SALESMAN 7698 1250
7566 JONES MANAGER 7839 3275

    上周帮一个部门做了一个临时查询页面时, 人家强烈要求这样的UI体验, 视觉之外的体验, 只好下功夫努力去解决一下了. 还好在DataReport中实现起来并不难. 先定义一个如下所示的页面

WEBCHART.FORALL_1=$arglist
WEBCHART.TYPE_1=-
WEBCHART.QUERY_1=SELECT empno, ename, job, mgr, sal
  FROM EMP WHERE EMPNO = TO_NUMBER(:ARGV0)

WEBCHART.QUERY_2=-

    只要将员工列表的数据用名为arglist的URL参数传给这个页面就可以了.


(©)Copyright 2006-2010 AnySQL.net. All rights reserved.