1、第8章 控制文件与日志文件的管理,Oracle数据库包含三种类型的物理文件数据文件、控制文件和重做日志文件,其中数据文件是用来存储数据的,而控制文件和日志文件则是用于维护Oracle数据库的正常运行。保证控制文件和重做日志文件的可用性和可靠性是确保Oracle数据库正常、可靠运行的前提条件。,1,本章知识要点:,了解控制文件的用途 理解控制文件的内容 管理控制文件 了解日志文件的用途 掌握对日志文件的基本管理 理解归档的概念 切换数据库到归档模式 设置归档参数 使用LogMiner分析日志文件,2,8.1 管理控制文件,每个Oracle数据库都必须至少具有一个控制文件。控制文件是一个很小的二进
2、行格式的操作系统文件,在其中记录了关于数据库物理结构的基本信息,包括数据库的名称、相关的数据文件和重做日志文件的名称和位置、当前的日志序列号等内容。在加载数据库时,Oracle实例将读取控制文件中的内容。如果无法找到可用的控制文件,数据库将无法加载,并且很难恢复。,3,8.1.1 控制文件简介,控制文件是Oracle数据库最重要的物理文件,它以二进制文件的形式在。不仅记载了数据库的特理结构信息(即构成数据库的数据文件和日志文件),在装载和打开数据时也需要这些文件,而且它们还记载了日志序列号、检查点和日志历史信息,同步和恢复数据库时需要这些信息。在创建数据库时会创建控制文件,如果数据库发生改变,
3、则系统会自动修改控制文件,以记录当前数据库的状态。大小一般在210MB之间,4,8.1.1 控制文件简介,控制文件包含的几项内容: 1、数据库名和标识 ,DB_NAME,SID 2、数据库创建时间戳 3、表空间名 4、数据文件、重做日志文件的名称和位置 5、当前重做日志文件序列号 6、检查点信息 7、UNDO SEGMENT的起始和结束 8、重做日志归档信息 9、备份信息,5,8.1.2 复合控制文件,因为控制文件非常重要,所以为了防止控制文件的损坏或丢失,应用将控制文件复合。Oracle建议每个数据库应该包含两个或两个以上的控制文件。但需要注意,Oracle数据库最多可以包含8个控制文件。当
4、复合控制文件时,为了防止磁盘损坏导致控制文件丢失或损坏。,6,8.1.2 复合控制文件,启动实例使用PFILE,复合程序: 1、手动修改初始化参数CONTROL_FILES CONTROL_FILES=( “D:APPADMINISTRATORORADATEORCLCONTROL01.CTL”, “D:APPADMINISTRATORORADATEORCLCONTROL02.CTL”, “D:APPADMINISTRATORORADATEORCLCONTROL03.CTL”, “E:ORADATAORCLCONTROL01.CTL”, “E:ORADATAORCLCONTROL02.CTL”,
5、 “E:ORADATAORCLCONTROL03.CTL”); 2、关闭数据库 3、复制控制文件呢 4、启动数据库 Startup pfile= D:APPADMINISTRATORORADATEORCLpfileinit.ora,7,8.1.2 复合控制文件,启动实例使用SPFILE,复合程序: 1、修改初始化参数controll_files Alter system set control_files=D:APPADMINISTRATORORADATEORCLCONTROL01.CTL, D:APPADMINISTRATORORADATEORCLCONTROL02.CTL, D:APPAD
6、MINISTRATORORADATEORCLCONTROL03.CTL, E:ORADATAORCLCONTROL01.CTL, E:ORADATAORCLCONTROL02.CTL, E:ORADATAORCLCONTROL03.CTL Scope=spfile;,8,8.1.2 复合控制文件,启动实例使用SPFILE,复合程序: 2、关闭数据库,备份控制文件 3、启动数据库如果某个控制文件丢失或损坏,数据库将无法装载,将产生ORA-00205:error in identifying controlfile,check alert log more info应修改control_files
7、,去掉坏或丢失的控制文件,重启数据库。,9,8.1.3 建立控制文件,在一般情况下,如果使用了复合控制文件,并且将各个控制文件分别存储在不同的磁盘中,则丢失全部控件文件的可能性将非常小。但是,如果数据库的所有控制文件全部丢失,这时惟一的补救方法就是以手动方式重新创建控制文件。修改数据库的某个永久性参数,如:数据库名称,MAXLOGFILES,MAXLOGMEMBERS,10,8.1.3 建立控制文件,1、查看数据库中所有的数据文件和重做日志文件名称和位置 Select member from v$logfile ; Select name from v$datafile; Select nam
8、e from v$comtrolfile; 如果数据库无法启动,只能查看警告文件的内容。 2、关闭数据库 Shutdown immediate; 3、在操作系统备份数据文件和重做日志文件。 4、启动实例,但不加载数据库 Startup nomount; 5、建立控制文件(需要sysdba权限),11,8.1.3 建立控制文件,Create controfilereuse database “orcl”logfilegroup 1 d:appuseroradataorclredo01.log,datafiled:appuseroradataorclsysten01.dbf,maxlogfiles
9、 50maxlogmembers 3maxinstances 6maxdatafiles 200noresetlogs /仍然使用原有的重做日志noarchivelog; /不归档日志,12,8.1.3 建立控制文件,6、编辑初始化参数control_files,指向新建的控制文件Alter system set control_files=;7、打开数据库alter database open;如何创建文件时使用resetlogs,按以下方式恢复:alter database open resetlogs;,13,8.1.4 控制文件的备份与恢复,为了提高数据库的可靠性,降低由于丢失控制文件
10、而造成灾难性后果的可能性,DBA需要经常对控制文件进行备份。特别是当修改了数据库结构之后,需要立该对控制文件进行备份。Alter database backup controfile tod:backup_controlfilecontrol_08_05-04.bkp; 备份为可读的文本文件:alter database backup controlfile to trace;通过副本,恢复数据库: 1、关闭数据库 shutdown immediate 2、 恢复文件 3、重新启动数据库startup,14,8.1.5 删除控制文件,为了防止控制文件被损坏,应该启用复合控制文件。但是,当多个复
11、合控制文件中任意一个被损坏后,都将导致无法装载Oracle数据库。这时为了使得数据库可以正常工作,只需要删除损坏的控制文件即可。关闭数据库 编辑初始化参数 重启数据库 物理上删除数据库,15,8.1.6 查看控制文件信息,控制文件是一个二制文件,其中被分隔为许多部分,分别记录各种类型的信息。每一类信息称为一个记录文档段。控制文件的大小在创建时即被确定,其中各个记录文档段的大小也是固定的。V$controlfile 控制文件的名称和状态信息 V$controlfile_record_section 控制文件中各个记录文档段的信息 V$parmeter 系统的所有初始化参数,16,8.2 管理重做
12、日志文件,在Oracle中,事务对数据库所做的修改将以重做记录的形式保存在重做日志缓存中。当事务提交时,由LGWR进程将缓存中与该事务相关的重做记录全部写入重做日志文件,此时该事务被认为成功提交。重做日志对数据库恢复来说是至关重要的,因此,对日志的管理也是DBA的日常工作的一部分。,17,8.2.1 重做日志简介,日志文件也称为重做日志文件(Redo Log File),重做日志文件用于记载事务操作所引起的数据库变化。执行DDL或DML操作时,Oracle会将事务变化的信息顺序写入重做日志。当丢失或损坏数据库中的数据时,Oracle会根据重做日志文件中的记录,恢复丢失的数据。,18,8.2.1
13、 重做日志简介,重做记录将以循序方式在SGA区的重做日志高速缓存中进行缓存。当一个事物被提交时,LGWR将相关记录写入日志文件,并生成一个“系统变更码SCN”,保存在日志文件。当一个日志文件被写满后,LGWR开始写入下一个日志文件。当所有文件都写满后,进程再重新写入第一个日志文件。,19,8.2.2 增加重做日志,如果发现LGWR经常处于等待状态,则就需要考虑添加日志组及其成员,一个数据库最多可以拥有MAXLOGFILES个日志组。增加重做日志是使用ALTER DATABASE语句完成的,执行该语句时要求用户必须具有ALTER DATABASE系统权限。 alter database add
14、logfile group 4(d:appadministratororadataorclredo04.log,e:oradatorclredo04.log)Size 10m;alter database add logfile d:appadministratororadataorclredo04.log reuse;,20,8.2.2 增加重做日志,创建日志成员文件Alter database add logfile membere:oradataorclredo01b.log to group 1;Alter database add logfile membere:oradataorc
15、lredo02.log to(d:appadministratororadataorclredo2.log);不可以指定大小,新成员大小是由组合中其他成员的大小决定的。,21,8.2.3 删除重做日志,当日志成员出现损坏或丢失时,后台进程LGWR不能将事务变化写入到该日志成员中,在这种情况下应该删除该日志成员;当日志组尺寸不合适时,需要重新建立新日志组,并删除原有的日志组。删除重做日志是使用ALTER DATABASE语句来完成的,执行该语句要求数据库用户必须具有ALTER DATABASE系统权限。Alter database drop logfile membere:oradataorcl
16、redo04b.log;,22,8.2.3 删除重做日志,删除日志组: 1、无论组里有多少成员,一个数据库至少需要两个日志组 2、只能删除INACTIVE状态的日志组 3、如果数据库处于归档状态,需要确定日志组已经被归档 Select group#,archived,status from v$log;Alter database drop logfile group 4;物理上删除。,23,8.2.3 删除重做日志,清空日志组-日志内容初始化Alter database clear logfile group 3;清空尚未归档的日志组: Alter database clear unarch
17、iced logfile group 3;提醒:清空尚未归档的日志组可能造成数据丢失。,24,8.2.4 改变重做日志位置或名称,在数据库文件、控制文件和重做日志这3种文件中,重做日志的I/O操作最频繁。为了提高I/O性能,应将重做日志分布到I/O操作相对较少、速度最快的磁盘设备上。规划重做日志时,应将同一个日志组的不同日志成员尽可能地分布到不同磁盘上,以防止磁盘损坏而导致所有日志成员丢失。 1、关闭数据库 2、复制或移动日志成员到目标位置 3、重启数据库,但不打开数据库startup mount;,25,8.2.4 改变重做日志位置或名称,4、alter database rename fi
18、le d:appadministratororadataorclredo03.logtod:appadministratororadataorclredo03a.log; 5、打开数据库alter database open; 6、备份控制文件,26,8.2.5 显示重做日志信息,对于DBA而言,可能经常要查询重做日志文件,以了解其使用情况。要了解Oracle数据库的日志文件信息,可以查询下表所示的数据字典视图和动态性能视图。,27,8.3 管理归档日志,归档日志是非活动重做日志的备份。通过使用归档日志,可以保留所有重做历史记录。当数据库处于ARCHIVELOG模式并进行日志切换时,后台进程A
19、RCH会将重做日志的内容保存到归档日志中。当数据库出现介质故障时,使用数据文件的备份、归档日志和重做日志可以完成数据库的完全恢复。,28,8.3.1 日志操作模式,日志操作模式是指Oracle数据库处理重做日志的方式,它决定了是否保存重做日志,以保留重做日志所记载的事务变化。Oracle数据库包括非归档日志(NOARCHIVELOG)模式和归档日志(ARCHIVELOG)模式。,29,8.3.1 日志操作模式,非归档日志(NOARCHIVELOG)模式:1、 当检查点完成之后,后台进程LGWR可以覆盖原来的重做日志内容。2、 如果数据库备份后的重做日志内容已经被覆盖,那么当出现数据文件损坏时只
20、能恢复到过去的完全备份点。 归档日志(ARCHIVELOG)模式: 1、如果发生磁盘介质损坏,则可以使用数据库备份与归档重做日志恢复已经提交的事务,保证不会发生任何数据丢失。 2、利用归档日志文件,可以实现使用数据库打开状态下创建的备份文件来进行数据库恢复。 3、如果为当前数据库建立一个备份数据库,通过持续地为备份数据库应用归档重做日志,可以保证源数据库与备份数据库的一致性。,30,8.3.2 控制归档,在安装Oracle 11g时,默认为数据库运行在非归档模式下,这样可以避免在创建数据库的过程中对生成的重做日志进行归档。当数据库开始正常运行后,就可以将它切换到归档模式中。要将数据库在归档模式
21、与非归档式之间进行切换,需要使用带ARCHIVELOG或NOARCHIVELOG子句的ALTER DATABAS语句。,31,8.3.2 控制归档,1、检查当前日志操作模式Select log_mode from v$database;2、关闭数据库,装载数据库shutdown immediate;startup mount;3、改变日志操作模式,打开数据库Alter database archivelog;Alter database open;4、查看模式Archive log list; 配置归档进程:Alter system set log_archive_max_processes=
22、5;,32,8.3.3 配置归档文件格式,当数据库处理ARCHIVELOG模式时,如果进行日志切换,后台进程将自动生成归档日志。归档日志的默认位置为%ORACLE_HOEM%RDBMS,在Oracle 11g中,归档日志的默认文件名格式为ARC%S%_%R%T。为了改变归档日志的位置和名称格式,必须改变相应的初始化参数。alter system set log_archive_format=$s_%t_%r.arcscope=spfile;shutdown immedidate;startup;,33,8.3.4 配置归档位置,归档日志文件保存的位置称为“归档目标”,档目标在初始化参数中进行设
23、置。DBA可以为数据库设置多个归档目标,不同的归档目标最好位于不面的磁盘中,以分布归档时磁盘的I/O操作。alter system setlog_archive_dest_1=location=d:oracledataarchive1;,34,8.3.5 显示归档日志信息,查询关于归档的信息有两种方法:一种是使用数据字典和动态性能视图;使用ARCHIVE LOG LIST命令。在SQL*Plus中执行ARCHIVE LOG LIST命令,将显示当前数据库的归档信息。,35,8.4 查看日志信息,在重做日志文件中记录了数据库中曾经过发生过的操作,当对重做日志进行了归档后,所有已经执行的操作都将被
24、记录在案。DBA可以利用这些归档日志将数据库恢复到任意时刻的状态,还可以利用一些工具对日志进行分析,以便对数据库操作进行跟踪和统计分析。,36,8.4.1 LogMiner概述,使用LogMiner工具可以对重做日志文件或归档重做日志文件进行分析,以便DBA对数据库用户的操作进行审计,或者撤销数据库中已经执行过的、指定的操作。此外,DBA还能够通过分析日志文件来追踪某个用户的所有操作,或者追踪某个数据库对象的变更过程,并且由引生成统计信息。,37,8.4.2 LogMiner分析过程,一、安装logminer d:appadministratorproduct11.1.0db_1rdbmsad
25、mindbmslmd.sql; d:appadministratorproduct11.1.0db_1rdbmsadmindbmslm.sql; 二、创建字典文件 1、确认初始化参数utl_file_dir,并确认oracle对目录拥有读写权限,然后启动实例。show parameter utl; 2、alter system set utll_file_dir=e:orcldata;ogminer scope=spfile; 3、重启数据库 startup 4、 创建字典文件 Execute dbms_logmnr_d.bulid(e:orcldatalogminersqltrace.ora
26、,e:orcldatalogminer);,38,8.4.2 LogMiner分析过程,三、指定分析的日志文件 创建日志列表Execute dbms_logmnr.add_logfile(logfilename=d:appuseroradataorclredo01.log,options=dbms_logmnr.new); 增加日志文件Execute dbms_logmnr.add_logfile(logfilename=d:appuseroradataorclredo02.log,options=dbms_logmnr.addfile); 删除日志文件Execute dbms_logmnr.
27、add_logfile(logfilename=d:appuseroradataorclredo01.log,options=dbms_logmnr.removefile);,39,8.4.2 LogMiner分析过程,四、启动LogMiner字典文件e:orcldatalogminersqltrace.ora: execute dbms_logmnr.start_logmnr(dictfilename=e:orcldatalogminersqltrace.ora); 五、查看分析结果 Select operation,sql_redo from v$logmnr_contents; Select sql_redo from v$logmnr_contents where username=SCOTT and table_name=EMP; 六、结束logminer Execute dbms_logmnr.end_logmnr;,40,8.4.3 结束LogMiner,过程DBMS_LOGMNR.END_LOGMNR将终止日志分析事务,并且释放PGA内存区域,分析结果也将随之不再存在。如果没有执行该过程,则LogMiner将保留所有它分配的资源,直到启动LogMiner的会话结束为止。,41,