Oracle 增加重做日志
Oracle物化视图定时全量刷新导致归档日志骤增

Oracle物化视图定时全量刷新导致归档⽇志骤增⼀、问题描述 某项⽬组来电,说有⼀个源表约2万多条的物化视图,每5分钟定时全量(Complete)刷新⼀次,⼀天下来,导致Oracle数据库归档⽇志骤增。
⼆、问题分析及解决 先明确⼀个问题:归档⽇志(Archive Log)和重做⽇志(REDO Log)的关系。
Oracle的重做⽇志是⼀组(或⼏组)⽂件,按⼀定的规则顺序循环写,当重做⽇志写满后,从头开始写之前,如果数据库在归档模式(Archive),则在重写之前,需要把当前的重做⽇志进⾏归档(Archive),形成归档⽇志。
即归档⽇志来⾃于重做⽇志。
基于此,可以通过减少产⽣重做⽇志的量来达到减少归档⽇志量的⽬的。
综合⼀下: 1、不要全量刷新,采⽤在源表上记录物化视图⽇志的⽅式,实现快速刷新,减少更新的数据量,达到减少重做⽇志的⽬的; 2、指定物化视图为nologging模式 3、减少或取消其上的索引(2W条记录,如果使⽤得⽐较频繁,甚⾄可以考虑把它cache到内存中) 4、如果⼀定要有索引,⾃⼰写刷新的Job,先disable索引,然后刷新,然后重建索引(唯⼀索引可能有问题)。
5、评估业务、技术要求,考虑取消物化视图,建⽴⼀般视图,在访问该视图时,直接从源表中查询。
三、验证过程 验证全量刷新的物化视图产⽣的REDO⽇志的⼤⼩:-- 建⽴源表create table big_table as select * from dba_objects;-- 我机器上(11g),⼤概8W条记录select count(*) from big_table;/*开始验证全量刷新产⽣的REDO⽇志的量*/-- 建⽴物化视图create materialized view big_table_mv as select * from big_table;-- 查看⽬前REDO⽇志的量(重新启动数据库会⾃动清理)-- 记录下数值,⽤于接下来的⽐较select , b.value from v$statname a, v$mystat b where a.statisti = b.statistic# and = 'redo size';--243964-- ⼿⼯全量刷新物化视图begindbms_mview.refresh( 'BIG_TABLE_MV', 'C' );end;-- 再查看REDO⽇志的量,⽐较⼀下-- 记录下数值,⽤于接下来的⽐较select , b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and = 'redo size';--value:38845196--diff:38601232,增加了约37M-- 还是⽐较可观的-- 把物化视图改为nologging模式alter table big_table_mv nologging;-- 再全量刷新begindbms_mview.refresh( 'BIG_TABLE_MV', 'C' );end;-- 再查看REDO⽇志的量,⽐较⼀下-- 记录下数值,⽤于接下来的⽐较select , b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and = 'redo size';--value:77495608--diff:38894376,增加了约37M,全量刷新时,指定nologging没有什么效果喔。
Oracle添加和删除联机重做日志文件

Oracle添加和删除联机重做日志文件作者:雨竹清风数据库管理员应该在每个重做日志组中保证至少两个,以防止重做日志的物理错误。
创建重做日志文件的命令为:alter database add logfile member‘路径’to group 组号;示例如下:SQL>desc v$logfile;名称是否为空?类型-----------------------------------------------------------------------------GROUP#NUMBERSTATUS VARCHAR2(7)TYPE VARCHAR2(7)MEMBER VARCHAR2(513)IS_RECOVERY_DEST_FILE VARCHAR2(3)SQL>col member for a50SQL>select GROUP#,STATUS,TYPE,MEMBER from v$logfile;GROUP#STATUS TYPE MEMBER--------------------------------------------------------------------------3ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG2ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG1ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOGSQL>alter database add logfile member 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01b.LOG'to group1;数据库已更改。
添加后查询一下是否成功。
oracle 重做日志文件

