orastats & mysqlstats通用监控工具

Posted by anysql on 2013-03-19

    以前曾写过Oracle与MySQL的监控工具,但随着数据库版本的变化,性能指标也在发生变化,常常需要改进代码,然后再进行编译,比较麻烦。这个时间和OceanBase开发人员在一起久了,受了他们一点灵气的影响,想出了通用的监控工具的方法。

    将所有性能指标理解成一个Key及一个Value的组合,Key为字符串类型,Value为浮点数类型,可以自定义SQL在数据库中查询出来。比如下面的SQL语句:

select name, bytes from v$sgastat
union all
select name, value from v$sysstat

    将上面查询的结果,再加一个当前的时间点(Key=orastats.timestamp)存放到一个Hash表中,然后根据一定的格式规则显示出其中的数据,就是一个非常好的通用监控工具了,我们以如下SQL为例。

select name, value from v$sga

    输出格式使用如下格式进行控制,对任何一个Key需要指定数值的类型(显示当前值还是差量值?),然后指定一个简写的指标名字。

Key|{CURR|DELTA}|Label|…

    编写如下的文本文件(orastats.txt)。

user=sys
query=select name, value from v$sga
format=Fixed Size|curr|Fixed|
        Variable Size|curr|VarS|
        Database Buffers|curr|Data|
loop=10
wait=5

    使用orastats工具来运行,就可以得到如下有效的监控输出。

D:\MyTools\x64>orastats parfile=orastats.txt
2013-03-19 22:57:08 Fixed VarS Data
2013-03-19 22:57:08 2174k 134m 134m
2013-03-19 22:57:13 2174k 134m 134m
2013-03-19 22:57:18 2174k 134m 134m
2013-03-19 22:57:23 2174k 134m 134m
2013-03-19 22:57:28 2174k 134m 134m
2013-03-19 22:57:37 2174k 134m 134m

    不指定Format选项的话,会以Key/Value的方式显示数据。

D:\MyTools\x64>orastats parfile=orastats.txt wait=5 loop=1 format=
orastats.timestamp=2013-03-19 22:58:46
Database Buffers=134217728.000000
Fixed Size=2174888.000000
Redo Buffers=5005312.000000
Variable Size=134217816.000000

    为MySQL也准备了类拟的工具(mysqlstats),这样的话数据库的版本变了,只需要改一下配置文件即可以跟上时代了,明天会加入Linux下的一些基本负载信息,就可以完全用于收集Oracle或MySQL的性能数据了。

从MySQL迁移数据到Oracle库的工具

Posted by anysql on 2013-02-01

    MySQL用于处理简单事务,还是不错的,但用于保存较大的数据则还不行,一般公司的历史库之类的还是可以用Oracle进行保存,那么从MySQL如何迁移数据到Oracle呢?MySQL的文本导出工具(MYSQLULDR2)固然是一个不错的选择,将数据导成文本,然后用SQL*Loader进行导入,不过不落地的工具使用起来会更方便。在以前写的程序的基础上,很容易就写出了一个MYSQL2ORA工具,并且性能也不错。

    使用Direct Load方式,将MySQL的表对拷到Oracle数据库中,要以用如下语法,因为MySQL中建议用自增主键,所以相对于Oracle中多了一个ID列,在导入过程中使用FILLER选项直接跳过。

mysql2ora.exe user1=/@::test user2=test/test table1=emp_his table2=emp_his direct=yes filler=id
          0 rows processed at 2013-02-01 21:01:39.
    1000000 rows processed at 2013-02-01 21:01:41.
    2000000 rows processed at 2013-02-01 21:01:44.
    3000000 rows processed at 2013-02-01 21:01:46.
    3830800 rows processed at 2013-02-01 21:01:48.

    使用普通方式,只要不加DIRECT选项就行了,拷贝数据的话,本质是源端一个SQL语句(query1)以及目标端一个DML语句(query2),大家可以更灵活地指定。

mysql2ora.exe user1=/@::test user2=test/test table1=emp_his table2=emp_his filler=id
          0 rows processed at 2013-02-01 21:11:24.
    1000000 rows processed at 2013-02-01 21:11:28.
    2000000 rows processed at 2013-02-01 21:11:32.
    3000000 rows processed at 2013-02-01 21:11:37.
    3830800 rows processed at 2013-02-01 21:11:40.

    可以下载Windows版本Linux版本进行测试,商业环境使用请支持100RMB给开发者,以创造良好的技术生存环境。

按事务一致性导出的数据

Posted by anysql on 2013-01-31

    昨天收到一邮件,内容如下:

Hi Fangxin,

I’ve just discovered your tool and am excited about the prospect of using it for some of our extract needs. The problem is, I often have sets of tables which must be extracted with a consistent view across those tables at a specific point in time. As such, we normally, set a read only transaction, extract the data from table 1 to file 1, then table 2 to file 2, then table 3 to file 3, then commit. This gives us data integrity and consistency across those tables even if updates/deletes are going on while we are extracting. Is there any way to accomplish this using your sqluldr2 tool?

Please note that our customer does not enable Oracle flashback in production so using the “as of” notation across separate runs is not an option. Thanks in advance for your assistance.

-Eric

    想一想这个要求还是合理的,于是给工具增加了query2-query9的选项,以实现按事务导出功能,加上”presql”选项就可以实现按读事务导出了, 使用方法如下:

user=stats_user/stats_user@tooldb
presql=set transaction read only
query=select * from all_objects
file=nul
query2=select * from all_tables
file2=nul

    执行的日志如下所示,在一个命令里导出多个表。

