日期:2014-05-16 浏览次数:20918 次
最近工作需要从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工具迁移数