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

DBA Archives

March 6, 2008

HVR, 欧州的Shareplex?

    除了ShareplexGoldenGate外, 及中途夭折的MyLOG(开玩笑)外, 还有一个基于日志文件分析作Oracle逻辑备份的产品, 来自欧州的HVR(High Volume Replicator). 前几天发的一篇关于Zizzy开源项目的文章, 引起了他们的注意, 从而找到我, 原来Zizzy就是这家公司贡献出代码来的, HVR的核心就是Zizzy这个项目的代码了, 它相当于是Unix的Kernel了, 而HVR则相当于很漂亮的一个Unix Shell. 现在主要维护它的居然是一个中国籍人, 实在是意料之外了.

    在与他们的谈话中了解到, 这个项目是从99年就开始研究开发它的, 我想Shareplex也差不多就是那时侯开始的吧, 不知道主要开发这个代码的Sean Young是什么背景出生, 居然这么历害. 这下我的牛皮又吹破了, 说是要注入MyLOG的代码, 看来没有必要了, 比我现有的完善多了, 到是可以仔细研究一下他们的代码, 看看可不可以贡献一点点. 看来握着MyLOG的源代码不放, 的确是做错了.

    还问了一下他们产品的应用情况, TNT就是他们的客户之一, 在欧州那边有相当多的客户, 据说有一次开会, 来了三十个不同国家的人, 怎么就没有想到进入中国呢?

    又多了一个竞争者, 不知道Quest会不会将Shareplex卖得便宜一点? DSG会不会感受到压力, 而加大研发的投入, 使其产品的质量和易用性上更上一层楼呢? 国内的公司是不是也有信心去做出另一个Shell呢?

March 13, 2008

如何防止大的DML语句?

    开发人员在开发库上更新某个表的记录时总忘了添加限制(Where)条件, 而错误地更新了数据, 几个小时或几天后来求助DBA, 给DBA制造了不少麻烦, 有没有办法限制他们一句话能更新的记录的条数呢? 下面的方法可以用来限制一条语句能更新的记录数, 首先来创建一个包.

create or replace package temppkg as
    rowcount number := 0;
end;
/

    创建一个语句级(执行前)的触发器, 初始化包中的变量.

create or replace trigger trg_before_update_NOTEINFO
before update on NOTEINFO
begin
   temppkg.rowcount := 0;
end;
/

    创建一个行级的触发器, 进行计数和检查, 并抛出错误.

create or replace trigger trg_update_NOTEINFO_row
before update on NOTEINFO
for each row
begin
   temppkg.rowcount := temppkg.rowcount + 1;
   if temppkg.rowcount > 100 then
      temppkg.rowcount := 0;
      raise_application_error(-20002,'error message ...');
   end if;
end;
/

    这个办法是不是太土了? 用这个方法, 有点看不起自已.

March 14, 2008

致命的人为错误

    在所有的错误中, 人为错误是最难恢复的, 尤期是要到达99.9%的恢复, 最近就有三个这样的例子.

    一个国外的200G的数据库, 使用的是Oracle ASM, 有一天突然起不来的, 上去看了后, 居然是将一块ASM中的盘加到了操作系统的卷管理系统中了, 因此硬盘上部分数据被覆盖, 导致了Oracle ASM起不来. 后来找来找去, 说是有一个dmp格式的备份, 接近200GB, 这么大的dmp文件能成功导入的可能性很少了, 果然, 导入35GB的数据后, imp报错了. 最后的结果可想而知, 从这里可以看出文档(要指明那块盘被那个系统使用了), 方法(加盘前检查一下有没有正被别的系统使用)和简单性(同一台机器用ASM和OS VG做什么呢?)的重要性.

    第二个例子, 人家用PL/SQL Developer工具以DBA权限登录, 一不小心选中了所有用户选项, 然后按了删除操作, 虽然发现后按了取消键, 并强行关闭数据库, 还是导致了上百个表被删除. 在删除的过程中, 又有部分数据进入到系统中, 因此不能全部恢复, 还导致了LOB索引损坏, 总算运气不错, 还恢复了大部份数据. 想想有多少DBA能离开图形工具这个话题, 还是有讨论的必要性的. 建议Toad等图形工具禁用大量删除功能算了, 带来的方便性远没有危害性多.

    第三个例子, exp后将原来表删除了, 然后再imp到其他数据库时, 发现字符集有问题了. 如果真的是exp时出错了, 很多数据将要变成乱码了, 这只能说是人为错误, 谁让他们不检查exp时的字符集呢?

    做DBA实在要小心, 如果觉得头晕, 直接告诉领导, 换个人做工作!

March 15, 2008

OR引起的Join性能问题

    在SQL语句中用了OR之后, 其实很不容易控制, 第一次是想让一个带两个OR的用UNION去执行, 结果用了USE_CONCAT后变成了4个UNION了, 居然没有办法让他按我想象的第一个OR进行UNION. 第二次是在索引上, OR条件导致了不能在索引上进行条件过滤. 现在遇到了第三次, 是同事发现的, 怕自已记不住, 就没有征得他的同意, 在这儿共享出来了.

    有下面两个表, TYPE_ID列上值的重复性很高.

CREATE TABLE T_SMALL (TYPE_ID, ID, ...);
CREATE TABLE T_MIDDLE (TYPE_ID, ID1, ID2, ...);

    运行下面的SQL时, 总是很慢, 我们已经指定用HASH JOIN, 并也指定了T_SMALL是驱动表, 百思不得其解.

SELECT .....
  FROM T_SMALL S, T_MIDDLE M
  WHERE S.TYPE_ID = M.TYPE_ID
    AND (S.ID = M.ID1 OR S.ID = M.ID2)

    第一百零一思时, 发现了原因所在, 因为OR的问题, Oracle在做HASH JOIN时只依据了TYPE_ID这个效率不高的列, 这时的PLAN中肯定出现了FILTER这样的步骤. 后来将这个语句手工改成UNION方式, 就从2个小时变成了15分钟.

SELECT .....
  FROM T_SMALL S, T_MIDDLE M
  WHERE S.TYPE_ID = M.TYPE_ID
    AND S.ID = M.ID1
UNION ALL
SELECT .....
  FROM T_SMALL S, T_MIDDLE M
  WHERE S.TYPE_ID = M.TYPE_ID
    AND S.ID = M.ID2 AND M.ID1 <> M.ID2

    SQL语句的调优, 其实很需要功夫, 也是一门很深的学问, 如此简单的SQL, 也有很深刻的知识.

May 15, 2008

将dmp数据导入到另一个表

    偶然看到有人问, 如何将A表导出的dmp文件导入到B表中, 初一看, 的确好象是不行, 其实还是有办法的. 先来建一个测试环境吧!

SQL> create table t_a as select * from tab;

Table created.

SQL> create table t_b as select * from tab where rownum < 1;

Table created.

    任务是将T_A表导出的记录导入到T_B表中, 所以我在SYSTEM用户中建了一个同义词.

SQL> create synonym t_a for mydul.t_b;

Synonym created.

    接下来的导出和导入命令, 你自已去试试吧.

exp mydul/mydul file=t_a.dmp tables=t_a
imp system/oracle file=t_a.dmp fromuser=mydul touser=system ignore=y

    验证一下数据有没有导入进去.

SQL> select count(*) from t_b;

  COUNT(*)
----------
        17

SQL> select count(*) from t_a;

  COUNT(*)
----------
        17

    Oracle的imp导入数据时, 也只不过是运行Insert语句而已, 向同义词和向表, 它分得清吗?

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

当前分类: DBA

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