当前位置: 首页 > news >正文

oracle日志管理

oracle 日志管理
一: Active (Current) and Inactive Redo Log File(当前活动和非活动的日志文件)
active(current):Redo log files that are required for instance recovery are called active redo log files
实例恢复需要该日志就叫活动的,或者叫当前的重做日志文件
inactive:Redo log files that are no longer required for instance recovery are called inactive redo log files
实例恢复时不需要的日志就叫inactive日志
二:Log Sequence Numbers
当发生日志切换并且lgwr后台进程开始写该日志文件,oracle数据库便给该日志文件分配一个新的日志序列号。
当数据库归档了该日志文件,则归档日志将会保有该日志序列号。
在线日志,或者归档日志被日志序列号唯一标识,当实例crash或者需要介质恢复时,数据库使用日志序列号以升序方式应用重做日志文件和必须的归档日志文件。
三:Creating Redo Log Groups
采用默认组号
ALTER DATABASE
ADD LOGFILE ('/oracle/CRM2/CRM/redo4a.log', '/oracle/CRM2/CRM/redo4b.log') SIZE 200M;
采用指定组号 (注意为了好管理不要跳跃性的指定你的组号)
ALTER DATABASE 
ADD LOGFILE GROUP 10 ('/oracle/CRM2/CRM/redo10a.log', '/oracle/CRM2/CRM/redo10b.log')
SIZE 200M;
四:Creating Redo Log Members
添加一个日志成员到日志组号2 注意事项:
必须指定日志文件名。
文件大小不需要指定,文件大小取决于已存在日志组指定的大小。
新日志成员的状态会从新添加时候的invalid到第一次使用时变为active
语句:
ALTER DATABASE ADD LOGFILE MEMBER '/oracle/CRM2/CRM/redo2b.log' TO GROUP 2;
五:Relocating and Renaming Redo Log Members(迁移和重命名日志成员)
重命名日志成员步骤:
步骤1: Shutdown the database.
shutdown immediate
步骤2: Copy the redo log files to the new location.
The following example uses operating system commands (UNIX) to move the 
redo log members to a new location:
mv /source/log1a.rdo /ddestination/log1c.rdo
mv /source/log2a.rdo /destination/log2c.rdo
步骤3: Startup the database。
startup mount
步骤4: Rename the redo log members.
alter database
rename file  '/source/log1a.rdo', '/source/log2a.rdo' 
           to '/destination/log1c.rdo', '/destination/log2c.rdo';
步骤5:Open the database for normal operation.
The redo log alterations take effect when the database is opened.
alter database open
六:Dropping Redo Log Groups and Members
drop log group(restrictions):删除重做日志组的限制条件
限制一:instance 要求至少两个组,而不管组内成员个数
限制二:你可以丢弃一个状态为inactive状态的重做日志组,如果要丢弃当前的日志组,必须手动切换日志组
限制三:如果是归档模式,确定丢弃重做日志组之前,成员已经被归档,通过视图v$log 进行检查
select group#,archived,status from v$log;
    GROUP# ARC STATUS
---------- --- ----------------
         1 YES INACTIVE
         2 NO  CURRENT
         3 YES INACTIVE
         4 YES UNUSED
        10 YES UNUSED
