日期:2014-05-16  浏览次数:20864 次

从Oracle迁移数据到MySql方法大全

最近工作需要从Oracle迁移大量数据到MySql,由于涉及不深,便网上学习了很多的方法,现总结Oracle迁移大量数据到MySql如下:

一,牛人编写的Oracle到MySQL的数据迁移工具

从Oracle迁移数据到MySQL的小程序,ora2mysql下载地址 http://www.anysql.net/software/ora2mysql.zip
使用方法如下:
??? D:\>ora2mysql user1=scott/tiger user2=/@localhost:3306:test table=emp
??????????? 0 rows processed at 2011-04-02 15:03:08.
??????????? 2 rows processed at 2011-04-02 15:03:08.

??? 在速度方面,由于不支持Array操作,因此速度比较慢,希望Oracle能让SQL * Plus也能连接MySQL库,或改造一下MySQL客户端,增加Array接口。

??? D:\>ora2mysql user1=scott/tiger user2=/@::test table1=emp_bak table2=emp
??????????? 0 rows processed at 2011-04-02 19:48:51.
??????? 100000 rows processed at 2011-04-02 19:49:17.
??????? 200000 rows processed at 2011-04-02 19:49:42.
??????? 300000 rows processed at 2011-04-02 19:50:07.
??????? 400000 rows processed at 2011-04-02 19:50:32.
??????? 500000 rows processed at 2011-04-02 19:50:57.
??????? 600000 rows processed at 2011-04-02 19:51:23.
??????? 700000 rows processed at 2011-04-02 19:51:48.
??????? 800000 rows processed at 2011-04-02 19:52:14.
??????? 900000 rows processed at 2011-04-02 19:52:39.
????? 1000000 rows processed at 2011-04-02 19:53:03.
????? 1100000 rows processed at 2011-04-02 19:53:29.
????? 1200000 rows processed at 2011-04-02 19:53:56.
????? 1300000 rows processed at 2011-04-02 19:54:24.
????? 1400000 rows processed at 2011-04-02 19:54:53.

??? 目前还不支持BLOB类型, 也不支持字符集的设置

?? 作者地址:http://www.anysql.net/tools/oracle-mysql-data-migration-tool.html/comment-page-1#comment-4146


二,从oracle导数据到mysql,使用命令
?? (1)在使用pl/sql developer生成的sql文件然后插入到mysql时由于to_date()和chr()问题,insert时会失败。
?? (2)phpmyadmin里面有个SQL compatibility mode 的 Oracle选项,具体作用还未知。
?? (3)DBA高效数据迁移方法:先导出成文本,然后LOAD DATA 命令直接导入。
建议用

????????select u_id||'&'||u_pid||'&'||str_1||'&' ||str_2||'&' ||str_3||'&'||tm_create_time?? from table_foo

????????这样的形式,在sql plus里面导出用&分割的数据,然后在mysql里面用

????????load data local infile '~/table_foo' into table tbl_gbase_inf fields terminated by '&';

????????导入。

如果str里面包含多行文本,而默认是文本文件里一行对应数据库里一行数据的,多行文本被误认为是多行数据,格式就不对,导入出错。可以在pl/sql developer里面进行以下查询:

select t.*,'$' from tbl_foo t

????????用$作 为一行数据的结束符,这样即使遇到回车,mysql仍然能够正确处理了。然后把结果全选,右键菜单导出结果到TSV文件("导出结果"->"TSV 文件")。这个文件的格式就是一行一项数据的文本文件了,而且字段之间是用tab分隔的,正好就是load data命令的默认分隔符。
????????在 select语句里加了一个'$'作为最后一个域,也就是说在文本文件里,它前面会有一个tab,后面会有一个回车换行。所以要用ultraedit把 '\t\$\r\n'(Ultredit正则)都替换成'$',这样一搞,文本文件基本上没法看了,但在load edit眼里,它就是一个正好合胃口的美味的数据源了。用如下命令导入:

load data local infile '~/table_foo' into table tbl_gbase_inf lines terminated by '%';show warnings;

回 车搞定。可以在文件名和into之间插上replace关键字,自动替换掉原有数据。 注意,load data可能不是立即生效的,可以show processlist;看看是否被delay了,过一段时间表没人访问应该就会插进去了。? 另外,如果插入的中文显示出来是乱码,就用
show?? variables?? like?? "%char%";

???????? 看看结果是不是长这样的:

+--------------------------+----------------------------+
| Variable_name??????????? | Value????????????????????? |
+--------------------------+----------------------------+
| character_set_client???? | utf8?????????????????????? |
| character_set_connection | utf8?????????????????????? |
| character_set_database?? | utf8?????????????????????? |
| character_set_filesystem | binary???????????????????? |
| character_set_results??? | utf8?????????????????????? |
| character_set_server???? | utf8?????????????????????? |
| character_set_system???? | utf8?????????????????????? |
| character_sets_dir?????? | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

????????如果database或server的字符集不是utf8,用set 命令将其改为utf8,然后重新load data,应该就不会是乱码。

三,使用mysql工具迁移数