IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]MySQL数据库移植总结

    zhouzxi发表于 2016-04-28 18:56:47
    love 0

    一、前言
    MySQL是一个由瑞典MySQL AB公司开发的关系型数据库管理系统,目前归属Oracle公司旗下。MySQL是一种关联数据库管理系统,它将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。

    考虑到MySQL的诸多优点,很多通讯类软件都开始采用MySQL作为其业务数据库,前期采用Oracle或Sybase的软件也启动了向MySQL数据库移植的工作。本文基于作者近期将Sybase数据库移植为MySQL数据库的工作,总结了在移植过程中需要修改的主要数据库语法及一些基本的操作MySQL的命令。

    二、需要修改的数据库语法
    1.基本语法
    1) 将类似select xxx from %s..tb_xxx where xxx的语法修改为select xxx from %s.tb_xxx where xxx。
    2) 将类似select top N * from tb_xxx的语法(查询前N条记录)修改为select * from tb_xxx limit N。
    3) 将获取当前时间的语句convert(varchar(10),getdate(),102)+' '+convert(varchar(10),getdate(),108))修改为date_format(now(),'%Y.%m.%d %T')。
    4) 将类似执行没有输出参数的存储过程的SQL语句exec %s..pr_xxx '%s'修改为call %s.pr_xxx ('%s')。
    5) 将类似执行有输出参数的存储过程的SQL语句exec %s..pr_xxx 1, '%s', 0, 0, %d, '', %d, 0, 0修改为call %s.pr_xxx(1,'%s',0,0,%d,'',%d,0,0,@1,@2,@3,@4,@5,@6);select@1,@2,@3,@4,@5,@6。

    2.在存储过程中
    1) 将类似drop procedure pr_xxx语句修改为drop procedure if exists pr_ xxx;语句。
    2) 在类似drop procedure if exists pr_ xxx;语句之后要添加delimiter //语句。
    3) 对类似存储过程输入输出参数作如下修改:
    将

    createprocedure pr_xxx
        @aaa        varchar(40),
        @bbb        varchar(10),
        @ccc        varchar(20),
        @ddd        int  out

    修改为:

    createprocedure pr_ xxx
    (
           in   p_ aaa         varchar(40),
           in   p_ bbb         varchar(10),
           in   p_ ccc         varchar(20),
           out   p_ ddd        int
    )

    4) 将类似定义的参数作如下修改:
    将

    declare
            @aaa             int,
            @bbb             varchar(20),    
            @ccc             int,         
            @ddd             int, 

    修改为:

           declare p_aaa         int;
           declare p_bbb         varchar(20);
           declare p_ccc         int;
           declare p_ddd         int;

    5) 将类似if @aaa = x语句修改为if p_aaa = x then语句。
    6) 将类似select @aaa = x的初始化语句修改为set p_aaa = x;。
    7) 将类似select @aaa=bbb from tb_xxx where ccc=yyy的语句修改为select bbb int op_aaa from tb_xxx where ccc=yyy;。
    8) 将类似if语句修改如下:
    将

    if xxx
    begin
    
    end
    else
    begin
    
    end

    修改为:

    if xxx then
    begin
    
    end;
    else
    begin
    
    end;
    end if;

    9) 将类似获取当前时间的select @curtime=convert(varchar(50),getdate(),102)+''+convert(varchar(50),getdate(),108)语句修改为set p_curtime=date_format(now(),'%Y.%m.%d %T');。
    10) 将类似select @curdatetime = dateadd(minute, @tzonemin, @curdatetime)语句修改为set p_curdatetime=date_add(p_curdatetime,interval p_tzoneminminute);。
    11) 将return语句修改为leave pr_xxx_label;。
    12) 对存储过程最后的end语句作如下修改:
    将

    end

    修改为;

    end;
    //
    delimiter ;

    13) 将存储过程最后的print语句作如下修改:
    将

    print 'create procedure:pr_xxx ok!'

    修改为:

    select 'create procedure pr_ xxx ok!';

    14) 将类似的if语句作如下修改:
    将

    if xxx
    begin
    
    end
    else if yyy
    begin   
    
    end
    else if zzz
    begin   
    
    end
    else
    begin
    
    end

    修改为:

    if xxx then
    begin
    
    end;
    elseif yyy then
    begin   
    
    end;
    elseif zzz then
    begin   
    
    end;
    else
    begin
    
    end;
    end if;

    15) 将类似select @maxcnt = convert(int,@tmpstr)语句修改为set p_maxcnt=convert(p_tmpstr,signed);语句。

    三、一些基本的操作MySQL的命令
    作者所使用的数据库位于Linux之下,因此,本节所使用的命令均是在Linux之下运行的。
    1.启动MySQL

    xpecdmoni

    2.停止MySQL

    xsuperstop

    3.登录MySQL
    1)MySQL位于本机之上:

    mysql -uusername -p'pwd' 

    (其中,username是用户名,pwd是密码)
    2)MySQL在其它机器上:

    mysql -uusername -p'pwd' –h0.1.1.1-P3306

    (其中,username是用户名,pwd是密码,0.1.1.1是MySQL数据库的IP,3306是端口号)
    4.切换数据库

    use DbName;   

    (其中,DbName是数据库名)
    5.执行SQL脚本

    mysql -uusername -p'pwd' –h0.1.1.1 -P3306 -DDbName<test.sql 

    (其中,username是用户名,pwd是密码,0.1.1.1是MySQL数据库的IP,3306是端口号,DbName是数据库名,test.sql是SQL脚本名)

    四、总结
    在进行数据库移植的过程中,我们需要注意以下问题:
    1.只修改必须要修改的代码,不能更改业务逻辑。要将修改之后的代码与修改之前的代码进行反复的对比,确保代码修改的正确性。

    2.要对修改之后的代码和脚本等进行全方位的测试,确保业务逻辑的正确性。

    3.如果有某段代码或存储过程是公用的,那么只需要指定某个人修改就可以了,这样也可以防止重复劳动。



沪ICP备19023445号-2号
友情链接