一、前言
这里记录一次将MySQL
数据库中的表数据迁移到Oracle
数据库中的全过程 ,使用工具 Navicat
,版本 12.0.11
操作环境及所用工具:
- mysql5.7
- oracle18c
- windows
- Navicat12.0.11
- idea
二、开始移植
点击 工具
-> 数据传输
左边 源
标识mysql数据库 , 右边 目标
标识要移植到的oracle数据库
选择需要移植的表,这里我一把梭全选了~
然后等待数据传输完成即可
如果最后遇到如下情况,可暂不管,直接关闭即可~
然后查看oracle,如下,数据导入成功
三、问题
1、oracle自增主键问题
oracle设置自增主键的几种方式:
序列
+触发器
序列
+Hibernate配置
(注:此方式仅适用于通过Hibernate连接数据库的方式)- oracle12c版本之后新增 自增列语法
GENERATED BY DEFAULT AS IDENTITY
思路:
将ddl 创建表sql中添加自增主键ID的命令,重新创建一次表结构,然后再将oracle中的数据单独导入
这里由于小编oracle版本为18c 因此在创建表的时候加上自增主键语法即可完成!
① idea中如下查看ddl
然后将ddl拷贝到一个txt文本文件中保存
② ddl文件内容替换自增主键工具类
public class MySQLToOracleTest {
public static void main(String[] args) {
try {
replacTextContent("D:\\Users\\dq\\Desktop\\oracle测试\\oracle_ddl.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 替换文本文件中的 自增主键ID
*
* @param path
* @throws IOException
*/
public static void replacTextContent(String path) throws IOException {
// 原有的内容
String srcStr = "not null";
// 要替换的内容
String replaceStr = "GENERATED BY DEFAULT AS IDENTITY";
// 读
File file = new File(path);
FileReader in = new FileReader(file);
BufferedReader bufIn = new BufferedReader(in);
// 内存流, 作为临时流
CharArrayWriter tempStream = new CharArrayWriter();
// 替换
String line = null;
// 需要替换的行
Map<Integer, Object> lineMap = new HashMap<>(104);
//定义顺序变量
int count = 0;
while ((line = bufIn.readLine()) != null) {
count++;
if (line.contains("create table")) {
lineMap.put(count + 2, line);
}
//遍历map中的键
for (Integer key : lineMap.keySet()) {
if (count == key && !line.contains("NVARCHAR2")) {
// TODO 在这里替换主键ID哦
line = line.replaceAll(srcStr, replaceStr);
lineMap.put(count, line);
}
}
// 将该行写入内存
tempStream.write(line);
// 添加换行符
tempStream.append(System.getProperty("line.separator"));
}
// 关闭 输入流
bufIn.close();
// 将内存中的流 写入 文件
FileWriter out = new FileWriter(file);
tempStream.writeTo(out);
out.close();
System.out.println("文件存放位置:" + path);
System.out.println(lineMap);
}
}
温馨小提示:
- 这里小编的数据库中的时间类型为
DATE
类型 需 改为TIMESTAMP
类型 ,这个由于小编目前的表名和字段名这些都是小写,因此直接使用idea的替换功能即可完成修改~ - 如果字段名和表名都为小写,需要将双引号去掉,否则操作数据的时候将会出现找不到表或视图的错误,解决方法是必须加上双引号才能查询到,这样的话我们通过程序操作数据的时候必须加上双引号,即大大加重了迁移数据库后的工作量,因此这里需
去掉双引号
!!! - 可能会遇见部分字段属于oracle关键字
解决方法①
:大写字段再加上双引号 ex:user -> "USER"
number -> "NUMBER"
desc -> "DESC"
level -> "LEVEL"
解决方法②
:将ddl sql语句拷贝到Navicat
中格式化,然后再拷贝回idea中然后将大写的关键字字段再加上双引号,最后运行即可~解决方法③
:找工具或写程序将所有字段和表名大写加上双引号解决方法④
:由于最开始的ddl原本是双引号+小写形式,所以只需要将ddl所有内容全部大写即可! 小编的idea转大写快捷键为Ctrl+Shift+Y
(刚想到的~ haha~)解决方法⑤
:在最开始数据传输的时候,高级选项中勾选转换对象为大写!(最后才发现有这个东西滴!!! 说多了都是泪啊,这种方式也可以解决oracle关键字的问题,会自动将关键字加上双引号哦~) - 其余的修改则根据个人情况进行操作即可~
③ 备份数据 -> 数据泵方式
④ 将替换过后的ddl拷贝到idea中的一个新控制台中运行创建表
全选ddl,然后点击左上角运行创建表 【 注:这里需先清空该库下所有表,因此需要先备份一下从mysql迁移到oracle后的表数据 哦】
等待表全部创建成功,如下所示:
⑤ 导入备份数据
⑥ 最后查看数据导入成功,自增主键也是完全没毛病吖!
最后温馨小提示:传输过程中可能会存在有部分几张表不成功,手动再导一下就好了~~
2、程序中的sql语句转换
这里结合个人语言实际操作…
来源:CSDN
作者:郑清
链接:https://blog.csdn.net/qq_38225558/article/details/103694901