Oracle数据库使用数据泵导入dmp数据文件
在使用Oracle数据库进行数据库备份的还原,或者迁移数据到新的库中时,都会使用数据泵功能来导出导入dmp数据文件完成。这里大概记录下操作的主要流程及相关注意细节问题以作备忘。
目的是要将线上生产环境的数据库数据整体迁移到公司本地环境中,本地是在服务器上利用docker部署的oracle容器服务。将具体迁移的过程分为三个步骤:
- 将dmp文件传输到容器部署的宿主机上;
- 将宿主机上的文件传输到oracle容器中的目录中;
- 在oracle容器中导入dmp数据文件;
第一步、将dmp文件传输到容器部署的宿主机上
利用xftp等工具或者rz -bye命令上传本地的dmp文件
第二步、将宿主机上的文件传输到oracle容器中的目录下
由于我这里Oracle是通过docker镜像启动的,所以要先将文件先传输到容器中,再在容器中执行数据泵的操作命令。
#登录到容器的bash界面,其中[container-name]容器名称也可使用容器ID,利用docker ps命令查到;使用root用户登录进去具有最高权限,可以进行文件夹的授权更改等操作(*后面有使用到)
#登录到docker容器中,以root用户登录
sudo docker exec -it -u root [container-name] bash
#登录到docker容器中,以默认用户登录
docker exec -it [container-name] bash
#从宿主机向容器中拷贝文件
docker cp you_dmp_file.dmp [container-name]:/usr/oracle/dump/dir
#从容器向宿主机中拷贝文件
docker cp [container-name]:/usr/oracle/dump/dir/copy_file /home/data/dest_file
在执行数据泵导入命令之前,需要在oracle控制界面创建目录和授权限,授权后的目录dump_dir即为我们最终使用的dmp文件来源路径。
SQL> create or replace directory DUMP_DIR as '/usr/oracle/dump/dir';
#这里的[user]即Oracle中的目标用户
SQL> grant read,write on directory DUMP_DIR to [user] ;
#用户及表空间的创建
#创建临时表空间
SQL> create temporary tablespace user_temp tempfile '\usr\oracle\oracledata\user_temp.dbf' size 50m autoextend on next 50m maxsize 2048m extent management local;
#创建表空间
SQL> create tablespace user_data logging datafile '\usr\oracle\oracledata\user_data.dbf' size 50m autoextend on next 50m maxsize 2048m extent management local;
#创建用户并分配表空间
SQL> create user [user] identified by [password] default tablespace user_data temporary tablespace user_temp;
#重命名表空间
SQL> alter tablespace user_data rename to new_user_data;
#修改用户表空间
SQL> alter user user default tablespace other_data temporary tablespace other_temp;
#Oracle登录、用户创建及授权
SQL> sqlplus sys/[sysPassword]@[instance];
SQL> create user [user] identified by [password];
SQL> grant connect,resource,dba to [user];
当然这里碰到一个问题,因为执行数据泵时需要使用对文件及目录具备Oracle用户操作权限,而我从宿主机往容器中传入文件的权限是root,所以需要对相关操作的目录修改属主和属组。
chown -R oracle:oinstall /usr/oracle/dump/dir
第三步、在oracle容器中导入dmp数据文件
impdp system/Oracle123@orclpdb directory=DUMP_DIR dumpfile=xxxxx.dmp remap_schema=abc:abc+ TRANSFORM=segment_attributes:n
impdp命令的几个相关参数的使用说明:
directory: 用来注明所使用的的dmp文件所在目录,必须经过oracle创建和授权操作的。
dumpfile: dmp文件名,目录下可能存在多个dmp数据文件,需要指明文件名。
remap_schema:该参数用于当dmp文件中的用户名和目标用户名不一致的情况,abc:abc+ 冒号左侧是导入文件中使用的用户名,右侧是目标的用户名。
table_exists_action:注明当导入已存在的表时的操作,取值效果如下
skip:若存在表则跳过
append:追加数据到表中
replace:替换表
truncate:截断表,并覆盖新数据
remap_tablespace=source_tablespace:target_tablespace:指定导入时更改表空间
TRANSFORM=segmen_attributes:n: 用于不确定源表空间的情况下,会直接导入到用户默认表空间