百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle 逻辑结构篇 之 重做日志和归档日志管理(二)

mhr18 2024-09-20 20:52 26 浏览 0 评论

1.2 日志操作

通常,DBA 会在创建数据库时按照计划创建所需重做日志组和各个组成员日志文件。然而在有些情况下,会需要通过手工方式为数据库添加新重做日志组和成员。比如,如果当前某个重做日志组由于某种原因无法使用,DBA 需要创建一个新的重做日志组来代替它进行工作。在另外些情况下,DBA 可能会需要改变现有重做日志文件的名称和位置,或者删除重做日志组或成员。在本节中将介绍上述重做日志文件的基本操作。

1.2.1 增加日志组

要创建一个新的联机重做日志文件组,请使用下面的 SQL 命令:

ALTER DATABASE [database]ADD LOGFILE [GROUP integer] filespec[, [GROUP integer] filespec]...]

可以通过 filespec 来指定成员名称和位置。可以选择每个重做日志文件组的 GROUP 数值。如果省略了该参数,Oracle 服务器自动生成其值

【实例2-1】为数据库增加一个重做日志组,组中包含两个成员,大小为 1M,并查询动态性视图确认增加。

1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
已连接。
2)创建新日志组
SQL> ALTER DATABASE DB01 ADD LOGFILE('d:\oracle\oradata\db01\log4a.rdo','d:\oracle\oradata\db01\log4b.rdo')SIZE 1M;
数据库已更改。
3)查询动态性能性图
SQL> SELECT * FROM V$LOGFILE;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- ----------------------------------
3 STALE ONLINE D:\ORACLE\ORADATA\DB01\REDO03.LOG
2 STALE ONLINE D:\ORACLE\ORADATA\DB01\REDO02.LOG
1 ONLINE D:\ORACLE\ORADATA\DB01\REDO01.LOG
4 ONLINE D:\ORACLE\ORADATA\DB01\LOG4A.RDO
4 ONLINE D:\ORACLE\ORADATA\DB01\LOG4B.RDO

其中 db01 代表数据库名,由于没指定 GROUP 子句,这时 ORACLE 将自动为新建的重做日志组设置组号,一般是当前组后之后递增,因为当前数据库已包含三个日志组,因此,新日志组组号 4,其中包含两个成员,d:\ oracle\oradata\ db01\log4a.rdo 是重做日志组成员所在的路径和名称,SIZE 1M 代表每个成员的大小是 1M. V$LOGFILE 视图包含了重做日志组中所有成员文件的基本信息。

也可以使用 GROUP 子句显式的指定组号。

【实例 2-2】为 Oracle Server 再增加一个重做日志组,组中包含两个成员,大小为 2M.

1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
已连接。
2)创建新日志组
SQL> ALTER DATABASE DB01 ADD LOGFILE GROUP 5('d:\oracle\oradata\db01\log5a.rdo','d:\oracle\oradata\db01\log5b.rdo')SIZE 2M;
数据库已更改。

在使用 GROUP 子句时,需要注意以下两点:

? 重做日志组的组号不能大于 MAXLOGFILES 参数所指定的值。

  • ? 在对重做日志组进行编号时,中间不能有间断。比如,不能将重做日志组依次编号:10,15,20,25,这样会浪费控制文件中文档段的存储空间。

1.2.2 增加日志成员

有时,DBA 可能需要为已有重做日志组添新的成员日志文件,比如,由于某个磁盘损坏,导致每个重做日志组都丢失了一个成员日志文件,这时,需通过手工方式为每重做日志组增加一个新日志成员文件。可以使用下面的 ALTER DATABASE ADD LOGFILE MEMBER命令向现有的重做日志文件组添加新成员,命令格式如下ALTER DATABASE [database]ADD LOGFILE MEMBER [ 'filename' [REUSE][, 'filename' [REUSE]]...TO {GROUPinteger|('filename'[, 'filename']...)}]..

