7.Managing Database Storage Structures

逻辑结构

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

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

SQL> select name from v$datafile;

如何更好的访问和管理这些文件以及文件中的数据呢? 必须使用逻辑方法,比如表就是一种逻辑方式
逻辑结构:从逻辑上分,一个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;

SYSTEM:系统表空间,存储系统数据,比如数据字典信息,oracle预定义的包
SYSAUX:系统辅助表空间,是oracle10g新增加的一个表空间,用来分担SYSTEM表空间的压力,主要存储自动性能诊断数据
UNDOTBS1:undo表空间,主要是存储undo数据(是数据被修改之前的原值)
USERS:用户表空间,主要是存储普通用户的数据
EXAMPLE:示例表空间,比如hr、oe等示例方案的数据

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

查看当前数据库中的段的类型:
SQL> select distinct segment_type from dba_segments;

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

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

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

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

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

实验:

在a会话:
SQL> create table t as select * from emp;
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,block_id from dba_extents where owner='SCOTT' and segment_name='T';
SQL> /

手动为段分配区:

SQL> create table e as select * from emp;
SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name='E';

SQL> alter table e allocate extent;
SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name='E';

SQL> alter table e deallocate unused;
SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name='E';

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

SQL> conn scott/tiger
SQL> 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';

SQL> conn /as sysdba
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,block_id
from dba_extents where owner='SCOTT' and segment_name='E';

SQL> alter table scott.e deallocate unused;

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

如何存储数据

desc v$tablespace;
dba_tablespaces;
select segment_type, segment_name, owner from dba_segments where tablespace_name='USERS' and segment_type='TABLE';

行链接:Insert操作:数据块剩余的空间不能保留整行,仅能保留一部分,则保存完一部分之后,保存一个指针指向另一个数据块。
行迁移:Update操作:更新的数据不能在当前数据块存下,则需要将整行迁移到另外的数据块,在当前位置保持指向新数据块的指针。

数据块:
数据从下往上增长,块头从上往下增长。
pctfree = 10.--便于减少行链接和行迁移,为事务槽服务
事务槽记录对数据块的哪些行进行更改,以及锁是否释放。

操作表空间

创建表空间:

CREATE SMALLFILE TABLESPACE "HNDX" DATAFILE '/u01/app/oracle/oradata/orcl/hndx01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 300M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

SQL> select tablespace_name,file_id,file_name from dba_data_files where tablespace_name='HNDX';

SQL> drop tablespace hndx including contents and datafiles;

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 100M;

SQL> set long 1000
SQL> select dbms_metadata.get_ddl('TABLESPACE','HNDX') from dual;

删除表空间:

SQL> select name from v$tablespace;

SQL> drop tablespace hndx;
SQL> ! ls /u01/app/oracle/oradata/orcl/hndx01.dbf
SQL> select name from v$tablespace;

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 10M reuse;
SQL> select name from v$tablespace;
SQL> create table scott.t as select * from scott.emp;
SQL> select segment_name,segment_type from dba_segments where tablespace_name='HNDX';

SQL> drop table scott.t purge;
SQL> create table scott.t tablespace hndx as select * from scott.emp;
SQL> select segment_name,segment_type from dba_segments where tablespace_name='HNDX';

SQL> drop tablespace hndx;--有段,删除不了
SQL> drop tablespace hndx including contents;
SQL> !ls /u01/app/oracle/oradata/orcl/hndx01.dbf

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 10M reuse;
SQL> drop tablespace hndx including contents and datafiles;
SQL> !ls /u01/app/oracle/oradata/orcl/hndx01.dbf

扩大表空间:

1. 自动扩展:

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 10M;

SQL> select AUTOEXTENSIBLE from dba_data_files where tablespace_name='HNDX';

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' autoextend on;

SQL> select AUTOEXTENSIBLE from dba_data_files where tablespace_name='HNDX';

SQL> select file_id from dba_data_files where tablespace_name='HNDX';

SQL> alter database datafile 7 autoextend off;

SQL> select AUTOEXTENSIBLE from dba_data_files where tablespace_name='HNDX';

2. 添加数据文件:

SQL> alter tablespace hndx add datafile '/u01/app/oracle/oradata/orcl/hndx02.dbf' size 10M;

