什么是表空间?
我们在导入数据库文件时,通常会创建表空间以及用户,其实不是必须的,只是为了方便查询使用而建立不同的空间来分别存储。那我们就简单来介绍一下表空间。
ORACLE数据库被划分成称作为表空间的逻辑区域——形成ORACLE数据库的逻辑结构。一个ORACLE数据库能够有一个或多个表空间,而一个表空间则对应着一个或多个物理的数据库文件。表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库实体,如表、视图、索引、聚簇、回退段和临时段等。
大体分为四类:
- 用户表空间
- 临时表空间
- 系统表空间
- 回滚表空间
如何创建表空间以及删除表空间
其中datafile目录是你存储表空间的目录,我这里放在的是数据库安装目录下D:\app\adm\oradata,然后名字是SPACE.DBF;删除表空间是连同表空间下的物理文件一起删除。
--创建表空间
create tablespace SPACE
logging
datafile 'D:\app\adm\oradata\SPACE.DBF'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
--删除非空表空间,包含物理文件
drop tablespace SPACE including contents and datafiles cascade constraint;
查看表空间
--查看所有用户表空间
select username,default_tablespace from dba_users;
--查看当前用户表空间
select username,default_tablespace from user_users;
创建用户
--创建用户
CREATE USER admin PROFILE DEFAULT IDENTIFIED BY admin123 DEFAULT TABLESPACE SPACE;
--用户授权(管理员,连接,资源)
grant dba,connect,resource to admin;
--回收源表空间,imp导入指定表空间
revoke unlimited tablespace from admin ;
alter user admin quota 0 on 原表空间;
alter user admin quota unlimited on SPACE;
删除用户
以system用户登录,查找需要删除的用户
drop user admin cascade;
exp导出数据库文件
用户名为导出对象用户密码
//本机全库导出
exp 用户名/密码@orcl file=D:\temp.dmp full=y
//导出用户
exp 用户名/密码@orcl owner = 用户名 file=D:\temp.dmp
//远程全库导出(但必须遵循向下兼容原则)
exp 数据库用户名/密码@服务器ip:1521/实例(sid) file=D:\temp.dmp full=y
C:\Users\adm>exp text/text@xx.xx.xx.:1521/orcl file=D:\temp.dmp
Export: Release 11.2.0.1.0 - Production on 星期三 11月 6 14:05:05 2019
Copyright © 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的用户…
. 正在导出 pre-schema 过程对象和操作
. 正在导出用户 HL_RISKCTRL 的外部函数库名
. 导出 PUBLIC 类型同义词
. 正在导出专用类型同义词
. 正在导出用户 HL_RISKCTRL 的对象类型定义
即将导出 text 的对象…
. 正在导出数据库链接
. 正在导出序号
. 正在导出簇定义
. 即将导出 HL_RISKCTRL 的表通过常规路径…
EXP-00008: 遇到 ORACLE 错误 904
ORA-00904: “POLTYP”: 标识符无效
EXP-00000: 导出终止失败
以上错误就是没有循序向下兼容原则导致
imp导入表空间
用户名为导入对象用户密码,打开dos窗口,输入以下命令
imp 用户名/密码@orcl file=C:\Users\adm\Desktop\temp.dmp full=y
1、orcl为Oracle的服务名,查询服务名:select global_name from global_name;
2、full=y为全库导入、导出,默认则为只导出该用户下的对象。file参数指定文件位置,owner=用户,指定导出的用户
3、若命令后添加 tables=(table1,table2…)为导出特定的表。
4、一个数据库实例可以有N个表空间(tablespace),一个表空间下可以有N张表(table), tablespaces=(tablespace1,tablespace2,…)为导出特定表空间。
5、owner(username1,username2);为用户名对象导出。
补充
Oracle的imp/exp组件的一个操作原则就是向下兼容。具体表现为:
- 低版本的exp/imp可以连接到高版本(或同版本)的数据库服务器,但高版本的exp/imp不能连接到低版本的数据库服务器。
- 高版本exp出的dmp文件,低版本无法imp(无法识别dmp文件);低版本exp出的dmp文件,高版本可以imp(向下兼容)。
- 从Oracle 低版本Export的数据可以Import到Oracle高版本中,但限于Oracle的相邻版本,如从Oracle 7 到 Oracle 8。对于两个不相邻版本间进行转换,如从Oracle 6 到 Oracle 8。
有必要讲一下提供另一种方法来导出,即IMPDP/EXPDP。
- 在oracle9g以后引入数据泵命令IMPDP/EXPDP,oracle11g中exp命令是无法 导出数据库中的空表的。如果一定要用exp的话可以参考这篇文章exp方法导出空表解决
- Oracle11g通过exp导出的数据是无法通过imp导入到oracle10g中的,但是通过数据泵可以。
- IMPDP/EMPDP是服务器端是命令,无法在客户端使用。
这里简单介绍下如何用IMPDP/EXPDP从高版本导入到低版本。
expdp导出
登录
打开dos窗口,用管理员账户登录oracle,回车后让输入口令,不用输,再回车就登陆。
//orcl为oracle服务名
sql>sqlplus 用户名@orcl as sysdba
创建逻辑目录
创建目录。这个目录oracle是不会真实创建的,需要你自己手动去创建,用来给导出来的文件指定位置。没有特殊要求,建议使用默认的目录也可。
sql>create directory dpdata as 'D:\text\temp.dmp';
授权目录public指所有用户,也可单独某个用户名。
sql>grant write,read on directory dpdata to public;
通过下面查询命令,可以看到默认目录
(即DATA_PUMP_DIR)
sql>select * from dba_directories;
directory=DATA_PUMP_DIR 这个是一个oracle下的默认文件目录,可以直接这样用或者按以上做法。然后在oracle的默认文件目录下(或者你自己创建的目录)去找到temp.dmp文件及日志文件;再复制到对应要导入的10g数据库的默认目录
下。如果自己指定文件位置,目标数据库也要创建同样的文件位置(包括逻辑路径及手动创建的路径)。
//version--指定版本号 logfile--指定日志
EXPDP 源数据库用户/源数据库密码@orcl schemas=源数据库用户 directory=DATA_PUMP_DIR dumpfile=temp.dmp logfile=test.log version=10.2.0.3.0
注意:如果导出失败,仔细检查逻辑路径与你创建的路径是否一致,或者用户权限是否足够,可登录oracle在dos窗口中查看是否创建成功,路径是否正确
impdp导入
- 创建表空间,及用户,授权用户,具体参考exp/imp
- 登录dos窗口,登录目标数据库,创建源数据库同样的逻辑目录即手动路径,如果使用默认路径可不必创建。
- 将从源数据库导出的dmp文件及日志放入创建的目录下或者默认目录。
- 退出目标数据库,执行导入命令
//导入(版本号可不写)
IMPDP 目标数据库用户/目标数据库密码@orcl schemas=源数据库用户名 DIRECTORY=DATA_PUMP_DIR DUMPFILE=risk20190308_10g.dmp logfile=test.log version=10.2.0.3.0 table_exists_action=replace
//用户不同时需要指定,用户名相同时,REMAP_SCHEMA可省略表空间相同时,REMAP_TABLESPACE也可省略
IMPDP 目标数据库用户/目标数据库密码@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=risk20190308_10g.dmp logfile=test.log REMAP_SCHEMA=源数据库导出用户名:目标数据库要导入的用户名 REMAP_TABLESPACE=源数据库表空间:目标数据库表空间
总结
注:schemas为源数据库用户名,这里目标数据库中创建的用户名和源数据库用户名相同,新建用户时最好和原来用户名保持一样,当然不一样也可以,就必须指定源数据库和目标数据库的用户名了。
–logfile日志存放路径
–dumpfile导入文件
–remap_schema 替换对象 旧:新
–remap_tablespace 替换表空间 旧:新
–table_exists_action 表存在参数说明
使用imp进行数据导入时,若表已经存在,要先drop掉表,再进行导入。
而使用impdp完成数据库导入时,若表已经存在,有四种的处理方式:
- skip:默认操作
- replace:先drop表,然后创建表,最后插入数据
- append:在原来数据的基础上增加数据
- truncate:先truncate,然后再插入数据