首页 | 摘要显示 | 上一页 1 2 3 4 5 6 7 下一页

Tools Archives

November 13, 2006

小工具 -- 显示归档日志的基本信息

    如何判断一个归档日志保存了从那个SCN开始到那个SCN结束的数据库修改? 或者从那个时间开始到那个时间结束的修改? 首先我们会从V$LOG_HISTORY, V$ARCHIVED_LOG等视图中去查找, 但这些视图只保存了最近一段时间内的归档日志的信息, 如果将control file record keep time参数设得小一些, 可能保存不了多条信息. 另一种方法是将归档日志文件的文件头DUMP出来, 你可以看到以下信息:

FILE HEADER:
......
Low scn: 0x031f.05c00824 08/23/2006 19:08:21
Next scn: 0x031f.05c00990 08/23/2006 19:08:58
......

    但DUMP日志文件显得比较麻烦, 根据前段时间研究LOG的成果, 写了一个小工具lslog, 可以用来查看这些信息:

$> lslog file=PROD_26375.arc
26375,3436537083312,2006-11-12 18:13:57,3436537256045,2006-11-12 21:09:24

    命令输出中用逗号分隔成5个字段, 依次是:

1, Log Sequence
2, Start SCN
3, Start Time
4, Next Log Start SCN
5, Next Log Start Time

    这个命令可以跨平台显示信息, 支持显示8i/9i/10g的日志文件. 如下所示:

SQL> SELECT FIRST_CHANGE#,FIRST_TIME,NEXT_CHANGE#
  2  FROM V$LOG_HISTORY WHERE SEQUENCE#=26375;

   FIRST_CHANGE# FIRST_TIME              NEXT_CHANGE#
---------------- ------------------- ----------------
   3436537083312 2006-11-12 18:13:57    3436537256045

00:36:55 SQL> select FIRST_TIME from  v$log_history where SEQUENCE#=26376;

FIRST_TIME
-------------------
2006-11-12 21:09:24

    总是写一些无用的工具, 需要请下裁!

November 16, 2006

ociuldr小工具的新选项 -- table

    给我的小工具ociuldr加了一个命令行选项:

table = table name in the sqlldr control file

    默认这个选项的值为空, 这样的话就不会生成用于sqlldr装裁的控制文件, 如果定义了这个选项的值, 则会生成"表名_sqlldr.ctl"这样的控制文件, 以方便使用.

C:\TEMP>ociuldr user=anysql/anysql query="select * from tab" table=tab

       0 rows exported at 2006-11-16 21:49:12
       5 rows exported at 2006-11-16 21:49:12

    现在我们查看生成的sqlldr控制文件内容:

