oracle 数据库主要包括二个主要部分 1:数据库: 一系列物理文件(数据文件和相关对象文件) 2:实例: 一系列操作系统进程和它管理内存区 //----------------------------------- 从多的数据由oracle来分配管理, 是堆砌还是叠加.. oracle 管理数据库的方式是 高效的逻辑结构来管理物理数据结构. 物理结构:对应一系列的不同格式类型作用的文件 逻辑结构:oracle内部存储管理数据方式 //-------------------------------- 数据库物理存储结构 数据库由一系列物理文件组成,任务不同 发号指令{领导} 老实听话[跟班] 任劳任怨[白劳] 埋头苦干[保镖] //----------------------------------- 控制文件 Control Files 数据文件 DataFiles 临时文件 Tempfiles 重做日志文件 Online Redolog File & Archived Log Files //------------------------------------------- 控制文件(Control Files) 领导 1:文件的大小 不超过20000个数据库 注意:控制文件数据块大小与数据文件数据块大小不一样 SELECT BLOCK_SIZE FROM V$CONTROLFILE;//默认16KB 如何查询数据文件的大小 SELECT BLOCK_SIZE FROM V$DATAFILE; 2:控制文件作用 a:oracle启动从NOMOUNT状态-->MOUNT 状态读取控制文件 如果文件出错或者不存在则启动失败。 3:控制文件格式 二进制不能手工修改可以通过指令修改 ALTER SYSTEM SET ???????????????????????????????????????????????? 4:控制文件的内容 数据文件位置/重做日志文件路径/ 数据库名称/数据库创建信息/表空间信息 数据文件状态/日志文件信息/检查点信息 1:该文件启动时需要 2:备份 3:数据库结构修改[添加删除表空间,数据文件] 等操作都需要同步控制文件 5:控制文件保证措施 oracle 系统默认二个镜像控制文件11g 三个镜像控制文件10g 6:查看控制文件 SHOW PARAMETER CONTROL_FILES; SELECT NAME FROM V$CONTROLFILE; 7:控制文件的位置和数据可以由DBA指定??????????????????? //----------------------------------------------------- 数据文件 oracle 需要保存大量的数据,在所有文件中只有数据文件来 保存数据. 数据文件是指在磁盘上的一个物理文件 1:oracle有多少个物理文件 SELECT NAME,STATUS FROM V$DATAFILE; 2:重要概念!! oracle在创建数据文件时,是通过操作系统 在指定路径下分配一块指定大小的磁盘空间, 并将这块空间的数据清空,然后按照指定的块 大小格式化这块存储区域。 3:裸设备 oracle也允许在裸设备上创建数据文件 裸设备:一块没有分区格式化的磁盘 4:数据是直接保存在数据文件中吗? 数据对象是保存在表空间中, 然后由oracle分配至某一个或某几数据文件; 5:数据文件的状态 Online 联机 Offline 脱机 System 系统状态 RECOVER 11g?????????????????????? 只有system和online状态的数据文件用户可以正常访问 其中存储的数据,默认联机状态。 6.修改数据文件的状态 col name for a50; select name,status from v$datafile; ALTER DATABASE DATAFILE 'D:DEVORACLEDATATESTSCOTT_TBS01.DBF' OFFLINE; ALTER DATABASE DATAFILE 'D:DEVORACLEDATATESTSCOTT_TBS01.DBF' ONLINE; * 第 1 行出现错误: ORA-01113: 文件 15 需要介质恢复 ??正在使用文件?? //------------------------------------------------------------ 临时文件 1:概念的误解 临时文件是临时存在的文件-->{不在} 而是临时表空间对应的数据文件 该文件不是用完就会被删除,而该文件中存储的对象属于 <-临时存在的对象-> 2:什么情况下会使用临时表空间 通常oracle在执行大规模排序操作时,如果PGA内存区无法存放, 就会将数据存储到临时表空间作为中转,当排序操作完毕后, 这部分空间又可被其它操作使用. 3:临时表空间文件与普通表空间的数据文件不同之处 a:临时表空间必须处理Nologging模式 b:临时表空间数据文件不能置为只读 c:不能通过ALTER DATABASE 语句创建临时表空间数据文件 d:通过RMAN备份时不会备份临时表空间数据文件 恢复数据时也不会恢复临时表空间。 e:临时表空间数据文件在分配空间时与普通表空间数据文件不同. 普通表空间数据文件分配空间时,需要等待操作系统格式化空间 临时表空间数据文件是一种稀疏类型文件. f:查询临时文件 SELECT * FROM V$TEMPFILE; SELECT * FROM DBA_TEMP_FILES; //------------------------------------------------- 日志文件 重做Redo特指一面操作: oracle执行数据修改操作后{不会马上写入数据文件} 1: 生成重做信息 2: 写入SGA中的一块LOG_BUFFER 3: LOG_BUFFER 空间一般设置3~5MB左右 如何查询LOG_BUFFER????????????????????? 4:当满足触发条件后,LOG_BUFFER中写入联机重做日志文件. 5:查询LOG_BUFFER大小 SQL> show parameter log_buffer NAME TYPE VALUE ------------------------------------ ----------- -------- log_buffer integer 7708672 6:联机重做日志文件 6.0:查看联机重做日志 select * from v$logfile; 6.1:重做日志组 每个数据库至少有两个重做日志文件组(一般应该3~5组) 6.2:重做日志组工作的方式 循环使用 6.3:循环的方式 LGWR进程当前在写LOG日志组1,日志组1状态 CURRENT状态 数据写满后. LGWR开始写下一个LOG日志组2<组2 状态CURRENT,组1ACTIVE> 以此类推,所有日志都写满后LGWR再次写LOG日志组 ?????LOG组不是满的吗?如何写 6.4:每个日志文件至少要有一份冗余保证数据不会丢失。 6.5:创建新日志文件组--> ALTER DATABASE ADD LOGFILE GROUP 10( 'D:DEVORACLEDATATESTREDO011.LOG', 'D:DEVORACLEDATATESTREDO012.LOG') SIZE 50M; 6.6: 新创建文件状态 select * from v$log; 10 UNUSED [未被写入过数据] 6.7:删除联机重做日志组 ALTER DATABASE DROP LOGFILE GROUP 9; 注意:不能删除 CURRENT;ACTIVE状态重做日志组 日志文件不会通过指令删除,需要管理员手工删除. 6.8:为日志组添加日志文件 ALTER DATABASE ADD LOGFILE MEMBER 'D:DEVORACLEDATATESTREDO013.LOG' to GROUP 10; 注意:单独添加文件不需要指定大小 6.8:删除日志组中的文件 ALTER DATABASE DROP LOGFILE MEMBER 'D:DEVORACLEDATATESTREDO013.LOG'; 注意:删除文件之前必须确保删除后日志组中至少还拥有一个组员 不然触发ORA-00361错误. ALTER DATABASE DROP LOGFILE MEMBER 'D:DEVORACLEDATATESTREDO011.LOG'; ALTER DATABASE DROP LOGFILE MEMBER 'D:DEVORACLEDATATESTREDO012.LOG'; 第 1 行出现错误: ORA-00361: 无法删除最后一个日志成员 D:DEVORACLEDATATESTREDO012.LOG (组 10) 6.9:查询重做日志 SELECT * FROM V$LOG; SELECT * FROM V$LOGFILE; 6.10 日志状态 UNUSED: 日志文件从未被写入过数据,刚创建日志组状态。 CURRENT: oracle正在使用的重做日志文件组 ACTIVE: 当前未使用,不过该文件的内容<!!!尚未归档!!> 或者文件中的数据没有全部写入数据文件. 一旦需要实例恢复,必须借助该文件中保存的内容. CLEARING:该重做日志文件正被重建(重建后状态UNUSED) ?????????????????????????????????????? 如何重建 CLEARING_CURRENT:重做日志重建时出现错误 INACTIVE:联机重做日志文件中的内容己被妥善处理,当前处理空闲状态. 6.11:设置联机重做日志文件大小 a:数据修改频繁度 如果数据频繁修改产生大量的重做日志,此时重做日志太小, 日志组写满了换另一个组,一旦日志文件切换时发现下一组 重做日志尚未完成写入,那么数据库将仃止工作,等待 完成归档或数据写入。 b:平均恢复时间 如果重做日志文件大,是不是可以最终解决问题. 修改数据->写数重做日志文件->触发检查点(CKPT) 如果数据库受损,实例恢复的话必须要花费相当长的时间 处理巨大日志文件。 c:高峰时的负载 不同的业务高峰时刻也不同,有些系统可能是1:00-3:00 有的系统可能是8:00-10:00 不管什么系统设置重做日志都应该以最繁忙的时段产生的 日志量为准. 如果一天50G,其中4GB是13:00-15:00产生的,按照每10-15 分钟左右换一次单个重做日志为3GB左右.. 6.12:重做日志的生成 对数据库的更新操作会生成大量的重做日志,如果控制 某些更新语句在执行时不生成重做日志[省时,省空间] 常规情况下有二种 a:某些DDL语句时附加NOLOGGIN子句 b:执行DML时指定HINT APPEND c:SQL Loader 采用直接路径的方式跳过SQL引擎,不生成重做日志.. //----- create table test2 NOLOGGING as select * from dba_objects where 1=2; insert into test2 nologging select * from dba_objects alter table test2 nologging; insert into test2 select * from dba_objects; insert/*+append*/ into test2 select * from dba_objects ; 如果您希望生成重做日志成为强制约定,可以使用属性 Force Logging 一旦改变属性;Nologging/Append Hint自动失效/SQLLDER直接路径也会自动 转为常规路径.. 6.13 查询数据库是否启用的Force Logging SQL> SELECT FORCE_LOGGING FROM V$DATABASE; FOR --- NO 6.14 修改状态ForceLogging SQL> ALTER DATABASE FORCE LOGGING; 6.15 取消属性 SQL> ALTER DATABASE NO FORCE LOGGING; //------------------------------------------------------------------- 数据文件 块:区:段:表空间 表/列 表空间->学院 段----->系 区----->专业 块----->班 数据文件-->教学大楼 数据{表/记录/索引}----->学生 :你真实看到一个物理{教学大楼} :大学校内有自己的组织关系{按照一定规则组织方便高效的管理} :学生-->去学院报到--->{内部管理方式->系->专业->班->学哪个教学大楼上课} :学生|<透明>|{内部工作方式}