最好使用日志文件成员的绝对路径名;否则将在数据库服务器缺省目录下创建该文件。如果该文件已经存在,其大小必须与指定值相同,并且必须指定 REUSE 选项。可以通过指定一个或多个组内成员或者指定组号来识别目标组。

【实例 2-3】为 Oracle Server 的第四个重做日志组增加一个成员。

1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
已连接。
2)添加新的成员
SQL> ALTER DATABASE DB01 ADD LOGFILE MEMBER'd:\oracle\oradata\db01\log4c.rdo' to GROUP 4;
数据库已更改。

注意:在创建成员日志文件时,不能使用 SIZE 参数来指定重做日志文件的大小,因为新建的重做日志文件必须与组中已有的其它成员具有相同大小。

1.2.3 日志文件重定位

在重做日志文件创建以后,有时还需改变它们名称和位置,假设原来数据库系统中只有一个硬盘,因此重做日志的所有成员都保存在同一个硬盘中,后来又增加一个硬盘,这时可将重做日志组中的一部分成员移动到新的硬盘中。有两种方法可实现重定位或重命名重做日志文件:1)ALTER DATABASE RENAME FILE 命令。

2)添加新成员并删除旧成员。

使用 ALTER DATABASE RENAME FILE 命令的步骤如下:

  • 1)关闭数据库
  • 2)使用操作系统命令 COPY 重做日志文件到新位置
  • 3)启动数据库到 mount 状态
  • 4)执行 ALTER DATABASE RENAME FILE 命令
  • 5)打开数据库

【实例 2-4】移动日志文件,观察日志文件丢失时出现的现象,并重新定位。

1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
已连接。
2)关闭数据库
SQL> SHUTDOWN;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
3)移动日志文件
使用操作系统命令移动 3 号日志组的第成员到 E:盘根目录下。
4)启动失败,停止在 MOUNT 状态,并使显示出丢失的日志文件
SQL> CONNECT / AS SYSDB
已连接。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 64035360 bytes
Fixed Size 453152 bytes
Variable Size 29360128 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 3 (线程 1) 的成员
ORA-00312: 联机日志 3 线程 1: 'D:\ORACLE\ORADATA\DB01\REDO03.LOG
5)执行 RENAME 命令,重新定位日志文件
SQL> ALTER DATABASE RENAME FILE 'D:\ORACLE\ORADATA\DB01\REDO03.LOG'TO 'E:\REDO03.LOG';
数据库已更改。
6)打开数据库
SQL> ALTER DATABASE OPEN;
数据库已更改。

第二种方法,参考删除日志文件。

1.2.4 删除重做日志

如果日志组尺寸设置不合理,需要改日志组尺寸,但是 ORACLE 数据库中,已存在的日志组的尺寸是不能改变的,这时可通过增加新日志组,然后删除原有的日志组来实现改变日志组尺寸的目的。如果某个重做日志组不再需要使用,也可以将整个重做日志组删除。删除一个重做日志组时,其中成员日志文件将都被删除。在删除重做日志组之前,应首先考虑如下几个问题:

  • ? 无论组中有多少成员,一个数据库至少需要使用两个重做日志组,因此,如果在据库中只包含两个日志组时,不能进行删除日志组的操作。
  • ? 只能删除处于 INACTIVE 状态的重做日志组,如果要删除 CURRENT 状态的重做日志组,必须执行一次手工日志切换,将它切换到 INACTIVE 状态。
  • ? 如果数据库处于归档模式下,在删除重做日志组之前,必须确定它已经被归档。

因此,在删除重做日志组之前,必须通过查询 V$LOG 动态性能视图来获取各个重做日志组的状态及是否已归档,比如:

SQL> SELECT GROUP#,ARCHIVED,STATUS FROM V$LOG;
GROUP# ARCHIVED STATUS
------ ----------- --------
1 YES ACTIVE
2 NO CURRENT
3 YES INACTIVE
4 YES INACTIVE

