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 某表名;
相关推荐
小科先生16 小时前
Java springboot调用数据库的基本流程
java·数据库·spring boot
星恒随风16 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Pniubi18 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
数据库小学妹18 小时前
pgbouncer 事务池:prepared statement、临时表与会话状态
数据库·后端·postgresql
Lucifer三思而后行19 小时前
最近折腾了一下金仓数据库的备份恢复
数据库·备份恢复
草莓熊Lotso20 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
进击的荆棘21 小时前
MySQL——库的操作
数据库·mysql
2601_967980111 天前
“小程序·云开发”上线 助力开发者的高效利器
数据库·存储管理·小程序云开发·云函数·开发者工具
zhangjw341 天前
1-9 SELECT 查询基础:where、group by、having、order by、limit offset
数据库·postgresql·pg数据库
唐老板1 天前
Postgres 慢查询,先取证再动手
数据库·ai编程