SQL> select file_name from dba_data_files where tablespace_name='HNDX';

3. 加大数据文件的大小

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' resize 20M;

减小表空间:

1. 删除数据文件:

SQL> alter tablespace hndx drop datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf';--第一个数据文件不能删除,因为有整个表空间的控制信息

SQL> alter tablespace hndx drop datafile '/u01/app/oracle/oradata/orcl/hndx02.dbf';

SQL> select file_name from dba_data_files where tablespace_name='HNDX';

2. 减小数据文件的大小:

SQL> col file_name for a45
SQL> select file_name,bytes/1024/1024 from dba_data_files where file_id=7;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' resize 10M;

SQL> select file_name,bytes/1024/1024 from dba_data_files where file_id=7;

[oracle@hndx ~]$ sqlplus scott/tiger

SQL> create table t tablespace hndx as select * from emp;
SQL> insert into t select * from t;
SQL> /
SQL> /
insert into t select * from t
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.T by 128 in tablespace HNDX

SQL> commit;

conn /as sysdba

SQL> select bytes/1024/1024 from dba_segments where tablespace_name='HNDX';
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' resize 8M;--超出了数据的范围

表空间的状态:online, offline

online:read write、read only

read write:对表空间中的数据可以进行读和写
read only:只读,只能就行读操作(除了drop table以外)

SQL> alter tablespace hndx read only;

SQL> select segment_name,segment_type from dba_segments where tablespace_name='HNDX';

SQL> col segment_name for a20
SQL> /

SQL> select count(*) from scott.t;

COUNT(*)
----------
114688

SQL> update scott.t set sal=sal+100;
SQL> delete scott.t ;
SQL> insert into scott.t select * from scott.emp;
SQL> create table scott.e tablespace hndx as select * from scott.dept;

SQL> drop table scott.t purge;

Table dropped.

SQL> alter tablespace hndx read write;

压缩选项
不压缩
基本压缩--11G之前技术
OLTP压缩:空闲空间达到或小于pctfree时才进行压缩,并非一插入就压缩。
数据仓库压缩
在线归档压缩

alter tablespace test read write;
删除的时候只对数据字典进行更改,不对表空间进行更改,因此即使表空间为只读也可以进行操作。

重整表空间:释放不用的块,相当于碎片整理。
exec dbms_stats.gather_table_stats('scott','big_t');
select blocks, num_rows from user_tables where table_name='BIG_T';
delete big_t where rownum<=40000;
alter table big_t enable row movement;
alter table big_t shrink space;

SQL> select ts.name, df.name from v$tablespace ts, v$datafile df
2 where ts.ts#=df.ts#;

表空间信息
DBA_TABLESPACES
V$TABLESPACE

数据文件信息
DBA_DATA_FILES
V$DATAFILE

临时文件信息
DBA_TEMP_FILES
V$TEMPFILE

Oracle管理文件(OMF)
SQL> show parameter DB_CREATE_FILE_DEST
SQL> show parameter DB_CREATE_ONLINE_LOG_DEST_n
SQL> show parameter DB_RECOVERY_FILE_DEST

SQL> ALTER SYSTEM SET DB_CREATE_FILE_DEST = '+DATA';
SQL> CREATE TABLESPACE tbs_1;

数据库对象
Tablespaces
Redo log files
Control files
Archived logs
Block change tracking files
Flashback logs
RMAN backups

数据库扩容
1.创建新的表空间
2.给现存的小文件表空间增加数据文件
3.增加数据文件大小
4.提供数据文件的自动增长

备注:
数据库可以混合oracle管理的文件和非管理的文件
大文件表空间并不要求至少有一个文件大于100MB

查看表所在的数据文件
SQL> select segment_name,segment_type,tablespace_name from dba_segments where segment_name='EMP';

SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
-------------------- ------------------ ------------------------------
EMP TABLE USERS

SQL> select file_name from dba_data_files where tablespace_name='USERS';

emp表位于/u01/app/oracle/oradata/orcl/users01.dbf这个文件

查看区
select segment_name,EXTENT_ID,blocks from dba_extents where segment_name='EMP';
SQL> /

