从零开始导入(imp),导出(dmp)Oracle数据

article/2025/10/4 22:30:03

具体任务:现有一个300+ G的dmp文件需要将其导入到Oracle数据库中,并且将其切分为若干的小的dmp文件

安装Oracle 11g

通过 docker 去 pull 阿里的镜像
具体流程参考

http://t.csdn.cn/Zbc6P

注意点

  1. 注意安装的版本,如果选择带有 XE 的版本,在导出的时候会受到输出空间的限制(32G左右)
  2. 输入的数据文件可通过宿主机和容器映射的方式来实现
  3. docker run -d --privileged=true -p 1521:1521 -e ORACLE_ALLOW_REMOTE=true -v [宿主机目录]:[镜像内的目录] --name oracle registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

imp导入流程

1.登陆并创建用户

sqlplus /nolog --登录
conn /as sysdba
create user oracle_user identified by 【password】; – 创建内部管理员账号密码;

2.授权

grant connect,resource,dba to oracle_user; --将dba权限授权给内部管理员账号和密码;

3.设置

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; --设置密码永不过期:
alter system set processes=1000 scope=spfile; --修改数据库最大连接数据;

4.导入数据
注意,这里可以指定表空间导入,可以去找相关帖子

imp [username]/[password]@[ip]:1521/[数据库实例名 helowin] file=‘[导入的文件位置]’ full=y ignore=y;

exp导出文件

命令

exp [username]/[password]@[ip]:1521/[数据库实例名] file=[导出的位置] tables=[, …] log=[日志导出位置] grants=y;

解决方案:
连接数据库,获取所有表名,大致计算每个表的大小,将所有表名进行分割后得到导出的exp语句

package org.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/*** @version 1.0* @Author kurumi* @Date 2022/7/26 19:24* @注释*/
public class Conn {static String driverClass="oracle.jdbc.driver.OracleDriver"; //oracle的驱动static String url="jdbc:oracle:thin:@[ip]:1521:[实例名 这里是helowin]";  //连接oracle路径方式 “”gfs“”是要建立连接的数据库名 1521端口static String user="[user]";   //user是数据库的用户名static String password="[password]";  //用户登录密码public static Connection getconn() {  //为了方便下面的讲解,这里专门建立了一个用于数据库连接的一个方法Connection conn=null;try {//首先建立驱动Class.forName("oracle.jdbc.driver.OracleDriver");//驱动成功后进行连接conn=DriverManager.getConnection(url, user, password);//            System.out.println("连接成功");} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return conn; //返回一个连接}
}

2.连接数据库并处理得到导出语句

oracle11g对应的jdbc版本

<dependency><groupId>cn.easyproject</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.4</version>
</dependency>
package org.example;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;/*** @version 1.0* @Author kurumi* @Date 2022/7/26 19:23* @注释*/
public class GetExpInfo {public static void main(String[] args) {Connection conn=null;Statement st=null;ResultSet rs=null;ArrayList<String> tableNames = new ArrayList<>();try {//1、获取连接对象conn=Conn.getconn();//2、创建statement类对象,用来执行SQL语句!!st=conn.createStatement();//3、创建sql查询语句/*select table_name from all_tables where TABLESPACE_NAME ='USERS'select table_name from all_tables a where a.OWNER = upper('oracle_user') ORDER BY(TABLE_NAME);*/String sql="select table_name from all_tables a where a.OWNER = upper('oracle_user') ORDER BY(TABLE_NAME)";//4、执行sql语句并且换回一个查询的结果集rs=st.executeQuery(sql);while(rs.next()) {  //循环遍历结果集String name=rs.getString("table_name");tableNames.add(name);}} catch (Exception e) {e.printStackTrace();}StringBuffer stringBuffer = new StringBuffer();ArrayList<String> resSQL = new ArrayList<>();int i = 0;//每次导出一百个表String start = tableNames.get(0);for (String tableName : tableNames) {if((i+1) % 100 == 0){String end = tableNames.get(i);String name = start+"-"+end+".dmp";stringBuffer.deleteCharAt(stringBuffer.lastIndexOf(","));resSQL.add("exp [user_name]/[password]@[ip]:1521/helowin " +"file=/home/oracle/app/oracle/oradata-source/"+name+" tables="+stringBuffer.toString());stringBuffer.setLength(0);start = end;}stringBuffer.append(tableName+",");i++;}//剩下的表String end = tableNames.get(i-1);String name = start+"-"+end+".dmp";stringBuffer.deleteCharAt(stringBuffer.lastIndexOf(","));resSQL.add("exp [user_name]/[password]@[ip]:1521/helowin " +"file=/home/oracle/app/oracle/oradata-source/"+name+" tables="+stringBuffer.toString());for (String s : resSQL) {System.out.println(s);}}
}

3.服务器写一个脚本自动导入

vi block.sh

#! /bin/bash
exp [user_name]/[password]@[ip]:1521/helowin file=/home/oracle/app/oracle/oradata-source/[your file name1].dmp tables= [table1],[table2],[table3]......  
&&
exp [user_name]/[password]@[ip]:1521/helowin file=/home/oracle/app/oracle/oradata-source/[your file name2].dmp tables= [table1],[table2],[table3]......
&&
.......  

执行block.sh脚本

遇到的问题

1 .exp 导出数据时候发生EXP-00091

EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.

1.问题产生的原因
linux下oracle用户环境变量语言集和oracle数据库中的环境变量语言集不同

2.解决方法
只要将oracle环境变量语言集改成和数据库环境变量语言集一样的就可以

解决方案:

参考了

http://t.csdn.cn/2D7jC

1). 查看服务器端字符编码(注意是Oracle安装的服务器,对于docker是容器内的字符编码)
得到的字符集为 ‘AMERICAN_AMERICA.AL32UTF8’

SQL> select userenv(‘language’) from dual;
USERENV(‘LANGUAGE’)
AMERICAN_AMERICA.AL32UTF8

2). 返回命令行设置