重做日志文件重做日志文件记录的两类数据:1.修改前的数据2.修改后的数据当满足一定条件时先将修改操作所产生的重做记录写入重做日志文件中,然后才将内存中的修改结果成批的写入数据文件,最后在提交事务重做日志文件是由重做记录组成的,重做记录是由修改向量组成的。
当用户执行一条update 语句对某一个表中的记录进行修改时,会生成一条记录,这条记录用多个向量记录下了被这条语句修改过的各个db块中的信息。
重做记录采用循环的方式在SGA区的重做日志缓存区中进行缓冲,并且由后台进程LGWR 写入到其中的某个重做日志文件中。
用户无论何时提交事务,LGWR都会将该事务的重做记录从SGA的重做日志缓存区写入到某个重做日志文件中,并且为提交的每个事务分别分配一个识别重做记录的系统修改编号。
只有当与已知事务相关的所有重做记录都安全的写入重做日志文件后,用户进程才被告之已经提交。
LGWR进程在开始写入下一个重做日志文件之前,必须确保这个即将覆盖的重做日志文件已经完成了如下的工作:1.如果数据库处于“非归档日志模式(noarchivelog)”,则该重做日志文件中的所有重做记录所对应的修改结果,必须全部被写入到数据文件中。
2.如果数据库处于“归档日志模式(archivelog)”,则该重做日志文件中的所有重做记录所对应的修改结果,必须全部被写入到数据文件中,并且归档进程ARCH已经将该重做日志文件进行了归档。
活动的,非活动的,当前的联机重做日志文件LGWR当前写入的重做日志文件称为当前的联机重做日志文件,例程恢复时需要的重做日志文件称为活动的重做日志文件,例程恢复时不需要的重做日志文件称为非活动的重做日志文件。
如果已经能够进行归档,oracle就不能重新使用或重写活动的重做日志文件,知道ARCH 存储了这个文件的内容。
如果不能进行归档,当最后一个重做日志文件被填满是时,将通过重写的方法继续使用第一个可用的活动重做日志文件。
日志切换1.当一个重做日志文件被完全填满,必须填写下一个联机重做日志文件2.手动强制执行日志切换强制切换日志,需要有alter system权限,使用alter system switch logfile强制切换日志顺序号没次发生日志切换和LGWR开始进行填写时,oracle都会为每个联机重做日志文件分配一个新的日志序列号重做日志文件的归档归档就是在重做日志文件被覆盖之前,将该重做日志文件通过复制操作系统文件的方式,保存到指定的位置。
Oracle数据库启动与关闭各种方式详解整理

Oracle数据库启动与关闭各种⽅式详解整理概述只有具备sysdba和sysoper特权的⽤户才能启动和关闭。
在启动数据库之前应该启动监听程序,否则就不能利⽤命令⽅式来管理数据库,包括启动和关闭数据库。
虽然数据库正常运⾏,但如果没有启动监听程序,客户端就不能连接到数据库。
在oracle⽤户下:启动监听程序 lsnrctl start 关闭监听程序lsnrctl stop查询监听程序状态lsnrctl statusstartup⽀持参数STARTUP options | upgrade_optionsoptions为:[FORCE] [RESTRICT] [PFILE=filename] [QUIET] [ MOUNT [dbname]| [ OPEN [open_options] [dbname] ] | NOMOUNT ],NOMOUNT、MOUNT、OPEN为startup的三个阶段,不能在命令中同时存在。
其中,open_options为:READ {ONLY| WRITE [RECOVER]} | RECOVER。
upgrade_options为:[PFILE=filename] {UPGRADE | DOWNGRADE} [QUIET]的完整启动过程包含以下3个步骤:简单地说,就是:启动实例-->加载数据库-->打开数据库.------------------------------------------------------------------------------------------------------------------1.创建并启动与数据库对应的实例。
在启动实例时,将为实例创建⼀系列后台进程和服务进程,并且在内存中创建SGA区等内存结构。
在实例启动的过程中只会使⽤到初始化参数⽂件,数据库是否存在对实例的启动没有影响。
如果初化参数设置有误,实例将⽆法启动。
ORACLE新增记录更新记录

ORACLE新增记录更新记录在ORACLE数据库中,新增记录和更新记录是两个主要的操作。
新增记录是将新的数据插入到数据库中,而更新记录是修改现有数据的内容。
下面将详细介绍如何在ORACLE中进行新增记录和更新记录的操作。
新增记录:在ORACLE数据库中新增记录有以下几种方式:1.使用INSERTINTO语句:INSERTINTO是最常用的新增记录的方法。
语法如下:```sqlINSERT INTO table_name (column1, column2, column3, ...)VALUES (value1, value2, value3, ...);```其中,table_name是要插入记录的表名,column1, column2, column3是要插入记录的列名,value1, value2, value3是要插入的值。
例如,要向名为"employees"的表中新增一条员工记录,可以使用以下语句:```sqlINSERT INTO employees (employee_id, first_name, last_name, hire_date)VALUES (1, 'John', 'Doe', SYSDATE);```这将向"employees"表中插入一行包含员工ID为1,名为"John",姓为"Doe",雇佣日期为当前日期的记录。
2.使用SELECTINTO语句:SELECTINTO语句可以从一个表中选择数据并插入到另一个表中。
语法如下:```sqlSELECT column1, column2, column3, ...INTO new_tableFROM old_tableWHERE condition;```其中,column1, column2, column3是要插入的列名,new_table是要插入记录的表名,old_table是要选择数据的表名,condition是选择数据的条件。
Oracle 改变重做日志位置或名称

