Oracle的实例、用户和表空间

一、实例

实例(Instance),按Oracle的官方说法,就是内存结构和一系列进程结构。

这个概念很难以平白的语言去解释。

让我们从不同的角度来说:

1、从连接Oralce的角度,实例就是IP加斜杠后边的名字,例如127.0.0.1/ORCL,ORCL就是实例名。

2、从运行Oracle的角度,实例就是Services.msc中,名为OracleServicesORCL的的服务,ORCL就是实例名。

3、从存储Oracle的角度,实例就是Oracle中oradata文件夹下的ORCL文件夹。

这三个角度都正确,但是加起来才是完整的实例。一个ORCL实例,实际数据存储在oradata下的表空间文件中,通过运行OracleServicesORCL,为连接127.0.0.1/ORCL的用户提供数据服务。

二、用户和表空间

在一些业务库中,为了便于记忆和对应,常将用户和表空间创建为同名。这样做对于新手而言造成了概念理解上的混淆,分不清用户和表空间的区别。

1、表空间

上文所说,实例的表空间都存储在“oradata\实例名\”文件夹下(这是表空间的默认存储位置,也可以存在其他文件夹),创建表空间的语句示例:

create tablespace test_ts logging datafile 'C:\Oracle\oradata\orcl\test_ts.dbf' size 50m;

从上述语句可见,创建表空间是需要指定表空间的路径的,也就是说表空间实际上对应的是文件,是数据的物理存储位置。

2、用户

相对应的,用户则代表了数据的逻辑存储位置,接着来看用户的创建示例:

create user test_user identified by 123 default tablespace test_ts;

创建用户的语句,指定了默认表空间为test_ts,把数据的逻辑存储和物理存储关联起来,也就是用户test_user在创建表、函数、存储过程、包等数据库对象时,会把数据存储在默认的表空间test_ts。

所谓用户是数据的逻辑存储位置,也可以理解为,用户是这些表、函数、存储过程、包等数据库对象的所有者。因此,当其他用户的数据库对象需要调用test_user的数据库对象时,需要加上“test_user.”前缀,例如:user_A需要调用test_user的表test_table,那么user_A是不能直接使用表名test_table的,而需要使用test_user.test_table。

3、关于导入dmp

在系统部署和迁移场景中,使用impdp导入数据库是是一个常见的操作。导入命令结构如下:

impdp 用户名/密码@IP/实例名 directory=DATA_DUMP_DIR dumpfile=dmp文件名 logfile=日志保存路径 schemas=dmp中的用户名

在cmd、bat或sqlplus中执行该语句时:

1、如果数据库中已经存在dmp中的用户名,那么dmp的数据将导入到相同用户名下的表空间,例如dmp中的用户是userA,dmp中的表空间是tsA,数据库中已有userA,且userA默认的表空间是tsA,那么dmp中的数据将导入到userA中,数据的物理存储位置是表空间tsA。

2、如果数据库中不存在dmp中的用户名,那么在导入时,Oracle会创建userA,并试图将数据存储到表空间tsA,但如果表空间tsA不存在,就会报错。

因此,执行该命令时,可以不必在数据库中建立和dmp中相同的用户名,但是必须要建立和dmp中相同的表空间名。

如果我想要用不同的用户名和不同的表空间怎么办?这就需要用到impdp命令的remap_schema和remap_tablespace:

impdp system/123@127.0.0.1/orcl directory=DATA_DUMP_DIR dumpfile=xxx.dmp logfile=xxx.log schemas=userA remap_schema=userA:userB remap_tablespace=tsA:tsB

这样就可以把数据导入到用户userB和表空间tsB中了,当然前提是,必须要事先创建用户userB和表空间tsB。

扩展知识:

在impdp命令中,有一个directory=DATA_DUMP_DIR的参数,这个参数指定的是导入dmp所在的文件夹。“DATA_DUMP_DIR”指向的是Oracle数据库中的文件夹(Directory)对象,是数据库默认自带的导入导出文件夹,如下图:

这个文件夹(Directory)对象默认的文件夹是:

C:\Oracle\admin\orcl\dpdump

在使用impdp命令时,directory=DATA_DUMP_DIR的参数是可以省略的,在不写该参数的情况下,系统默认到该文件夹下查找dmp进行导入。如果需要从其他文件夹导入dmp,必须在Oracle中创建新的Directory对象,并在impdp中加入directory=新对象名的参数。

Directory对象存在的意义是,控制Oracle对文件目录的访问权限。只有定义了Directory对象,Oracle才能对该目录下的文件进行操作。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180125G0C70L00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券