目录

1简介... 1

2 准备... 1

2.1 环境说明... 1

3 安装... 2

4 配置... 2

5 使用... 2

5.1 验证实验... 2

5.2 问题分析... 4

6 延展... 5

7 总结... 5

Mysql迁移到Oracle方法

1简介

基于mysql select into outfile的方式导出文本文件并结合sqlldr导入数据到oracle里

2 准备

2.1 环境说明

1 mysql版本10.3.13-MariaDB,同理其它mysql版本效果类似。

-- 查看mysql版本
SELECT VERSION() AS mysql_Version;

mysql_Version

10.3.13-MariaDB

-- mysql 字符集
show variables like '%char%';

Variable_name

Value

character_set_client

utf8

character_set_connection

utf8

character_set_database

utf8

character_set_filesystem

binary

character_set_results

character_set_server

utf8

character_set_system

utf8

character_sets_dir

E:\Program Files\MariaDB 10.3\share\charsets\

2 oracle版本为11gR2,同理其它版本效果类似。

--查看数据库版本
SELECT * FROM v$version;

BANNER

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

"CORE   11.2.0.4.0  Production"

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 - Production

--查看字符集
SELECT * FROM v$nls_parameters where parameter='NLS_CHARACTERSET';

PARAMETER

VALUE

NLS_CHARACTERSET

AL32UTF8

3 安装

无.

4 配置

5 使用

5.1 验证实验

1) 通过mysql的 select into outfile的方式拼接SQL生成导出txt的语句。并将生成出来的sql语句拷贝出来并保存成export.sql

SELECT
CONCAT('SELECT ',
group_concat('IFNULL(',COLUMN_NAME,','''')'),
' into outfile "\/var\/lib\/mysql-files\/tmp\/data\/',
table_name,
'.txt','"  fields terminated by "\\t" lines terminated by ''\\r\\n'' from test.',table_name,';')
from information_schema.`COLUMNS`
WHERE TABLE_schema = 'test'
GROUP BY TABLE_NAME

注:

  1. 这里 /var/lib/mysql-files/tmp/data可以改成其它mysql用户权限访问的目录。
  2. 这里假设export.sql 保存在/var/lib/mysql-files/tmp/目录里。

2) 通过mysql <的方式执行外部的sql文件,这里可以将该命令封装在shell里

#! /bin/sh
mysql -uroot -ppasswd -Dtest<'/var/lib/mysql-files/tmp/export.sql' 1>/tmp/log.log

3) 如果oracle和mysql不在一台服务器上,那么需要通过命令将txt文件拷贝到oracle服务器里。如果在一台服务器上,则忽略这个操作。

scp -r /var/lib/mysql-files/tmp/data/*.txt root@192.168.56.32:/root/script/data/

4) 通过sql拼出sqlldr的ctl文件,拷贝执行出来的内容到imp.txt里

select concat('load data','\r','characterset utf8','\r','INFILE ''\/root\/script\/data\/',table_name,'.txt''','\r','Append into table ',table_name,'\r','fields terminated by '"'\\t'"'','\r','trailing nullcols','\r','(','\r',
group_concat(COLUMN_NAME),');'
)
from information_schema.`COLUMNS`
WHERE table_schema in('test')
GROUP BY TABLE_NAME

5) 通过python代码按照“;”拆分成ctl文件。

import osdef splitFile(fileIn,dirOut):file1 = open(fileIn, 'r', encoding='utf-8')try:str=""for line in file1.readlines():if line.find('.') >0:fileName=line.split('/')[-1].replace('txt\'','ctl').strip("\n")print(fileName)file2 = open(dirOut + '\\' + fileName, 'w', encoding='utf-8')str=str+" "+lineif line[-2]==";":#line = line.strip("\n")###print(str);file2.write(str.replace(";",'').replace("GXSJC","GXSJC date \"yyyy-mm-dd hh24:mi:ss\""))str = ""file2.close()finally:file1.close()if __name__ == '__main__':splitFile(r'D:\temp\imp.txt',r'D:\temp\impCtls')

6) 生成sqlldr执行脚本,将SQL拼接里的内容拷贝出到Imp.sh内。

select concat('sqlldr userid=test/passwd@Instance  rows=500000 bindsize=30720000 control=/root/script/ctl/' ,table_name )
from information_schema.tables where table_schema='test';

7) 运行Imp.sh并结合log文件对错误进行分析。

5.2 问题分析

  1. 报字符串长度超了,oracle里的长度varchar2最长为4000,而且汉字占用3个字符,所以需要跟mysql里的varchar乘以3;这个仅限oracle字符集是UTF8的情况。
  2. mysql导出txt出现NULL或者\N的情况,解决方法在mysql导出时加IFNULL函数。当前的导出脚本里已经加了。但是建议基于mysql的字典表,对字段可能为NULL的加加上IFNULL函数,其它的不加。
  3. ORA-01861: literal does not match format string 需要指定时间格式;

可能的时间格式 date 'yyyy-mm-dd hh24:mi:ss',此操作可以在ctl文件里修改,即对应的字段后面加上时间格式转换,如:

Col_name date 'yyyy-mm-dd hh24:mi:ss'

4. Field in data file exceeds maximum length;

这种错误可能是字段里含有中文字符,解决方法,在ctl里对有问题的字段,后面加char(4000)转换,如:

Col_name char(4000)