SEGMENT_NAME EXTENT_ID BLOCKS
-------------------- ---------- ----------
EMP 0 8

OCA读书笔记(7) - 管理数据库存储结构的更多相关文章

  1. OCA读书笔记(4) - 管理数据库实例

    Objectives: •Start and stop the Oracle database and components •Use Oracle Enterprise Manager •Acces ...

  2. OCA读书笔记(8) - 管理用户安全

    创建用户:create user +用户 default tablespace + 表空间名 identified + 验证方式 SQL> create user easthome profil ...

  3. OCA读书笔记(9) - 管理数据同步

    9.Managing Data Concurrency 描述锁机制以及oracle如何管理数据一致性监控和解决锁冲突 管理数据的并发--管理锁数据的不一致:脏读更改丢失幻影读 脏读:数据是指事务T2修 ...

  4. OCA读书笔记(16) - 执行数据库恢复

    16. Performing Database Recovery 确定执行恢复的必要性访问不同接口(EM以及命令行)描述和使用可用选项,如RMAN和Data Recovery Advisor执行恢复- ...

  5. OCA读书笔记(5) - 管理ASM实例

    Objectives:Describe the benefits of using ASMManage the ASM instanceCreate and drop ASM disk groupsE ...

  6. OCA读书笔记(10) - 管理UNDO数据

    Undo自动管理与手动管理 undo段自动管理SQL> show parameter undo_management 将undo段改为手工管理SQL> alter system set u ...

  7. OCP读书笔记(14) - 管理数据库性能

    搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...

  8. OCA读书笔记(15) - 执行数据库备份

    物理备份 -- 数据文件,控制文件,日志文件,参数文件 数据库备份 冷备 -- 归档和非归档均可以 什么时候必须用冷备?1. 数据库的模式为非归档的2. 用于现场保护 冷备的过程:1. 首先查看备份文 ...

  9. OCA读书笔记(1) - 浏览Oracle数据库架构

    Objectives: List the major architectural components of Oracle DatabaseExplain the memory structuresD ...

随机推荐

  1. 在windows下安装mysql5.6.24版本

    链接地址:http://jingyan.baidu.com/article/90bc8fc8615c99f653640cc4.html 工具/原料 官网下载安装包 系统需装net 4.0及以上运行库 ...

  2. BZOJ 4152: [AMPPZ2014]The Captain( 最短路 )

    先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就dijkstra ---------------------------------------------- ...

  3. PAD会取代PC吗

    公司上了新的内部管理系统,上线一片混乱,群里也很热闹,从系统是否应该支持pad谈起 ,有技术大佬说5年内就是pad时代了,pad将完全取代pc.我不知道大佬从何得出这个结论,有和数据支撑.我的观点是, ...

  4. 数学之路-python计算实战(14)-机器视觉-图像增强(直方图均衡化)

    我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是  是图像中全部的灰度数, 是图像中全部的像素数,  实际上是图像的直方图,归一化到 . 把  作为相应于  的累计概率 ...

  5. BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )

    假设C君为(0, 0), 则右上方为(n - 1, n - 1). 一个点(x, y) 能被看到的前提是gcd(x, y) = 1, 所以 answer = ∑ phi(i) * 2 + 2 - 1 ...

  6. C++内存管理(超长)

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  7. Java读写Word文件常用技术

      Java操作操作Word文件,最近花了几天时间解决使用Word模板导出数据的问题,收集到一些资料分享下. 常见的技术如下: 1.POI(兼容doc.docx文件) 官方网站:http://poi. ...

  8. attachEvent与addEventlistener兼容性

    关于原生事件绑定中attachEvent与addEventlistener中兼容性以及attachEvent函数中this指代window有关问题   请点击下面回答中的"采纳为答案&quo ...

  9. Appium - iOS 各种问题汇总

    Appium - iOS 各种问题汇总 作者: Max.Bai 时间: 2014/10 Appium - iOS 各种问题汇总  1. Appium 滑动: swipe 有三种方式:  第一种:swi ...

  10. linux scp传文件

    一.输入 scp 201207.tar.gz root@192.1001.122:/backup 二.输入密码:abc123 注解: scp 201207.tar.gz :将要传输的文件 root : ...