当前位置:七道奇文章资讯数据防范Oracle防范
日期:2011-01-25 22:55:00  来源:本站整理

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防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • PHP将数据从Oracle向Mysql数据迁移实例-开辟技术
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .