控制文件:
数据文件:
联机重做日志文件:
参数文件:
归档日志文件:
控制文件、数据文件、联机重做日志文件 放在存储上。
控制文件:数据库的名字,数据库物理结构信息,数据库字符集信息,SN号,checkpoint,状态信息
归档日志的历史信息
数据文件:普通数据文件(百万以下行是小表,百万到千万行是中型表,亿行以上的表是大型表),临时数据文件
联机重做日志文件:如果被破坏,数据库做报错
参数文件spfile:数据库启动时读取,并不关闭这个文件,但是启动过后丢了也没事。一般放在服务器上。不放在存储上面。$ORACLE_HOME/dbs下
参数文件包括:
备份文件{
控制文件、参数文件定期备份;
数据文件、归档日志文件每次都要备份。
}原则上备份的文件不能放在存储上,一般放在带库上。(带库分为虚拟带库和真实带库,建议最好放在真实带库)
口令文件,以sysdba远程登录时会需要口令文件,丢了也没有关系,可以在线生成,
Alert日志文件:用于对数据库的问题进行诊断的入口(后台进程),错误日志
文件位置:/u01/app/oracle/admin/ORCL/bdump/alert_ORCL.log
Trc日志文件:
文件位置:/u01/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_j000_3984.trc
Server Process(前台进程)产生的trace文件:
文件位置:/u01/app/oracle/admin/ORCL/udump/*.trc
存储有三种组织形式:
1. 文件系统
2. ASM
3. 裸设备
Oracle的特点:多表空间结构(虚的概念):
一个实例对应一个数据库,一个数据库内有多个表空间,每个表空间对应存储不同的数据。不同的业务存放在不同的表空间中
Mysql或sql server 一个数据库实例可以有多个数据库名称,每个数据库名称对应不同的业务。
1个库里有多个表空间。
是通过划分表空间来方便我们的管理。
一个表空间由一个或多个文件组成。表空间的大小是多个物理文件大小的总和
查看oracle上面的表空间:
SYSTEM表空间:oracle自身的信息
SYSAUX表空间:oraclesystem表空间的附属表空间,以上两个表空间要同时在线,要不然数据库无法启动
UNDOTBS1:undo 表空间,将数据改变前的数据存在这里面
TEMP表空间:存储临时数据,当PGA空间不够用时,sql排序时会用到TEMP表空间临时排序使用。
EXAMPLE表空间: 存储样例数据库
USERS表空间:存放用户数据。
查看表空间对应的数据文件:
Oracle通过用户将数据库所有的段组织起来.删除一个用户会将这个用户下的所有的段一起删除.
查看oracle所有的用户:
查看oracle中的所有的段:
Oracle文件结构:
所有文件
数据库,表空间,段,区,块
Oracle表空间
普通表空间
回滚表空间
临时表空间
Oracle段
表段,表分区段,索引段,索引分区段,临时段,撤销(UNDO)段,二进制大对象段
Oracle 区
高水位线:段使用分配的区的最后一个块的位置.是oracle对表进行全表扫描的最后一个位置。
降低高水位线:truncate t2
Oracle块:
Oracle块
Oracle块物理存储结构
行链接
行迁移
文件系统块:dumpe2fs /dev/sda1
扇区:512字节
知识点一:一个段建立以后,oracle如果给这个段分配区
知识点二:这个段分配了区以后,空闲的区空间是如何管理的
区管理方式;
本地管理(默认):
1.自动管理:会根据空间的增长情况,自动分配空间给表段
2.统一管理: 每次只分配固定的区给表段
数据字典
段管理方式:
自动管理方式(默认)
手工管理方式
创建表空间SQL语句:
create smallfile tablespace “data1”
datafile “/u01/app/oracle/oradata/ORCL/data1_01.dbf” size100M reuse
autoextend on next 100M maxsize unlimited
logging
extent management local
segment space management auto
分析表:
Analyze table t2 computestatistics
Analyze table t2 computestatistics for all indexes;
Analyze table t2 deletestatistics
Exec dbms_stats.gather_table_stats('sys','t2')
查看指定表的段区块信息:
selectsegment_name,blocks,extents,bytes,segment_type,tablespace_name fromdba_segments where segment_name='T2';
select * from dba_extents where segment_name='T2'
查看段的统计信息:
select blocks,empty_blocks from dba_tables wheretable_name='T2'
select count(*) from t1;
truncate table t1;
DBMS_STATS包里的statistics过程:
GATHER_INDEX_STATS
Index statistics
GATHER_TABLE_STATS
Table,column andindex statistics
Exec dbms_stats.gather_table_stats(‘sys’,’T2’)
GATHER_SCHEMA_STATS
Statistics forall objects in a schema
GATHER_DICTIONARY_STATS
Statistics forall dictionary objects
GATHER_DATABASE-STATS
Statistics forall objects in a database
DBA_TABLES
DBA_OBJECT_TABLES
DBA_TAB_STATISTICS
DBA_TAB_COL_STATISTICS
DBA_TAB_HISTOGRAMS
DBA_INDEXES
DBA_IND_STATISTICS
DBA_CLUSTERS
DBA_TAB_PARTITIONS
DBA_TAB_SUBPARTITIONS
DBA_IND_PARTITIONS
DBA_IND_SUBPARTITIONS
DBA_PART_COL_STATISTICS
DBA_PART_HISTOGRAMS
DBA_SUBPART_COL_STATISTICS
DBA_SUBPART_HISTOGRAMS
表的统计信息:
包含表的行数,使用的块数,空的块数,块的使用率,行迁移和链接的数据,PCTFREE,PCTUSED的数据,行的平均大小
SELECT TABLE_NAME,NUM_ROWS,--表中的记录数
BLOCKS, --表中数据所占的数据块数
EMPTY_BLOCKS,--表中的空块数
AVG_SPACE, --数据块中平均的使用空间
CHAIN_CNT, --表中行连接和行迁移的数量
AVG_ROW_LEN --每条记录的平均长度
FROM USER_TABLES;
SELECT TABLE_NAME,NUM_ROWS,--表中的记录数
BLOCKS, --表中数据所占的数据块数
EMPTY_BLOCKS,--表中的空块数
AVG_SPACE, --数据块中平均的使用空间
CHAIN_CNT, --表中行连接和行迁移的数量
AVG_ROW_LEN --每条记录的平均长度
FROM USER_TABLES WHERE TABLE_NAME='T2';
索引列的统计信息:
包含索引的深度(B-Tree的级别),索引叶级的块的数量,集群因子(clustering_factor),唯一值的个数SELECT BLEVEL --索引的层数
LEAF_BLOCKS, --叶子结点的个数
DISTINCT_KEYS, --唯一值的个数
AVG_LEAF_BLOCKS_PER_KEY, --每个KEY的平均叶块个数
AVG_DATA_BLOCKS_PER_KEY, --每个KEY的平均数据块个数
CLUSTERING_FACTOR --群集因子
FROM USER_INDEXES
列的统计信息
包含唯一的值个数,列最大小值,密度(选择率),数据分布(直方图信息),NULL值个数
SELECT NUM_DISTINCT, --唯一值的个数
LOW_VALUE,--列上的最小值
HIGH_VALUE, --列上的最大值
DENSITY, --选择率因子(密度)
NUM_NULLS, --空值的个数
NUM_BUCKETS, --直方图的BUCKET个数
HISTOGRAM --直方图的类型
FROM USER_TAB_COLUMNS;
相关视图:
V$TABLESPACE
V$ENCRYPTED_TABLESPACES
DBA_TABLESPACES,DBA_ USER_TABLESPACE
DBA_TABLESPACE_GROUPS
DBA_SEGMENTS,USER_SEGMENTS
DBA_EXTENTS,USER_EXTENTS
DBA_FREE_SPACE,USER_FREE_SPACE
DBA_TEMP_FREE_SPACE
V$DATAFILE
V$TEMPFILE
DBA_DATA_FILES
DBA_TEMP_FILES
V$TEMP_EXTENT_MAP
V$TEMP_EXTENT_POOL
V$TEMP_SPACE_HEADER
DBA_USERS
DBA_TS_QUOTAS
V$SORT_SEGMENT
V$TEMPSEG_USAGE
V$SEGSTAT_NAME,V$SEGSTAT,V$SEGMENT_STATISTICS
SQL可以帮助我们找到当前数据库中逻辑读最高的10个对象:
Select * from (select object_name,statistic_name,valuefrom v$segment_statistics where statistic_name=’logical reads’ order by 3 desc)where rownum <11;
Oracle块详解:
行目录:数据中的每行的起点位置
块的大小:
Oracle中一个块是8k showparameter block
文件系统是: 4k dumpe2fs /dev/sda1
一个块是8k,由两个文件系统块组成,由16个扇区组成
正常情况下,一个块放多行数据:
PCTFREE:默认是10%,当往一个块中插入数据时,当数据空间还剩10%时,就不插入了,代表这个块的空间满了。
为什么要留10%的原因是:当后期这个块中的数据因更新而变长时,可以使用这10%的空间.
行迁移=>update, 整体一行牵出来。Pctfree过小导致的。
因为pctfree配置过小,update时,行会迁移出来,导致访问一个块的内容时,会访问两个块的内容(当块满了时,这时update时,某个列要增长,这时oracle会将这个行整个移出来到这个新块中,原来的行不会删除,原来行里写上新数据块中行的地址。这个当扫描原来的块时,会扫描到新增加的块)
如果一个行非常长,一个块容不下一行,所有要新增加一个块以存放行的其它部分。
行链接=>insert,一个行非常长,块太小了。
原来的块存不下行的内容,会在行最后的位置存放下一个块的新行的位置,在另一个新块里存储行其它的部分。
Oracle块的内部结构
行与行之间是串起来的,结构是:
第一行:列宽_列值-列宽_列值-列宽_列值-列宽_列值
第二行:列宽_列值-列宽_列值-列宽_列值-列宽_列值
查看是行链接还是行迁移的方法:
SELECT TABLE_NAME,NUM_ROWS,--表中的记录数
BLOCKS, --表中数据所占的数据块数
EMPTY_BLOCKS,--表中的空块数
AVG_SPACE, --数据块中平均的使用空间
CHAIN_CNT, --表中行连接和行迁移的数量:这个值如果为0,表示正常,如果太大,要看一下是行连接,还是行迁移造成的。
AVG_ROW_LEN --每条记录的平均长度
如果行的平均长度大于块的长度:说明块太小了,需要增加块的容量。PCTFREE可能配置太大比率了,可以减少。
如果行的平均长度小于块的升序,但CHAIN_CNT的值比较高,这就说明是行迁移造成的。解决方法是对表进行重新整理,将这个表先导出来,再导进去。
FROM USER_TABLES WHERE TABLE_NAME='T2';