1、数据库表结构转换
工具:PowerDesigner
1.1导入本地oracle数据库表结构到工具中:






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





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


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



至此,数据库表结构转换完成,但是工具终究是工具,转换出的数据库脚本一般会存在一些瑕疵,需要手工调整,需要根据实际情况处理,最后把导出的数据库脚本导入你的mysql数据库即可。
2、程序代码中的sql语法转换
由于不同程序涉及到的sql脚本不一样,此处只罗列一些我遇到的和常见的sql语法替换关系
| oracle | mysql | 备注 |
|---|---|---|
| VARCHAR2 | VARCHAR | |
| NUMBER | int/DECIMAL | |
| Date | DATATIME/VARCHAR(8)/VARCHAR(6) | 日期格式一般转换为字符串8或者6位 |
| trunc | FORMAT | |
| decode | case when ... | |
| nvl | ifnull | |
| to_char | DATE_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>2 | limit 0,2 | |
| rownum=2 | limit 2 | |
| rownum | SELECT @rowno :=@rowno + 1 AS rownumFROM (SELECT @rowno := 0) t; | |
| sysdate | sysdate()/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 tableName | drop table if exists tableName | 删除表 |
| select * from all_users | show databases | 显示所有的用户 |
| select * from tab | show tables | 查询当前所有的表 |
| conn 用户名/密码@主机字符串 | use 库名 | 改变连接用户(库) |
| show user | connect | 显示当前连接用户 |
| @a.sql | source 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
保存 ,重启服务器。