[oracle@a5ee52623107 ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

3). 导出数据

[oracle@a5ee52623107 ~]$
exp [username]/[password]@[ip]:1521/[数据库实例名] file=[导出的位置] tables=[, …] log=[日志导出位置] grants=y;

2. imp导入的时候发生IMP-00058

错误信息

IMP-00058: ORACLE error 1658 encountered
ORA-01658: unable to create INITIAL extent for segment in tablespace USERS
. . importing table “xxxxxxxxx”
IMP-00058: ORACLE error 1658 encountered
ORA-01658: unable to create INITIAL extent for segment in tablespace USERS
. . importing table xxxxx"

or

. . importing table “xxxxxx” 出错
IMP-00058: ORACLE error 1659 encountered
ORA-01659: unable to allocate MINEXTENTS beyond 4 in tablespace USERS
. . importing table “xxxxxx”

错误原因
表空间大小不足造成的,可以在 navicat 中去实时查看当前要导入的表空间的利用率
在这里插入图片描述

另一种查看表空间利用率的方法 执行
SELECT UPPER(F.TABLESPACE_NAME) “【表空间名】”,
  D.TOT_GROOTTE_MB “表空间大小(M)”,
  D.TOT_GROOTTE_MB - F.TOTAL_BYTES “已使用空间(M)”,
  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),‘990.99’) || ‘%’ “使用比”,
  F.TOTAL_BYTES “空闲空间(M)”,
  F.MAX_BYTES “最大块(M)”
  FROM (SELECT TABLESPACE_NAME,
  ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
  ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
  FROM SYS.DBA_FREE_SPACE
  GROUP BY TABLESPACE_NAME) F,
  (SELECT DD.TABLESPACE_NAME,
   ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
  FROM SYS.DBA_DATA_FILES DD
  GROUP BY DD.TABLESPACE_NAME) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 1;

解决方法
增加数据文件来达到表空间扩容
注意
1.一般情况下单个数据文件最大32G左右的大小,这里设置了30G
2.就我所执行的任务而言,所需要的表空间大致为dmp文件大小的2倍左右

alter tablespace USERS add datafile ‘[path]/users01.dbf’ size 30720m autoextend on next 10240m MAXSIZE UNLIMITED;
alter tablespace USERS add datafile ‘/home/oracle/app/oracle/oradata/helowin/users02.dbf’ size 30720m autoextend on next 10240m MAXSIZE UNLIMITED;
alter tablespace USERS add datafile ‘/home/oracle/app/oracle/oradata/helowin/users03.dbf’ size 30720m autoextend on next 10240m MAXSIZE UNLIMITED;
alter tablespace USERS add datafile ‘/home/oracle/app/oracle/oradata/helowin/users04.dbf’ size 30720m autoextend on next 10240m MAXSIZE UNLIMITED;

另一种解决思路
可以在导入的时候指定要导入的表空间,如果数据文件很大的话,可以设置bigfile类型的表空间

3.exp导出的时候 EXP-00028

错误代码