5. ORA-01722: invalid number;

这种错误可能是因为当前表的最后一个字段是数值型的且当前导出的数据行分隔符是\r\n,即回车换行。

解决方法,导出的txt的行分隔符换成\n

6.导入时出现字段和记录对不上的问题

可能的情况是字段里含有行分隔符\r\n,处理方法是换个行分隔符或者对出错的字段替换\r\n,即

REPLACE(REPLACE(char(13),''),CHAR(10),'')

6 延展

7 总结

暂无.有问题可以咨询如下:

Mysql迁移到Oracle方法相关推荐

  1. 数据从mysql迁移至oracle时知识点记录(一)

    最近在做数据的迁移,再将数据从mysql迁移至oracle时,部分sql语句进行了修改,在此对部分知识点进行记录: 参考资料:https://dev.mysql.com/doc/refman/5.5/ ...

  2. 记一次基于mybatis的Springboot项目数据库从Mysql迁移至Oracle的全过程(超详细)

    前言 自己做了一个后端使用springboot,前端使用vue的前后端分离的知识图谱系统,图数据库用Neo4j,关系数据库用的mysql,在项目上线前一周,甲方爸爸要求关系数据库要使用Oracle11 ...

  3. oracle移植mysql方案_系统从MySQL迁移至ORACLE实现方案

    一.数据库脚本迁移 1.数据结构同步 打开Navicat Premium,点击菜单[工具]-[数据传输],在弹出的对话框中选择对应的源库和目标库. 为使用方便,请在TAB页[高级]中,将[转换对象名为 ...

  4. Mysql迁移到Oracle

    一.工具下载及安装(若有则忽略此步骤) 1. 下载并安装Mysql 5.7.x版本 参考:MySQL 安装 | 菜鸟教程 2. 下载并安装oracle 11g 参考:Oracle(11g)数据库安装详 ...

  5. date oracle 表中_从 MySQL 迁移数据到 Oracle 中的全过程

    一.前言 这里记录一次将MySQL数据库中的表数据迁移到Oracle数据库中的全过程 ,使用工具 Navicat,版本 12.0.11 操作环境及所用工具: mysql5.7 oracle18c wi ...

  6. 迁移程序mysql_程序从MYSQL迁移ORACLE注意事项之二

    程序从MYSQL迁移ORACLE注意事项之二 程序从Mysql迁移到Oracle的时候,需要注意到以下几个地方: 4. 长字符串的处理 长字符串的处理ORACLE也有它特殊的地方.INSERT和UPD ...

  7. Javamysql语法转化oracle_MyBatis项目实战 快速将MySQL转换成Oracle语句

    一.前言 因项目需求,小编要将项目从mysql迁移到oracle中 ~ 现在将完成 基于MyBatis-Plus将项目中的MySQL语句全部转换成Oracle语句 大概实现步骤: 将项目改成支持双库配 ...

  8. mysql迁移数据库

    为什么uber工程师把数据库从postgres迁移到了mysql Uber工程师在官方博客上描述了他们为什么要从Postgres切换到MySQL数据库.Uber的早期架构是由Python编写的后端应用 ...

  9. oracle迁移到mysql工具_oracle数据库想迁移到mysql上 有什么方法或者工具吗

    Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等 Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全量.增量 ...

最新文章

  1. python字典一键多值_python字典中如何一键多值的写入?
  2. CentOS7添加中文输入法
  3. spring beans源码解读之--XmlBeanFactory
  4. linux pxe启动ftp格式,FTP+DHCP+TFTP+PXElinux实现RHLINUX的网络自动安装
  5. Python 中 Mock 到底该怎么玩?一篇文章告诉你(超全)
  6. Dapr微服务应用开发系列1:环境配置
  7. 服务器c的环境配置文件,配置linux服务器环境(jdk+tomcat+mysql+nginx+redis+svn+nexus的maven私服)...
  8. 互联网日报 | 华为前三季度营收6713亿元;新央企南水北调集团揭牌;易车私有化议案获股东大会通过...
  9. ddos常见攻击报文
  10. 函数指针的定义和函数指针数组
  11. 京东商品类目查询接口
  12. dex2jar .\classes.dex - .\classes-dex2jar.jar com.googlecode.d2j.DexException: not support version
  13. 大学生选课抢课如何提高选中概率
  14. WebView调用微信H5支付
  15. VS使用C++开发桌面程序
  16. 不会用matplotlib画多子图?收好这2个套路
  17. 令人炸毛儿的MySQL隐式转换 - 无形之刃,最为致命
  18. Java虚拟机学习笔记(一)--运行时数据区域
  19. 软考专题模块:2014年下半年软件设计师考试上午试题
  20. 绝对值编码器常见的故障有哪些 如何处理

热门文章

  1. OpenCASCADE:Modeling Algorithms模块之制作原语Making Primitives
  2. wxWidgets:将所有内容与 wxString 相互转换
  3. boost::units模块实现测试数量的隐式转换的测试程序
  4. boost::future相关的测试程序
  5. boost::mpl::not_equal_to相关的测试程序
  6. boost::qvm::deduce_scalar相关的测试程序
  7. 使用 Proto 构建了一个简单但功能强大的 lambda 库的测试程序
  8. boost::hana::tag_of_t用法的测试程序
  9. boost::to_address用法实例
  10. Boost:BOOST_CURRENT_FUNCTION的测试程序