从上述结果看,1、3、4 号日志组已归档,但是 1 号日志组处于活动状态,因此当前能删除的是 3,4 号的两个重做日志组。

可以使用下面的 ALTER DATABASE DROP LOGFILE 命令删除整个联机重做日志文组:

ALTER DATABASE [database]DROP LOGFILE {GROUP integer|('filename'[, 'filename']...)}[,{GROUP integer|('filename'[,'filename']...)}]...

【实例 2-5】删除日志组 4

1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
已连接。
2)删除日志组
SQL> ALTER DATABASE DROP LOGFILE GROUP 4;
数据库已更改。

若要增大或者减小联机重做日志文件组的大小,请添加新的联机重做日志文件组(具有新的大小),然后删除原来日志组

注意:删除日志组时并不删除操作系统文件。

除了需要删除重做日志组外,更为常见的情况是仅需要删除重做日志组中的某个成员日志文件。比如,由于存放日志文件的硬盘发生物理损坏导致日志成员发生损坏或丢失时,该日志成员将无法访问,此时需要将它从重做日志组中删除。如果要删除一个或多个特定的联机重做日志文件成员,请使用下面的 ALTER DATABASE DROP LOGFILE MEMBER 命令:

ALTER DATABASE [database]DROP LOGFILE MEMBER 'filename'[, 'filename']...

删除日志组成员有如下限制:

  • ? 如果要删除的日志组只包含一个成员或者只包含一个有效的成员时,那么不能删除该成员。
  • ? 如果该组是当前组,那么必须先强制执行日志文件切换,然后才能删除该成员。
  • ? 如果数据库正运行在 ARCHIVELOG 模式下并且未将该成员所属日志文件组归档,那么无法删除该成员

【实例2-6】删除日志组 5 中的第 2 个日志组成员

1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
已连接。
2)删除日志组
SQL> ALTER DATABASE DROP LOGFILE MEMBER 'd:\oracle\oradata\db01\log5a.rdo';
数据库已更改。

注意:以上操作删除联机重做日志文件成员时,不会删除对应的操作系统文件。

1.2.5 清除重做日志

在数据库运行过程中,联机重做日志文件可能会因为某些原因而损坏。如果出现这种情况,数据库最终会由于无法将损坏的重做日志文件归档而停止。或者当一个联机重做日志件组中的所有成员都已经被破坏时,数据库会因为无法切换到损坏的日志组而停止。如果发生种情况,可以在不关闭数据库情况下,手工清空损坏的重做日志文件的内容,以避免出现停止运行的情况。

清空重做日志文件就是将重做日志文件中的内容全部初始化,相当于删除该重做日志文件,然后各方面重建它。即使数据库只拥有两个重做日志组,或者要清空的重做日志组是当前日志组,都可以成功执行清空操作。

【实例 2-7】清空日志组 5

1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
已连接。
2)清空日志组
SQL> ALTER DATABASE CLEAR LOGFILE GROUP 5
;数据库已更改。

执行上述命令后,Oracle 会自动将日志组 5 中的重做日志文件全部初始化。但是,如果日志组 5 尚未归档,则必须指定 UNARCHIVED 子句。命令如下:

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 5;

指定 UNARCHIVED 子句后,Oracle 将避免对 5 号日志组进行归档。

在数据库打开时不能清除当前日志组,为了清除当前日志组,可以对日志进行切换或将数据库置成 MOUNT 状态。

1.2.6 使用控制台管理重做日志

【实例2-8】使用控制台管理重做日志

步骤 1:登录控制台

以 SYSDBA 身份登录控制台

步骤 2:日志组操作显示

选择【DB01】→【存储】→【重做日志组】下的日志组节点,按鼠标右键弹出下拉菜单,可以实现重做日志组的创建、删除、查看重做日志详细资料、切换日志组、强制检查点等功能。如图 7-2 所示:

