PHP将数据从Oracle向Mysql数据迁移实例-开辟技术[Oracle防范]
本文“PHP将数据从Oracle向Mysql数据迁移实例-开辟技术[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
为什么要迁移?
首先从运营本钱考虑,用Mysql可以节俭不少的费用.另一方面,Mysql的安定性及功效不断地提高与加强,基本上可以满意客户的需求,如支持多 节点布置,数据分区等.还有就是Mysql利用便利,比Oracle简单易用.故客户就要求将已有的Oracle数据表与内容迁移到Mysql来.
为什么要自己写脚本?
迁移的表与数据都蛮多的,有几百张表.因此手工完成不太便利.也尝试了一些免费的迁移工具,如:MySQLMigrationTool等,发现转移 的字段范例不太符合要求(大概是本来的Oracle表计划得不太好),会招致数据不太完好,认为不是太坚固,所以决意自己写迁移脚本安心一些,有不符合要求的也可当即调整,所以就开始吧.
所用到的技术支持
1.php5
2.php oci8
3.mysql 5.1
迁移表构造
获得schema全部表
用以下语句可以从Oracle中得到schema中全部的表名
SELECT table_name FROM user_tables |
然后可以遍历全部表向mysql举行表构造的成立与数据的迁移工作.
获得单个表的全部字段与范例
用以下语句可以从oracle中得到单个表的全部字段与范例
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER('{$table_name}') ORDER BY column_id ASC |
这样可以得知表字段的名称,范例,长度,能否答应为空,默许值.因为oracle与mysql的字段范例并不完好兼容,故需求成立字段范例的对应关系表.
Oracle | Mysql |
---|---|
number(<11)> | int |
number(>11) | bigint |
varchar | varchar |
varchar2(<255)> | varchar |
varchar2(>255) | text |
clob | text |
date | date |
获得单个表的Primary Foreign Unique Key用以下语句可以从oracle中得到单个表的Primary Foreign Unique Key
SELECT C.CONSTRAINT_NAME, C.CONSTRAINT_TYPE, C.R_CONSTRAINT_NAME, C.DELETE_RULE, CC.COLUMN_NAME FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS CC WHERE C.TABLE_NAME=upper('{$table_name}') AND C.CONSTRAINT_TYPE!='C' AND C.CONSTRAINT_NAME=CC.CONSTRAINT_NAME AND C.OWNER=CC.OWNER AND C.TABLE_NAME=CC.TABLE_NAME ORDER BY C.CONSTRAINT_TYPE, C.CONSTRAINT_NAME, CC.POSITION |
获得单个表的索引
用以下语句可以从oracle中得到单个表的索引
SELECT T.INDEX_NAME,T.COLUMN_NAME,I.INDEX_TYPE FROM USER_IND_COLUMNS T,USER_INDEXES I WHERE T.INDEX_NAME = I.INDEX_NAME AND T.TABLE_NAME = I.TABLE_NAME AND T.TABLE_NAME = UPPER('{$table_name}') |
这样可以获知表的索引名称,被索引的字段.
将全部的表信息组装成mysql的表构造 有了表名,字段信息,主键,Foreign, Unique.索引等信息,便可以将表构造成立起来.由于oracle没有自增字段,一个变通的办法是用primary key做为mysql中的自增字段,因为在oracle中没办法精确地知道哪个字段用到了seq来做自增,用这种办法也不是很精确.
迁移视图
获得schema全部views.用以下语句可以从oracle中获得schema全部views
SELECT VIEW_NAME,TEXT FROM USER_VIEWS |
这样可以得到view的名称及成立view的构成语句.
Oracle与Mysql不兼容的view处理
Oracle的对view的构建语句对比宽松一些,mysql中对view的构建语句要严峻些,from不能从子查询中构建,也就是人样的让语句是不被答应的.
CREATE VIEW `view_name` AS SELECT * FROM (SELECT * FROM table_name) ... |
那么处理这样的view,有一个办法是将子查询再成立成一个view,将子查询替换成新成立的view名便可.
迁移数据
数据的迁移,从Oracle数据库中select出数据,拼装成Mysql的insert语句便可以了.需求注意的两点:一是oracle的日期类 型的数据格局与mysql的日期范例格局不太一致,所以要用TO_CHAR(field_name, 'YYYY-MM-DD')将其转换成mysql的呼应的数据格局;二是oracle中的clob字段的内容要用 oci_fetch_array($stid, OCI_ASSOC|OCI_RETURN_NULLS|OCI_RETURN_LOBS)将其取出,插入到mysql的text字段. 在mysql插入大量数据时,还要注意,在window的my.ini或my.cnf默许max_allowed_packet是1M要将其改成
[mysqld]...max_allowed_packet = 16M... |
要不会呈现mysql goes away的错误,linux版本没有这个问题,因为其默许值就是16M.
不能迁移的内容
Oracle中的触发器、存储历程与Mysql中是不一样的,所以不能通过脚本程序自动迁移过去.要手工举行重写.
总结
从Oracle向Mysql数据迁移,table构造与数据是基本上可以平移过去的,view有些还不是完好兼容oracle的语句,所以要对其作 出一些中间表.触发器与存储历程是不能平移的,这两部份需求重写.表构造平移过去后,看能否都对比符合,假如认为不太好还可以通过alter等语句对其进 行呼应的调整.在导入大量数据时还要注意一下mysql的配置文件(my.ini或my.cnf)里的max_allowed_packet值,这应设置 得太小,免得导入数据时出错或导不进去或乱码等不安定因素.
以上是“PHP将数据从Oracle向Mysql数据迁移实例-开辟技术[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |