ORACLE管理存储结构之物理机构+逻辑结构【weber出品】

一、数据库的存储结构有物理结构和逻辑结构组成的

物理结构:物理上,oracle是由一些操作系统文件组成的

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/example01.dbf

如何更好的访问和管理这些文件以及文件中的数据呢?
必须使用逻辑方法,比如表就是一种逻辑方式

逻辑结构:从逻辑上分,一个oracle数据库是由多个表空间组成的

表空间的作用:根据实际的需要,对物理文件进行分组,比如系统数据单独放到一个表空间中,用户数据可以放到单独的
一个表空间中

数据库中有哪些表空间?

SQL> col ts for a15
SQL> col file_name for a45
SQL> /

SQL> select tablespace_name ts,file_id,file_name from dba_data_files;

TS                 FILE_ID FILE_NAME
--------------- ---------- ---------------------------------------------
USERS                    4 /u01/app/oracle/oradata/orcl/users01.dbf
SYSAUX                   3 /u01/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1                 2 /u01/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM                   1 /u01/app/oracle/oradata/orcl/system01.dbf
EXAMPLE                  5 /u01/app/oracle/oradata/orcl/example01.dbf

SYSTEM:系统表空间,存储系统数据,比如数据字典信息,oracle预定义的包

SYSAUX:系统辅助表空间,是oracle10g新增加的一个表空间,要来分担SYSTEM表空间的压力,主要存储
自动性能诊断数据

UNDOTBS1:undo表空间,主要是存储undo数据(是数据被修改之前的原值)

USERS:用户表空间,主要是存储普通用户的数据

EXAMPLE:示例表空间,比如hr、oe等示例方案的数据

段:表空间从逻辑上是由段组成的,在创建对象的时候,如果这个对象需要空间,oracle都会为这个对象分配一个段

查看当前数据库中的段的类型:

SQL> select distinct segment_type from dba_segments;

SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO

从以上的输出可以看出:表、索引需要段

区:段是由区组成的,区是为段进行空间分配的单位,当段的空间不足的时候,oracle会以区为单位为段分配空间

oracle数据块:一个区是由连续的n个oracle数据块组成的

os块:一个oracle数据块是由n个连续的os块组成的

oracle最小的I/O单位是一个oracle数据块

实验:

在a会话:

SQL> create table t as select * from emp;

Table created.

SQL> insert into t select * from t;

/

---不停的翻倍

在b会话:

查看区的分配以及区的大小:

SQL> col owner for a5
SQL> col segment_name for a14
SQL>  set linesize 100

SQL> select owner,segment_name,segment_type,extent_id,file_id,blocks
         from dba_extents where owner=‘SCOTT‘ and segment_name=‘T‘;

SQL> /   

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS
----- -------------- ------------------ ---------- ---------- ----------
SCOTT T              TABLE                       0          4          8

SQL> /

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS
----- -------------- ------------------ ---------- ---------- ----------
SCOTT T              TABLE                       0          4          8
SCOTT T              TABLE                       1          4          8

select owner,segment_name,segment_type,extent_id,file_id,blocks,block_id
from dba_extents where owner=‘SCOTT‘ and segment_name=‘T‘

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS   BLOCK_ID
----- -------------- ------------------ ---------- ---------- ---------- ----------
SCOTT T              TABLE                       0          4          8        385
SCOTT T              TABLE                       1          4          8        393

SQL> /

.
.
.

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS   BLOCK_ID
----- -------------- ------------------ ---------- ---------- ---------- ----------
SCOTT T              TABLE                       0          4          8        385
SCOTT T              TABLE                       1          4          8        393
SCOTT T              TABLE                       2          4          8        401
SCOTT T              TABLE                       3          4          8        409
SCOTT T              TABLE                       4          4          8        417
SCOTT T              TABLE                       5          4          8        425
SCOTT T              TABLE                       6          4          8        433
SCOTT T              TABLE                       7          4          8        441
SCOTT T              TABLE                       8          4          8        449
SCOTT T              TABLE                       9          4          8        457
SCOTT T              TABLE                      10          4          8        465

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS   BLOCK_ID
----- -------------- ------------------ ---------- ---------- ---------- ----------
SCOTT T              TABLE                      11          4          8        473
SCOTT T              TABLE                      12          4          8        481
SCOTT T              TABLE                      13          4          8        489
SCOTT T              TABLE                      14          4          8        497
SCOTT T              TABLE                      15          4          8        505
SCOTT T              TABLE                      16          4        128        521

17 rows selected.

