数据结构在计算机中的表示(映像)称为数据的物理(存储)结构它包括数据元素的表示和关系的表示
物理结构即oracle数据库使用的操作系统文件结构对于数据库物理结构文件不同的oracle版本不同的操作系统平台上有不同的存储目录结构
winnt| d:oracleproductoradataDB_NAME**(oracle g);d:orantdatabase**(oracleoracle)Unix | /home/app/oracle/product//oradata/DB_NAME/**(g);/home/app/oradata/db_name/**(ii)
数据库的物理结构文件按其作用可以分为三类
数据文件
日志文件
控制文件
一数据文件
数据文件用来存储数据库的数据如表索引等读取数据时系统首先从数据库文件中读取数据并存储到SGA的数据缓沖区中这是为了减少I/O如果读取数据时缓沖区中已经有要读取的数据就不需要再从磁盘中读取了存储数据时也是一样事务提交时改变的数据先存储到内存缓沖区中再由oracle后台进程DBWR决定如何将其写入到数据文件中
查询数据文件的信息
sql>select * from dba_data_files或sql>select * from v$datafile(此数据字典包含文件的动态信息)
一个数据文件只与一个数据库相联系数据文件的大小是可以改变的可以通过以下语句查询表空间的空间空闲量
sql>select * from dba_free_space
修改数据文件的大小
sql>alter database datafile "d:dfdbf" resize m
数据库文件的自动扩展特性请看下面的例子:
sql>alter tablespace tbs add datafile"d:dfdbf" size m autoextendon next m maxsize msql>alter database mydb datafile"d:dfdbf""d:dfdbf" autoexetend offsql>alter database mydb datafile"d:dfdbf""d:dfdbf" autoexetendon next m maxsize unlimited
二重做日志文件
重做日志文件记录对数据库的所有修改信息它是三类文件中最复杂的一类文件也是保证数据库安全与数据库备份与恢复有直接关系的文件
日志文件组与日志成员
在每一个oracle数据库中至少有两个重做日志文件组每组有一个个或多个重做日志文件即日志成员同一组中的成员是镜像关系它们存储的内容是一模一样的Oracle在写日志时以一个日志组为逻辑单位写入只在将日志都写入日志组中的每个成员文件中后写日志才完成
日志工作原理
Oracle有多个日志文件组当一个日志文件组中所有的成员所有的成员同时被写满数据时系统自动转换到下一个日志文件组这个转换过程称为日志切换
当日志切换后会给前一个日志组编一个号用于归档日志的编号这个编号称为日志序列号此编号由开始每切换一次序列号自动加最大值受参数MAXLOGHISTORY限制该参数的最大值为
当oracle把最后一个日志组写满了以后自动转向第一个日志组这时再向第一个日志组写日志的时候如果数据库运行在非归档模式下这个日志组中的原有日志信息就会被覆盖
使用以下语句查询日志文件信息
sql>select * from v$log
相关字段说明如下
GROUP#:日志文件组号
THREAD#:日志文件线程号一般为双机容时为
SEQUENCE#:日志序列号
BYTES:日志文件大小
MEMBERS:该组的日志成员个数
ARC:该组日志信息是否已经完成归档
STATUS:该组状态(CURRENT:表示当前正在使用的组NACTIVE:表示非活动组ACTIVE:表示归档未完成)
FIRST_CHANGE#:系统改变号SCN也叫检查点号
FIRST_TIME:系统改变时间
DBA可以使用下列命令进行强制日志切换
sql>alter system switch logfile
NOARCHIVELOG/ARCHIVELOG
NOARCHIVELOG是非归档模式如果数据库运行在这种模式下当日志切换时新切换到的日志组中的日志信息会被覆盖ARCHIVELOG:归档模式如果数据库运行在这种模式下日志会被归档存储产生归档日志且在未归档之前日志不允许被覆盖写入
要确认数据库的归档方式可以查询数据字典v$database:
sql>select log_mode from v$database
要了解归档日志的信息可以查询数据字典v$archived_log
要将数据库改为归档模式
aalter database archivelog
b设置初始化参数LOG_ARCHIVE_START=TRUE
c设置归档文件目标存储路径 LOG_ARCHIVE_DEST=C:ORAARCHIVE
d设置归档文件命名格式参数 LOG_ARCHIVE_FORMAT="ORCK%T%SARC"这个格式中的%S表示日志序列号自动左边补零%s表示日志序列号自动左边不补零%T表示日志线程号左边补零%t表示日志线程号不补零
e重新启动数据库
CKPT进程(检查点进程)
CKPT进程保证有修改过的数据库缓沖区中的数据都被写入到数据文件日志文件数据文件数据库头和控制文件中都有写入检查点标记数据库在恢复时只需提供自上一个检查以来所做的修改检查点完成时系统将更新数据库数据库头和控制文件
参数LOG_CHECKPOINT_TIMEOUT决定一个检查点发生的时间间隔LOG_CHECKPOINT_INTERVAL决定一个检查需要填充的日志文件块的数量检查点号也称系统改变号(SCN)它标识一个检查点可以通过v$log查询日志文件的检查点信息通过v$datafile查询数据文件的检查点信息通过v$database查询数据库头的检查点信息三个地方的检查点号相同如果不同说明发明数据库不同步此时数据库肯定无法正常启动
增加与删除日志文件组日志成员(详细语法请参考oracle文档)
alter database [database] add logfile[group integer] filespec[[groupalter database [database] add logfile ()alter database [database] drop logfile[grout integer]alter database[database] add logfilemember "filespec" [reuse] to group integeralter database [database]drop logfile member "filename""filename"alter database [database]rename file "filename" to "filename
"
清除日志文件数据
alter database [database] clear[unarchived] logfile group integer|filespec
三控制文件
控制文件是一个二进制文件用来描述数据库的物理结构一个数据库只需要一个控制文件控制文件的内容包括
数据库名及数据库唯一标识
数据文件和日志文件标识
数据库恢复所需的同步信息即检查点号
控制文件由参数control_files指定格式如下
control_files=("home/app//controlctl""home/app//controlctl")
参数中各个文件是镜像关系也就是说几个文件中只要有一个文件完好数据库就可以正常运行
以下语句查询控制文件的信息
sql>select * from v$controlfile
如果控制文件损坏或丢失数据库将终止并且无法启动所以要对控制文件进行镜象手工镜像步骤如下
a关闭数据库
b复制控制文件
c修改参数文件加入新增的控制文件位置描述
d重新启动数据库
另外注意控制文件中还包含几个服务器参数的设置如果修改这些参数的值刚需要重新创建控制文件这些参数是
MAXLOGFILES:最大日志文件个数
MAXLOGMEMBERS:最大日志成员个数
MAXLOGHISTORY:最大历史日志个数
MAXDATAFILES:最大数据文件个数
MAXINSTANCES:最大实例文件个数
所有修改数据库结构的命令都会引起控制文件的改变同时出会记录在oracle跟蹤文件中跟蹤文件的名称为alter_SIDlog路径如下
d:oracleproductadminDB_NAMEdumpSIDALRTlog(unix是alter_SIDora)
也可以在参数文件中指定跟蹤文件的存储路径后台进程跟蹤文件目录由参数background_dump_dest指定用户跟蹤文件位置由参数user_bdump_dest指定如
background_bdump_dest=/u/app/oracle/oralog/bdumpuser_bdump_dest=/u/app//oralog/udump