iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >从MYSQL到oracle的迁移以及备份的方法
  • 751
分享到

从MYSQL到oracle的迁移以及备份的方法

2024-04-02 19:04:59 751人浏览 薄情痞子
摘要

本篇内容介绍了“从Mysql到oracle的迁移以及备份的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

本篇内容介绍了“从Mysqloracle的迁移以及备份的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!


一、mysql可以导入导出脚本,本来应该准备好数据库的备份的初始化数据库和初始化数据的两个初始化脚本,经由MYsql导出为一个full.sql的总的初始化脚本,用过mysql的都知道,导出的数据库脚本中,包含了建库、建表、以及插入数据的语句。需要分割成两个:建库、建表的初始化脚本和插入数据的初始化脚本。于是我写了一个类,用于分割SQL脚本,在类中,我查找到create table开头的后面紧跟着的字符串,就是表的名字,取出insert开头的语句,改行就是插入数据的,于是,通过文件流读取文件的每一行,如果是插入的取出来放入一个方法convertInsertSQL处理后写入一个脚本文件insert_data.sql中,剩下的写入一个脚本文件create_table.sql中, 方法convertInsertSQL对于插入语句做处理,因为脚本中的插入语句是批量插入的,insert into 表名(列名) values(对应值),( 对应值),( 对应值),所以需要拆分成insert into 表名(列名) values (对应值)这样的语句,所以我通过将前面values(前的值截取后,对剩下的所有对应数据,进行通过),(用正则分割成String数组,对数组进行循环,每次追加组成插入语句,最后将插入语句全部返回后写入文件流。
package com.test.file;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
 

public class MyFileReader {
 
   
    public static void main(String[] args) {
       String full_sql_path="C:/Documents and Settings/gaofei/桌面/最终mysql脚本(12.15).sql";
       String create_sql_path="C:/Documents and Settings/gaofei/桌面/建立数据库初始化.sql";
       String insert_sql_path="C:/Documents and Settings/gaofei/桌面/数据初始化.sql";
       try {
           readFull_to_insert(full_sql_path, create_sql_path, insert_sql_path);
       } catch (IOException e) {
           System.out.println("文件读取或写入出错");
           e.printStackTrace();
       }
      
//     String aa="insert into `templatetype`(`id`,`templatetypename`,`deflong`,`defdate`,`defvar`) values (0,'通用模板类型',0,NULL,NULL),(1,'首页模板类型',0,NULL,NULL),(2,'栏目模板类型',0,NULL,NULL),(3,'专题模板类型',0,NULL,NULL),(4,'内容模板类型',0,NULL,NULL),(5,'留言模板类型',0,NULL,NULL),(6,'投票模板类型',0,NULL,NULL),(7,'特殊模板类型',0,NULL,NULL);";
//     String bb=full_to_part(aa);
//     System.out.println(bb);
    }
   
    private static void readFull_to_insert(String full_sql_path,String create_sql_path,String insert_sql_path) throws IOException{
       File fullFile=new File(full_sql_path);
       File createFile=new File(create_sql_path);
       if(!createFile.exists())
           createFile.createNewFile();
       File insertFile=new File(insert_sql_path);
       if(!insertFile.exists())
           insertFile.createNewFile();
       InputStreamReader isr=new InputStreamReader(new FileInputStream(fullFile), "UTF-8");
       BufferedReader br=new BufferedReader(isr);
       OutputStreamWriter osw_create=new OutputStreamWriter(new FileOutputStream(createFile), "UTF-8");
       OutputStreamWriter osw_insert=new OutputStreamWriter(new FileOutputStream(insertFile), "UTF-8");
       BufferedWriter bw_create=new BufferedWriter(osw_create);
       BufferedWriter bw_insert=new BufferedWriter(osw_insert);
       Map<Integer, String> allData=new HashMap<Integer,String>();
       String line=null;
       int num=17;
       while((line=br.readLine())!=null){
           String lowerLine=line.toLowerCase();
           if(lowerLine.startsWith("insert")){                         //在该语句下用来判断插入数据的先后顺序
              if(lowerLine.indexOf("`sequenceblock`")!=-1){
                  allData.put(1, line);
              }else if(lowerLine.indexOf("`operationlogtype`")!=-1){
                  allData.put(2, line);
              }else if(lowerLine.indexOf("`WEBsite`")!=-1){
                  allData.put(3, line);
              }else if(lowerLine.indexOf("`fucdefine`")!=-1){
                  allData.put(4, line);
              }else if(lowerLine.indexOf("`role`")!=-1){
                  allData.put(5, line);
              }else if(lowerLine.indexOf("`department`")!=-1){
                  allData.put(6, line);
              }else if(lowerLine.indexOf("`cmsuser`")!=-1){
                  allData.put(7, line);
              }else if(lowerLine.indexOf("`account`")!=-1){
                  allData.put(8, line);
              }else if(lowerLine.indexOf("`accountrole`")!=-1){
                  allData.put(9, line);
              }else if(lowerLine.indexOf("`flowdefine`")!=-1){
                  allData.put(10, line);
              }else if(lowerLine.indexOf("`flowtask`")!=-1){
                  allData.put(11, line);
              }else if(lowerLine.indexOf("`rolefucperm`")!=-1){
                  allData.put(12, line);
              }else if(lowerLine.indexOf("`templategroup`")!=-1){
                  allData.put(13, line);
              }else if(lowerLine.indexOf("`templatetype`")!=-1){
                  allData.put(14, line);
              }else if(lowerLine.indexOf("`template`")!=-1){
                  allData.put(15, line);
              }else if(lowerLine.indexOf("`contenttype`")!=-1){
                  allData.put(16, line);
              }else{
                  allData.put(num++, line);
              }
           }else{
              bw_create.append(line+"\r\n");
           }
       }
       for (int i = 1; i < num; i++) {
           if(allData.containsKey(i)){
              bw_insert.append(full_to_part(allData.get(i)));
           }
       }
      
       bw_create.flush();
       bw_insert.flush();
       br.close();
       bw_create.close();
       bw_insert.close();
    }
// private static void setSequence(){
//    
// }
   
   
    private static String full_to_part(String line){
       StringBuffer sb=new StringBuffer();
       String lowerLine=line.toLowerCase();
       int firstDan=lowerLine.indexOf("`");
       int firstQuot=lowerLine.indexOf("(");
       String tableName=lowerLine.substring(firstDan, firstQuot);
       System.out.println("--------------------------开始转换插入----"+tableName+"---的数据----------");
       int values_position=lowerLine.indexOf("values")+7;
       String forward_line=line.substring(0, values_position);
      
       String datas_line=line.substring(values_position,line.length()-1); //得到后面插入的数据
       String[] datas=datas_line.split("\\)\\,\\(");//根据),(分割为一个字符串数组
      
       for (int i = 0; i < datas.length; i++) {
           String data=null;
           if(datas.length==1){            //如果只有一条数据,不会被分割的,数组就会只有一条数据
              data=datas[i];
           }else{
              if(i==0)                        //如果是第一条,那么后面需要追加一个括号
                  data=datas[i]+")";
              else if(i==datas.length-1)         //如果是最后一条,需要在前面加一个括号
                  data="("+datas[i];
              else                     //如果是中间的数据,前后都需要加括号
                  data="("+datas[i]+")";
           }
           sb.append(forward_line);           //将insert 字段名和values先行加入
           sb.append(data+";");
           sb.append("\r\n");
       }
       sb.append("\r\n");
       return sb.toString();
    }
 
}
这是通用方法,以后需要得到MYSQL的两个初始化脚本就通过这个方法已转换就可以。
二、Oracle建表的问题没有通过这个解决,可以通过Hibernate逆向生成。建表和表结构,表关系,都有了。
下面就是插入数据了:
关于MYSQL的insert脚本基本上和Oracle的一致,但是也有不一致,对于日期,对于一些符号&rsquo;都是问题。将MYSQL的insert语句转换成ORACLE的insert语句。
1、需要将&rsquo;去掉,这个符号是在插入数据时的表名上括起来的,所以,将表名上的&rsquo;都替换掉。
2、需要将date日期,经过函数to_date(date,”yyyy-MM-dd”)转换一下,所以我通过正则表达式来查找到所有的日期,还有一种日期,携带时分秒的日期,需要另一个正则,最后当然都是替换成为年月日就可以了。
package com.sql.convert;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class FromMYSQLInsertToOracleInsert {
   
   
    public static void main(String[] args) throws IOException {
       String mysql_file="C:/Documents and Settings/gaofei/桌面/insertData.sql";
        String oracle_file="C:/Documents and Settings/gaofei/桌面/oracle_insertData.sql";
      
       turnSQL(mysql_file, oracle_file);
      
    }
    private static void turnSQL(String mysql_file,String oracle_file) throws IOException{
       File mysqlFile=new File(mysql_file);
       File oracleFile=new File(oracle_file);
       if(!oracleFile.exists())
           oracleFile.createNewFile();
       InputStreamReader isr=new InputStreamReader(new FileInputStream(mysqlFile), "UTF-8");
       OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(oracleFile), "UTF-8");
      
       BufferedReader br=new BufferedReader(isr);
       BufferedWriter bw=new BufferedWriter(osw);
      
       String line=null;
       while((line=br.readLine())!=null){
           bw.append(convertString(line));
           bw.append("\r\n");
       }
       bw.flush();
       br.close();
       bw.close();
       isr.close();
       osw.close();
    }
    private static String convertString(String line){
       line=line.replace("`", "");
       Pattern p=Pattern.compile("'\\d{4}\\-\\d+\\-\\d+'");
       Matcher m=p.matcher(line);
       String date=null;
       while(m.find()){
           date=m.group(0);
           line=line.replace(date, "to_date("+date+",'yyyy-MM-dd')");
       }
       p=Pattern.compile("'\\d{4}\\-\\d+\\-\\d+\\s\\d+\\:\\d+\\:\\d+'");
       m=p.matcher(line);
       date=null;
       while(m.find()){
           date=m.group(0);
           String newDate=date.substring(0,date.indexOf(" "));
           line=line.replace(date, "to_date("+newDate+"','yyyy-MM-dd')");
       }
       return line;
    }
}
 