手动为段分配区:

SQL> create table e as select * from emp;

Table created.

SQL> desc user_extents
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SEGMENT_NAME                                       VARCHAR2(81)
 PARTITION_NAME                                     VARCHAR2(30)
 SEGMENT_TYPE                                       VARCHAR2(18)
 TABLESPACE_NAME                                    VARCHAR2(30)
 EXTENT_ID                                          NUMBER
 BYTES                                              NUMBER
 BLOCKS                                             NUMBER

select segment_name,segment_type,extent_id,blocks from user_extents where segment_name=‘E‘

SEGMENT_NAME         SEGMENT_TYPE        EXTENT_ID     BLOCKS
-------------------- ------------------ ---------- ----------
E                    TABLE                       0          8

SQL> alter table e allocate extent;

Table altered.

SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name=‘E‘;

SEGMENT_NAME         SEGMENT_TYPE        EXTENT_ID     BLOCKS
-------------------- ------------------ ---------- ----------
E                    TABLE                       0          8
E                    TABLE                       1          8

SQL> alter table e deallocate unused;

Table altered.

SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name=‘E‘;

SEGMENT_NAME         SEGMENT_TYPE        EXTENT_ID     BLOCKS
-------------------- ------------------ ---------- ----------
E                    TABLE                       0          8

SQL> conn /as sysdba
SQL> alter tablespace users add datafile ‘/u01/app/oracle/oradata/orcl/users02.dbf‘ size 100M;

SQL> conn scott/tiger
Connected.

 alter table e allocate extent(size 1M datafile ‘/u01/app/oracle/oradata/orcl/users02.dbf‘)

SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name=‘E‘;

SEGMENT_NAME         SEGMENT_TYPE        EXTENT_ID     BLOCKS
-------------------- ------------------ ---------- ----------
E                    TABLE                       0          8
E                    TABLE                       1          8
E                    TABLE                       2          8
E                    TABLE                       3          8
E                    TABLE                       4          8
E                    TABLE                       5          8
E                    TABLE                       6          8
E                    TABLE                       7          8
E                    TABLE                       8          8
E                    TABLE                       9          8
E                    TABLE                      10          8

SEGMENT_NAME         SEGMENT_TYPE        EXTENT_ID     BLOCKS
-------------------- ------------------ ---------- ----------
E                    TABLE                      11          8
E                    TABLE                      12          8
E                    TABLE                      13          8
E                    TABLE                      14          8
E                    TABLE                      15          8
E                    TABLE                      16        128

17 rows selected.

SQL> conn /as sysdba
Connected.
SQL> col owner for a5
SQL> col segment_name for a14
SQL> set linesize 100

  1  select owner,segment_name,segment_type,extent_id,file_id,blocks,block_id
  2* from dba_extents where owner=‘SCOTT‘ and segment_name=‘E‘
SQL> /

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS   BLOCK_ID
----- -------------- ------------------ ---------- ---------- ---------- ----------
SCOTT E              TABLE                       0          4          8        385
SCOTT E              TABLE                       1          6          8          9
SCOTT E              TABLE                       2          6          8         17
SCOTT E              TABLE                       3          6          8         25
SCOTT E              TABLE                       4          6          8         33
SCOTT E              TABLE                       5          6          8         41
SCOTT E              TABLE                       6          6          8         49
SCOTT E              TABLE                       7          6          8         57
SCOTT E              TABLE                       8          6          8         65
SCOTT E              TABLE                       9          6          8         73
SCOTT E              TABLE                      10          6          8         81

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS   BLOCK_ID
----- -------------- ------------------ ---------- ---------- ---------- ----------
SCOTT E              TABLE                      11          6          8         89
SCOTT E              TABLE                      12          6          8         97
SCOTT E              TABLE                      13          6          8        105
SCOTT E              TABLE                      14          6          8        113
SCOTT E              TABLE                      15          6          8        121
SCOTT E              TABLE                      16          6        128        137

SQL> alter table scott.e deallocate unused;

Table altered.

SQL> select owner,segment_name,segment_type,extent_id,file_id,blocks,block_id
  2  from dba_extents where owner=‘SCOTT‘ and segment_name=‘E‘;

OWNER SEGMENT_NAME   SEGMENT_TYPE        EXTENT_ID    FILE_ID     BLOCKS   BLOCK_ID
----- -------------- ------------------ ---------- ---------- ---------- ----------
SCOTT E              TABLE                       0          4          8        385
时间: 2024-10-31 11:58:59

