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 scott
scott下面就可以执行
ALTER SESSION{ ENABLE RESUMABLE [ TIMEOUT integer ][ NAME string ]| DISABLE RESUMABLE}
- 监控:通过
USER_RESUMABLE
andDBA_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;
alter tablespace temp02 add tempfile '/home/oracle/db01/temp02.dbf' size 50m;
alter database tempfile '/home/oracle/temp02.dbf' drop;
shut immediate
startup mount
!mv /home/oracle/db01/temp02.dbf /home/oracle/temp02.dbf
alter database rename file '/home/oracle/db01/temp02.dbf' to '/home/oracle/temp02.dbf';
alter database open;
查看所有的物理文件
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;
SYSTEM :系统扩展,阶梯增长
1~16 extent : 8*8K
17~80 extent : 128*8K
81~200 extent : 1024*8K
201~ extent : 8192*8K
SQL> select blocks,count(*) from dba_extents where segment_name='T07' group by blocks order by 1;
BLOCKS COUNT(*)
---------- ----------
8 16
128 63
1024 120
8192 ...
UNIFORM:同一分配(extent的尺寸不变)
create tablespace tbs06 datafile '/testdata/tbs06.dbf' size 100m uniform size 10m;
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; |
删除表空间和文件
--删除空的表空间,但是不包含物理文件 |