三、看似没有问题了,直接执行脚本就没问题了,但是问题又来了:
         我是直接用控制开的sqlplus来访问Oracle的,没有工具,每次执行脚本,是通过@脚本名.sql来执行的,但是请注意如果是路径太长,比如@”C:/Documents and Settings/gaofei/桌面/oracle_insertData.sql”路径中间有空格需要加上””的,
执行报错。很多错:
1、关于数据中的&nbsp;等这类的特殊,oracle会认为是plsql中自定义的变量,当然会出问题了,所以需要设置set define off,关掉自定义变量。
2、一个问题很少会有人用到,就是关于Oracle的插入数据,一个字段最多插入2999个字符。太多将会插入不进的。而我的数据都是模板或新闻,很多多是上万,所以问题来了。没有想到办法。最后我是将很多的数据删除的很短,插入成功后,通过程序一条条插入的。
 
迁移完成了 ,下面就是关于Oracle的备份问题了。www.2cto.com

说是可以准备SQL脚本,但是脚本到时候还会是INSERT语句,到时候又不能插入了。
所以是通过ORACLE的备份命令,备份出DMP文件。
刚开始是用SYSTEM用户直接备份的,但是会有很多的系统表,这是不符合要求的。于是建立一个用户future ,用future用户逆向生成表结构、表关系。然后通过赋予futureDBA权限,通过insert into sequenceblock select * from system.sequenceblock;将所有表中有数据的表都从system导入到future用户中。
这样表就再future用户的指定表空间中建立出来了。
通过future直接备份数据。有两种备份方式。
$exp future/ylzxdb1219@ylzxdb file=D:/future_final.dmp full=y;
以future身份导出了所有库的信息
$exp future/ylzxdb1219@ylzxdb file=D:/future_user.dmp owner=future;
以future的身份导出了future用户中所有的数据。
但是future有DBA权限,所以会再备份时将系统表备份。所以推荐第二种方式。导出的只是当前用户future的所有表的备份。
导入数据:
         $imp future/ylzxdb1219@ylzxdb fromuser=future touser=future ignore=y file=D:/future_user.dmp;
         (注:例句是将的备份文件放在了D:盘下的future.user.dmp文件)

