Oracle 数据泵导出与还原操作指南

1. 导出前检查(生产库)

1.1 查询目录对象及权限

复制代码
-- 查看所有目录对象
SELECT * FROM dba_directories;

-- 查询 DUMP_DIR 目录对 MESPRD 用户的授权情况
SELECT * FROM dba_tab_privs 
WHERE grantee = 'MESPRD' 
  AND table_name = 'DUMP_DIR';

1.2 确认备份目录磁盘空间

复制代码
df -h /u01/app/oracle/admin/cimdb/dpdump

1.3 确认 Data Pump 命令可用

复制代码
# 切换到 oracle 用户
su - oracle

# 查找 expdp 可执行文件
find $ORACLE_HOME -name expdp -type f 2>/dev/null
复制代码
# 如找到,说明支持数据泵

2. 导出数据(生产库)

跳过大表数据,只导出表结构(DDL)

复制代码
expdp MESPRD/MESPRD@cimdb \
  DIRECTORY=DUMP_DIR \
  DUMPFILE=cimdb_MESPRO_20260327.dmp \
  LOGFILE=cimdb_MESPRO_20260327.log \
  SCHEMAS=MESPRD \
  EXCLUDE=TABLE_DATA:\"IN \(\'SL_COM_IF_LOG\'\)\"

说明

  • TABLE_DATA:只导出表定义,不导出数据

  • 若想完全跳过表(包括结构),可使用 EXCLUDE=TABLE


3. 传输 DMP 文件到测试服务器

复制代码
scp /u01/app/oracle/admin/cimdb/dpdump/cimdb_MESPRD_20260327.dmp root@测试服务器IP:/home/oracle/app/oracle/admin/cimdbsync/dpdump/

请将 测试服务器IP 替换为目标地址。


4. 还原前准备(测试库)

4.1 断开已有连接(如用户已存在)

复制代码
-- 查询 MES260327 用户的会话
SELECT SID, SERIAL#, USERNAME FROM V$SESSION WHERE USERNAME = 'MES260327';

-- 强制断开(示例:SID=5052, SERIAL#=55357)
ALTER SYSTEM KILL SESSION '5052,55357' IMMEDIATE;

4.2 删除用户(如需重建)

复制代码
DROP USER MES260327 CASCADE;

4.3 创建新的表空间

复制代码
CREATE TABLESPACE TS_MES_TXT_NEW 
DATAFILE '/home/oradata/cimdbsync/TS_MES_TXT_NEW.DBF' 
SIZE 100M 
AUTOEXTEND ON NEXT 100M;

TS_MES_TXT_NEW是目前不存在的表空间

4.4 创建用户并授权

复制代码
CREATE USER MES260327 IDENTIFIED BY MES260327
DEFAULT TABLESPACE TS_MES_TXT_NEW
TEMPORARY TABLESPACE TEMP
QUOTA 500M ON TS_MES_TXT_NEW
ACCOUNT UNLOCK;
用户的表空间设权
-- 基础权限
GRANT CONNECT, RESOURCE TO MES260327;
GRANT CREATE SESSION TO MES260327;

-- 创建对象权限
GRANT CREATE PROCEDURE, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE TRIGGER, CREATE TYPE, CREATE SYNONYM TO MES260327;

-- 目录权限
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO MES260327;

-- 查询权限(按需)
GRANT SELECT ANY TABLE, ALTER ANY SEQUENCE, SELECT ANY SEQUENCE TO MES260327;

4.5 验证用户及权限

复制代码
-- 查看用户信息
SELECT username, account_status, created, profile 
FROM dba_users 
WHERE username = 'MES260327';

-- 查看系统权限
SELECT * FROM dba_sys_privs WHERE grantee = 'MES260327';

4.6 查看表空间使用情况

复制代码
SELECT
    FILE_NAME,
    ROUND(BYTES/1024/1024/1024, 2) AS FILE_SIZE_GB,
    ROUND((BYTES - NVL(FREE_BYTES,0))/1024/1024/1024, 2) AS USED_GB,
    ROUND(NVL(FREE_BYTES,0)/1024/1024/1024, 2) AS FREE_GB,
    ROUND(100 * (BYTES - NVL(FREE_BYTES,0)) / BYTES, 2) AS USED_PCT,
    AUTOEXTENSIBLE,
    ROUND(MAXBYTES/1024/1024/1024, 2) AS MAX_GB
FROM (
    SELECT
        df.FILE_NAME,
        df.FILE_ID,
        df.BYTES,
        df.AUTOEXTENSIBLE,
        df.MAXBYTES,
        NVL(fs.FREE_BYTES,0) FREE_BYTES
    FROM DBA_DATA_FILES df
    LEFT JOIN (
        SELECT FILE_ID, SUM(BYTES) FREE_BYTES
        FROM DBA_FREE_SPACE
        GROUP BY FILE_ID
    ) fs ON df.FILE_ID = fs.FILE_ID
    WHERE df.TABLESPACE_NAME = 'users'
)
ORDER BY FILE_NAME;

因为这个users表空间是导出的时候默认的,如果还原不指定修改表空间,就需要查询测试库这个表空间的大小一定要大于还原的dmp文件的大小

我创建的表空间文件有两个,默认上限32G,导入的时候两个文件都会写入


5. 还原数据(测试库)

5.1 导入到新表空间

复制代码
impdp MES260327/MES260327@10.200.0.47:1521/zhmesstg \
  directory=DATA_PUMP_DIR \
  dumpfile=cimdb_MESPRO_20260327.dmp \
  remap_schema=MESPRD:MES260327 \
  remap_tablespace=USERS:TS_MES_TXT_NEW \
  table_exists_action=replace

说明

  • remap_tablespace 将源表空间 USERS 映射到新表空间 TS_MES_TXT_NEW

  • 如果不指定此参数,则使用导出时的原表空间(若目标库中不存在则会报错)。


6. 验证还原结果

复制代码
-- 查看导入的表数量
SELECT COUNT(*) FROM user_tables;

-- 查看某张表的数据行数
SELECT COUNT(*) FROM 某表名;
相关推荐
邂逅you2 小时前
SQL温故与知新
数据库·sql
zhangren024682 小时前
Laravel7.x新特性全面解析
数据库·mysql·adb·php
鸽芷咕2 小时前
Oracle替换工程实践深度解析:金仓数据库破解PL/SQL“零改造”迁移难题
数据库·sql·oracle
猿小喵2 小时前
MySQL数据库参数解读-第一篇
数据库·mysql·性能优化
云边有个稻草人2 小时前
数据库性能调优实战:从瓶颈诊断到落地优化
网络·数据库·oracle·金仓·kes
小陈工2 小时前
Python Web开发入门(二):Flask vs Django,项目结构大比拼
前端·数据库·python·安全·web安全·django·flask
wellc2 小时前
Django视图与URLs路由详解
数据库·django·sqlite
倔强的石头1062 小时前
新型电力系统应该用什么数据库?——时序数据库选型与落地实战
数据库·时序数据库
墨神谕2 小时前
关系型数据库与非关系型数据库的区别
数据库·nosql