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

Tools Archives

March 14, 2007

refresh_mysql.pl角本的一个配置例子

    在Oracle中创建表和实体化视图日志:

CREATE TABLE T_OBJECTS AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM < 1;
ALTER TABLE T_OBJECTS MODIFY OBJECT_ID NOT NULL;
ALTER TABLE T_OBJECTS ADD PRIMARY KEY (OBJECT_ID);
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS WITH PRIMARY KEY, SEQUENCE;

    在MySQL中创建测试表:

CREATE TABLE t_objects (
  OBJECT_ID decimal(10,0) NOT NULL,  OWNER varchar(30) ,
  OBJECT_NAME varchar(128) ,   SUBOBJECT_NAME varchar(30) ,
  DATA_OBJECT_ID decimal(10,0) ,  OBJECT_TYPE varchar(18) ,
  CREATED datetime ,   LAST_DDL_TIME datetime ,
  TIMESTAMP varchar(19) ,  STATUS varchar(7) ,
  TEMPORARY varchar(1) ,  GENERATED varchar(1) ,
  SECONDARY varchar(1) ,  PRIMARY KEY  (OBJECT_ID)
);

    创建一个配置文件(demo.conf):

# SOURCE  # PKEY      # MVIEW Log       # TARGET
T_OBJECTS # OBJECT_ID # MLOG$_T_OBJECTS # T_OBJECGS

    运行refresh_mysql.pl角本(我装的是ActivePerl):

perl refresh_mysql.pl -s Oracle用户名#口令#Oracle:连接串 -t MySQL用户名#口令#MySQL:数据库名:主机 -c demo.conf

    然后你在Oracle端进行插入或更新或删除, 看看记录有没有被复制过去.

如何在不同类型的数据库间迁移数据?

    refresh_mysql.pl是一个用来从Oracle向MySQL中复制变更数据的Perl角本. 通过变通的方法, 也可以用于在不同种类的数据库之间拷贝数据. 只要我们建一个假的和Oracle实体化视图日志表结构差不多的表就可以了, 然后向这个表中手工插入记录(在Oracle中, 实体化视图日志会被自动维护), 也可以被这个角本支持. 再进一步地去设想, 在非Oracle的数据库中, 可以用触发器(Trigger)来维护变更记录, 达到和视图化视图日志一样的作用, 就可以从其他的数据库向Oracle复制数据了.

    在这儿只要我们自已建的临时表包括所有的主键列, 两个名字分别为"SEQUENCE$$"和"DMLTYPE$$"的列就可以了, 我已经在MySQL中测试过了, 列名中可以包含"$"符号, 如下所示:

create table temp_table
{
    SEQUENCE$$    INT NOT NULL PRIMARY KEY,
    DMLTYPE$$     VARCHAR(1) DEFAULT 'I',
    pkey_col1     column_type,
    pkey_col...   column_type
);

    然后创建一个配置文件, 就可以让这个角本工作了. 为了适应MySQL和Oracle之间的情况, 还真的去掉一些Oracle特殊的, 如在字段名前加又引号, 在Oracle中是当作一个字段名的, 但在MySQL中就当作一个字符常量了.

    又经过一翻修改, 已经成功地用这种方式, 将数据从Oracle到MySQL进行互拷了. 又发现了一个新用途.

March 25, 2007

DUL有多大啊, 可不可以发一个啊?

    去ITPub的数据库区一看, 居然有人翻出了04年的这个贴子, 还引得不少人再次回贴, 要求DUL, d.c.b.a居然现在公开发贴要DUL? 不由得让人细看了发帖人的名字好几遍, 这里最基本的原因是因为发贴时间不够明显, 另外呢我们看贴时也很少注意发贴时间, 总以为冒上来的总是最新的.

    话说回来, 当时最后还是没有要到DUL, 估计当时总共的发贴数还不到100吧? 要是当时每个人都被看成一支股票, 我想我到是一支好股票, 两年多的时间, 增值了多少倍? 因为没有搞到, 求人不如求已, 就自已写一个吧, 从2004年10月份开始想的, 11月份动手, 到2005年3月份就出第二版了. 那就是当年引起深入研究是否不符合Oracle版权之争的MyDUL, 也因为那场版权之争, 将名字从MyDUL更改到AUL. 大约几个月后, 又认为使用MyDUL的名字也没有关系, 想改回来, 但又没有完全改回来.