步骤 3:创建日志组

如果选择创建菜单,则创建新的重做日志组,弹出创建日志组的对话窗口,在组编号中输入新组的编号,在文件大小中输入日志成员的大小,并且增加日志成员的文件名和路径后,按创建按键即可创建新的日志组,如图 7-3 所示。如果想显示创建日志组的 SQL 语句代码,可以按显示 SQL 按钮来显示,这也是学习 Oracle 命令的一种方法。创建日志组 4,其中志 成 员 的 大 小 为 1024KB , 其 中 包 含 两 个 日 志 成 员 , 分 别 为 D:\ORACLE\ORADATA\DB01\LOG4A.ORA 和 D:\ORACLE\ORADATA\DB01\LOG4B.ORA。

步骤 4:日志组成员操作

选择【DB01】→【存储】→【重做日志组】→【1】后,可以对日志组 1 中的成员进行增加、删除、重定位等操作(略)。

1.2.7 查询重做日志信息

可以查询以下动态性能视图获取组和成员的信息。

1.查询重做日志组的基本信息

下面的查询返回控制文件中关于联机重做日志文件的信息:

SQL> SELECT group#, sequence#, bytes, members, status FROM v$log;
GROUP# SEQUENCE# BYTES MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
1 230 104857600 1 CURRENT
2 228 104857600 1 INACTIVE
3 229 104857600 1 INACTIVE
5 0 2097152 1 UNUSED
各字段含义如下:
group#:表示日志组号;
sequence#:表示日志序列号;
bytes:表示日志组的大小;
members:表示日志组中包含的成员数;
status:表示日志组状态。

日志组的状态可以是以下几种:

  • ? UNUSED:表示从未对联机重做日志文件组进行写入。这是刚添加的联机重做日志文件的状态。
  • ? CURRENT:表示当前的联机重做日志文件组。这说明该联机重做日志文件组是活动的。
  • ? ACTIVE:表示联机重做日志文件组是活动的,但是并非当前联机重做日志文件组。数据库的崩溃恢复需要该组。它可用于块恢复。它可能已归档,也可能未归档
  • ? CLEARING:表示在执行 ALTER DATABASE CLEAR LOGFILE 命令后正在将该日志重建为一个空日志。日志清除后,其状态更改为 UNUSED
  • ? CLEARING_CURRENT:表示正在清除当前日志文件中的已关闭线程。如果切换时发生某些故障,如写入新日志标头时发生了输入/输出(I/O) 错误,则日志可能处于此状态。
  • ? INACTIVE:表示例程恢复不再需要联机重做文件日志组。它可能已归档,也可能未归档。

2.查询重做日志成员的基本信息

若要获取组内所有成员的名称,请查询 V$LOGFILE 视图。

SQL> SELECT group#,status,type,member FROM V$LOGFILE;
GROUP# STATUS TYPE MEMBER
--- ------- ------ --------------------
3 STALE ONLINE D:\ORACLE\ORADATA\DB01\REDO03.LOG
2 STALE ONLINE D:\ORACLE\ORADATA\DB01\REDO02.LOG
1 ONLINE D:\ORACLE\ORADATA\DB01\REDO01.LOG
5 ONLINE E:\LOG5B.RDO
各字段含义如下:
group#:表示日志组号;
status:表示日志文件的状态;
type:表示日志文件的类型,可以是 online(联机状态),也可以是 offline(脱机状态);
member:表示日志文件的名称。

日志文件状态可以为下列之一:

  • ? INVALID:表明该文件不可访问
  • ? STALE:表示文件内容不完全
  • ? DELETED:表明该文件已不再使用
  • ? 空白表明文件正在使用中

3.使用控制台查询重做日志信息

【实例 2-9】使用控制台查询重做日志文件

步骤 1:登录控制台

以 SYSDBA 身份登录控制台

步骤 2:查询日志

