从 MySQL 迁移数据到 Oracle 中的全过程

房东的猫 提交于 2019-12-26 03:20:09

一、前言

这里记录一次将MySQL数据库中的表数据迁移到Oracle数据库中的全过程 ,使用工具 Navicat,版本 12.0.11

操作环境及所用工具:
  1. mysql5.7
  2. oracle18c
  3. windows
  4. Navicat12.0.11
  5. idea

在这里插入图片描述

二、开始移植

点击 工具 -> 数据传输

在这里插入图片描述
左边 标识mysql数据库 , 右边 目标 标识要移植到的oracle数据库
在这里插入图片描述
选择需要移植的表,这里我一把梭全选了~
在这里插入图片描述
然后等待数据传输完成即可
在这里插入图片描述
如果最后遇到如下情况,可暂不管,直接关闭即可~
在这里插入图片描述
然后查看oracle,如下,数据导入成功
在这里插入图片描述

三、问题

1、oracle自增主键问题

oracle设置自增主键的几种方式:
  1. 序列 + 触发器
  2. 序列 + Hibernate配置 (注:此方式仅适用于通过Hibernate连接数据库的方式)
  3. 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);
    }

}
温馨小提示:
  1. 这里小编的数据库中的时间类型为 DATE 类型 需 改为 TIMESTAMP 类型 ,这个由于小编目前的表名和字段名这些都是小写,因此直接使用idea的替换功能即可完成修改~
  2. 如果字段名和表名都为小写,需要将双引号去掉,否则操作数据的时候将会出现找不到表或视图的错误,解决方法是必须加上双引号才能查询到,这样的话我们通过程序操作数据的时候必须加上双引号,即大大加重了迁移数据库后的工作量,因此这里需去掉双引号 !!!
  3. 可能会遇见部分字段属于oracle关键字
    解决方法①:大写字段再加上双引号 ex: user -> "USER" number -> "NUMBER" desc -> "DESC" level -> "LEVEL"
    解决方法②:将ddl sql语句拷贝到Navicat中格式化,然后再拷贝回idea中然后将大写的关键字字段再加上双引号,最后运行即可~
    在这里插入图片描述
    解决方法③:找工具或写程序将所有字段和表名大写加上双引号
    解决方法④:由于最开始的ddl原本是双引号+小写形式,所以只需要将ddl所有内容全部大写即可! 小编的idea转大写快捷键为Ctrl+Shift+Y (刚想到的~ haha~)
    解决方法⑤:在最开始数据传输的时候,高级选项中勾选转换对象为大写!(最后才发现有这个东西滴!!! 说多了都是泪啊,这种方式也可以解决oracle关键字的问题,会自动将关键字加上双引号哦~)
    在这里插入图片描述
  4. 其余的修改则根据个人情况进行操作即可~
③ 备份数据 -> 数据泵方式

在这里插入图片描述
在这里插入图片描述

④ 将替换过后的ddl拷贝到idea中的一个新控制台中运行创建表

全选ddl,然后点击左上角运行创建表 【 注:这里需先清空该库下所有表,因此需要先备份一下从mysql迁移到oracle后的表数据 哦】
在这里插入图片描述
等待表全部创建成功,如下所示:
在这里插入图片描述

⑤ 导入备份数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⑥ 最后查看数据导入成功,自增主键也是完全没毛病吖!

在这里插入图片描述

最后温馨小提示:传输过程中可能会存在有部分几张表不成功,手动再导一下就好了~~

2、程序中的sql语句转换

这里结合个人语言实际操作…

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!