最近因为业务需要,需要从生产环境拉一份数据出来,导入到公司服务器上留着备份,之前就做过oracle数据库的导入导出。怎奈时间过于久远,一番折腾下,也算是光荣完成上级交给任务了
导入之前我们先科普一下oracle用户,表,表空间,数据泵的基础知识。已经了解过的可跳过此步骤。直接到下面导入即可
表空间:我们都知道,Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,N个用户,一个表空间下可以有N张表。这个表空间是逻辑存在的。
数据文件:操作系统上实际存在的文件,通常都是.dbf结尾的,用来真正存放数据的。属于物理存在。数据文件属于表空间。与表空间的对应关系为一对多,即一个表空间下,可以有多个数据文件,但是一个数据文件只能对应一个表空间
准备工作:oracle数据泵文件(dmp文件)。一台安装已经安装好oracle数据库的机器(PS:废话,没装oracle怎么导入)。
dmp文件是其他项目组的人直接给的。一般来说文件名都是XXX.tar.gz。直接将这个文件往服务器上传即可,数据文件超级大,整整10个G。公司VPN又慢的要死,整整传了我两天。
千辛万苦,总算是把文件上传到服务器上了。接下来,开启一段激动人心的时刻。首先,解压这个文件,压缩之前得先查看一下物理磁盘空间是否足够,不然,文件没解压完,磁盘先炸了,,,一般来说,dmp文件都是10倍左右的压缩率。就是说你拿到一个10G的dmp。解压过后的文件得有100G!!
tar -zxvf 20180828.tar.gz
解压完成,在导入前,需要先检查一下表空间是否足够,还要了解一下dmp文件里面的内容是啥,是按用户导出、全库导出、还是按表导出的,我们在导入前得先检查一下表空间,执行如下命令:
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
我要导入的是第三个表空间里面去(ps:要导入到哪个表空间,其实在导出的时候有一个默认值,假如没设置的话,一般来说你导出的用户在哪个表空间,导入的时候还是哪个表空间。如果新库不存在,则会导出失败)
虽然现在还有90多G的空间,但是为了以防万一,还是先给加上30G。
oracle拓展表空间的方法:
alter tablespace 表空间名 add datafile '物理磁盘路径/data05.dbf' size 32G;
扩展完成之后新建一个导入目录。该目录存放我们刚刚要导入的dmp文件,
以dba的身份登录oracle。新建一个导入目录EXPDIR。该目录下存放我们要导入的dmp文件。
create directory expnc_dir as '/home/oracle/xxx';
给即将导入的用户授权
Grant read,write on directory DXPDIR to oracle;
完了我们来查询一下这个目录是否已经成功建立
select * from dba_directories;
可以看到,目录已经已经成功建立。如果上面都没问题,接下来就是导入操作了,登录服务器。一般是Linux,如果为windows的话,直接win+R。输入cmd打开控制台。
输入如下命令:
impdp oracle/oracle@ip地址/实例名 directory=DXPDIR schemas=oracle dumpfile =20180828.dmp logfile=20180831.log
这里解释一下,ip地址呢,为服务器的ip地址,如果是本机导入的话就写127.0.0.1。实例就是你登录的数据库名称。schemas为你要导入的用户名。
一切成功之后,控制台一般会打印出如下信息
看到这个熟悉的画面,掩饰不住内心的激动,剩下的就是去睡个觉,等它自己慢慢导入就可以了。当然这只是一个简单的导入而已,导入命令还有很多复杂的参数,以后慢慢了解