ORACLE管理存储结构之物理机构+逻辑结构【weber出品】的相关文章

oracle整体结构-内存结构、物理结构、逻辑结构、进程

Oracle的体系结构大体上分为两部分:Instance(实例)和Database(数据库). Instance(实例) :在Oracle Instance中主要包含了SGA以及一些进程(例如:PMON.SMON.DBWn.LGWR.CKPT等).如果一个用户的进程连接到Oracle Server时,其实就是连接到Oracle Instance.在SGA中又包含了5大部件:Share Pool.Database Buffer Cache.Redo Log Buffer.Java Pool.Lar

oracle的存储结构

oracle024 oracle的存储结构 存储结构--表的存储结构 表空间:由一个或多个文件组成,表空间的空间容量就是多个文件大小的总和 表和数据文件建立一个中间层,表空间中有许多表. select * from DBA_TABLESPACES; 系统级别: SYSTEM:orale的自身的信息就是数据字典,数据字典表就放在system表空间中 sysaux:是system的附属表空间,也是存放系统信息 //上面两个表空间必须联机的 UNDOTBS1:改变前的数据块的存放位置 TEMP:临时表

ORACLE SQL单行函数(一)【weber出品必属精品】

1.SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 2.LENGTH:求字符串的长度 SQL> select LENGTH('HELLOWO

ORACLE SQL单行函数(二)【weber出品必属精品】

11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type ----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1) 12.dual的作用: 1. 查询数据库系统日期 2. 进行四则运算 SQL> select sysdate from dual; ---这里查询数据库系统日期 SYSDATE ---

ORACLE SQL单行函数(三)【weber出品必属精品】

16.L:代表本地货币符,这个和区域有关.这个时候我们想来显示一下人民币的符号:¥ $ vi .bash_profile ---写入如下内容: export NLS_LANG='SIMPLIFIED CHINESE'_CHINA.AL32UTF8 ---修改成简体中文+地区+字符集 source .bash_profile ---让环境变量生效 [[email protected] ~]$ sqlplus scott/tiger SQL*Plus: Release 10.2.0.5.0 - Pr

oracle逻辑存储结构

逻辑存储结构是对数据存储结构在逻辑概念上的划分.oracle的逻辑存储结构主要由表空间.段.区间和数据块等概念组成.oracle数据块是由多个表空间组成,表空间又是由多个段组成,段有多个数据区组成,数据区又有多个块组成.数据块是Oracle逻辑存储中的最小的逻辑单位,也是执行数据输入.输出最小存储单位.数据块由块头.表目录.行目录.空余空间和行数据组成.块头.表目录.行目录组合起来称为头部信息区,头部信息区不存放数据,存放整个块的引导信息,起到引导系统读取数据的作用.空余空间和行数据公共构成块的

ORACLE数据库存储结构

一.数据块 Oracle对数据库数据文件中的存储空间进行管理的单位是数据块.数据块是数据库中最小的(逻辑)数据单位,是最小的I/O单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节.每种操作系统都有一个被称为块容量的参数.Oracle每次获取数据时,总是访问整个数据块,而不是按照操作系统块的容量访问数据.数据块容量应该设为操作系统块容量的整数倍,以便减少不必要的I/O操作,一般数据块大小为8k. 结构: 头部:(1)块的物理地址 (2)块的段信息.表空间信息 (3) 事物槽 (4

ORACLE之SQL语句内部解析过程【weber出品】

一.客户端通过监听连接到数据库,数据库开启一个server process进程来接收客户端传过来的sql. 1.这条sql语句从来都没有被执行过.(硬解析) 2.这条sql语句被执行过.(软解析) 二.我们来看一条SQL语句内部解析到底经历了什么? sql硬解析解析的步骤 1.语法检测:检测sql语句有没有语法错误,是否符合sql规范 2.语义检测:检测sql语句涉及的对象是否存在. 3.检查共享池中是否存在相同的已经执行过的sql语句. 4.通过数据字典的统计信息,来计算最优执行计划. sql

oracle包详解(二)【weber出品】

一.重载子程序 PL/SQL中的重载功能: 1. 能够使用户创建两个或多个同名的子程序 2. 要求子程序的形式参数的数量,顺序或者数据类型不一样 3. 能够使用户使用不同的数据灵活的调用子程序 4. 对已经存在的代码的功能的扩展 注意: 重载可以对本地子程序,包,包中的子程序,方法进行重载,不能对标准的子程序进行重载 示例:先创建表和序列 conn scott/tiger drop table d purge; create table d as select * from dept where