E:\>.\sqluldr2 parfile=test.txt
          0 rows exported at 2013-01-31 13:07:43, size 0 MB.
      12916 rows exported at 2013-01-31 13:07:44, size 1 MB.
        output file nul closed at 12916 rows, size 1 MB.
          0 rows exported at 2013-01-31 13:07:44, size 0 MB.
        1435 rows exported at 2013-01-31 13:07:44, size 0 MB.
        output file nul closed at 1435 rows, size 0 MB.

    不过这个改动还是没有能够满足那个网友的要求,他有192个表需要在一个事务里时出,用SQL*Plus太慢了,才找到我这个工具的,这样的需求是不是有一点点特殊? 还是大家都有同样的需求?

从MySQL数据库自由导出文本

Posted by anysql on 2013-01-18

    MySQL上处理一些简单的事务是不错的,但历史数据的保存不能靠MySQL,所以还是得将数据导出来,存放到其他数据库(Oracle)或数据仓库(HBase),MySQL本身虽然提供了生成文本文件的方法,但并不是很好用,比如将文本文件导入到Oracle的话,还需要一个控制文件,编写控制文件是一个比较麻烦的事情,SQL Server或Sybase也需要一个格式说明文件,才能方便地导入。为此将Oracle的文本导出工具改造了一下,发布了MySQL版的文本导出工具 — MySQLULDR2。

SQL*UnLoader: Fast Oracle Text Unloader (GZIP, Parallel), Release 4.0.1
(@) Copyright Lou Fangxin (AnySQL.net) 2004 – 2010, all rights reserved.

Usage: MYSQLULDR2 keyword=value [,keyword=value,…]

Valid Keywords:
  user    = username/password@tnsname
  sql    = SQL file name
  query  = select statement
  field  = separator string between fields
  record  = separator string between records
  rows    = print progress for every given rows (default, 1000000)
  file    = output file name(default: uldrdata.txt)
  log    = log file name, prefix with + to append mode
  fast    = auto tuning the session level parameters(YES)
  text    = output type (MYSQL, CSV, MYSQLINS, ORACLEINS, FORM, SEARCH).
  charset = character set name of the target database.
  ncharset= national character set name of the target database.
  parfile = read command option from parameter file

  for field and record, you can use ‘0x’ to specify hex character code,
  \r=0x0d \n=0x0a |=0x7c ,=0x2c, \t=0x09, :=0x3a, #=0x23, “=0x22 ‘=0x27

    使用方法很简单,指定一个连接信息(用户名/口令@主机:端口:数据库),并指定一个查询语句或者表名就可以了。比如:

D:\MyTools>mysqluldr2 /@::test query=emp_his file=emp_his.txt
      0 rows exported at 2013-01-18 07:56:14, size 0 MB.
  819200 rows exported at 2013-01-18 07:56:16, size 42 MB.
        output file emp_his.txt closed at 819200 rows, size 42 MB.

    直接指定表名时,会自动生成Oracle SQL*Loader的控制文件,内容如下:

OPTIONS(BINDSIZE=2097152,READSIZE=2097152,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE ’emp_his.txt’ “STR X’0a'”
INSERT INTO TABLE emp_his
FIELDS TERMINATED BY X’2c’ TRAILING NULLCOLS
(
  empno CHAR(16) NULLIF empno=BLANKS,
  ename CHAR(10) NULLIF ename=BLANKS,
  job CHAR(9) NULLIF job=BLANKS,
  mgr CHAR(16) NULLIF mgr=BLANKS,
  hiredate DATE “YYYY-MM-DD HH24:MI:SS” NULLIF hiredate=BLANKS,
  sal CHAR(20) NULLIF sal=BLANKS,
  comm CHAR(20) NULLIF comm=BLANKS,
  deptno CHAR(16) NULLIF deptno=BLANKS
)

    可以下载Windows版本Linux版本进行测试,商业环境使用请支持100RMB给开发者,以创造良好的技术生存环境。

SQLULDR2的安全保密功能

Posted by anysql on 2013-01-14

    SQLULDR2也许是我所有工具中被使用最广泛的,因此也是最成熟的,上一次修改需求是在一年多以前,为MySQL的Insert语句导出功能增加Hex函数支持。不过用户的需求是无止境的,有网友要求增加一个安全保密功能,对导出的数据内容进行简单的加密操作,我觉得是合理的功能,就快速实现了。

    只需要在导出时加上”crack”选项,指定加密的KEY就可以了,不管生成的是格式化文本,还是Insert语句,所有内容都被加密了。

E:\>sqluldr2 user=dict/ali88@tooldb query=tab file=a.dat crack=anysql
      0 rows exported at 2013-01-14 16:28:06, size 0 MB.
    128 rows exported at 2013-01-14 16:28:06, size 0 MB.
        output file a.dat closed at 128 rows, size 0 MB.

    同样SQLULDR2也提供了解密功能,同样需要用”uncrack”选项来指定解密的KEY,以及用”file”选项来指定要解密的文件(可以接受标准输入),解密后的内容写出到标准输出设备。

E:\>sqluldr2 uncrack=anysql file=a.dat
TASK_INFO,TABLE,
ALI_SQLFILE,TABLE,
ALI_SQLSTATEMENT,TABLE,
TRANS_TMP_1,TABLE,
TRANS_TMP_2,TABLE,
……

    如果要接受标准输入来进行解释,则指定”file”选项的值为”-“就可以。

E:\>type a.dat | sqluldr2 uncrack=anysql file=-
TASK_INFO,TABLE,
ALI_SQLFILE,TABLE,
ALI_SQLSTATEMENT,TABLE,
TRANS_TMP_1,TABLE,
TRANS_TMP_2,TABLE,
……

    加密功能本身的逻辑比较简单,并且会影响性能,希望不是在巨量数据导出中使用。


Copyright © 2007 AnySQL.net. All rights reserved.