Oracle体系介绍与踩坑经验

前言


    今天公司要求把Mysql全部迁移到Oracle上继续跑测试,使用了19c版本。因此中间走了不少坑,准备给大家好好分享下经验。

1.体系结构


    oracle 实际上是一个数据的物理储存系统,这其中包括数据文件(ora/dbf)、参数文件、控制文件、联机日志等。
  • 实例: 一个操作系统只有一个或多个Oracle数据库( 看版本号,后面补充介绍),但是可以安装多个Oracle实例(例如一个实例安装后监听1521,另一个安装监听8888),一个Oracle实例对应着一系列的后台进程(Backguound Processes)和内存结构(Memory Structures)。
  • 数据文件: Oracle数据文件是数据存储的物理单位,数据库的 数据是存储在表空间 中的。一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间,一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行()。
  • 表空间:表空间是Oracle 对物理数据库数据文件(ora/dbf)的逻辑映射(逻辑上还分为段、区、数据块 )。一个 数据库在逻辑上被划分成一到若干个表空间,每个表空间由同一磁盘上的一个或多个数据文件(datafile)组成,一个数据文件只能属于一个表空间。
  • oracle用户:表当中的数据是由Oracle用户放入到表空间当中的,而这些 表空间会随机的把数据放入到一个或者多个数据文件当中。oracle对表数据的管理是通过用户对表的管理去查询,而不是直接对数据文件或表空间进行查询。因为不同用户可以在同一个表空间上面建立相同的表名。但是通过不同的用户管理自己的表数据。

2.表空间、用户和表区别与联系


    Oracle是通过表空间来存储实际存在的那些表、索引、视图的,
(1)表空间分类:
  • 临时表空间: 存储数据库中需要永久化存储的对象,比如二维表、视图、存储过程、索引。其数据在物理上对应一个或者多个数据文件。永久表空间也是我们实际中用的最多的一个类型的表空间。
  • 永久表空间:不能进行永久对象的存储。其主要用途在于 存储临时表的数据、提供空间进行 排序操作、创建索引等。
  • 撤销表空间:撤销表空间主要用于 DML语句的数据管理,当执行 insert,update,delete的时候,旧的数据就会存放到 undo表空间。undo表空间的4个常见操作:事务回滚、数据库恢复、读一致性、闪回查询。
注意:不同的创建表的语句的作用可能不同:
  • create table test( id int); 这样创建的表, 将创建在 用户的默认表空间下
  •  create table test1 ( id int ) tablespace Test01 ; 这样创建的表, 将创建在 Test01表空间下。
 因此,查询默认表空间和临时表空间为:
SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where username='SYSTEM';
DEFAULT_TABLESPACE         TEMPORARY_TABLESPACE
------------------------------ ------------------------------
SYSTEM                          TEM
(2)一个数据库实例可以含有多个表空间,一个表空间又可以存储多张表。
(3)每一个用户一般来说都有一个 默认的永久的表空间和一个临时的表空间,一个用户可以拥有一个或多个表空间的权限。

3.数据库、用户和表空间关系


    在oracle12c 中,增加了 可插接数据库的概念,即 PDB允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为 ContainerDatabase,中文翻译为数据库容器,PDB全称为PluggableDatabase,即可插拔数据库。在ORACLE 12C之前, 实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
     首先, 容器数据库创建新用户并分配表空间时必须在没有PDB的情况下进行或PDB与CDB有相同的表空间的时候进行,否则会报错如果是在PDB与CDB 有相同表空间的情况下给CDB用户分配表空间,则分配CDB的表空间给用户PDB的表空间并不受影响。而且, CDB用户必须以‘C##’为开头,否则创建不了。如下:
  • 这是在没有PDB的情况下创建用户“C##ukprod”并分配”USERS“(系统自带的表空间),如果不以C##开头的用户名就会报错。
  • 在CDB中创建表空间TBLSPACE_OTH,而PDB中不存在该表空间,然后创建用户默认表空间为TBLSPACE_OTH将报错
  • 在PDB中创建表空间TBLSPACE_OTH,注意文件名不能和CDB中的一样(在不同目录也没关系)
    • show con_name   --查看当前容器
    •   alter session set container=UKPDB1;       --转换容器到PDB
    •   alter session set container=CDB$ROOT;   --转换容器到CDB
    oracle推荐是把应用放在PDB中的,然而PDB中创建的用户你会发现按照12g之前的语法是连接不上的,如下图:
    原因是要写成conn test11/test11@UKPDB1!!!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值