C:\TEMP>type tab_sqlldr.ctl
--
-- Generated by OCIULDR
--
OPTIONS(BINDSIZE=4194304,READSIZE=4194304,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'uldrdata.txt' "STR X'0a'"
INTO TABLE tab
FIELDS TERMINATED BY X'2c' TRAILING NULLCOLS
(
  TNAME CHAR(30),
  TABTYPE CHAR(7),
  CLUSTERID CHAR(40)
)

    自从加了自动生成sqlldr控制文件信息后, 我自已用ociuldr的频率也高了一些. 加这个选项也是为了进一步的方便.

November 23, 2006

ociuldr支持分成几个文件导出了

    一网友导出了7亿多条记录之后, 生成了一个50g大小的文本文件, 却发现Perl处理起来比较难, 于是问我是不是可能导出成几个文件. 现在对程序作了改进, 增加了一个命令行选项:batch. 指定在几个batch后切换文件名, 默认一个batch是50万条记录, 如果指定batch为2就表示100万条记录换一个文件. 默认这个选项值是0, 就是指不生成多个文件. 在指定batch选项后, 请指定file选项来定义生成的文件名, 中间请包含"%d"字样, 在生成文件时, "%d"会被打印成序号. 例如要导出下面的表:

SQL> SELECT COUNT(*) FROM T_OBJID;

  COUNT(*)
----------
   2430720

    用如下命令进行导出, 请观查log输出:

C:\TEMP>ociuldr user=anysql/anysql query="select * from t_objid" batch=2 file=test_%d.txt

       0 rows exported at 2006-11-23 21:09:19
  500000 rows exported at 2006-11-23 21:09:20
1000000 rows exported at 2006-11-23 21:09:21
         output file test_1.txt closed at 1000000 rows.
  500000 rows exported at 2006-11-23 21:09:21
1000000 rows exported at 2006-11-23 21:09:22
         output file test_2.txt closed at 1000000 rows.
  430720 rows exported at 2006-11-23 21:09:22
         output file test_3.txt closed at 430720 rows.

    请大家重新下载, 或下载源代码来编译. 以前的Linux版本在编译时没有加上64Bit IO的支持, 可能不能导出大于4GB的数据.

December 11, 2006

更改dmp文件中的字符集 -- dmp2utf8

    看到过几次"如何修改dmp文件字符集"的问题, 我自已仅在刚入门时, 在老板的指导下用过一次. 到现在也不知道这种直接更新dmp文件第二个和第三个字节的方法到底安全不安全, 因为除了第二个第三个字节外, dmp文件中, 每个字符列都有相应的字符集标识的.

    虽然如此, 还是发布一个小工具吧, 可以用于修改dmp中的字符集标识, 新工具命令为: dmp2utf8, 命令使用语法如下:

Usange: dmp2utf8 dmpfile [charset id]

    如果不指定第二个参数, 则默认将改dmp文件为utf-8字符集, 这就是名字的由来.

    更安全的做法应当是Clone一个数据库, 然后更新字符集:

ALTER DATABASE CHARACTER SET INTERNAL_USE target_char_set;

    然后进行导出, 这样新导出的dmp文件就用新的字符集了. 对于直接修改dmp文件字符集, 有人很清楚吗? 下载文件中包括源程序.

    慎重声明: 本站只提供工具, 不负责其他责任, 改dmp文件字符集之前, 请注意备份, 虽然这个程序只会更新第二和第三字节.

December 12, 2006

fatal: ... wrong ELF class: ELFCLASS64

    今天有人在用Solaris上的ociuldr时遇到这个问题, 引起这个问题的原因是, ociuldr是编译成32Bit的程序的, 因此需要使用32Bit的Oracle客户端库, 在8i中, $ORACLE_HOME/lib是32Bit的库文件所在目录, $ORACLE_HOME/lib64是64Bit的库所在的目录, 而9i以后, $ORACLE_HOME/lib32是32Bit的库文件, $ORACLE_HOME/lib是64Bit的库文件, 一般在Oracle 9i及以上版本的服务器端, 默认的库文件查找位置(Linux/Unix: LD_LIBRARY_PATH变量, AIX: LIBPATH变量)是指向64Bit的客户端的, 这时运行ociuldr就报了这个错误.

    我一般是将可行文件命名成ociuldr.bin, 然后建一个ociuldr的Shell角本, 如下所示:

#!/bin/sh

if [ "A${ORACLE_HOME}A" = "AA" ]; then
   echo "ORACLE_HOME environment variable not setted."
   exit
fi

if [ "A${LD_LIBRARY_PATH}A" = "AA" ];then
   LD_LIBRARY_PATH=/lib:/usr/lib
fi

if [ -d ${ORACLE_HOME}/lib32 ]; then
   LD_LIBRARY_PATH = ${ORACLE_HOME}/lib32:${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
else
   LD_LIBRARY_PATH = ${ORACLE_HOME}/lib:${ORACLE_HOME}/lib64:${LD_LIBRARY_PATH}
fi

export LD_LIBRARY_PATH

ociuldr.bin "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$8"

    这个程序在8i/9i/10g的客户端下都可以跑, 不需要重新编译. 我的其他工具也都是32Bit的, 可以使用相同的办法处理.

上一页 1 2 3 4 5 6 7 下一页

当前分类: Tools

Creative Commons License
本站版权: 共用创作 CC
署名-非商业性-相同方式分享
本站基于MT-3.36免费版
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql