2019-12-22 BoobooWei
前面我们学习了物理结构中的8大文件,接下来学习逻辑结构
存储结构
存储结构: |
数据库实例
Oracle数据库服务器由一个Oracle数据库和一个或多个Oracle数据库实例组成。 每次启动数据库时,都会分配一个称为系统全局区域(SGA)的共享内存区域,并启动Oracle数据库后台进程。后台进程和SGA的组合称为Oracle数据库实例。
物理结构
Oracle数据库的物理数据库结构,包括数据文件,控制文件,重做日志文件,已归档的重做日志文件,参数文件,警报和跟踪日志文件以及备份文件。
the physical database structures of an Oracle database, including datafiles,control files, online Redo Log Files, archived redo log files, parameter files, alert and trace log files, and backup files.
补充password files
包括以下主题:
逻辑结构
逻辑存储结构:数据块,扩展区,段和表空间。这些逻辑存储结构使Oracle数据库可以对磁盘空间使用进行细粒度的控制。
logical storage structures: data blocks, extents, segments, and tablespaces. These logical storage structures enable Oracle Database to have fine-grained control of disk space use.
包括以下主题:
tablespace的空间管理
tablespace的空间管理:
- DMT : dictionary management tablespace
- LMT : local management tablespace
管理表空间和数据文件:
- Database files Maximum per database 65533
Database files Maximum per tablespace Operating system dependent; usually 1022
表空间相当于vg;数据文件相当于pv;一个表空间下至少要包含一个数据文件
表空间按照存储的内容分成3类:
select tablespace_name,contents from dba_tablespaces order by 2; |
| CONTENTS | 备注 |
|---|---|
| PERMANENT | 保存永久对象 |
| TEMPORARY | 保存临时表的数据和排序的中间结果 |
| UNDO | 不能保存任何对象,只能保存数据修改前的老镜像,老镜像存储在rollback segment |
select tablespace_name,extent_management from dba_tablespaces; |
| 表空间 | system | sysaux | temp |
|---|---|---|---|
| 说明 | 数据库内最重要的表空间 在建立数据库时,就诞生了 在数据库open的时候必须online |
表空间(system auxiliary辅助) 10g新引入的新的表空间 分担system表空间的压力 |
临时表空间的内部分配由oracle自动完成 重新启动数据库时该表空间都会重新分配 有排序需求时分配,SHUTDOWN后回收 |
| 存放内容 | 该表空间含有数据字典的基表 含有包,函数,视图,存储过程的定义 原则上不存放用户的数据 |
一些应用程序的存放数据空间 |
用来排序或临时存放数据的 不存放永久的对象 |
| 其他 | 不能改名称, 可以offline,但部分数据库功能受影响 | 数据库内可以有多个临时表空间 |
sysaux表空间
查看有那些应用程序使用了sysaux表空间
select * from V$SYSAUX_OCCUPANTS; |
users数据表空间
查看和修改数据库默认数据表空间
10g新特性
SELECT property_value |
修改数据库的默认数据默认表空间
ALTER DATABASE DEFAULT TABLESPACE newusers; |
- 以前版本的默认表空间为system,现在可以自己指定。
- 默认数据表空间不能被删除,想将它删除请先指定别的表空间为默认数据表空间。
永久表空间管理
| 永久表空间管理 | 命令 |
| :————————- | :————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————– | —————————————————————————————————– |
| 创建永久表空间tbs01 | create tablespace tbs01 datafile ‘/home/oracle/tbs01.dbf’ size 10m; |
| 向指定表空间下创建表 | create table scott.t01 tablespace tbs01 as select * from scott.emp;
create table scott.t02 (x int,name varchar2(20)) tablespace tbs01; |
| 查看表空间下拥有哪些表 | select owner,table_name from dba_tables where tablespace_name=’TBS01’; |
| 查看一张表属于哪一个表空间 | select tablespace_name from dba_tables where table_name=’T03’; |
| 查看用户的默认表空间 | select default_tablespace from dba_users where username=’SCOTT’;
create table scott.t03 (x int); –> default_tablespace |
| 修改用户的默认表空间 | alter user scott default tablespace tbs01; |
| 数据库默认永久表空间 | 创建数据库的时候system表空间被指定为默认永久表空间。
创建用户的时候如果没有指明默认表空间,那么用户就使用数据库的默认永久表空间保存数据。
查看数据库的默认永久表空间
select * from database_properties where rownum<4; |
| 修改数据库的默认永久表空间 | alter database default tablespace tbs01;
| create user tom identified by tom;
grant connect,resource to tom;
create table tom.t04 (x int); |
| 查看表空间的状态 | select tablespace_name,status from dba_tablespaces; |
| 修改表空间状态 | alter tablespace tbs01 read only;
alter tablespace tbs01 read write;
alter tablespace tbs01 offline;
alter tablespace tbs01 online; |
| 移动数据文件 | 适合可以offline的表空间!
查看数据文件和表空间的对应关系
select tablespace_name,file_name from dba_data_files;
alter tablespace tbs01 offline;
!mv /home/oracle/tbs01.dbf /home/oracle/db01/tbs01.dbf
修改控制文件中的指针
alter tablespace tbs01 rename datafile ‘/home/oracle/tbs01.dbf’ to ‘/home/oracle/db01/tbs01.dbf’;
alter tablespace tbs01 online;
不可以offline的表空间如果需要移动文件,使用移动日志文件的手段! |
| 移动字符设备表空间 | select name,blocks,block1_offset from v$datafile
alter tablespace tbs02 offline;
!dd if=/dev/raw/raw1 of=/home/oracle/db01/tbs02.dbf bs=8K count=1281
alter tablespace tbs02 rename datafile ‘/dev/raw/raw1’ to ‘/home/oracle/db01/tbs02.dbf’;
alter tablespace tbs02 online; |
监控表空间的空间使用情况
select a.tablespace_name,a.curr_mb,a.max_mb,nvl(b.free_mb,0),round(nvl(b.free_mb,0)/a.curr_mb,4)*100||'%' free_pct |
与空间问题相关的可恢复语句
在resumable开启 的情况下,如果Oracle执行某一个SQL申请不到空间了,会停顿下来(时间可以由TIMEOUT来控制),但是不会报OUT-OF-SPACE这个错 误。等你把空间的问题解决了,Oracle会继续从停下来的部分开始刚才的SQL。
grant resumable to scott; |
步骤:
具有dba角色的用户:
grant resumable to scottscott下面就可以执行
ALTER SESSION{ ENABLE RESUMABLE [ TIMEOUT integer ][ NAME string ]| DISABLE RESUMABLE}监控:通过
USER_RESUMABLEandDBA_RESUMABLE来查看
表空间扩容
select file_id,file_name from dba_data_files where tablespace_name='TBS02'; |
大文件表空间
大文件表空间的文件的上限是 (4G-3)*8K,只能有一个数据文件
create bigfile tablespace tbs03 datafile '/home/oracle/db01/tbs03.dbf' size 10m; |
temp临时表空间
临时表空间中存放的是什么?
临时表数据(事务提交即销毁 | 会话提交即销毁) 和 排序缓冲
临时表空间是否可以删除?
可以删除;备份的时候不需要备份。
如何查看临时表空间属性?
select TABLESPACE_NAME,CONTENTS,LOGGING from dba_tablespaces where tablespace_name='TEMP'; |
实践1-创建事务提交即销毁的临时表
只是将数据清空,表还在
create global temporary table temp as select * from emp; |
实践2-创建会话提交即销毁的临时表
只是将数据清空,表还在
create global temporary table temp2 on commit preserve rows as select * from emp; |
实践3-执行排序操作使用临时表空间
select USERNAME,TABLESPACE,BLOCKS from v$sort_usage; |
实践4-验证删除临时表空间不影响数据库使用
alter system set pga_aggregate_target=10m; |
其他常用命令
数据库默认临时表空间: |
移动临时文件
查看临时文件和临时表空间的对应关系
select tablespace_name,file_name from dba_temp_files; |
查看所有的物理文件
select * from |
segment的空间管理
segment的空间管理,重点掌握两种管理段内所拥有的空闲空间的方式:
- MANUAL:使用空闲列表管理段内的空闲块
- AUTO :使用位图块管理段内的空闲空间
select tablespace_name,segment_space_management from dba_tablespaces; |
MANUAL
什么叫做MANUAL:使用空闲列表管理段内的空闲块
创建段空间管理模式为手工的表空间:
create tablespace tbs04 datafile '/testdata/tbs04.dbf' size 10m segment space management manual; |
向表空间下创建表:
create table scott.t04 (x int,name varchar2(10)) segment creation immediate tablespace tbs04; |
查看表的空闲列表:
select freelists from dba_tables where table_name='T04'; |
查看t04段的头:
select header_file,header_block from dba_segments where segment_name='T04'; |
空闲列表就是段头块中的指针,指向段内的空闲块
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 |
AUTO
什么叫做auto:使用位图块管理段内的空闲空间
create tablespace tbs05 datafile '/testdata/tbs05.dbf' size 10m; |
查看t06段的头:
SQL> select header_file,header_block from dba_segments where segment_name='T06'; |
Last Level 1 BMB: 0x02800080 |
extent管理
extent分配
数据增长时会自动分配extent
create table t07 (x int,name varchar2(20)); |
手工扩展
alter table t07 allocate extent (size 128k); |
extent空间分配算法(类型):
select tablespace_name,allocation_type from dba_tablespaces; |
extent回收
alter table scott.t05 deallocate unused; |
oracle block空间管理
block空间管理
SQL> show parameter db_block_size |
计算行的分布情况
SQL> select dbms_rowid.rowid_block_number(rowid),count(*) from scott.t09 group by dbms_rowid.rowid_block_number(rowid) order by 1; |
删除表空间和文件
--删除空的表空间,但是不包含物理文件 |