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 某表名;