暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle数据库转mysql数据库笔记

程序员杂货店 2021-12-28
2389

1、数据库表结构转换

工具:PowerDesigner

1.1导入本地oracle数据库表结构到工具中:

备注:选择ojdbc14.jar的时候,一般需要重新引入本地jar包,然后重新启动软件才可以生效;点击Test先测试连通性。

1.2根据oracle数据库模型生成mysql数据库模型:

1.3根据新生成的mysql数据库模型导出mysql数据库脚本:

至此,数据库表结构转换完成,但是工具终究是工具,转换出的数据库脚本一般会存在一些瑕疵,需要手工调整,需要根据实际情况处理,最后把导出的数据库脚本导入你的mysql数据库即可。

2、程序代码中的sql语法转换

由于不同程序涉及到的sql脚本不一样,此处只罗列一些我遇到的和常见的sql语法替换关系

oraclemysql备注
VARCHAR2VARCHAR
NUMBERint/DECIMAL
DateDATATIME/VARCHAR(8)/VARCHAR(6)日期格式一般转换为字符串8或者6位
truncFORMAT
decodecase when ...
nvlifnull
to_charDATE_FORMAT
to_char(sysdate,'YYYYMMDD')DATE_FORMAT(sysdate(), '%Y%m%d')
to_char(sysdate,'HH24:Mi:SS')DATE_FORMAT(sysdate(), '%H%i%s')
listagg(score, ',') within group(ORDER BY )group_concat(score separator ',')
rownum>2limit 0,2
rownum=2limit 2
rownumSELECT @rowno :=@rowno + 1 AS rownumFROM (SELECT @rowno := 0) t;
sysdatesysdate()/now()
nextval(“”)nextval(“”)通过创建相关函数实现
length(str)char_length()
trunc(-1.002)cast(-1.002 as SIGNED)
TO_NUMBER(str)CAST("123" AS SIGNED INTEGER)
alter table tableName drop (columnName1,columnName2)alter table tableName drop column columnName1, drop column columnName2删除列
alter table tableName add (columnName1 int, columnName2 int);alter table tableName add column columnName1 int, add column columnName2 int;添加列
drop table tableNamedrop table if exists tableName删除表
select * from all_usersshow databases显示所有的用户
select * from tabshow tables查询当前所有的表
conn 用户名/密码@主机字符串use 库名改变连接用户(库)
show userconnect显示当前连接用户
@a.sqlsource a.sql执行外部脚本命令

3、mysql数据库常用语法及函数

3.1:在mysql语法中,总是需要给联合查询的表添加虚拟名称;

3.2:nextval函数

CREATE FUNCTION `currval` (seq_name VARCHAR(50)) RETURNS INT (11)
BEGIN
DECLARE

VALUE
INT;

SET
VALUE
= 0;

SELECT
current_value INTO
VALUE

FROM
sequence
WHERE
NAME = seq_name;

RETURN
VALUE
;

END;

CREATE FUNCTION nextval (seq_name VARCHAR(50)) RETURNS INTEGER LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT ''
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE
NAME = seq_name;

RETURN currval (seq_name);

END;

CREATE FUNCTION setval (
seq_name VARCHAR (50),

VALUE
INTEGER
) RETURNS INTEGER LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT ''
BEGIN
UPDATE sequence
SET current_value =
VALUE

WHERE
NAME = seq_name;

RETURN currval (seq_name);

END;

create table `sequence` (`name` VARCHAR (50) collate utf8_bin not null COMMENT '序列的名字',
`current_value` INT (11) not null COMMENT '序列的当前值',
`increment` INT (11) not null default '1' COMMENT '序列的自增值',
primary key (`name`) ) ENGINE = INNODB default CHARSET = utf8 collate = utf8_bin;

insert into sequence values ('seq_execid', 0, 1);

select nextval("seq_execid") from dual;

--也可以使用UUID替换序列:
select UUID() from dual;
select UUID_SHORT() from dual;

4、mysql常用设置

4.1时区设置
show VARIABLES like '%time_zone%';
set GLOBAL time_zone='+8:00';

5、mysql常见错误处理

5.1 lock wait timeout exceeded错误:

概念:

Lock wait timeout exceeded
Dead Lock
的区别:

  • Lock wait timeout exceeded
    :后提交的事务等待前面处理的事务释放锁,但是在等待的时候超过了mysql的锁等待时间,就会引发这个异常。

  • Dead Lock
    :两个事务互相等待对方释放相同资源的锁,从而造成的死循环,就会引发这个异常

innodb_lock_wait_timeout
lock_wait_timeout
的区别:

  • innodb_lock_wait_timeout
    :innodb的dml操作的行级锁的等待时间

  • lock_wait_timeout
    :数据结构ddl操作的锁的等待时间

查看innodb_lock_wait_timeout的具体值:

SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'

修改innode lock wait timeout的值:

修改的范围有Session和Global,并且支持动态修改,可以有两种方法修改:

方法一:

set innodb_lock_wait_timeout=100;
set global innodb_lock_wait_timeout=100;

备注:global的修改对当前线程是不生效的,只有建立新的连接才生效。

方法二:

修改参数文件/etc/my.cnf
innodb_lock_wait_timeout = 50

问题现象:

  • 数据更新或新增后数据经常自动回滚。

  • 表操作总报 Lock wait timeout exceeded
    并长时间无反应

解决方法:

应急方法:

show full processlist;

kill
掉出现问题的进程

5.2 当有mysql本地或远程建立function或procedure时报上面的错误

log_bin_trust_function_creators错误,一般情况是log_bin_trust_function_creators值为off导致

临时解决方法:

set global log_bin_trust_function_creators=1;

永久解决方案:

windows下my.ini[mysqld]加上log_bin_trust_function_creators=1
linux下/etc/my.cnf下my.ini[mysqld]加上log_bin_trust_function_creators=1

保存 ,重启服务器。


文章转载自程序员杂货店,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论