Oracle 改变重做日志位置或名称在所有后台进程中,LGWR进程活动最为频繁,它需要不断地将事务变化由重做日志缓冲区写入重做日志中。
在数据库文件、控制文件和重做日志这3种文件中,重做日志的I/O操作最频繁。
为了提高I/O性能,应将重做日志分布到I/O操作相对较少、速度最快的磁盘设备上。
规划重做日志时,应将同一个日志组的不同日志成员尽可能地分布到不同磁盘上,以防止磁盘损坏而导致所有日志成员丢失。
例如,假设在初始阶段,日志组二中的日志成员被放在同一块磁盘上,但是后来出于完全和性能方法的考虑,DBA为服务器新增加了一块磁盘,并且将日志组二中的一个日志成员移动到新磁盘上,此时就需要改变该日志成员的存放位置。
下面修改重做日志文件的名称和位置的具体操作步骤如下:(1)关闭数据库。
SQL> connect /as sysdbaSQL> shutdown(2)复制或移动日志成员到目标位置。
当闭数据库后,DBA就可以使用操作系统命令复制或移动日志成员到新位置。
例如,修改原日志文件的名称。
(3)重新启动数据库实例,加载数据库,但是不打开数据库。
SQL> startup mount;(4)使用带RENAME FILE子句的ALTER DATABASE语句重新设置重做日志文件的路径和名称。
SQL> alter database rename file2 'd:\app\Administrator\oradata\orcl\redo03.log',3 'd:\app\Administrator\oradata\orcl\redo02.log',4 'd:\app\Administrator\oradata\orcl\redo01.log'5 to6 'd:\app\Administrator\oradata\orcl\redo03a.log',7 'd:\app\Administrator\oradata\orcl\redo02a.log',8 'd:\app\Administrator\oradata\orcl\redo01a.log';数据库已更改。
OracleOracle日志分类

Oracle-归档日志详解(运行模式、分类)一、Oracle日志分类分三大类:Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和redo log 重做日志(记录数据库的更改)。
本文主要关注Oracle的重做日志。
重做日志分为在线重做日志和归档重做日志。
online Redo log files--在线重做日志,又称联机重做日志,指Oracle以SQL脚本的形式实时记录数据库的数据更新,换句话说,实时保存已执行的SQL脚本到在线日志文件中(按特定的格式)。
Archive Redo log files--归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。
重做日志的简单原理:在数据更新操作commit前,将更改的SQL脚本写入重做日志。
主要用于数据库的增量备份和增量恢复。
重做日志直接对应于硬盘的重做日志文件(有在线和归档二种),重做日志文件以组(Group)的形式组织,一个重做日志组包含一个或者多个日志文件。
二、关于在线重做日志(online redo log)在线重做日志的原理:对于在线重做日志,Oracle 11g默认对于每个数据库实例,建立3个在线日志组,每组一个日志文件,文件名称为REDO01.LOG,REDO02.LOG和REDO03.LOG。
(用户可以通过视图操作添加/修改/删除日志组和日志文件来自定义在线重做日志)每组内的日志文件的内容完全相同,且保存在不同的位置,用于磁盘日志镜像,以做多次备份提高安全性。
默认情况这3组通常只有一组处于活动状态,不断地同步写入已操作的脚本,当日志文件写满时(达到指定的空间配额),如果当前数据库处于归档模式,则将在线日志归档到硬盘,成为归档日志;若当前数据库处于非归档模式,则不进行归档操作,而当前在线日志的内容会被下一次重新写入覆盖而无法保存。
因此,通常数据库在运行时,是处于归档模式下的,以保存数据更新的日志。
oracle日志文件