选择【DB01】→【存储】→【重做日志组】节点,在右侧面板中可看到重做日志组的信息。如图 7-4 所示,共包含 4 个重做日志组,当前日志组是 1 号日志组,5 号日志组是新增加重做日志组,还未使用,每个重做日志组中包含 1 个成员。

“已归档”栏表示归档模式下该组是否完成归档。

“大小”栏表示日志成员的大小。

“序列”栏表示对应日志的序号。

“第一个更改编号”栏表示对应日志中第一个记录的 SCN 号。


写在最后的话

感谢各位的支持与阅读,后续会继续推送相关知识和交流,欢迎交流、转发和关注,感谢!

相关推荐

甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入

IT之家7月1日消息,根据甲骨文Oracle当地时间6月30日向美国证券交易委员会(SEC)递交的FORM8-K文件,该企业在始于2025年6月1日的202...

甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云

IT之家6月23日消息,Oracle甲骨文创始人、董事长兼首席技术官LarryEllison(拉里埃里森)在本月早些时候的2025财年第四财季和全财年财报电话会议上表示,Oracle...

Spring Boot 自定义数据源设置,这些坑你踩过吗?

你在使用SpringBoot进行后端开发的过程中,是不是也遇到过这样的问题:项目上线后,数据库连接总是不稳定,偶尔还会出现数据读取缓慢的情况,严重影响了用户体验。经过排查,发现很大一部分原因竟然...

一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)

今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...

低代码建模平台-数据挖掘平台(低代码平台的实现方式)

现在来看一下数据连接。·这里是管理数据连接的空间,点击这里可以新增一个数据连接。·输入连接名称,然后输入url,是通过gdbc的方式去连接的数据库,目前是支持mysql、oracle以及国产数据库达梦...

navicat 17.2.7连接oracle数据库提示加载oracle库失败

系统:macOS15.5navicat版本:navicatpremiumlite17.2.7连接oracle测试报错:加载oracle库失败【解决办法】:放达里面找到程序,显示简介里面勾选“使...

开源“Windows”ReactOS更新:支持全屏应用

IT之家6月17日消息,ReactOS团队昨日(6月16日)在X平台发布系列推文,公布了该系统的最新进展,包括升级Explorer组件,支持全屏应用,从Wine项目引入了...

SSL 推出采用全模拟内置混音技术的模拟调音台Oracle

英国调音台传奇品牌SolidStateLogic宣布推出Oracle——一款采用全模拟内置混音技术的调音台,在紧凑的AWS尺寸机箱内集成了大型调音台的功能。该调音台提供24输入和...

47道网络工程师常见面试题,看看有没有你不会的!

你们好,我的网工朋友。网络工程师面试的时候,都会被问到什么?这个问题其实很泛,一般来说,你肯定要先看明白岗位需求写的是什么。基本上都是围绕公司需要的业务去问的。但不可否认的是,那些最基础的概念,多少也...

汉得信息:发布EBS系统安装启用JWS的高效解决方案

e公司讯,从汉得信息获悉,近日,微软官方宣布InternetExplorer桌面应用程序将于2022年6月15日正式停用。目前大部分客户都是使用IE浏览器打开EBS的Form界面,IE停用后,只能使...

36.9K star ! 推荐一个酷炫低代码开发平台!功能太强!

前言最近在逛github,看看能不能搜罗到一些对自己有帮助的开源软件。不经意间看到一个高star的java开源项目:jeecg-boot。进入在线演示版一看,感叹实在是太牛了!此开源项目不管是给来学习...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

手把手教你在嵌入式设备中使用SQLite3

摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数...

JAVA语言基础(java语言基础知识)

一、计算机的基本概念什么是计算机?计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行、自动高速处理海量数据的现代化智能电子设备。由硬件和软件组成、没有安装过任何软件的计算机称...

再见 Navicat!一款开源的 Web 数据库管理工具!

大家好,我是Java陈序员。在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件,基...

取消回复欢迎 发表评论: