使用数据泵(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 执行导入的用户;