“从MYSQL到oracle的迁移以及备份的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 从MYSQL到oracle的迁移以及备份的方法

本文链接: https://www.lsjlt.com/news/59389.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 从MYSQL到oracle的迁移以及备份的方法
    本篇内容介绍了“从MYSQL到oracle的迁移以及备份的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • Oracle迁移到Postgresql的方法
    Oracle迁移到Postgresql的方法一:用Oracle_fdw参考资料:https://www.jianshu.com/p/e0d11f57ab75http://francs3.blog.163.c...
    99+
    2024-04-02
  • 从MySQL迁移到Oracle数据库的详细步骤和方法
    系列文章目录 文章目录 系列文章目录前言一、备份MySQL数据库二、安装Oracle数据库三、数据转换四、导出MySQL数据五、导入数据到Oracle六、重新创建索引和约束七、测试和验证八、...
    99+
    2023-09-24
    数据库 mysql oracle
  • Docker镜像的迁移与备份及Dockerflie使用方法详解
    目录一、迁移与备份1. 容器保存为镜像2. 镜像备份3. 镜像恢复与迁移二、Dockerflie1. 认识 Dockerfile2. Dockerfile 常用命令3. 使用 Doc...
    99+
    2024-04-02
  • MySQL数据备份、还原、数据库迁移以及表的导出和导入
    目录前言一、数据备份1、使用mysqldump命令备份2、直接复制整个数据库目录3、使用mysqlhotcopy工具快速备份二、数据还原1、使用mysql命令还原2、直接复制到数据库目录三、数据库迁移1、相同版本的MyS...
    99+
    2024-04-02
  • 怎样从Oracle到GaussDB的数据迁移
    今天就跟大家聊聊有关怎样从Oracle到GaussDB的数据迁移,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 一、背景最近某省运营商O域...
    99+
    2024-04-02
  • mysql迁移到mongodb的方法是什么
    将MySQL迁移到MongoDB有以下几种常用方法:1. 手动迁移:这是一种最基本的方法,需要将MySQL中的数据以某种格式(如CS...
    99+
    2023-09-11
    mongodb mysql
  • MySQL多主一从的备份方法
    本篇内容介绍了“MySQL多主一从的备份方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 从MySQL到ORACLE程序迁移的注意事项有哪些
    本篇文章给大家分享的是有关从MySQL到ORACLE程序迁移的注意事项有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 ...
    99+
    2024-04-02
  • 浅析mysql迁移到clickhouse的5种方法
    数据迁移需要从mysql导入clickhouse, 总结方案如下,包括clickhouse自身支持的三种方式,第三方工具两种。 create table engin mysql CREATE TABLE...
    99+
    2024-04-02
  • oracle上的数据怎么迁移到到mysql
    这篇文章主要介绍“oracle上的数据怎么迁移到到mysql”,在日常操作中,相信很多人在oracle上的数据怎么迁移到到mysql问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • MYSQL数据迁移到ORACLE中碰到的乱码问题的解决方法
    本篇内容主要讲解“MYSQL数据迁移到ORACLE中碰到的乱码问题的解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MYSQL数据迁移到ORACLE中碰到...
    99+
    2024-04-02
  • 备份、还原和迁移MongoDB数据库的方法是什么
    这篇文章主要介绍了备份、还原和迁移MongoDB数据库的方法是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mongodump是mongod...
    99+
    2024-04-02
  • Oracle12跨平台完成PDB的备份迁移方法是什么
    这篇文章主要介绍“Oracle12跨平台完成PDB的备份迁移方法是什么”,在日常操作中,相信很多人在Oracle12跨平台完成PDB的备份迁移方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2024-04-02
  • mysql数据库迁移的方法
    mysql数据库迁移的方法:1、确定迁移需求;2、备份数据;3、恢复数据到新服务器;4、调整配置文件;5、迁移用户和权限。详细介绍:1、确定迁移需求,在开始迁移之前,需要明确迁移的目的和需求,这包括确定要迁移的数据库、目标平台和时间表;2、...
    99+
    2023-11-16
    数据库 mysql
  • 【数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践
    在之前这一篇中我们分享过使用chameleon工具完成MySQL到openGauss的全量数据复制、实时在线复制。9.30新发布的openGauss 3.1.0版本 ,工具的全量迁移和增量迁移的性能不但有了全面提升,而且支持数据库对象视图、...
    99+
    2023-08-17
    数据库 mysql bash 云原生
  • 内网服务器迁移到阿里云从准备工作到迁移过程的详细指南
    内网服务器迁移到阿里云是一项复杂但必要的任务,它涉及到多个步骤和技术,需要经过深思熟虑和周密规划。这篇文章将详细介绍内网服务器迁移到阿里云的整个过程,包括准备工作、迁移过程和后期维护,希望能为读者提供一个全面的指南。 准备工作:阿里云账号:...
    99+
    2023-11-07
    阿里 准备工作 内网
  • Docker镜像的迁移与备份及Dockerflie使用实例分析
    这篇文章主要介绍“Docker镜像的迁移与备份及Dockerflie使用实例分析”,在日常操作中,相信很多人在Docker镜像的迁移与备份及Dockerflie使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-07-02
  • mysql数据库的备份以及还原
    这篇文章主要讲解了“mysql数据库的备份以及还原”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql数据库的备份以及还原”吧!一.数据备份:1.使用m...
    99+
    2024-04-02
  • oracle数据库迁移到MySQL的示例分析
    这篇文章给大家分享的是有关oracle数据库迁移到MySQL的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方式一: 手动方式导入导出手动的方式导入, 就是操作步骤会比较...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作