文章目录
- [oracle:数据迁移(Data Pump方式)](#oracle:数据迁移(Data Pump方式))
- 一、导出
- 二、导入前准备(在目标库操作)
- 三、导入
-
- 1.将导出的文件传输到需要导入的数据库的服务器上
- 2.创建数据库目录对象(在目标数据库的SQL*Plus中)
- [3.场景A:将数据恢复到同名的 test 用户下](#3.场景A:将数据恢复到同名的 test 用户下)
- 4.场景B:跨用户导入(不推荐)
- 5.备注
oracle:数据迁移(Data Pump方式)
一、导出
1.以管理员身份登录数据库
bash
sqlplus / as sysdba
2.在数据库服务器上创建一个物理目录
bash
# 第一次需要创建,后续不需要创建,除非改变了目录
# windows: 图形化界面自己创建,如:
D:\db_backup\local_oracle\dpump
# linux:
mkdir -p /u01/app/oracle/dpump_dir
# 注意:这一步需要在操作系统中执行,或者在数据库服务器上有创建目录的权限
3.在Oracle数据库中创建指向该物理目录的目录对象
bash
# windows:
CREATE OR REPLACE DIRECTORY dpump_dir AS 'D:/db_backup/local_oracle/dpump';
# linux:
CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/app/oracle/dpump_dir';
# 注意:如果想要修改指向别的目录地址,只需要改变命令中的目录地址,再持续一遍命令即可,因为命令加了replace,创建或替换。
4.将该目录的读写权限授予需要执行导出导入的用户
bash
# 将该目录的读写权限授予需要执行导出导入的用户(例如 test 用户)
GRANT READ, WRITE ON DIRECTORY dpump_dir TO test;
5.授予更高级的角色(可选)
bash
#(可选)如果需要导出/导入整个数据库或其他用户的表,还需要授予更高级的角色
GRANT DATAPUMP_EXP_FULL_DATABASE, DATAPUMP_IMP_FULL_DATABASE TO test;
6.执行导出
1.按用户模式导出(最常用)
bash
# 导出指定用户的所有对象和数据(不包含表空间)
# windows在cmd执行以下命令:
# 导出的文件带时间戳(每次三句都要重新执行一遍)
# cmd中先执行这两句
set ymd=%date:~0,4%%date:~5,2%%date:~8,2%
set hms=%time:~0,2%%time:~3,2%%time:~6,2%
# 再执行这句
expdp test/123456 DIRECTORY=dpump_dir DUMPFILE=test_full_%ymd%_%hms%_%U.dmp LOGFILE=expdp_test_%ymd%_%hms%.log SCHEMAS=test PARALLEL=2 COMPRESSION=ALL
# 命令解释:
# 连接与基本参数:
# expdp test/123456
# 作用:启动Data Pump导出工具,并指定连接凭据。
# 解释:
# expdp:Data Pump导出程序的命令行工具。
# test/123456:数据库用户名和密码,格式为用户名/密码。
# 注意:在生产环境中,直接在命令中暴露密码不安全。可用expdp
# test@orcl格式,然后交互式输入密码。
# DIRECTORY=dpump_dir
# 作用:指定转储文件和日志文件的存储位置。
# 解释:
# DIRECTORY:关键字,表示后面是一个目录对象名。
# dpump_dir:数据库目录对象名(非操作系统路径),需事先用CREATE DIRECTORY创建。
# 所有输出文件(.dmp和.log)都将写入该目录对象对应的物理路径。
# 输出文件定义
# DUMPFILE=test_full_%ymd%_%hms%_%U.dmp
# 作用:定义转储文件(数据文件)的命名规则。
# 拆解:
# test_full_:自定义的文件名前缀,标识导出内容和类型。
# %ymd%:CMD环境变量,代表年月日(如20251229)。格式取决于系统区域设置。
# %hms%:CMD环境变量,代表时分秒(如132124)。需确保变量已正确定义。
# _%U:Data Pump通配符,当启用并行导出时自动生成两位序号(01, 02...)。
# .dmp:转储文件的标准扩展名。
# 示例文件名:test_full_20251229_132124_01.dmp
# LOGFILE=expdp_test_%ymd%_%hms%.log
# 作用:定义导出过程日志文件的名称。
# 解释:
# 命名规则与DUMPFILE类似,但没有%U(日志文件只有一个)。
# 日志包含:作业详细进度、对象统计、错误信息等。
# 重要:如果同名日志文件已存在,默认会被覆盖。
# 导出内容控制
# SCHEMAS=test
# 作用:指定导出哪个用户模式(schema)的所有对象。
# 详细解释:
# SCHEMAS:导出模式的关键字,表示按用户模式导出。
# test:要导出的数据库用户名(模式名)。
# 导出范围:该用户下的所有表、索引、约束、视图、存储过程、序列、权限等。
# 替代模式:还有TABLES=(表级)、FULL=Y(全库)、TABLESPACES=(表空间级)等。
# 性能优化参数
# PARALLEL=2
# 作用:启用并行处理,提高大数据的导出速度。
# 工作机制:
# 创建2个并行工作进程同时导出数据。
# 与%U通配符配合:每个并行进程写入独立的.dmp文件。
# 若PARALLEL=2且DUMPFILE含%U,则生成..._01.dmp和..._02.dmp两个文件。
# 注意事项:
# 值并非越大越好,需考虑CPU和I/O资源。
# 所有并行文件必须一起用于后续导入。
# COMPRESSION=ALL
# 作用:压缩导出文件内容,节省磁盘空间。
# 压缩对象:所有元数据和表数据。
# 压缩级别:还有DATA_ONLY(仅压缩数据)、METADATA_ONLY(仅压缩元数据)等选项。
# 性能权衡:减少存储空间,但增加CPU消耗和导出时间。
bash
# linux执行以下命令:
expdp test/123456 DIRECTORY=dpump_dir DUMPFILE="test_full_$(date +"%Y%m%d_%H%M%S")_%U.dmp" LOGFILE="expdp_test_$(date +"%Y%m%d_%H%M%S").log" SCHEMAS=test PARALLEL=2 COMPRESSION=ALL

二、导入前准备(在目标库操作)
1.删除并重新创建用户(如果不存在,手动创建)
bash
# 登录
sqlplus / as sysdba
# 删除用户及其所有对象(如果存在)
DROP USER test CASCADE;
# 创建
CREATE USER test IDENTIFIED BY 123456 DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
# 授权
GRANT CONNECT, RESOURCE TO test;
# 为什么要删除,重新创建?
# 因为第一次导入,所有的内容才会更新
# 如果是第二次导入,不删除直接导入,只会更新表的数据,
# 如果有存储过程、视图这些,不会更新,存在就跳过了
# 因此直接删除用户,全部更新比较好(适用于线上数据库迁移到本地测试库)
2.创建表空间(手动创建)
bash
#表空间不可以自动创建,需要手动创建
#安全风险:自动创建表空间需要高权限(CREATE TABLESPACE),且可能创建巨大文件(如源表空间是100GB)。
#存储不可控:Data Pump无法知道目标服务器的磁盘空间、路径规划等存储配置。
#设计哲学:Data Pump定位是数据移动工具,而非存储管理工具。表空间管理被视为DBA的职责。
#创建表空间案例:
CREATE TABLESPACE tc_test_data DATAFILE 'D:\install\Oracle\app\Administrator\oradata\orcl\TEST_DATA01.DBF' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
注意:表空间的路径不要乱写,可参考:表空间的创建
三、导入
1.将导出的文件传输到需要导入的数据库的服务器上
远程工具传输或者U盘拷贝,自行处理。
2.创建数据库目录对象(在目标数据库的SQL*Plus中)
bash
# 以 sysdba 身份登录
sqlplus / as sysdba
# 创建指向物理目录的逻辑目录
CREATE OR REPLACE DIRECTORY import_dir AS 'D:/db_backup/local_oracle/dpump/';
# 授权给需要执行导入的用户(这里授权给 test 用户)
GRANT READ, WRITE ON DIRECTORY import_dir TO test;
3.场景A:将数据恢复到同名的 test 用户下
bash
# 1. 执行导入(注意文件路径)(第一次初始化时执行)
impdp system/用户密码@orcl DIRECTORY=import_dir DUMPFILE=TEST_FULL_20251229_132314_%U.dmp LOGFILE=impdp_test.log SCHEMAS=test TABLE_EXISTS_ACTION=REPLACE
# 第二次覆盖数据时,执行,也可执行第一个命令,只是遇到已经存在用户和以存在存储过程,会答应已存在,看着日志不舒服
# impdp system/用户密码@orcl DIRECTORY=import_dir DUMPFILE=TEST_FULL_20251229_153456_%U.dmp LOGFILE=impdp_test.log SCHEMAS=test TABLE_EXISTS_ACTION=REPLACE EXCLUDE=USER EXCLUDE=PROCEDURE
# 注意:TEST_FULL_20251229_132314替换为每次导出的文件前缀
# TABLE_EXISTS_ACTION=REPLACE效果:先删除现有表,然后重新创建并导入数据。(用于第二次导入时使用,如果不加,需要表存在就跳过,不会更新里面的数据)
# 连接与基本参数
# impdp system/用户密码@orcl
# 作用:启动Data Pump导入工具,并指定连接信息。
# 分解:
# impdp:Data Pump导入程序的命令行工具。
# test/用户密码:以system管理员用户连接,用户密码需替换为实际的test密码。
# @orcl:指定要连接的数据信服务名。orcl是Oracle数据库实例的默认服务名,实际使用时需根据目标数据库的实际服务名调整。
# 注意:通常使用system用户是因为它拥有足够的权限创建用户、表空间等对象。
# DIRECTORY=import_dir
# 作用:指定转储文件和日志文件的存放目录。
# 解释:
# DIRECTORY:关键字,表示后面是一个数据库目录对象名。
# import_dir:目录对象名,必须已在目标数据库中创建(使用CREATE DIRECTORY语句)。
# 该目录对象指向操作系统中的物理路径(如D:\oracle_import\),转储文件(.dmp)必须位于该路径下。
# 输入文件定义
# DUMPFILE=TEST_FULL_20251229_132314_%U.dmp
# 作用:指定要导入的转储文件名称。
# 分解:
# TEST_FULL_:文件名前缀,通常表示导出内容和类型。
# 20251229_132314:时间戳(年月日_时分秒),标识导出时间。
# %U:Data Pump通配符,自动匹配多个文件。当导出时使用PARALLEL参数,会生成多个文件(如_01.dmp、_02.dmp)。
# .dmp:转储文件的标准扩展名。
# 匹配规则:%U会匹配TEST_FULL_20251229_132314_01.dmp、TEST_FULL_20251229_132314_02.dmp等所有序列文件。
# 重要:只需指定第一个文件或使用%U通配符,Data Pump会自动查找其他文件。
# LOGFILE=impdp_test.log
# 作用:指定导入过程日志文件的名称。
# 解释:
# 日志文件将记录导入的详细过程:每个对象的创建状态、数据行数、错误信息等。
# 如果文件已存在,默认会覆盖原文件。
# 日志文件也生成在import_dir目录对应的物理路径中。
# 导入内容控制
# SCHEMAS=test
# 作用:指定将数据导入到哪个用户模式(schema)下。
# 详细解释:
# SCHEMAS:导入模式的关键字,表示按用户模式导入。
# test:目标数据库用户名(模式名)。
# 导入内容:转储文件中属于test用户的所有对象(表、索引、存储过程、数据等)。
# 工作流程:
# 如果目标库中不存在test用户,Data Pump会尝试创建(需要转储文件包含用户元数据)。
# 如果test用户已存在,则将对象导入到该用户下。
# 如果目标用户下已有同名对象,默认会报错失败。
4.场景B:跨用户导入(不推荐)
bash
# 跨用户导入,使用下面的命令:
impdp system/用户密码@orcl DIRECTORY=import_dir DUMPFILE=TEST_FULL_20251229_132314_%U.dmp LOGFILE=impdp_system.log SCHEMAS=test TABLE_EXISTS_ACTION=REPLACE REMAP_SCHEMA=导出原用户名:导入用户名
5.备注
bash
注意:
原数据库导出时,使用test用户,导入时,尽量使用system或test用户;
原使用哪个用户导出。导入的目标尽量也使用相同的用户;
不然,跨用户导入导出,会出现错误。
案例:
1.导出时使用test用户导出,导入时使用system或test用户导入,不报错;
2.导出时使用system用户导出,导入时使用test用户导入,就会报错。
因此,导出时使用权限小的用户(test),导入时使用权限大的用户(system)。