详解Oracle存储结构 掌握基本操作管理
2018.10.14那天我写了Oracle12C 的安装并初步了解了一下Oracle体系结构中数据库和实例。从中我们知道:
数据库是磁盘上数据的集合,位于收集和维护相关信息的数据库服务器上的一个或多个文件中。数据库由各种物理和逻辑结构组成,而表则是数据库中最重要的逻辑结构。表由包含数据的相关行和列组成。
- 组成数据库的文件主要分为两类:数据库文件和非数据库文件。两者之间的区别在于存储何种数据。数据库文件包含数据和元数据,非数据库文件则包含初始参数和日志记录信息等。数据库文件对于每时每刻正在进行的数据库操作来说至关重要。
- 典型的企业服务器的主要组成部分是一个或多个CPU(有多个核)、磁盘空间和内存。Oracle数据库存储在服务器的磁盘上,而Oracle实例则存在于服务器的内存中。Oracle实例由一个大型内存块和大量后台进程组成;该内存块分配在系统全局区域中,后台进程在SGA和磁盘上的数据库文件之间交互。
- 在OracleRAC中,多个实例将使用同一个数据库。虽然共享数据库的实例可能在同一服务器上,但最可能的是这些实例位于不同服务器上,这些服务器通过高速互连进行连接,并且访问驻留在专门的,支持RAID磁盘子系统上的数据库。Oracle Exadata数据库一体机是一个将数据库服务器、I/O服务器和磁盘存储组合到一个或多个机柜,并针对RAC环境优化的示例(包括以每接口40Gbps的速度连接所有这些设备的双InfiniBand接口)。
本篇开头我将Oracle体系结构中的存储结构先进行一个归纳:
- Oracle的存储结构从两方面看:
1.Oracle逻辑存储结构(表空间、块、盘区、段);
2.Oracle物理存储结构(数据文件、重做日志文件、控制文件、归档的日志文件、初始化参数文件、警报和跟踪日志文件、备份文件、Oracle管理文件、密码文件);- 在逻辑存储结构下Oracle的逻辑数据库结构:表、约束、索引、视图、用户和模式、配置文件、序列、同义词、PL/SQL、外部文件访问、数据库链接和远程数据库;
- 另外Oracle 12C与之前版本最大的亮点是;支持数据库热插拔,可以和其他类型的数据库对接
通过结构图就能一目了然:
Oracle逻辑存储结构图:
- Oracle逻辑数据库结构图:
- Oracle物理存储结构图:
详解Oracle逻辑存储结构:Oracle数据库中的数据文件被分组到一个或多个表空间中。在每个表空间中,逻辑数据库结构(如表和索引)都是片段,被进一步细分为"盘区"(extent)和"块"(block)。这种存储的逻辑细分允许Oracle更有效的控制磁盘空间的利用率。
- 表空间:
Oracle表空间由一个或多个数据文件组成,一个数据文件是且只能是一个表空间的一部分。对于Oracle12c的安装,最少会创建两个表空间:SYSTEM表空间和SYSAUX表空间。Oracle12c的默认安装创建6个表空间; - 段:
数据库中的下一个逻辑分组级别是段。段是一组盘区,这组盘区组成了被Oracle视为一个单位的数据库对象,如表或索引。因此,段一般是数据库终端用户要处理的最小存储单位。Oracle数据库中可看到4种类型的段:数据段(非分区表和分区表的每个分区)、索引段、临时段和回滚段。 - 盘区:
它由一个或多个数据库块组成。当扩大数据库对象时,为该对象添加的空间将分配为一个盘区。 - 块:
数据库块是Oracle数据库最小的存储单位。块的大小是数据库内给定表空间中特定数量的存储字节。默认块大小是8KB;
- 表空间:
Oracle逻辑数据库结构组成:
Oracle逻辑数据库结构内容非常繁杂,这里先简单概括一下都有哪些内容组成:
1.表: 是Oracle数据库中的基本存储单位,如果没有表,数据库对于企业来说就没有任何价值;
包括: 关系表、临时表、索引组织表、对象表、外部表、群集表、散列群集、排序的散列群集、分区表、分区索引;
2.约束:Oracle约束是一条或多条规则,它在表的一列或多列上定义,用于帮助实施业务规则;
包括:空值约束、唯一列值、主键值、引用完整性值、复合内联完整性、基于触发器的完整性;
3.索引:当检索表少量的行时,使用Oracle索引能更快访问表中的这些行;
包括:唯一索引、非唯一索引、反向键索引、基于函数的索引、位图索引;
4.视图:视图允许用户查看单独表或多个连接表中数据的自定义表示。视图也称为"存储查询",用户无法看到视图底层隐藏的查询细节;
包括:普通视图、物化视图、对象视图;
5.用户和模式:有权访问数据库的数据库账户称为"用户"。用户可存在与数据库中,而不拥有任何对象。如果用户在数据库中创建并拥有对象,这些对象就是与数据库用户同名的模式(schema)的一部分。模式可拥有数据库中任何类型的对象:表、索引、序列和视图等。模式拥有者或者DBA可授权其他数据库用户访问这些对象。用户总是拥有完整的权限,而且可以控制用户模式中的对象;
6.配置文件:数据库资源不是无限的,因此DBA必须为所有数据库用户管理和分配资源。数据库资源的一些示例是CPU时间、并发会话、逻辑读和连接时间。
数据库配置文件是可以赋给用户的限定资源的命令集。安装Oracle后,DEFAULT配置文件已经存在,并且系统将其赋给任何还没有显式分配配置文件的用户。DBA可添加新的配置文件或改变DEFAULT配置文件,从而符合企业的需求。DEFAULT配置文件的初始值允许无限使用所有的数据库资源。
7.序列: Oracle序列用于分配有序数,并且保证其唯一性。
8.同义词:Oracle同义词(synonym)只是数据库对象的别名,用于简化对数据库对象的引用,并且隐藏数据库对象源的细节。同义词可以赋给表、视图、物化视图、序列、过程、函数和程序包。与视图类似,除了数据字典中的定义外,同义词不会再数据中分配任何空间。
同义词可以是公有或者私有。私有同义词在用户模式下定义,并且只有该用户可用。公有同义词通常由DBA创建,并且所有的数据库用户都可以自动使用。
9.PL/SQL:PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用。PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL 只有 Oracle 数据库有。
Oracle物理存储结构:
物理存储构的组成及其功能:
数据文件(.dbf):用于存储数据库中的所有数据,包含系统数据、数据字典数据、临时数据、索引数据、应用数据等
控制文件(.ctl):用于记录和描述数据库的物理存储结构信息
重做日志文件(.log):用于记录外部程序(用户)对数据库的修改操作
初始化参数文件:用于设置数据库启动时的参数初始值
跟踪文件:用户记录用户进程、数据库后台进程的运行情况
归档文件:用于保存已经写满的重做日志文件
口令文件:用于保存具有SYSDBA,SYSOPER权限的用户名和SYS用户口令。
数据文件及其管理:
在安装Oracle数据库时系统会自动为数据库创建几个数据文件,用户对数据库的操作本质是对数据文件的操作。一个表空间可以对应多个数据文件,一个数据文件只能从属于一个表空间。在逻辑上,数据对象都存放在表空间中,实质上是存放在空间对应的数据文件中。
Oracle基本操作管理:
1.数据库开启、关闭
* 进入数据库:* su - oracle* sqlplus / as sysdba #以最高管理员sysdba登录* SQL> help index #查看命令列表* SQL> show user #查看当前用户
* 开启、关闭数据库* SQL>startup #开启:实例--数据库装载--数据库打开* SQL>shutdown immediate #关闭:数据库关闭--卸载数据库--实例
* 启用、关闭监听(作用:客户端访问oracle数据库实例,安装好数据库如果重启主机,则需要开启监听服务,客户端才可以登录oracle数据库实例)* lnsrctl start* lnsrctl stop
2.创建数据库:
* dbca (在桌面界面执行)#创建数据库(如果不弹窗口执行: export DISPLAY=:0.0)* 执行成功会跳出创建数据库页面,按以下步骤操作:
3.表空间操作:
创建表空间:
create tablespace school //创建表空间school2 datafile '/oracle/app/oracle/oradata/school01.dbf' //指定表空间文件存放位置3 size 10m autoextend on; //指定大小,空间可以扩容
调整表空间大小:
调整大小:SQL> alter database datafile2 '/oracle/app/oracle/oradata/school01.dbf'3 resize 80m;数据库已更改。
添加文件:SQL> alter tablespace school2 add datafile3 '/oracle/app/oracle/oradata/school02.dbf'4 size 20m autoextend on;表空间已更改。
表空间权限:
SQL> alter tablespace school read only; //修改为只读权限表空间已更改。SQL> alter tablespace school read write; //权限修改为读写(默认)表空间已更改。
删除表空间:
SQL> drop tablespace school including contents;表空间已删除。
4.插拔数据库(CDB与PDB转换):
SQL> show con_name //查看当前所在的容器SQL> show pdbs; //查询数据库的所有容器
将当前数据库CDB转换为PDB:
CDB:默认的数据库PDB:容器型数据库SQL> alter pluggable database orclpdb open; //修改可插拔库orclpdb打开状态插接式数据库已变更。SQL> alter session set container=orclpdb; //CDB下切换会话到PDB中会话已更改。SQL> shutdown immediate //在PBD中关闭插拔数据库插接式数据库已关闭。SQL> startup //在PBD中打开插拔数据库插接式数据库已打开。
将PDB切换为CDB:
SQL> alter session set container=cdb$root; //切换会话到CDB
5.创建用户:
* 创建用户必须指定一个默认的表空间,在12C版本上CDB中创建用户,用户名格式为:c##用户名;PDB中创建用户,用户名格式为:用户名;* SQL> create user c##jack2 identified by abc123 //指定密码3 default tablespace users //指定默认表空间4 temporary tablespace temp //指定临时表空间5 quota unlimited on users; //不进行限额更改用户密码SQL> alter user c##jack identified by jack123;删除用户SQL> drop user c##jack cascade;
6.创建数据表(插入数据,事务)
SQL> create table info2 (3 id number(4),4 name varchar2(10),5 score number(5,2),6 riqi date7 );
7.事务:
在oracle中默认开启事务不进行提交。因此在进行数据操作时,一定要记得提交,或者设定为自动提交。否则数据不能写入硬盘中。SQL> insert into info values (1,'lisi',80,to_date('2018-08-26','yyyy-mm-dd'));SQL> set autocommit on; //设定自动提交,回滚无效
8.索引:
(SQL>)B树索引create index 索引名称 on 表名(列名)唯一索引/非唯一索引create unique index 索引名称 on 表名(列名)反向索引create index 索引名称 on 表名(列名)reverse位图索引create bitmap index 索引名称 on 表名(列名)其他索引create index 索引名称 on 表名(upper(列名)) //大写函数索引查看索引select index_name,index_type,table_name,tablespace_name from user_indexes;查看索引相关信息select index_name,table_name,column_name from user_ind_columns where index_name like 'EMP%';重建索引alter index 索引名称 rebuild;alter index 索引名称 rebuild tablespace 表空间合并索引碎片alter index 索引名称 coalesce;删除索引drop index 索引名称
9.视图:
创建视图要注意权限问题SQL> create view vinfo as select from info; //创建视图SQL> select from vinfo; //查询视图SQL> drop view vinfo; //删除视图
10.物化视图:
首先要通过管理员帐号为c##jack用户赋予权限SQL> grant create materialized view to c##jack; //创建物化视图权限SQL> grant query rewrite to c##jack; //查询,重写权限SQL> grant create any table to c##jack; //创建所有表权限SQL> grant select any table to c##jack; //查询所有表权限
SQL>alter table info add primary key (id); #添加主键SQL>create materialized view log on info; #创建物化视图之前需要创建物化视图日志
创建物化视图:SQL> create materialized view mtview 2 build immediate //创建完成立马生成新数据3 refresh fast //刷新数据4 on commit //提交5 enable query rewrite //开启查询重写功能6 as7 select * from info;SQL> drop materialized view mtview; //删除物化视图
11.序列:
oracle中自增列需要单独进行创建,然后插入数据时进行调用。创建序列SQL> create sequence id_seq2 start with 10 //初始值3 increment by 1 //增量4 maxvalue 1000 //最大值5 nocycle //肺循环6 cache 50; //缓存插入数据时调用序列SQL> insert into info values (id_seq.nextval,'tom',80,to_date('2018-04-10','yyyy-mm-dd'));查询序列当前值SQL> select id_seq.currval from dual;更改序列SQL> alter sequence id_seq cache 30;查看序列信息SQL> select sequence_name,increment_by,cache_size from user_sequences;删除序列SQL>drop sequence id_seq;
12.同义词:
俗称别名,外号,可以提高数据安全可靠性。私有同义词:只在当前用户可以使用公有同义词:所有数据库用户都可以使用SQL> create synonym pr_info for info; //创建私有同义词SQL> create public synonym pub_info for info; //创建共有同义词删除同义词SQL> drop synonym pr_info;SQL> drop public synonym pub_info;
13.补充:
常用oracle数据库查询命令:
(1)Select * from tables(表名); //查询表tables的内容(2)Truncate table tables(表名);//清除表内数据;但保留格式(3)Select ID(列名)from tables groupby ID(列名)、ID2(列名)havingcount(*)>1; //查询表中重复的数据(4)Select * from tables(表名) a where a.id(列名)='07552223'(重复的数据);//将在列ID中所有与07552223相同的数据排列出来(5)delete from tables where rowid in (select min(rowid)fromtables where id='15252525') group by username); //删除table表中ID列数据为'15252525'的重复项(6)delete from table where rowid in(select min(rowid)fromtable group by id..id2); //删除表table中所有关于列(ID)的重复信息(7)select * from tables where regex_like(id,'^[^[:digit:]]+$'); //查询table在id列中所有是数字的数据(8)select* from tables where regex_like(id,'^([a-z]|[A-Z]+[0-9]+)$'); //查询table在id列中所有带有字符和数字的数据(9)select count(*)fromtables; //查询table中所有数据的行数(10)select table_name from xxcj_tj_zdcj a group by a.table_namecount(*) >1; //查询数据库xxcj_tj_zdcj中是否有重复的表(11)select * from xxcj_tj_zdcj awhere a.table_name in ('05255') order by a.table_name for update; //修改数据库xxcj_tj_zdcj中的值(即括号内的内容)(12)select * from xxcj_tj_zdcj awhere a.id='' for update;//修改数据库xxcj_tj_zdcj中id列的内容(13)truncate table数据库; //数据比对 (14)select t.* ,t.rowid from 表名 t; //编辑表(15)alter table 表名 add 列名 字符类型;//新建列(16)alter table 表名 modify 列名 字符类型;//修改列类型(17)alter table 表名 drop column 列名;//删除列(最后一列)(18)select * from 表名 where asciistr(列名)not like '%\%';//查询数据表中xx列中的为中文字符的数据(19)select substr(f_get_sfzhm18(zjhm) ,7,8)as csrq from 表名where regexp_like(substr(f_get_sfzhm18(zjhm) ,7,1) ,'[^1[2]');