MySQL :: Oracle增量复制数据到MySQL的工具,历经多次去IOE数据迁移挑战!

可以胜任从Oracle增量迁移数据到MySQL的软件比较多,包括基于日志分析技术的SharePlex和GoldenGate等商业软件,然而在支付公司的多次去IOE数据迁移任务中,一直使用的是自己编写的一个小工具(“mysqlsync”),是一款基于Oracle实体化视图日志来捕捉增量数据,进行增量数据同步的软件,支持过每秒1500TPS压力下的增量数据迁移。

首先在Oracle中创建一张测试表,并创建实体化视图日志,如下所示:

SQL> create table t_mysql (id number(10) not null primary key, col2 int);

Table created.

SQL> create materialized view log on t_mysql with primary key, sequence;

Materialized view log created.

最好是在实体化视图日志表的“SEQUENCE$$”列上创建一个索引,在有大量增量数据堆积的情况下,优化同步数据的速度。

SQL> desc MLOG$_T_MYSQL
 Name                      Null?    Type
 ---------------------------------- ----------------

 ID                                 NUMBER(10)
 SEQUENCE$$                         NUMBER
 SNAPTIME$$                         DATE
 DMLTYPE$$                          VARCHAR2(1)
 OLD_NEW$$                          VARCHAR2(1)
 CHANGE_VECTOR$$                    RAW(255)
 XID$$                              NUMBER

SQL> create index id_mlog_t_mysql on mlog$_t_mysql (sequence$$);

接下来在MySQL数据库中创建具有相同表结构的目标表。

mysql> create table t_mysql (id int not null primary key, col2 int);
Query OK, 0 rows affected (0.02 sec)

还需要为“mysqlsync”工具编写一个配置文件,用来告诉工具需要同步的表、主键列、实体化视图日志表名等关键信息,源表和目标表可以使用不同的表名(需要注意MySQL可能会区分表名、列名的大小写)。

$ cat sync.cfg
# Source # Key Col # Log Table     # Target
 t_mysql # id      # mlog$_t_mysql # t_mysql

接下来可以启动“mysqlsync”工具了,请指定前面所展示的配置文件。

$ mysqlsync user1=system/oracle user2=test/test@db01:3306:test config=sync.cfg
DataSync: Oracle Data Replication Utility, Release 3.0.1
(c) Copyright Lou Fangxin (AnySQL.net) 2010, all rights reserved.

这时程序就在等着源表操作了,可以登录到Oracle中做一些变更操作,不要忘记需要提交事务后,复制才能开始。

SQL> insert into t_mysql values (1, 10);
1 row created.
SQL> commit;
Commit complete.
SQL> insert into t_mysql values (2, 10);
1 row created.
SQL> commit;
Commit complete.

在执行“COMMIT”命令后,就可以看到如下的日志输出信息,表示数据已经被成功同步过去了。

2016-03-27 16:58:22 -- Replicate from T_MYSQL to t_mysql,   1 messages processed.
2016-03-27 16:58:46 -- Replicate from T_MYSQL to t_mysql,   1 messages processed.

接下来可以向源表插入更多的数据。

SQL> insert into t_mysql select object_id, data_object_id
  2     from all_objects where object_id > 2 and object_id < 10;
7 rows created.
SQL> commit;
Commit complete.

马上可以在MySQL数据库中进行查询验证!

mysql> select * from t_mysql;
+----+------+
| id | col2 |
+----+------+
|  1 |   10 |
|  2 |   10 |
|  3 |    3 |
|  4 |    2 |
|  5 |    2 |
|  6 |    6 |
|  7 |    7 |
|  8 |    8 |
|  9 |    9 |
+----+------+
9 rows in set (0.00 sec

在2010年就完成了这个工具的研发,并在多次去IOE数据迁移中使用它来做增量数据同步,以节约停机维护的时间。