一.导言这里把表数据从MySQL数据库迁移到Oracle数据库的全过程记录一次,使用Navicat,版本12.0.11。操作环境和使用的工具:mysql5.7oracle18cwindowsNavicat12.0.11idea第二,开
这里把表数据从MySQL数据库迁移到Oracle数据库的全过程记录一次,使用Navicat,版本12.0.11。
操作环境和使用的工具:mysql5.7oracle18cwindowsNavicat12.0.11idea
第二,开始移植。
点击工具->数据传输
左边的源标识mysql数据库,右边的目标标识要迁移到的oracle数据库。
在高级选项中检查大写字母。
温馨提示:
如果字段名和表名都是小写的,oracle操作数据时会出现找不到表或视图的错误。解决方法是添加双引号来查询数据。在这种情况下,我们必须在通过程序操作数据时加上双引号,这大大增加了迁移数据库后的工作量。所以这里需要检查转换后的对象名是否大写,同时转换过程中的每一个字是否!!
【例如:用户->“用户”数字->“编号”desc->;“desc ”级别->;“级别”】
选择需要移植的表。这里的班车我都选了~
然后等待数据传输完成。
最后,如果遇到以下情况,可以暂时忽略,直接关闭就好~
然后检查oracle,如下图,数据导入成功。
温馨提示:传输过程中有些表可能不成功,手动引导即可~ ~
三。问题1.求解oracle自增主键设置oracle自增主键的几种方法:序列 + 触发器序列 + Hibernate配置 (注:此方式仅适用于通过Hibernate连接数据库的方式)oracle12c版本之后新增 自增列语法 GENERATED BY DEFAULT AS IDENTITY
解决方案:在ddl中添加自增主键命令创建表sql,重新创建一次表结构,然后单独从oracle导入数据。由于oracle的版本是18c,所以在创建表时可以添加自增主键语法!
①备份数据-->:数据泵模式数据泵-->:泵数据导出
② idea中如下查看ddl②检查idea中的ddl,如下所示
然后将ddl复制到txt文本文件并保存。
③ ddl文件内容替代自增主键工具类
温馨提示:
这里需要将边肖数据库中的时间类型改为时间戳类型。这个问题可以用idea ~的替换功能直接修改,其他修改可以根据个人实际情况日期。
public class MySQLToOracleTest { public static void main(String[] args) { try { replaceDDLContent("D:\Users\zq\Desktop\oracle测试\oracle_ddl.txt"); // TODO 这里修改为自己的ddl文件存放位置 } catch (IOException e) { e.printStackTrace(); } } /** * 替换文本文件中的 自增主键ID * * @param path * @throws IOException */ public static void replaceDDLContent(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 在这里这是自增主键哦 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); }}
④将替换的ddl复制到idea中的新控制台,运行并创建表格。选择所有ddl,然后点击左上角的Run创建表【注意:这里需要先清空空这个库下的所有表,所以步骤①,你要先备份从mysql迁移到oracle的表数据,别忘了!!】
等待所有表成功创建,如下所示:
⑤导入备份数据
数据泵-->:数据泵导入
⑥ 最后查看数据导入成功!⑥最后,检查数据是否导入成功!
此时数据可用,自增主键可用,但存在一个问题,插入数据时,主键的自增ID从1开始。如果表中没有数据,就ok了。问题是如果表中有数据,主键ID会重复!!!
2.解决自增主键ID无法从表数据ID的最大值开始增加值的问题。思路:拼接修改表自增ID开始的sql!SELECT 'SELECT ''ALTER TABLE SEWAGE_GY.' || t1.table_name || ' MODIFY(' || t1.Column_Name || ' Generated as Identity (START WITH '' || MAX( ' || t1.Column_Name || '+1 ) || ''));'' FROM ' || t1.table_name || ' UNION ALL' AS FINAL_SQLFROM cols t1LEFT JOIN user_col_comments t2 ON t1.Table_name = t2.Table_name AND t1.Column_Name = t2.Column_NameLEFT JOIN user_tab_comments t3 ON t1.Table_name = t3.Table_nameWHERE NOT EXISTS ( SELECT t4.Object_Name FROM User_objects t4 WHERE t4.Object_Type = 'TABLE' AND t4.TEMPORARY = 'Y' AND t4.Object_Name = t1.Table_Name ) AND t1.IDENTITY_COLUMN = 'YES'ORDER BY t1.Table_Name, t1.Column_ID
命令分辨率:
# 设置表主键ID从多少开始自增 ex:下面标识从10000开始自增ALTER TABLE 数据库名.表名 MODIFY(主键ID Generated as Identity (START WITH 10000));# 查询该库下所有表名SELECT table_name FROM user_tables;# 查询出指定表的主键ID字段名SELECT t1.table_name,t1.Column_NameFROM cols t1 LEFT JOIN user_col_comments t2 ON t1.Table_name = t2.Table_name AND t1.Column_Name = t2.Column_Name LEFT JOIN user_tab_comments t3 ON t1.Table_name = t3.Table_name WHERE NOT EXISTS ( SELECT t4.Object_Name FROM User_objects t4 WHERE t4.Object_Type = 'TABLE' AND t4.TEMPORARY = 'Y' AND t4.Object_Name = t1.Table_Name ) AND t1.table_name = '表名' AND t1.IDENTITY_COLUMN = 'YES' ORDER BY t1.Table_Name, t1.Column_ID# 查询该库下所有表名+表主键字段名SELECT t1.table_name,t1.Column_NameFROM cols t1 LEFT JOIN user_col_comments t2 ON t1.Table_name = t2.Table_name AND t1.Column_Name = t2.Column_Name LEFT JOIN user_tab_comments t3 ON t1.Table_name = t3.Table_name WHERE NOT EXISTS ( SELECT t4.Object_Name FROM User_objects t4 WHERE t4.Object_Type = 'TABLE' AND t4.TEMPORARY = 'Y' AND t4.Object_Name = t1.Table_Name ) AND t1.IDENTITY_COLUMN = 'YES' ORDER BY t1.Table_Name, t1.Column_ID
复制到新的控制台后,注意删除最后一个UNION ALL再运行一次!!!
主键ID最终自动递增从表数据的最大值开始!
3.程序中的sql语句转换
这里结合个人语言的实际操作…