前言
今天公司要求把Mysql全部迁移到Oracle上继续跑测试,使用了19c版本。因此中间走了不少坑,准备给大家好好分享下经验。
1.体系结构
oracle 实际上是一个数据的物理储存系统,这其中包括数据文件(ora/dbf)、参数文件、控制文件、联机日志等。
-
实例: 一个操作系统只有一个或多个Oracle数据库( 看版本号,后面补充介绍),但是可以安装多个Oracle实例(例如一个实例安装后监听1521,另一个安装监听8888),一个Oracle实例对应着一系列的后台进程(Backguound Processes)和内存结构(Memory Structures)。
-
数据文件: Oracle数据文件是数据存储的物理单位,数据库的 数据是存储在表空间 中的。而 一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间,一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行()。
-
表空间:表空间是Oracle 对物理数据库数据文件(ora/dbf)的逻辑映射(逻辑上还分为段、区、数据块 )。一个 数据库在逻辑上被划分成一到若干个表空间,每个表空间由同一磁盘上的一个或多个数据文件(datafile)组成,一个数据文件只能属于一个表空间。
-
oracle用户:表当中的数据是由Oracle用户放入到表空间当中的,而这些 表空间会随机的把数据放入到一个或者多个数据文件当中。oracle对表数据的管理是通过用户对表的管理去查询,而不是直接对数据文件或表空间进行查询。因为不同用户可以在同一个表空间上面建立相同的表名。但是通过不同的用户管理自己的表数据。
![](https://img-blog.csdnimg.cn/20210706012113491.bmp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDk0Nzcy,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210706012114386.bmp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDk0Nzcy,size_16,color_FFFFFF,t_70)
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的关系图。
![](https://img-blog.csdnimg.cn/20210706012113595.bmp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDk0Nzcy,size_16,color_FFFFFF,t_70)
首先,
容器数据库创建新用户并分配表空间时必须在没有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
-
![](https://img-blog.csdnimg.cn/20210706012108903.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDk0Nzcy,size_16,color_FFFFFF,t_70)
oracle推荐是把应用放在PDB中的,然而PDB中创建的用户你会发现按照12g之前的语法是连接不上的,如下图:
![](https://img-blog.csdnimg.cn/20210706012108529.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDk0Nzcy,size_16,color_FFFFFF,t_70)
原因是要写成conn test11/test11@UKPDB1!!!