归档日志(archive log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于archivelog模式并进行日志切换式,后台进程arch会将重做日志的内容保存到归档日志中.当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库.
日志操作模式:archivelog noarchivelog
1,改变日志操作模式:
检查当前日志操作模式
select log_mode from v$database;
关闭数据库,然后装载数据库
shutdown immediate
startup mount
改变日志操作模式,然后打开数据库
alter database archivelog;
alter database open;
2,执行手工归档
从oracle database 10g开始,当将日志操作模式转变未archivelog模式时,oracle会自动启动arch进程.如果要使用手工归档.那么在改变日志操作模式时必须使用命令alter database archivelog manual.
需要注意,使用手工归档方式,数据库管理员必须手工执行归档命令.如果没有执行手工归档命令,日志组的原有内容将不能被覆盖.alter database archivelog manual 命令是为了与先前的版本兼容而保留的,.将来的oracle版本会淘汰该命令,使用手工归档方式是,数据库管理员可以执行以下命令归档重做日志:
alter system archivelog all;
3,配置归档进程
初始化参数log_archive_max_processes用于指定例程初始启动的最大归档进程个数,当将数据库转变为archivelog模式时,默认情况下oracle会自动启动两个归档进程.通过改变初始化参数log_archive_max_process的值,可以动态地增加或降低归档进程的个数:
alter system set log_archive_max_processes=3;
配置归档位置和文件格式
当数据库处于archivelog模式时,如果进行日志切换,后台进程将自动生成归档日志,归档日志的默认位置为%oracle_home%rdbms,在oracle database 10g中,归档日志的默认文件格式为arc%s_%r.%t.为了改变归档日志的位置和名称格式,必须改变相应的初始化参数,
1,初始化参数log_archive_format用于指定归档日志的文件名格式,设置该初始化参数时,可以指定以下匹配符:
%s: 日志序列号:
%s: 日志序列号(带有前导0)
%t: 重做线程编号.
%t: 重做线程编号(带有前导0)
%a: 活动id号
%d: 数据库id号
%r resetlogs的id值.
从10g开始,配置归档日志文件格式时,必须带有%s,%t和%r匹配符,配置了归档文件格式后,必须重启数据库.
2,使用log_archive_dest配置归档位置
如果不使用备用数据库,只需要将归档日志存放到本地目录.配置本地归档位置可以使用初始化参数log_archive_dest和log_archive_duplex_dest,其中,第一个参数用于设置第一个归档位置,第二个参数用于指定第二个归档位置.
alter system set log_archive_dest='d:demoarchive1';
alter system set log_archive_duplex_dest='d:demoarchive2';
3,使用log_archive_dest_n配置多个归档位置.
初始化参数log_archive_dest_n用于指定多个归档位置,该参数最多可以指定10个归档位置.通过使用初始化参数log_archive_dest_n,不仅可以配置本地归档位置,还可以配置远程归档位置.
如果既要在主节点上生成归档日志,又要将归档日志传递到备用节点,那么必须使用参数log_archive_dest_n.该参数与log_archive_dest具有如下区别;
初始化参数log_archive_dest_n可以配置本地归档位置和远程归档位置,而初始化参数log_archive_dest和log_archive_duplex_dest只能配置本地归档位置.
初始化参数log_archive_dest_n可以配置多达10个归档位置,而初始化参数log_archive_dest和log_archive_duplex_dest最多只能配置两个归档位置.
初始化参数log_archive_dest_n 不能与初始化参数log_archive_dest和log_archive_duplex_dest同时使用.
因为初始化参数log_archive_dest_n不能与初始化参数log_archive_dest和log_archive_duplex_dest同时使用,所以必须禁用初始化参数log_archve_dest和log_archive_duplex_dest.当使用初始化参数log_archive_dest_n配置本地归档位置时,需要指定localtion选项.当配置远程归档位置时,需要指定service选项.
示例如下:
alter system set log_archive_duplex_dest='';
alter system set log_archive_dest='';
alter system set log_archive_dest_1='location=d:demoarchive1';
alter system set log_archive_dest_2='location=d:demoarchive2';
alter system set log_archive_dest_3='location=d:demoarchive3';
alter system set log_archive_dest_4='service=standby';
配置远程归档位置时,service选项需要指定远程数据库的网络服务名(在tnsnames.ora文件中配置)
4,使用log_archive_dest_n选项
使用初始化参数log_archive_dest_n配置归档位置时,可以在归档位置上指定optional或mandatory选项.指定mandatory选项时,可以设置reopen属性.
optional:该选项是默认选项.使用该选项时,无论归档是否成功,都可以覆盖重做日志.
mandatory:强制归档.使用该选项时,只有在归档成功之后,重做日志才能被覆盖.
reopen:该属性用于指定重新归档的时间间隔,默认值为300秒,必须跟在mandatory后.
例:
alter system set log_archive_dest_1=’location=d:demoarchive1 mandatory’;
alter system set log_archive_dest_2=’location=d:demoarchive2 mandatory reopen=500’;
alter system set log_archive_dest_3=’location=d:demoarchive3 optional’;
5,控制本地归档成功的最小个数.
使用初始化参数log_archive_min_succeed_dest控制本地归档的最小成功个数
alter system set log_archive_min_succeed_dest=2;
6,使用初始化参数log_archive_dest_state_n控制归档位置的可用性.设置该参数为enable(默认值),表示会激活相应的归档位置;设置该参数为defer,表示禁用相应归档位置.当归档日志所在磁盘损坏或填满时,dba需要暂时禁用该归档位置.
alter system set log_archive_dest_state_3=defer;(禁用)
alter system set log_archive_dest_state_3=enable;(启用)
显示归档日志信息
1,使用archive log list命令可以显示日志操作模式,归档位置,自动归档机器要归档的日志序列号等信息.
2显示日志操作模式
select name,log_mode from v$database;
3,显示归档日志信息.
col name format a46
select name, swquence#, first_change# from v$archived_log;
name用于表示归档日志文件名,sequence#用于表示归档日志对应的日志序列号,firs_change#用于标识归档日志的起始scn值.
4、执行介质恢复时,需要使用归档日志文件,此四必须准确定位归档日志的存放位置.通过查询动态性能视图v$archive_dest可以取得归档日志所在目录.
select destination from v$archive dest;
5,显示日志历史信息
select * from v$loghist;
thread#用于标识重做线程号,sequnce#用于标识日志序列号,first_change#用于标识日志序列号对应的起始scn值,first_time用于标识起始scn的发生时间.swicth_change#用于标识日志切换的scn值.
6.显示归档进程信息.
进行日志切换时,arch进程会自动将重做日志内容复制到归档日志中,为了加快归档速度,应该启用多个arch进程.通过查询动态性能视图v$archive_processes可以显示所有归档进程的信息!
select * from v$archive_processes;
porcess用于标识arch进程的编号,status用于标识arch进程的状态(active:活动,stopped:未启动),log_sequence用于标识正在进行归档的日志序列号,state用于标识arch进程的工作状态
==========================================
用oracle归档日志进行恢复的方法
用oracle归档日志进行恢复的方法
联机重演日志没有丢失应使用完成恢复,如联机重演日志损坏,而又没有备份,就只能进行不完全恢复。
一、完全恢复:
1.使用命令“svrmgrl”调用行方式服务器管理;
2.输入命令“connect internal”,然后输入命令“startup mount’;
3.输入命令“recover database;”
4.按下enter,接受默认值。
5.然后输入命令“alter database open;”完成数据库恢复。
二、不完全恢复
警告:
应用不完成恢复前,必须将数据库做一次完全冷备份,因为应用不完全恢复后,联机重演日志将重置,以前的所有日志不可用。
如果恢复不成功,数据库就不能使用了。再次强调,做完全冷备份后再应用不完全恢复。
1).基于变化的恢复(change-based recovery)
要执行基于变化的恢复,需要知道丢失日志之前的系统写入归档重演日志的最大的变化号(scn),然后可以启动恢复语句恢复数据库直到改变scn_number,其中比scn_number是写到已归档重演日志文件顺序号386的scn(即,小于丢失日志顺序号387的scn)。可以从v$log_history视图中得到scn信息。
select first_change# from v$log_history where sequence#=387;
其中387为最后一个有效的日志文件号加1,该例是查找386.
知道了scn后,使用下述步骤完成恢复
1.使用命令“svrmgrl”调用行方式服务器管理;
2.输入命令“connect internal”,然后输入命令“startup mount’;
3.输入命令“recover database until change 9999;”
4.在回答oracle第一个归档重演日志建议信息时,输入“auto”,oracle在找到第387号重演日志之前停止恢复。
5.用命令“alter database open resetlogs;”打开数据库。(应用该命令前请确认数据库已备份,如打开失败,日志将不可用)
2).基于停止的恢复(cancel-based recovery)
1.使用命令“svrmgrl”调用行方式服务器管理;
2.输入命令“connect internal”,然后输入命令“startup mount’;
3.输入命令“recover database until cancel;”,oracle提示需要的第一个归档重演日志文件名.按下enter键接受缺省文件名,并且—路enter直到询问顺序号387的日志。输入“cancel”,停止恢复操作。
4.用命令“alter database open resetlogs;”打开数据库。(应用该命令前请确认数据库已备份,如打开失败,日志将不可用)
3).基于时间的恢复(time-based recovery)
为使用基于时间的恢复,必须知道记录在v$log_history归档重演日志序号387(丢失重演日志)的时间,通过执行查询语句“select time from v$log_history where sequence#=387;”得到。本例得到的时间是:2002-06-23 14:42:04
现在开始实施恢复。
1.使用命令“svrmgrl”调用行方式服务器管理;
2.输入命令“connect internal”,然后输入命令“startup mount’;
3.输入命令“recover database until time '2002/06/23 14:42:04';”,oracle提示需要的第一个归档重演日志文件名,输入“auto”,oracle恢复归档重演日志直到序号为387的日志,停止恢复操作。
4.用命令“alter database open resetlogs;”打开数据库。(应用该命令前请确认已数据库已备份,如打开失败,日志将不可用)
提示: 使用基于时间的恢复,时间的格式是yyyy/mm/dd hh24:mi:ss,并且用单引号括起。
附:如何启用oracle的归档方式
1.参照以下内容编辑init.ora文件:
log_archive_start = true
log_archive_dest_1 = " location=d:\oracle\oradata\orcl\archive "
og_archive_format = %%oracle_sid%%t%ts%s.arc
2.关闭数据库
svrmgrl> connect internal
svrmgrl> shutdown normal
3.然后启动实例并安装该数据库,但不打开数据库。
svrmgrl> startup mount
4.接着,发布下列更改数据库的命令。
svrmgrl> alter database archivelog;
5.现在,数据库已经更改为归档方式,您可以打开数据库。
svrmgrl> alter database open;
提示:也可以使用dba studio工具启用数据库的归档方式,操作很简单
=============================================================
oracle归档模式的设置
在oracle 数据库的开发环境和测试环境中,数据库的日志模式和自动归档模式一般都是不设置的,这样有利于系统应用的调整,也免的生成大量的归档日志文件将磁盘空间大量的消耗。但在系统上线,成为生产环境时,将其设置为日志模式并自动归档就相当重要了,因为,这是保证系统的安全性,有效预防灾难的重要措施。这样,通过定时备份数据库和在两次备份间隔之间的日志文件,可以有效的恢复这段时间的任何时间点的数据,可以在很多时候挽回或最大可能的减少数据丢失。
一、 要使oarcle 数据库进行日志的自动归档,需要做两方面的事情;
1.是数据库日志模式的设置(可为archive mode 和no archive mode);2.就是自动归档模式设置(automatic archival,可为enabled 和disabled)。
二、 如何查看数据库的现行日志和自动归档模式的设置
可用archive log list 命令来查看。
运行在日志自动归档模式下的数据库系统查看结果如下(一般是生产环境):
sql> archive log list
database log mode archive mode
automatic archival enabled
archive destination /backup/archivelog
oldest online log sequence 2131
next log sequence to archive 2133
current log sequence 2133
没有启动数据库日志模式和自动归档的数据库系统查看结果如下(一般是测试环境):
sql> archive log list
database log mode no archive mode
automatic archival disabled
archive destination /u01/app/oracle/product/8.1.7/dbs/arch
oldest online log sequence 194
current log sequence 196
三. 数据库日志模式的设置
在创建数据库时,可以在create database 语句中指定数据库的日志模式。假如没有指明,则缺省为noarchivelog 模式。由于如果在创建数据库时指明是archive mode的话,会增加约20%的创建时间,而在以后启动instance 时再设置的话,一般只用去几秒的时间,所以一般在创建数据库时是不设置为archive mode 的。
将数据库的日志模式设置切换(archive mode 和no archive mode 之间的切换)的步骤和操作如下:
1. 关闭运行的数据库实例
sql> shutdown
在进行日志模式切换之前,必须将运行的数据库正常关闭。
2. 备份数据库
该备份跟以后产生的日志一起用于将来的灾难恢复(很重要,如要改为归档日志模式,没有这个数据库备份,仅有日志文件是无法从该时间点恢复的)。
3. 启动数据库实例到mount 状态,但不要打开。
sql> startup mount
4. 切换数据库日志模式。
sql> alter database archivelog;(设置数据库为归档日志模式)或
sql> alter database noarchivelog;(设置数据库为非归档日志模式)
5. 打开数据库
sql> alter database open;
6. 确认数据库现在处于归档日志模式。
sql> archive log list;
database log mode archive mode
automatic archival enabled
archive destination for example: $oracle_home/dbs/arch
oldest on-line log sequence 275
next log sequence 277
current log sequence 278
7. 将这个时间点的redo logs 归档
sql> archive log all;
8. 确认新产生的日志文件已在相应的归档目录下面。
四. 自动归档模式设置(automatic archival,可为enabled 和disabled)。
在该模式下,数据库启动一个arch 进程,专门负责将redo logs 写到系统归档设备的相应目录下。在数据库的参数文件中设置参数(一般是在$oracle_home/dbs/init*.ora 文件中):
log_archive_start=
log_archive_dest=
log_archive_format=
log_archive_start:
如要求自动归档的话,则设为true,如要求为非自动归档的话,则设为false
log_archive_dest:
该参数设定了archive logs 归档存放的路径。
log_archive_format:
该参数设定了archive logs 的命名格式。例如,如将格式设为: arch%s.arc
log 文件将为: arch1.arc, arch2.arc, arch3.arc
这几个参数设置只有在数据库实例启动前设置才能生效,如果在数据库运行中进行设置,要使其生效,必须重起数据库。
如果数据库正在运行中,不能即刻重起,要设置其为自动归档模式,则做如下操作:
sql> alter system archive log start;
如要设置其为非自动归档模式(取消自动归档),则:
sql> alter system archive log stop;
但如果数据库重起后,给语句修改的结果就失效了,自动归档的设置还是按照系统参数文件中的log_archive_start 的值来设置。
五. 几种设置情况:
1. database log mode archive mode,automatic archival enabled
这是在大部分生产环境中的oracle 数据库日志及归档模式设置,这种情况下,做好数据库的定期备份(有热备和冷备)和归档日志备份,可有效的将数据库恢复到有归档日志的全部时间点。
2. database log mode archive mode,automatic archival disabled
这种情况下,数据库不能自动归档,需要进行手工归档。如果所有在线日志都写满了,又没有的及时进行手工归档的话,由于lgwr 没有可用的在线日志可写,数据库将会挂在这儿,只有进行手工归档后,有可用的在线日志后才能继续。在生产环境中应该避免这种情况。
手工归档操作如下:
sql> alter system archive log all;
数据库将会把在线日志进行归档处理
3. database log mode no archive mode,automatic archival enabled
有些情况下,数据库管理员只在数据库参数文件中设置了log_archive_start=true,然后在数据库起来后查看到arch 归档进程已经起来了,可是尽管oracle 已经作了几次日志切换,但还是没有归档日志,这时的设置就是这种情况,如果数据库不是处在arvhivelog 模式,redolog 还是不会被归档。
4. database log mode no archive mode,automatic archival disabled
这种设置是刚安装的oracle 数据库的缺省设置,开发环境也大部分如此。即没有进行归档。
如何手工删除归档日志文件?(如果采用rmna备份后则不用手工删除)
一、先手工删除归档日志文件
二、用rman删除数据库记录的归档列表信息
1) 进入本数据库的rman,在命令行模式输入"rman target /",进入rman,查看提示,确认连接的是否是本库?
2) 查看归档日志文件的状态:
rman> list archivelog all;
3) 删除操作系统中的日志文件(到操作系统级进行手工删除,也可以是第一步;
4) 将归档日志信息进行更新;
rman> crosscheck archivelog all;
rman> delete expired archivelog all; (确认时键入"yes")
rman> exit
=================================================================
9个重要的视图
ref:
1)v$lock
给出了锁的信息,如type字段, user type locks有3种:tm,tx,ul,system type locks有多种,常见的有:mr,rt,xr,ts等。我们只关心tm,tx锁。
当tm锁时,id1字段表示object_id;当tx锁时,trunc(id1/power(2,16))代表了回滚段号。
lmode字段,session持有的锁的模式,有6种:
0 - none
1 - null (null)
2 - row-s (ss)
3 - row-x (sx)
4 - share (s)
5 - s/row-x (ssx)
6 - exclusive (x)
request字段,process请求的锁的模式,取值范围与lmode相同。
ctime字段,已持有或等待锁的时间。
block字段,是否阻塞其它锁申请,当block=1时说明这个session阻塞了别的session。
2)v$sqlarea
共享池中存储的sql和一些相关的信息,如累计的执行次数(executions),逻辑读(buffer_gets),物理读(disk_reads)等统计信息。
根据address和hash_value可以定位一条sql。sql_text字段存的这个sql的前1000个字符。查找整个的sql还需去v$sqltext或者v$sqltext_with_newlines。
3)v$session
所有当前session的信息,包括一些用户信息如username,terminal,program,logon_time等,command字段表示session执行的什么命令。
通过v$session.paddr=v$process.addr跟process相关,通过v$session.taddr=v$transaction.addr跟trancation相关。
通过sid可以到相关视图中查询与这个session相关的各种信息,如v$sesstat中有session的统计信息,v$sess_io中有session的io统计信息,v$session_wait中有session的等待信息,v$session_event中有session在一段时间内所等待的各种事件的信息。
根据lockwait字段可以查询当前正在等待的锁的相关信息:
select * from v$lock where kaddr in (select lockwait from v$session where sid=&sid);
(sql_address,sql_hash_value),(prev_sql_addr,prev_hash_value) 根据这两组字段, 可以查询到当前session正在执行的或者最近一次执行的sql语句的详细信息:
select * from v$sqltext where address = &sql_address and hash_value = &sql_hash_value;
4)v$sesstat
根据session id可以得到这个session的统计信息:
select a.name,b.value
from v$statname a,v$sesstat b
where a.statistic#=b.statistic#
and b.sid=&sid
and b.value <>0
order by b.value;
5)v$session_wait
--这部分抄袭 xzh的blog
根据session id可以得到这个session的等待情况。
event字段表示等待事件。
p1、p2、p3告诉我们等待事件的具体含义,如果wait event是db file scattered read,p1=file_id/p2=block_id/p3=blocks,然后通过dba_extents即可确定出热点对象;如果是latch free的话,p2为闩锁号,它指向v$latch。
p1raw,p2raw,p3raw列对应p1,p2,p3的十六进制值;p1text,p2text,p3text列对应p1,p2,p3列的解释。
--求等待事件及其对应的latch
col event format a32
col name format a32
select sid,event,p1 as file_id, p2 as "block_id/latch", p3 as blocks,l.name
from v$session_wait sw,v$latch l
where event not like '%sql%' and event not like '%rdbms%'
and event not like '%mon%' and sw.p2 = l.latch#( );
--求等待事件及其热点对象
col owner format a18
col segment_name format a32
col segment_type format a32
select owner,segment_name,segment_type
from dba_extents
where file_id = &file_id and &block_id between block_id
and block_id &blocks - 1;
--综合以上两条sql,同时显示latch及热点对象(速度较慢)
select sw.sid,event,l.name,de.segment_name
from v$session_wait sw,v$latch l,dba_extents de
where event not like '%sql%' and event not like '%rdbms%'
and event not like '%mon%' and sw.p2 = l.latch#( ) and sw.p1 = de.file_id( ) and p2 between de.block_id and de.block_id de.blocks - 1;
--如果是非空闲等待事件,通过等待会话的sid可以求出该会话在执行的sql
select sql_text
from v$sqltext_with_newlines st,v$session se
where st.address=se.sql_address and st.hash_value=se.sql_hash_value
and se.sid =&wait_sid order by piece;
6)v$process
根据session id可以查到操作系统进程的信息:
select * from v$process where addr in (select paddr from v$session where sid=&sid );
spid字段是操作系统进程号,可以用来进行 kill -9 spid 这么一个操作。
可以找到 unix命令 top 出来的最耗cpu资源的pid,根据pid最耗资源的sql:
select /* ordered */
sql_text
from v$sqltext a
where (a.hash_value, a.address) in (
select decode (sql_hash_value,
0, prev_hash_value,
sql_hash_value
),
decode (sql_hash_value, 0, prev_sql_addr, sql_address)
from v$session b
where b.paddr = (select addr
from v$process c
where c.spid = '&pid'))
order by piece asc
/
7)v$transaction
根据session id可以查到当前session正在执行的事务信息:
select * from v$transaction where addr in (select taddr from v$session where sid=&sid );
看下面这两个字段可以看到事务进行到什么程度了:
used_ublk
number
number of undo blocks used
used_urec
number
number of undo records used
重复查询这两个值,可以看到变化,可以估计事务的进度,尤其是长时间的回滚操作,当这两个值为0,回滚也就完成了。
8)v$sort_usage
temp表空间的使用情况,当temp表空间变得巨大的时候,根据session_addr可以得到session id,根据sqladdr和sqlhash可以得到正在执行的sql:
select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value)) as space,tablespace,segtype,sql_text
from v$sort_usage su,v$parameter p,v$session se,v$sql s
where p.name='db_block_size'
and su.session_addr=se.saddr
and s.hash_value=su.sqlhash
and s.address=su.sqladdr
order by se.username,se.sid;
9)v$sysstat
所有instance的统计信息。
==========================================================================================