I'd like to make some suggestions to you, if I may. As other nice folks point out, there may be a legal issue with MYDUL. I suggest you rename the tool to anything not having the word "DUL". Secondly, clearly state wherever appropriate that the tool is built by studying block dumps and trial-and-error experiments, not by disassembling either Oracle's DUL tool or Oracle server software. ......

Yong Huang
yong321ATyahoo.com

    当然绝对不是去反向编译Oracle的可执行文件或他的DUL程序来搞的, 因为这一点, 当时我坚信没有版权问题. 现在我还要搞一个MyLOG呢, 这一次绝对不更名.

March 27, 2007

对我的DBDiff - ocidiff的两点改进

    ocidiff是一个同步表结构(DBDiff)的程序, 今天所作的主要改进有两个方面. 第一个是类型(Type)/存贮过程(Procedure)/函数(Function)/包(Package)/视图(View)这些对象的刷新机制, 当发现目标数据库这些对象的LAST_DDL_TIME比源数据库的要旧的话, 就会从从源端取出重建代码进行创建(Create or Replace), 对于触发器, 将会在明后天作出相应的更改.

    第二个改进是增加了一个命令行参数mask(默认值1, 保留比较报告), 主要用于控制是否自动删除用到的监时文件, 以用于调试, 在ocidiff工作时, 会生成以下文件:

1, diff_rep.txt, 比较报告文件, 当mask的第一位不是1时就删除
2, diff_sql.txt, 最终同步的SQL文件, 不受mask控制, 始终保留
3, diff_sql.log, 自动运行sql文件同步生成的log文件, 不受mask控制
4, diff_exp.txt, 导出的参数文件, mask第二位不是1时就删除
5, diff_dmp.dmp, 导出(exp)文件, Oracle dump格式, 当mask第3位不是1时删除
6, diff_idx.sql, 导入(imp)的日志文件, 当mask的第4位不是1时删除

    mask是用Bit位来控制各个的, 如果全部生成的话, 指定mask值为15(0x01+0x02+0x04+0x08), 这样的指定方法, 有些不合我们的习惯吧.

March 29, 2007

使refresh_mysql适用于数据归档的一点改进

    受上一篇中案例的启发, 对refresh_mysql角本作了一点点改进, 可以为DELETE目标数据库的SQL加一个WHERE条件, 以防止删除不想删除的数据. 举个简单的例子来说, 有一个产品数据和历史库, 产品库中只有今年的记录, 而历史库中包括所有(当前的和07年以前)的数据, 我们还需要将产品库的修改比较实时地反应到历史库中, 那么我有可能要经常在产品库中删除三个月以前的记录, 为了不让这些删除操作被复制到历史库中, 就可以加一个Where条件了, 如"CREATE_DATE > SYSDATE - 30", 这样的话, 就只能在历史库中更新最近三个月的记录了:

    只需要refresh_mysql角本的配置文件后面再加一列, 如下所示:

# SOURCE  # PKEY      # MVIEW Log       # TARGET
T_OBJECTS # OBJECT_ID # MLOG$_T_OBJECTS # T_OBJECGS # CREATE_DATE > SYSDATE - 30

    这时在构造出来的删除目标表的SQL语句为:

DELETE T_OBJECTS WHERE OBJECT_ID = ? AND CREATE_DATE > SYSDATE - 30

    其他的改进, 现在已经不是将UPDATE转化为先DELETE后INSERT了, 而是直接UPDATE, 以提高程序的效率, 减轻目标数据库的压力. 本角本可以免费使用, 但不提供免费的支持服务.

上一页 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