`
itstudy123
  • 浏览: 7384 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

mydql--oracle项目迁移简说

阅读更多

 

418到现在,十天的时间。

 

也是,从接到这个单,从当时的混乱到了如果走向最后收尾的时候了。

 

这是第一次,做数据库的迁移,所以,决定记录下来这样一个历程。

 

环境: eclipse  3.0

框架结构:WSI (webwork + spring + ibaits)

        

1 数据结构迁移。

 

   在这里介绍一个工具,oracle官网可以下到,SQLDEVELOPER,现在的版本已经到了3.4或者4.0.,但是我推荐用的1.2,因为版本虽低,但是用于数据库迁移却很方便。

   第一步,需要导入mysql的驱动

   Tools-->preferences:

              附件--图片1

 

然后建立连接:

              附件--图片2

 

接下来就是进行迁移了,迁移有两种方式:

第一种: 普通迁移

              附件--图片3

 

    然后选择表或者数据库

       附件--图片4

 

然后确认迁移,接下来,你可以自己确定转换的类型,且会生成相应的ddl文件。这种方法也会把相应的索引迁移过去。

如果,如果对于mysqloracle类型结构不是很清楚的话,在Oracle官网的文档里面也会有比较,当然,在日志的最后我也会复制上去。

 

在我的项目中,只用到了下面8中类型:

 

变量

Mydql

Oracle

字符型

Varchar

Varchar2

Char

Char

         Varchar2  

整型

Int

Number[10,0]

浮点型

Double

Float[24,0]

中等长度

Mediumblob

Long raw

文本

Text

Clob

长文本

MediunText

Clob

日期

Date

Date

 

 

 

第二种是快速迁移:

             附件--图片5

 

填写好所弹出来的窗口的STEP1-STEP4,点击确认即可。

 

 

<!--[if !supportLists]-->2          <!--[endif]-->数据迁移

<!--[if !supportLists]-->2.1          <!--[endif]-->表名去除单引号

很多时候,为了防止关键字的情况下,在往mysql插入数据时,往往会把表名放在单引号里,而在oracle里面是行不通的、所以,第一步,就是需要把所有的单引号去掉。

<!--[if !supportLists]-->2.2          <!--[endif]-->日期转换问题

oracle里面,date型数据插入是一个很大的问题,日期格式默认情况下是04-9 -01’,

而我们的数据却是’2011-11-11 ’格式的,怎么处理呢?

大多数人会想到to_date函数

to_date(‘2011-11-11’,’yyyy-MM-dd’);

当然,在数据量不大的情况下,这种方法是可行了,可是,如果你需要插入的是好几万,甚至是几十万书句的时候,这种方式就行不通了,在这里就说说第二种方法。

改变oracle日期的默认格式。

Alter session set nls_date_format = ‘yyyy-MM-dd hh24:mi:ss’

注意的是,这只是暂时保存在session作用域,当你一旦关闭的时候也就得重新执行一次。

<!--[if !supportLists]-->2.3          <!--[endif]-->&问题

oracle里面,&是表示用户输入的标识,而在实际情况中,想text里面插入值得时候,很有可能是大片文章,那么,相对应的,也就可能出现了&nbsp &quot等符号的标识,我采取的方法是把所有这种标识去掉。

而如果不想去掉的话,可以采用[]&包起来,也可达到相同的效果。

 

         最后,关于数据迁移,我的建议是,用oracle自带的sqlplus,数据量过大时,第三方工具操作起来也相应的慢。

 

<!--[if !supportLists]-->3          <!--[endif]-->项目迁移

3.1   更改数据库连接配置

         jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc\:oracle\:thin\:@localhost\:1521\:ID

 

<!--[if !supportLists]-->3.2      <!--[endif]-->SQL文的改变

总的概括:函数、limit分页、视图和索引、GROOUP BY

关于函数:

    3.2.1 DATEDIFF

      A  trunc代替

      B  自己写函数(示例)

 

/*
--功能:将字符串转为年月日格式,删除时分秒.
--来源:http://jorkin.reallydo.com/article.asp?id=529
--参数:
       Datechar Varchar2
--Oracle9i测试通过
*/

Create Or Replace Function CDate(Datechar In Varchar2) Return Date Is
     ReallyDo Date;
Begin
    Select to_date(to_char(to_date(to_char(Datechar), 'YYYY-MM-DD HH24:MI:SS'),
                           'YYYY-MM-DD'),
                   'YYYY-MM-DD')
    Into ReallyDo
    From Dual;
    Return(ReallyDo);
End CDate;

/*
--功能:将字符串转为年月日时分秒格式.
--来源:http://jorkin.reallydo.com/article.asp?id=529
--参数:
       Datechar Varchar2
--Oracle9i测试通过
*/

Create Or Replace Function CDateTime(Datechar In Varchar2) Return Date Is
     ReallyDo Date;
Begin
    Select to_date(to_char(to_date(to_char(Datechar), 'YYYY-MM-DD HH24:MI:SS'),
                           'YYYY-MM-DD HH24:MI:SS'),
                   'YYYY-MM-DD HH24:MI:SS')
    Into ReallyDo
    From Dual;
    Return(ReallyDo);
End CDateTime;

/*
--功能:类似MSSQL的日期比较函数
--来源:http://jorkin.reallydo.com/article.asp?id=529
--更新时间:20080721
--参数:
       Datepart   Varchar2 -- 比较年?月?日?
       StartDate Varchar2 -- 起始日期
       EndDate    Varchar2 -- 结束日期
--Oracle9i测试通过
*/

Create Or Replace Function Datediff
(
    Datepart  In Varchar2,
     StartDate In Varchar2,
     EndDate   In Varchar2
) Return Number Is
     ReallyDo Numeric;
Begin
    Select Case Upper(Datepart)
               When 'YYYY' Then
                 Trunc(Extract(Year From CDate(EndDate)) -
                       Extract(Year From CDate(StartDate)))
               When 'M' Then
                Datediff('YYYY', StartDate, EndDate) * 12 +
                 (Extract(Month From CDate(EndDate)) -
                  Extract(Month From CDate(StartDate)))
               When 'D' Then
                 Trunc(CDate(EndDate) - CDate(StartDate))
               When 'H' Then
                Datediff('D', StartDate, EndDate) * 24 +
                 (to_Number(to_char(CDateTime(EndDate), 'HH24')) -
                  to_Number(to_char(CDateTime(StartDate), 'HH24')))
               When 'N' Then
                Datediff('D', StartDate, EndDate) * 24 * 60 +
                 (to_Number(to_char(CDateTime(EndDate), 'MI')) -
                  to_Number(to_char(CDateTime(StartDate), 'MI')))
               When 'S' Then
                Datediff('D', StartDate, EndDate) * 24 * 60 * 60 +
                 (to_Number(to_char(CDateTime(EndDate), 'SS')) -
                  to_Number(to_char(CDateTime(StartDate), 'SS')))
               Else
                -29252888
           End
    Into ReallyDo
    From Dual;
    Return(ReallyDo);
End Datediff;

          此段代码来源:http://Jorkin.Reallydo.Com/default.asp?id=529

 

    3.2.2 系统日期函数

         Mysql : select sysdate()

       Oracle : select sysdate from dual;

                            …..

在此省略一步分函数,因为mysql函数比较强大,所以具体的时候碰到了网上搜索对应的方案把。比如date_add等等。

         关于 limit

                    Limitmysql自带的分页机制,当迁移到oracle里面来,也有两种处理机制。

               A 简单的可以用 rownum代替

                  示例: 查询emp表中的前三行

 

 

select s.* from (select t.*,rownum rn from emp t) s  
              where s.rn <= 3   
 

 

                B 写一个oracle分页函数,这个大家肯定都用过吧。

 

         关于索引和是视图

            索引没什么变化,直接拿过来运行就OK了。

            视图的语法不同,在mysql中:

CREATE ALGORITHM=UNDEFINED DEFINER=`username`@`%` SQL SECURITY DEFINER VIEW viewname

                               Oracle create or replace view viewname

 

         关于group by 

              oracle里面,有个规定,含有group by的查询语句,字段类不在聚合函数中,就必须在group by语句后,我的说法是,你把字段列加到group by 后面就可以了。

 

  下面说个insert和update的问题:

  (具体点击http://itstudy123.iteye.com/blog/1012635)

  向一个表中执行updateinsert操作时,类型为CLOB列的就出现异常

  异常为:

  仅可以为插入 LONG 列的 LONG 值赋值 CLOB

   ............

 

  当时上网查了,有很多人也碰到了相同的问题,总体而言有两种解决方式,

  第一种是驱动版本过低。

  第二种是修改hibernate的配置文件,当时,前提是你开发的持久层必须是hibernate

 

  我从oracle官方网站下了一个最新的JDBC驱动(通过附件上传了),运行还是报哪个错误。没有效果

  而第二种方法,对于我而言,是肯定行不通的。

 

  网上有部分人说,值长度在2000-4000之间会出现异常,

  可是,我的不同,

  我的是值的长度在1000-2000之间会出现异常,稍短或长都没问题。

 

  在这里说明一下,肯定不会是因为长度限制的问题,因为CLOBORACLE里面,所输入的可达4G

  对于LONG,这个类型我没用过,在ORACLE里面也不建议用。是一个已经被废弃了的类型。

 

  最后我的解决方法是,在视图层,对所输入的进行判断,把少了的用空格不上,在jsp中,四个空格等于一个字符的长度。

让其长度超过2000即可,但是,这种方法对于紧急情况可能还不错,而效率上就不说了。

还有,就是说,如果你的长度不会超过2000,就建议用varchar2,但是需要注意的是数据库字符集应该是UTF-8的,对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。

.............

 

 

总的来说,最主要的就是sql问题,认真仔细点就好。关于迁移,是一个工作量比较大,但是技术含量比较低的工作,所以,每一步走稳,每一步走好是最重要的。

 

分享到:
评论

相关推荐

    最新mysql-connector-java-5.1.46(领附MySQL向Oracle迁移教程)

    总的来说,`mysql-connector-java-5.1.46`是Java开发者连接MySQL数据库的关键组件,而从MySQL迁移到Oracle则是一项涉及多方面技术的复杂任务。在进行这样的迁移时,充分的规划、详尽的测试以及对两种数据库系统的...

    mysql-migration-toolkit-noinstall-1.1.25-win32 ORACLE转MYSQL工具

    2. **创建迁移项目**:在工具中新建一个迁移项目,指定源(ORACLE)和目标(MYSQL)数据库信息。 3. **分析和转换**:工具会扫描ORACLE数据库并生成迁移计划,用户可查看并修改转换规则。 4. **预迁移检查**:在...

    Mysql迁移到Oracle就是这么简单

    总的来说,从MySQL迁移到Oracle是一个涉及多个层面的任务,包括数据转换、结构设计、代码调整和性能优化。尽管有一些自动化工具可以减轻工作负担,但整个过程仍需谨慎操作,确保数据完整性和系统稳定性。在实际操作...

    MySQL--oracle学习中心

    1. **MySQL移植工具包**:帮助用户迁移数据到MySQL。 2. **MySQL Administrator**:用于管理MySQL服务器配置、用户权限等。 3. **MySQL Query Browser**:用于构建和执行SQL查询。 #### 四、MySQL驱动程序 MySQL...

    mysql-connector-java-8.0.13.jar

    MySQL Connector/J 8.0.13 是MySQL数据库与Java应用程序之间的重要桥梁,它是Oracle官方提供的用于Java平台的MySQL驱动程序。这个jar包允许开发者在Java应用中执行SQL语句,进行数据的读取、写入和管理MySQL数据库。...

    基于java的数据库脚本转换工具(mysql-&gt;oracle).zip

    标题中的“基于java的数据库脚本转换工具(mysql-&gt;oracle)”揭示了这是一个利用Java编程语言开发的实用...同时,这也可能是一个很好的实践项目,对于学习数据库迁移、数据库兼容性问题以及Java编程的人来说极具价值。

    c#在odb.net下实现数据库从mysql->oracle迁移

    标题中的“c#在odb.net下实现数据库从mysql-&gt;oracle迁移”表明了本文将探讨如何使用C#编程语言,借助ODBC(Open Database Connectivity)驱动,来实现在.NET Framework 2008环境下构建一个Windows Forms应用程序,...

    mysql-connector-odbc-8.0.17-winx64.rar

    它不仅适用于开发新项目,也方便已有应用迁移至 MySQL 平台,提供了与 SQL Server、Oracle 等其他数据库系统的兼容性。 总的来说,MySQL Connector/ODBC 8.0.17-winx64 是一个强大的工具,它简化了64位 Windows ...

    Mysql驱动(mysql-connector-java-5.1.7)

    总的来说,`mysql-connector-java-5.1.7`是Kettle连接MySQL数据库的桥梁,通过它,Kettle能执行各种复杂的ETL任务,实现数据的高效管理和迁移。正确配置和使用此驱动对于Java和Kettle开发者来说至关重要。

    Mysql迁移Oracle方案

    ### MySQL 迁移至 Oracle 方案详解 #### 一、环境准备 在进行MySQL到Oracle的数据迁移之前,首先需要做好一系列的准备工作。 ##### 1.1 导入机 - **安装Oracle 11g数据库**:确保安装过程中正确配置数据库的各项...

    mysql-oracle驱动库

    在项目中引用这些库后,开发者可以通过编程接口进行数据库连接、查询、插入、更新和删除等操作,实现对MySQL和Oracle数据库的无缝访问。为了更好地使用这些驱动,开发者应熟悉JDBC规范以及MySQL和Oracle的SQL语法。

    数据迁移与合并-oracle至mysql

    ### 数据迁移与合并:Oracle至MySQL #### 一、引言 随着MySQL在数据库市场中的快速发展,越来越多的企业、政府机构、教育机构等开始考虑将原有的Oracle数据库迁移到MySQL上。这种迁移不仅涉及到技术层面的问题,还...

    MySQL和Oracle项目案例 项目基本流程

    在Oracle项目案例中,创建表的过程类似,但可能需要考虑更多的性能优化策略,如使用物化视图、索引或分区策略。Oracle的SQL语法与MySQL稍有差异,比如使用`CREATE TABLE AS SELECT`创建表,`ALTER TABLE`进行修改,`...

    oracle Mysql相互转化的工具

    8. 兼容性和性能优化:好的工具应该考虑不同版本的Oracle和MySQL的兼容性,同时优化迁移速度,减少对生产环境的影响。 9. 后续集成:迁移完成后,工具应提供报告,列出迁移详情,方便进行后续的系统集成和测试。 ...

    mysql与oracle数据迁移工具

    MySQL和Oracle都是业界广泛使用的数据库系统,但有时因为业务发展或技术升级,可能需要进行数据迁移。本文将深入探讨MySQL到Oracle的数据迁移工具及过程,以帮助你理解这一关键任务。 1. 数据迁移概述:数据迁移是...

    mysql迁移数据到oracle实用工具,试用版

    MySQL到Oracle的数据迁移是一项复杂而重要的任务,尤其在企业级应用中,确保数据的完整性和一致性至关重要。Dbmover for MySQL to ...对于需要在MySQL和Oracle之间迁移数据的企业和个人来说,这是一个值得考虑的工具。

    mysql-5.5.9-winx64

    但被甲骨文公司收购后,Oracle大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,因此导致自由软件社群们对于Oracle是否还会持续支持MySQL社群版(MySQL之中唯一的免费版本)...

    mysql导数据到oracle

    标签“mysql2oracle”进一步确认了这是一个从MySQL到Oracle的数据迁移项目。 在提供的文件列表中,我们可以识别出几个关键组件: 1. **DBImport.exe.config**:这是应用程序的配置文件,可能包含了数据库连接信息...

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。...它通过自动化处理减少了手动转换的工作量,降低了错误率,有助于提高项目迁移的效率和质量。

Global site tag (gtag.js) - Google Analytics