EXP-00028: failed to open /home/oracle/app/oracle/oradata-source/test_dmp.dmp for write

错误原因

用户权限不够

解决方法

su - root
chown -R oracle:oinstall /home/oracle/app/oracle/oradata-source

4. Oracle imp导入服务端字符集不匹配的问题

Oracle服务端字符集编码为AL32UTF8,dmp文件编码字符集为ZHS16GBK,导入过程中由于有中文列发生错误

解决方法

docker创建一个新的容器后重置数据库的字符集,修改原有数据库的字符集可能会发生一定的风险

docker创建同一个镜像的不同的容器,修改name和端口即可
此外。还需要修改端口,采用默认端口1521可不用修改,这里以创建docker oracle容器时指定端口为1524:1524

vi /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/listener.ora# listener.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/listener.ora
# Generated by Oracle configuration tools.LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1524))(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1524))))ADR_BASE_LISTENER = /home/oracle/app/oracle# 修改
vi /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora# tnsnames.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.LISTENER_HELOWIN =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1524))HELOWIN =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1524))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = helowin)))

修改字符集参考:
https://www.cnblogs.com/dll102/p/14822265.html

问题

imp导入发生错误,不晓得是不是创建容器时指定了不同的端口所造成的原因

IMP-00058: ORACLE error 12547 encountered
ORA-12547: TNS:lost contact
IMP-00000: Import terminated unsuccessfully

解决方法

去掉本机ip,命令改为 imp 用户名/密码@helowin full=y file=dmp文件 ignore=y full=y;

问题

import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses ZHS16GBK character set (possible charset conversion)
export client uses ZHS16GBK character set (possible charset conversion)

解决方法

vi ~/.bash_profile# bash_profile添加
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBKsource ~/.bash_profile 

http://chatgpt.dhexx.cn/article/XXKTXJEN.shtml

相关文章

Oracle- imp/impdp导入dmp文件

impdp命令 1.在目标库查询DATA_PUMP_DIR目录 select directory_name , directory_path from dba_directories2.将dpm文件放到上面的目录下 3.使用impdp命令导入 impdp system/oracle fromuser源库名 touser目标库名 dumpfilexxx.dmp remap_schema源库名:目标库名 remap_t…

使用impdp导入dmp文件

使用impdp导入dmp文件 一、查看导出log 查看导出log&#xff0c;确定导出表空间、用户和逻辑目录directory 二、创建表空间、用户、逻辑目录 2.1创建表空间 create tablespace XXX logging datafile ‘D:\app\hasee\oradata\orcl\XXX.dbf’ size 500M autoextend on next …

如何使用imp导入dmp文件

一、创建临时表空间&#xff1a; create temporary tablespace yd_temp tempfile D:\oracledata\file_temp.dbf --路径根据实际情况填写 size 50m autoextend on next 50m maxsize 2048m extent management local; 二、…

PHP前后端分离

主页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, ini…

java 实现前后端分离_详解前后端分离之Java后端

前后端分离的思想由来已久,不妨尝试一下,从上手开始,先把代码写出来再究细节。 前言 以前服务端为什么能识别用户呢?对,是session,每个session都存在服务端,浏览器每次请求都带着sessionId(就是一个字符串),于是服务器根据这个sessionId就知道是哪个用户了。 那么问题来…

前后端分离架构技术

前后端分离已成为互联网项目开发的业界标准使用方式&#xff0c;通过nginxtomcat的方式&#xff08;也可以中间加一个node.js&#xff09;有效的进行解耦&#xff0c;并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务&#xff08;多种客户端&…

前后端分离模式研究

一、前言 对目前的web来说&#xff0c;前后端分离已经变得越来越流行了&#xff0c;越来越多的企业/网站都开始往这个方向靠拢。前后端分离概念在今天其实并不新鲜&#xff0c;自以MVC模型为主的开发模式流行之初&#xff0c;前后端分离思想就被提出来了&#xff0c;但是经历了…

前后端分离搭建的简单实现

前言 本片博客描述欠缺&#xff0c;如果有细心的小伙伴有什么地方看不懂或者感觉写的有问题之处&#xff0c;请留言我&#xff0c;我会根据留言内容更改 搭建前后端分离 为什么要前后端分离 前后端分离是目前非常流行的一种开发模式&#xff0c;他的项目分工更加明确&#xff…

前后端分离开发架构

