使用数据泵(Data Pump)迁移Oracle数据库数据

目的

将一个oracle数据库实例数据复制给另一个实例

注意事项

sqlplus(即在本机linux环境下执行sql)、expdp、impdp等命令一般需要切换到oracle用户才能执行
如果你当前是linux的root用户,请切换用户

su - oracle
//一般在oracle账号下才能显示echo $ORACLE_HOME的结果

正式迁移步骤

1.确定导出数据的目录
不仅要创建文件夹,而且要创建对应数据库对象
路径可以随意,比如我打算放在$ORACLE_HOME+/dbs/old这样一个路径下

mkdir /u01/app/oracle/product/19.3.0/dbhome_1/dbs/old

2.登录sqlplus去创建export_dir对象

sqlplus 账号/密码@你的SID

注意如果密码中带有@符号,请改成如下方式
巨坑! Oracle TNSPING 正常但sqlplus报错ORA-12154: TNS:could not resolve the connect identifier specified

sqlplus '账号/"密码"'@你的SID
SQL> CREATE DIRECTORY export_dir AS '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/old';

Directory created.

export_dir命名随意
产生结果可以通过如下sql查找

SELECT * FROM dba_directories

3. 使用expdp 命令导出数据
请务必在操作系统的命令行界面中执行 expdp 命令,而不是在 SQL*Plus 环境中执行。注意千万别用sys,用其它有dba角色的账号。

expdp '账号/"密码"'@你的SID schemas=用户1,用户2,用户3 directory=export_dir dumpfile=export.dmp logfile=export.log
  • username/password@old_instance 是连接到旧实例的用户名和密码。
  • schemas=user1,user2 指定要导出的用户列表,用逗号分隔。
  • directory=export_dir 指定导出文件的目录。
  • dumpfile=export.dmp 指定导出文件的名称。
  • logfile=export.log 指定导出过程的日志文件。

4.在新机器或者新实例上创建import_dir对象和对应目录
记得切换oracle用户后登录sqlplus

SQL> CREATE DIRECTORY import_dir AS '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/new';
Directory created.

import_dir名字随意

mkdir /u01/app/oracle/product/19.3.0/dbhome_1/dbs/new

5.将export.dmp复制到new目录下
6.使用impdp命令导入数据

impdp username/password@new_instance directory=import_dir dumpfile=export.dmp logfile=import.log remap_schema=user1:new_user1 remap_schema=user2:new_user2
  • username/password@new_instance 是连接到新实例的用户名和密码。
  • directory=import_dir 指定导入文件的目录。
  • dumpfile=export.dmp 指定要导入的导出文件。
  • logfile=import.log 指定导入过程的日志文件。
  • remap_schema=user1:new_user1 和 remap_schema=user2:new_user2 可选,用于重新映射用户,如果在新实例中用户名称不同于旧实例。

7.可能出现的问题
ORA-39087: directory name IMPORT_DIR is invalid
可能是权限问题,确保执行导入操作的用户对 IMPORT_DIR 目录有读写权限。可以登录高权限账号使用以下命令授予权限:

GRANT READ, WRITE ON DIRECTORY IMPORT_DIR TO 执行导入的用户;

ORA-31631: privileges are required
。ORA-39122: Unprivileged users may not perform REMAP_SCHEMA remappings.

表明当前用户没有执行 REMAP_SCHEMA 操作所需的权限。

GRANT IMP_FULL_DATABASE TO 执行导入的用户;

ORA-39083: Object type TABLE:“用户名”.“表名” failed to create with error:
ORA-01031: insufficient privileges

在查看导入日志的时候发现,同一个用户同一个表空间,有1/3的表数据没有导入,报错却是没有权限,想不通为什么。
后来用system重新执行impdp命令导入才正常。

impdp 'system/"password"'@new_instance directory=import_dir dumpfile=export.dmp logfile=import.log remap_schema=user1:new_user1 remap_schema=user2:new_user2 TABLE_EXISTS_ACTION=REPLACE

与上面唯一不同的地方是末尾通过命令行参数来设置导入行为。
TABLE_EXISTS_ACTION 这个参数决定了如果目标表已经存在,应该如何处理:

  • APPEND:将数据追加到现有表中。
  • REPLACE:删除现有表并导入新数据。
  • SKIP:跳过现有表,继续导入其他对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值