Oracle数据库imp/exp
环境信息
项目 | 配置说明 |
---|---|
操作系统 | CentOS 7.9 (Kernel 3.10+) |
Oracle版本 | Oracle 19c (19.3.0) |
数据库实例 | orcl |
主机IP | 192.168.1.100 |
监听端口 | 1521 |
示例用户 | test_user/test_password |
示例表空间 | USERS |
示例表 | EMPLOYEES (ID, NAME, DEPT) |
数据目录 | /u01/app/oracle/dump |
一、exp/imp工具参数详解
1. exp(导出)核心参数
参数 | 说明 | 示例值 |
---|---|---|
USERID | 用户名/密码 | test_user/test_password |
BUFFER | 数据缓冲区大小(字节) | 10240000 |
FILE | 输出文件路径 | /u01/app/oracle/dump/exp_full.dmp |
FULL | 全库导出(需特权用户) | Y |
OWNER | 按用户导出 | test_user |
TABLES | 按表导出(支持通配符%) | EMPLOYEES, DEPARTMENTS |
ROWS | 是否导出数据行 | Y (默认) / N |
COMPRESS | 压缩区分配(Y=合并碎片) | Y |
DIRECT | 直接路径导出(绕过SQL层,提升性能) | Y |
LOG | 日志文件路径 | /u01/app/oracle/dump/exp.log |
QUERY | 条件导出数据 | "WHERE DEPT='IT'" |
CONSISTENT | 一致性导出(事务级一致) | Y |
特殊场景参数 | ||
TABLESPACES | 按表空间导出 | USERS, INDEXES |
PARFILE | 参数文件路径 | exp.par |
2. imp(导入)核心参数
参数 | 说明 | 示例值 |
---|---|---|
USERID | 用户名/密码 | test_user/test_password |
BUFFER | 数据缓冲区大小 | 10240000 |
FILE | 导入文件路径 | /u01/app/oracle/dump/exp_full.dmp |
FULL | 全库导入 | Y |
FROMUSER | 源用户(导出文件中的用户) | test_user |
TOUSER | 目标用户(导入到新用户) | new_user |
TABLES | 按表导入 | EMPLOYEES |
IGNORE | 忽略创建错误(继续导入数据) | Y |
INDEXES | 是否导入索引 | Y (默认) |
COMMIT | 每批数据提交(避免大事务回滚段不足) | Y |
LOG | 日志文件路径 | /u01/app/oracle/dump/imp.log |
特殊场景参数 | ||
DESTROY | 覆盖数据文件(慎用!) | Y |
SHOW | 仅显示导入内容(不执行) | Y |
二、操作前准备
1. 创建数据目录
mkdir -p /u01/app/oracle/dump
chown oracle:oinstall /u01/app/oracle/dump
chmod 775 /u01/app/oracle/dump
2. 配置示例数据
-- 使用sqlplus连接数据库
sqlplus system/your_password@//192.168.1.100:1521/orcl-- 创建测试用户
CREATE USER test_user IDENTIFIED BY test_password
DEFAULT TABLESPACE USERS
QUOTA UNLIMITED ON USERS;GRANT CONNECT, RESOURCE TO test_user;-- 创建示例表
CONNECT test_user/test_password@//192.168.1.100:1521/orclCREATE TABLE EMPLOYEES (ID NUMBER PRIMARY KEY,NAME VARCHAR2(50),DEPT VARCHAR2(20)
);-- 插入示例数据
INSERT INTO EMPLOYEES VALUES (1, 'Alice', 'HR');
INSERT INTO EMPLOYEES VALUES (2, 'Bob', 'IT');
COMMIT;
三、exp导出操作实战
场景1:全用户导出
exp USERID=test_user/test_password@192.168.1.100:1521/orcl \OWNER=test_user \FILE=/u01/app/oracle/dump/exp_user.dmp \LOG=/u01/app/oracle/dump/exp_user.log \BUFFER=10240000 \DIRECT=Y
场景2:单表导出(带条件)
exp USERID=test_user/test_password@192.168.1.100:1521/orcl \TABLES=EMPLOYEES \FILE=/u01/app/oracle/dump/exp_emp.dmp \QUERY=\"WHERE DEPT=\'IT\'\" \LOG=/u01/app/oracle/dump/exp_emp.log
场景3:全库导出(需SYSDBA权限)
exp USERID=\"sys/sys_password as sysdba\"@192.168.1.100:1521/orcl \FULL=Y \FILE=/u01/app/oracle/dump/exp_full.dmp \LOG=/u01/app/oracle/dump/exp_full.log
四、imp导入操作实战
场景1:全用户导入(原用户恢复)
imp USERID=test_user/test_password@192.168.1.100:1521/orcl \FILE=/u01/app/oracle/dump/exp_user.dmp \LOG=/u01/app/oracle/dump/imp_user.log \IGNORE=Y \COMMIT=Y
场景2:跨用户导入(test_user → new_user)
-- 先创建目标用户
CREATE USER new_user IDENTIFIED BY new_password
DEFAULT TABLESPACE USERS;
GRANT CONNECT, RESOURCE TO new_user;
imp USERID=system/manager@192.168.1.100:1521/orcl \FILE=/u01/app/oracle/dump/exp_user.dmp \FROMUSER=test_user \TOUSER=new_user \LOG=/u01/app/oracle/dump/imp_cross_user.log
场景3:单表导入
imp USERID=test_user/test_password@192.168.1.100:1521/orcl \TABLES=EMPLOYEES \FILE=/u01/app/oracle/dump/exp_emp.dmp \IGNORE=Y \LOG=/u01/app/oracle/dump/imp_emp.log
五、高级场景处理
1. 大表拆分导出(使用FILESIZE)
exp USERID=test_user/test_password@192.168.1.100:1521/orcl \TABLES=LARGE_TABLE \FILE=/u01/app/oracle/dump/exp_large_%U.dmp \FILESIZE=2G \LOG=/u01/app/oracle/dump/exp_large.log
2. 元数据导入(仅结构)
imp USERID=test_user/test_password@192.168.1.100:1521/orcl \FILE=/u01/app/oracle/dump/exp_user.dmp \SHOW=Y \ROWS=N \LOG=/u01/app/oracle/dump/imp_metadata.log
3. 网络直接导入(不落地文件)
# 导出端
exp USERID=test_user/test_password@source_db FILE= - | \
# 导入端
imp USERID=test_user/test_password@target_db FILE= -
六、错误处理与验证
常见错误解决
IMP-00058: 遇到ORACLE错误 1435
-- 执行重建回滚段 ALTER ROLLBACK SEGMENT "_SYSSMU1$" OFFLINE; DROP ROLLBACK SEGMENT "_SYSSMU1$";
EXP-00091: 导出统计信息失败
# 在导出命令中添加参数 exp ... STATISTICS=NONE
数据验证步骤
-- 检查对象计数
SELECT COUNT(*) FROM DBA_OBJECTS WHERE OWNER='TEST_USER';-- 验证数据完整性
SELECT * FROM TEST_USER.EMPLOYEES;
七、关键注意事项
版本兼容性
- 低版本exp导出文件可导入高版本数据库(如11g→19c)
- 高版本导出需用相同或更高版本imp导入(使用
VERSION
参数降级)
字符集一致性
-- 检查数据库字符集 SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
性能优化
- 导出:使用
DIRECT=Y
和RECORDLENGTH=65535
- 导入:设置
COMMIT=Y
和BUFFER=10485760
- 导出:使用
空间监控
-- 监控表空间使用率 SELECT TABLESPACE_NAME, USED_PERCENT FROM DBA_TABLESPACE_USAGE_METRICS;
附:参数文件示例(exp.par)
USERID=test_user/test_password@192.168.1.100:1521/orcl TABLES=EMPLOYEES, DEPARTMENTS FILE=/u01/app/oracle/dump/exp_tables.dmp LOG=/u01/app/oracle/dump/exp_tables.log DIRECT=Y COMPRESS=Y
执行命令:
exp parfile=exp.par
文档修订记录
版本 | 日期 | 修改说明 |
---|---|---|
V1.0 | 2023-10-15 | 初稿 |
V1.1 | 2023-10-20 | 增加大表拆分导出场景 |