前后端分离开发架构设计 一、为什么要使用前后端分离 1.理解 MVC MVC是一种经典的设计模式&#xff0c;Model-View-Controller&#xff0c;即模型-视图-控制器。M主要负责数据与模型&#xff0c;V主要负责显示&#xff0c;C主要负责交互与业务 模型是用于封装数据的载体&#…

前后端分离php还有优势,前后端分离优缺点

前后端分离优缺点 之前有朋友问我&#xff1a;什么是前后端分离。他说北度搜到的都是大篇幅文章&#xff0c;看完还是很懵。 这里我简单总结下&#xff0c;如果有疏漏和不对的地方还请路过的网友指出。 一、先用一张图来解释 二、为什么要前后端分离(优点) 1. 全端适应 PC、APP…

前后端分离的登录

目录 一、跨域认证的问题 ​编辑 1.2 什么是JWT 1.3 JWT原理 1.4 JWT结构 1.4.1 Header 1.4.2 Payload 1.4.3 Signature 1.5 使用JWT---JAVA 1.5.1 引入依赖 1.5.2 封装一个JWT工具类 二、完成前后端分离的登录功能 2.1 前端代码 2.2 配置拦截器axios 2.3 后台拦截器 一、…

前后端分离架构

原文 参考&#xff1a; 到底什么是前后端分离1 到底什么是前后端分离2 到底什么是前后端分离3 前后端分离是个架构设计问题。所谓架构设计&#xff0c;实际上是如何合理的对现实的人力架构进行系统映射&#xff0c;以便最大限度的提高整个公司的运行效率。 前后端的定义 前后…

前后端分离的跨域问题

跨域问题原因 在现在流行的前后端分离开发中&#xff0c;跨域问题突显了出来&#xff0c;跨域问题的根本原因&#xff1a;浏览器有同源策略限制&#xff0c;当前域名的js只能读取同域下的窗口属性&#xff0c;这是一个基础安全功能。那么什么是同源策略呢&#xff1f;即两资源的…

前后端分离历史

文章目录 前后端分离前后端分离的历史前后端合并前后端耦合前后端“分离”大厂的方案前后端分离的理想方式前后端分离的好处前后端分离的挑战总结 前端历史前端开发的历史和趋势什么是前端前后端不分的时代后端 MVC 的开发模式前端工程师的角色典型的 PHP 模板AjaxWeb 2.0前端 …

小谈什么是前后端分离?

什么是前后端分离&#xff1f; 学习目标 什么是前后端分离&#xff1f;前后端分离初了解为什么要前后端分离&#xff1f;1、前后职责分离2、前后技术分离3、前后分离带来了用户用户体验和业务处理解耦4、前后分离&#xff0c;可以分别归约两端的设计 前后分离架构接口设计 用户…

java 前后端分离_Java项目如何实现前后端分离

Java项目如何实现前后端分离 发布时间:2020-11-20 15:55:52 来源:亿速云 阅读:103 作者:Leah 今天就跟大家聊聊有关Java项目如何实现前后端分离,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 构建springboot…

java 前后端分离

前后端分离的开发模式&#xff0c;这两年确实被炒得如火如荼&#xff0c;导致这个话题也成了面试极其爱问的一个问题&#xff0c;尤其是换工作、跳槽&#xff0c;之前不管你是做后端&#xff0c;还是前端&#xff0c;都可能会涉及。 面试官常问&#xff1a; 诶&#xff1f;你…

前后端ajax分离如何做seo,前后端分离 seo

目录 一、bootstrap 前后端分离 表现层完全由前端掌控是最好的。所以掌握jsp和jstl是挺好的&#xff0c;等你全掌握之后麻利得把页面模板搞定就可以嘲笑后端都是bottleneck了。 当然不愿意用jsp/jstl之类的&#xff0c;也可以考虑完全用ajax。 为什么说前后端分离不利于seo的原…

前后端分离

一、项目有前后端分离和前后端不分离&#xff1a; 在前后端不分离架构中&#xff0c;所有的静态资源和业务代码统一部署在同一台服务器上。服务器接收到浏览器的请求后&#xff0c;进行处理得到数据&#xff0c;然后将数据填充到静态页面中&#xff0c;最终返回给浏览器。 实现…

Spring Security 前后端分离

前后端分离概述 前后端分离指的就是前后端分离部署&#xff0c;前端 调用后端API&#xff0c;后端 返回 JSON格式数据&#xff0c;页面是由前端渲染并展示到浏览器中。 相比较传统的单体项目 &#xff0c;页面是由后端渲染完成后返回给浏览器的。&#xff08;jsp、thymeleaf、…