Oracle 数据泵导出与还原操作指南
- 新建用户(建议直接用数据库工具建就可以)【用DBA账号,执行脚本】sys manager。remap_tablespace如果不指定,就是导出的默认的表空间名。-- 授予资源创建权限(表、视图等)--查看表空间下的所有文件的使用情况。--查询Oracle中的目录对象。-- 查询DUMP_DIR相关权限。--查询还原目录可用空间。-- 如果需要更细粒度的权限控制。---------数据库还原。-
·
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 某表名;
更多推荐



所有评论(0)