语句:ALTER DATABASE DROP LOGFILE GROUP xx; 注意,该命令实际上不删除日志文件,需要用操作系统命令删除。
Dropping Redo Log Members
限制一:drop的日志成员不能是当前组或者活动组的成员
限制二:drop之前确保日志成员已经归档,如果数据库是归档模式的话
限制三:drop的成员属于活动日志组,则必须 force a log switch
语句:ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo';
七:Forcing Log Switches
语句:alter system switch logfile;
八: Clearing a Redo Log File
当数据库一直open时,可能会出现日志损坏,最终挂起数据库,alter database clear logfile 语句能够用于重新初始化这个日志文件。
ALTER DATABASE CLEAR LOGFILE GROUP 3;
如果该日志文件没有归档,则
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;
九:oracle是如何切换日志的?
当前日志状态如下( 注意红色部分,当前日志序列号最大是42,而日志组6中序列号最小为37
SQL> select group#,sequence#,archived,status from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
           1         38 YES INACTIVE
         2         40 YES INACTIVE
         3         41 YES INACTIVE
          4         42 NO  CURRENT
         5         39 YES INACTIVE
         6         37 YES INACTIVE
切换日志组:
SQL> alter system switch logfile;
System altered.
再查询日志组状态:
SQL> select group#,sequence#,archived,status from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1         38 YES INACTIVE
         2         40 YES INACTIVE
         3         41 YES INACTIVE
         4         42 YES ACTIVE
         5         39 YES INACTIVE
         6         43 NO  CURRENT
总结:oracle总是找日志组中sequence#字段值为最小的日志组,做为下一个当前日志组。
十:重做日志恢复(见如下例1、例2、例3)
例1:数据库处于open状态,意外丢失inactive日志组所有成员
运行如下命令,不过该命令执行后,日志文件状态处于unuse状态,需要重启数据库 日志组才能真正生效。
ALTER DATABASE CLEAR LOGFILE GROUP 3;
或者重建日志文件
SQL> alter database drop logfile group 3;
Database altered.
SQL> alter database add logfile group 3 '/oracle/CRM2/CRM/redo03.log' size 200m  reuse;
Database altered.
SQL> select group#,archived,status from v$log;
    GROUP# ARC STATUS
---------- --- ----------------
         1 YES INACTIVE
         2 NO  CURRENT
         3 YES UNUSED
例2:如果数据库关闭,再open时出现日志组所有成员丢失的情况有如下两种情景:
情景一:非活动日志组所有成员全部损毁
关闭前日志状态如下
SQL> select group#,archived,status from v$log;
    GROUP# ARC STATUS
---------- --- ----------------
         1 YES INACTIVE
         2 YES INACTIVE
          3 NO  CURRENT
当数据库关闭后,打开数据库提示
SQL> startup
ORACLE instance started.
Total System Global Area  322961408 bytes
Fixed Size                  2020480 bytes
Variable Size              92277632 bytes
Database Buffers          222298112 bytes
Redo Buffers                6365184 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/oracle/CRM2/CRM/redo01.log'

当前数据库状态
SQL> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
当前日志状态如下所示:
SQL> select group#,archived,status from v$log;
    GROUP# ARC STATUS
---------- --- ----------------
          1 YES INACTIVE
         3 NO  CURRENT
         2 YES INACTIVE
查询redo01.log所在的日志组如下所示:
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- ----------------------------------------
         3 /oracle/CRM2/CRM/redo03.log
         2 /oracle/CRM2/CRM/redo02.log
          1 /oracle/CRM2/CRM/redo01.log
         2 /oracle/CRM2/CRM/redo2b.log
运行alter database clear logfile group 1 重新初始化创建日志组1如下所示:
SQL> alter database clear logfile group 1;
Database altered.
重新打开数据库如下:
SQL> alter database open;
Database altered.
SQL> select open_mode from v$database;
OPEN_MODE
----------
READ WRITE
情景二:数据库open时当前联机日志文件丢失
SQL> startup
ORACLE instance started.
Total System Global Area  322961408 bytes
Fixed Size                  2020480 bytes
Variable Size              92277632 bytes
Database Buffers          222298112 bytes
Redo Buffers                6365184 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/oracle/CRM2/CRM/redo01.log'
查询当前数据库日志状态发现当前日志组1所有成员丢失如下所示:
SQL> select group#,archived,status from v$log;
    GROUP# ARC STATUS
---------- --- ----------------
          1 NO  CURRENT
         3 YES INACTIVE
         2 YES INACTIVE
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- ----------------------------------------
         3 /oracle/CRM2/CRM/redo03.log
         2 /oracle/CRM2/CRM/redo02.log
          1 /oracle/CRM2/CRM/redo01.log
         2 /oracle/CRM2/CRM/redo2b.log
此时数据库启动状态如下:   
SQL> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
此时若执行 clear unarchived logfile会报如下错误:
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/oracle/CRM2/CRM/redo01.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
由于关闭数据库之前数据文件处于一致性状态所以执行基于取消的不完全恢复。
SQL>  recover database until cancel;
Media recovery complete.
用resetlogs打开数据库时自动创建丢失的日志文件
SQL>  alter database open resetlogs;
Database altered.
SQL> select group#,member from v$logfile;
    GROUP# MEMBER
---------- ----------------------------------------
         3 /oracle/CRM2/CRM/redo03.log
         2 /oracle/CRM2/CRM/redo02.log
         1 /oracle/CRM2/CRM/redo01.log
         2 /oracle/CRM2/CRM/redo2b.log
例3:数据库处于open状态意外丢失当前联机日志
当前数据库日志状态如下:
SQL> select group#,archived,status from v$log;
    GROUP# ARC STATUS
---------- --- ----------------
         1 NO  CURRENT
         2 YES INACTIVE
         3 YES INACTIVE
删除当前日志如下
[root@oracle CRM]# rm -rf redo01.log
切换当前日志组,触发报错,错误信息位于alert文件中如下:
SQL> alter system switch logfile;
System altered.
ORA-16038: log 1 sequence# 20 cannot be archived
ORA-00312: online log 1 thread 1: '/oracle/CRM2/CRM/redo01.log'
Wed Oct 17 01:50:35 2012
SQL> alter database clear unarchived logfile group 1;   ( 注意这里,如果是非当前日志组丢失则删除日志组后直接重建即可,不需要运行此命令处理)
Database altered.
SQL> select group#,archived,status from v$Log;
    GROUP# ARC STATUS
---------- --- ----------------
         1 YES UNUSED
         2 YES INACTIVE
         3 NO  CURRENT
   
此时需要注意:
1  如果直接drop当前日志组直接重建会报如下错误
SQL> alter database drop logfile group 1;
alter database drop logfile group 1
*
ERROR at line 1:
ORA-00350: log 1 of instance CRM (thread 1) needs to be archived
ORA-00312: online log 1 thread 1: '/oracle/CRM2/CRM/redo01.log'
2  clear unarchived logfile group 1 后,日志组1数据库还不能使用,需要重新启动数据库或者重建日志组1
重建步骤如下:
SQL> alter database drop logfile group 1;
Database altered.
SQL> alter database  add logfile group 1 '/oracle/CRM2/CRM/redo01.log' size 200m reuse;
Database altered.









本文转自 zhangxuwl 51CTO博客,原文链接:http://blog.51cto.com/jiujian/1031329,如需转载请自行联系原作者

相关文章:

  • 关于git的一些想法
  • TCP协议详解(理论篇)
  • STM 32 IAP(对flash进行读写)
  • [C++][基础]1_变量、常量和基本类型
  • 安装cacti
  • ubuntu 之is not in the sudoers file
  • 我看.NET的瓶颈期
  • zookeeper的高可用部署
  • linux 安装jdk
  • [SQL调优] Maclean讲SQL调优精要
  • (转)linux 命令大全
  • Android Activity的生命周期
  • left join的多重串联与groupby
  • 线性结构之数组
  • js,query 选择radio+选中select+checkbox选中
  • 【mysql】环境安装、服务启动、密码设置
  • 【刷算法】求1+2+3+...+n
  • 345-反转字符串中的元音字母
  • Create React App 使用
  • Docker 笔记(2):Dockerfile
  • Golang-长连接-状态推送
  • happypack两次报错的问题
  • JavaScript设计模式与开发实践系列之策略模式
  • Java面向对象及其三大特征
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • node学习系列之简单文件上传
  • October CMS - 快速入门 9 Images And Galleries
  • Python 基础起步 (十) 什么叫函数?
  • Swift 中的尾递归和蹦床
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 浮动相关
  • 关于字符编码你应该知道的事情
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 通信类
  • 项目管理碎碎念系列之一:干系人管理
  • 小程序开发之路(一)
  • 学习笔记:对象,原型和继承(1)
  • 一个完整Java Web项目背后的密码
  • Android开发者必备:推荐一款助力开发的开源APP
  • hi-nginx-1.3.4编译安装
  • (2022 CVPR) Unbiased Teacher v2
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (算法)N皇后问题
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)linux 命令大全
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)从 Java 代码到 Java 堆
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码