首页 | 摘要显示 | 上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 下一页

Oracle Archives

January 24, 2007

XMLTYPE类型的存贮属性如何修改?

    几天前我告诉一个朋友说, XMLTYPE其实就是CLOB类型, 可以通过修改CACHE属性来提升CLOB类型的性能. 今天朋友就来问我XMLTYPE类型的列如何修改存贮特性. 凭着模糊的对于XMLTYPE是一个对象类型的一点印象, 我首先去看了一下这个对象类型的结构:

SQL> DESC XMLTYPE

METHOD
------
STATIC FUNCTION CREATEXML RETURNS XMLTYPE
Argument Name    Type    In/Out Default?
---------------- ------- ------ --------
XMLDATA          CLOB    IN

......

    发现其中有一个属性XMLDATA是CLOB类型, 于是我就猜测(因为从没有用过这种类型), 可以用修改CLOB字段的语法来改相关的属性, 并在测试机上进行了测试并成功, 说明猜测准确:

SQL> create table t_xmltype (col1 xmltype);

Table created.

SQL> ALTER TABLE T_XMLTYPE MODIFY LOB (COL1.XMLDATA) (CACHE);

Table altered.

    多看些书, 留下些模糊的印象也好, 可以帮你想到解决的方法.

如何指定exp的query参数以导出部份记录?

    Oracle的exp工具有一个query参数可以指定一个where条件来有条件地导出记录, 对于不经常用这个选项的人来说, 经常会遇到这样的错误:

LRM-00112: multiple values not allowed for parameter 'query'

EXP-00019: failed to process parameters, type 'EXP HELP=Y' for help
EXP-00000: Export terminated unsuccessfully

    这是因为在where条件中一般都会有空格, 而命令行下就会被释成几个命令行参数, 需要用单引号或双引号将整个where条件括起来, 就可以了. 在Windows下, 如何指定query参数:

exp ... query='where deptno=10'
exp ... query='where deptno=''10'''
exp ... query='where deptno"<"10'

    在Solaris(C shell)下, 如何指定query参数:

exp ..... query=\"where col1 \< 1000\"
exp ..... query=\"where col1 \< '1000'\"

    其他Unix平台的应当和Solaris下的一样, 我自已也经常搞错. 在上面的例子中已经说明了如何在query值中使用单引号, 因此在看完这篇后, 就应当可以写出正确的where条件了. 最好是写在一个参数文件里, 这样的话就不用注意这些了.

January 31, 2007

用Oracle的加密包进行des3算法加密

    Oracle中的bms_obfuscation_toolkit包定义了几种加密算法, 你可以用这个包来对需要的数据进行加密, 国外有人这样用的, 刚好那个库坏了向我求助, 所以我才知道. 对于这方面我们知道的实在有限.

    将两个过程(加密和解密)放在一个包中, 定义如下:

create or replace package mydes3 is
  function encrypt (p_input varchar2) return varchar2;
  function decrypt (p_input varchar2) return varchar2;
end;
/

    DES3算法要求输入的值的长度是8的整数倍, 因此在加密和解密过程中, 字符串后面会多出空格. 如下所示:

ASQL> SELECT mydes3.ENCRYPT('ABCDE') ENC_STR FROM DUAL;

ENC_STR
-------
?oa?[Z?

1 rows returned.

ASQL> SELECT mydes3.DECRYPT(mydes3.ENCRYPT('ABCDE')) enc_str from dual;

ENC_STR
--------
ABCDE

1 rows returned.

ASQL> SELECT LENGTH(mydes3.DECRYPT(mydes3.ENCRYPT('ABCDE'))) STRLEN FROM DUAL;

STRLEN
------
     8

1 rows returned.

    为了安全起见, 你可以将PL/SQL代码用Wrap来加密. 下面附上Package Body部份代码:

阅读全文

你用过Oracle的Global Partition Index吗?

    Oracle的分区表也不是十分好用, 当分区的数目比较多时, 很可能让一些不能进行Partition Prune的SQL拥有很高的逻辑读(Consistent Gets), 解决的办法是将一些索引建成全局索引. 现在我们来看一下相反的例子, Oracle中的表是不分区的, 而且访问量最多的SQL是根据一个选择性很好的索引去走的, 每次执行的逻辑读也就只有4-6个了, 因为访问量很高, 如果能降底一个逻辑读的话, 也可能降底整个系统5%-10%的逻辑读, 我们应当从哪儿来考虑呢? 索引的层次(Level)绝对是一个值得研究的角度. 事实上如果我们能让索引的层次(Level)高度降一级, 就可以降低一个逻辑读了, 通过常有以下的方法可用:

1, Rebuild索引.
2, 删除一部份数据后重建索引.
3, 将索引建到一个较大Block Size的表空间中.
4, 建成Global Partitioned索引.

    什么是Global Partitioned索引? 指的是在非分区表上建的分区索引, 或者是分区表上但分区方法和表不相同的索引. 通过分区技术, 我们可以将一个大的索引划分为小片, 从而降底索引的层次(Level). 下面来看一下如何在非分区表上建分区索引:

create table t_objects as select * from all_objects;
create index t_objects_id_idx on t_objects (object_id)
   global partition by hash(object_id) partitions 4;

    虽然表是非分区表, 但有了这样一个分区的索引后, 所有这个表的SQL都将采用CBO, 这是需要考虑的地方, 取决你的SQL现在运行的方式.

February 5, 2007

RMAN Copy加上Rsync, 在Oracle 11g中实现了吗?

    去年有一段时间经常要为很忙的系统重建Standby, 因为归档生成量很多, 而存放归档日志的卷空间却不是很多, 给重建Standby带来很大的难处. 将表空间置为Begin Backup状态后, 生成的归档日志量更是加倍, 因此我们不得不用RMAN的Copy功能来进行数据文件拷贝, 但是没有办法直接拷贝到远程的机器上, 而用RMAN的Copy功能来拷贝文件的话则日志量不会增大, 但必须先拷到本地, 然后拷贝过去. 为什么不用NFS, 在不同的Data Center之间, 做NFS不是很简单的事, 在我们这儿, DBA只做DBA的事情.

    Rsync是很好的在Linux/Unix主机间拷贝文件的好工具, 还具有压缩功能, 可以适应网络条件不是很好的情况, 而不同的数据中心之间, 就是一个很合适的场合. 如何将两者结合起来, 这样的话将是一个完美的组合. 不少的刚入门的DBA, 拷出来的文件总是Online Fuzzy的, 说明RMAN Copy和Hot Backup还是比较难的.

    于是我就想到了一个osync的程序, 将这两个结合起来, 直接"osync file_id 主机:目标文件"这样就可以了. 为此在Google的论坛上发过一个贴子, 被笑了一把. 后来给Oracle发了个Tar(号码不记得了), Oracle的开发人员说可能在11g中加入RMAN将数据文件直接拷贝到远程机器的功能.

    现在Oracle宣称11g Beta出来已经有不少天数了, 不知道有没有朋友得到Beta版本的, 有的话能帮我确认一下吗? 我最想知道的就是这个功能有没有被实现. 谢谢!

上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 下一页

当前分类: Oracle

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