分类:Oracle 体系结构2010-07-20 14:11 2259人阅读评论(5) 收藏举报--=========================================-- Oracle 联机重做日志文件(ONLINE LOG FILE)--=========================================一、Oracle中的几类日志文件Redo log files -->联机重做日志Archive log files -->归档日志Alert log files -->告警日志Trace files -->跟踪日志user_dump_dest -->用户跟踪日志backupground_dump_dest -->进程跟踪日志--查看后台进程相关目录SQL> show parameter dumpNAME TYPE VALUE------------------------------------ -----------------------------------------background_core_dump string partialbackground_dump_dest string/u01/app/oracle/admin/orcl/bdumpcore_dump_dest string/u01/app/oracle/admin/orcl/cdumpmax_dump_file_size string UNLIMITEDshadow_core_dump string partialuser_dump_dest string/u01/app/oracle/admin/orcl/udump关于Oracle 常用目录及路径请参考:Oracle 常用目录结构(10g)关于Oracle 体系结构请参考:Oracle实例和Oracle数据库(Oracle体系结构)二、联机重做日志的规划管理1.联机重做日志记录了数据的所有变化(DML,DDL或管理员对数据所作的结构性更改等)提供恢复机制(对于意外删除或宕机利用日志文件实现数据恢复)可以被分组管理2.联机重做日志组由一个或多个相同的联机日志文件组成一个联机重做日志组至少两个日志组,每组一个成员(建议每组两个成员,分散放开到不同的磁盘)由LGWR后台进程同时将日志内容写入到一个组的所有成员LGWR的触发条件在事务提交的时候(COMMIT)Redo Log Buffer 三分之一满Redo Log Buffer 多于一兆的变化记录在DBWn写入数据文件之前3.联机重做日志成员重做日志组内的每一个联机日志文件称为一个成员一个组内的每一个成员具有相同的日志序列号(log sequence number),且成员的大小相同每次日志切换时,Oracle服务器分配一个新的LSN号给即将写入日志的日志文件组LSN号用于唯一区分每一个联机日志组和归档日志处于归档模式的联机日志,LSN号在归档时也被写入到归档日志之中4.日志文件的工作方式日志文件采用按顺序循环写的方式当一组联机日志组写满,LGWR则将日志写入到下一组,当最后一组写满则从第一组开始写入写入下一组的过程称为日志切换切换时发生检查点过程检查点的信息同时写入到控制文件5.联机日志文件的规划总原则分散放开,多路复用日志所在的磁盘应当具有较高的I/O一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求建议使用rdo结尾的日志文件名,避免误删日志文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle 增加重做日志
如果发现LGWR经常处于等待状态,则就需要考虑添加日志组及其成员,一个数据库最多可以拥有MAXLOGFILES个日志组。
增加重做日志是使用ALTER DA TABASE语句完成的,执行该语句时要求用户必须具有ALTER DATABASE系统权限。
1.增加重做日志组
当管理重做日志时,为防止后台进程LGWR等待写入日志组,DBA必须选择合适的日志组个数。
要增加重做日志组,可以使用带ADD LOGFILE子句的ALTER DATABASE语句。
例如,下面的语句向数据库中添加了一个新的重做日志组:
SQL> alter database add logfile
2 ('d:\app\Administrator\oradata\orcl\redo04.log',
3 'e:\oradata\orcl\redo04b.log')
4 size 10m;
数据库已更改。
新增的重做日志组具有两个成员,每个成员文件的大小均为10MB。
一般情况下,日志文件的大小在10MB到50MB之间,Oracle默认的日志文件大小为50MB。
如果在ALTER DA TABASE ADD LOGFILE语句指定GROUP子句,Oracle将自动为新建的重做日志组设置编号,例如:下面的语句可以在创建日志组时指定为第4组:SQL> alter database add logfile group 4
2 ('d:\app\Administrator\oradata\orcl\redo04.log',
3 'e:\oradata\orcl\redo04b.log')
4 size 10m;
数据库已更改。
使用组号可以更加方便地管理重做日志组,但是,对日志组的编号必须为连续的,不要跳跃式地指定日志组编号。
也就是说,不要将组号编为10,20,30等这样不连续的数。
否将会耗费数据库控制文件中的空间。
如果要创建一个非复合的重做日志文件,则可以使用如下的语句:
alter database add logfile
'd:\app\Administrator\oradata\orcl\redo01.log' reuse;
如果要创建的日志文件已经存在,则必须在ALTER DTABASE语句中使用REUSE子句,覆盖已有的操作系统文件。
在使用了REUSE的情况下,不能再使SIZE子句设置重做日志文件的大小,重做日志文件的大小将由已存在日志文件的大小决定。
2.创建日志成员文件
建立日志组时,至少要为日志组指定一个日志成员。
为了防止日志成员损坏而导致日志组无法使用,Oracle建议每个日志组至少包含两个或两个以上的日志成员。
如果日志组只有一个日志成员,并且该日志成员出现损坏,那么当后台进程LGWR切换到该日志组时,Oracle 会停止工作,并对该数据库执行不完全恢复。
为重做日志组添加新的成员时,只需要使用带ADD LOG MEMBER子句的ALTER DA TABASE语句即可。
例如,下面示例为第1组重做日志添加了一个新的成员日志文件:SQL> alter database add logfile member
2 'e:\oradata\orcl\redo01b.log' to group 1;
数据库已更改。
此外,也可以通过指定重做日志组中的其他成员的名称,以确定要添加的成员所属的重做日志组。
例如,下面的语句为第2组添加一个新成员:
SQL> alter database add logfile member
2
'e:\oradata\orcl\redo02b.log' to
3 ('d:\app\Administrator\oradata\orcl\redo02.log'); 数据库已更改。
注意为日志组添加新的成员时,必须指定文件名,但是不可以指定大小,新成员的大小是由组中其他成员的大小决定。