Oralce数据库 手工重新创建控制文件

控制文件对于Oralce数据库的作用,就好像微软操作系统中注册表的作用一样。控制文件是一个比较小的二进制文件,记录着数据库的结构信息。如果数据库控制文件发生孙华的话,则Oracle将无法正常启动。通常情况下,在创建数据库时会自动创建控制文件;并且当数据库的结构发生变化时,也会自动修改自动文件的内容。
但是,当数据库遇到一些故障导致控制文件发生损坏时,数据库管理员可能需要手工重新创建控制文件,以解决数据库的启动故障。笔者在这里就谈谈手工创建控制文件的相关策略。希望能够帮助大家解决控制文件损坏导致的数据库故障问题。


一、什么情况下要手工重新创建控制文件?


通常情况下,在数据库创建过程中,系统就会自动创建控制文件。不过在遇到一些比较特殊的情况是,数据库管理员就需要手工重新创建新的控制文件。这些特殊情况,据笔者所知,主要有如下两种情况。


一是希望改变某个数据库参数的永久性设置。

在创建数据库的时候,数据库管理员需要设置一些永久性的参数,如数据库的名字等等。有时候在一些特殊的情况下,需要修改这些永久性的参数。如企业后来随着规模的扩大,一台数据库服务器已经不能够满足企业日常作业的需要。为此,数据库管理员决定采用分布式环境来改善数据库的性能。可是,在刚创建数据库的时候,由于没有考虑到这种情况,所以给数据库命名的时候比较简便。现在需要创建多个数据库,管理员为了统一各个数据库的命名策略,即可能需要更改数据库的名字,以符合这个命名规则。遇到这种情况,数据库管理员必须要手工重新建立控制文件,才能够更改数据库名字。


二是所有数据库的控制文件都遭受到永久性损坏。

通常情况下,数据库处于Archivelog模式时,ARCH进程会自动用归档日志文件名和日志序列号之类的信息修改控制文件。而当管理员利用RMAN执行备份操作时,RMAN的备份信息也会被记录到控制文件中。所以,如果当控制文件发生永久性损坏时,那么对于数据库的影响是致命的。如此此时,数据库管理员因为一时疏忽,没有做好数据库控制文件的备份(或者说备份文件比较早),那么此时数据库管理员不得不手工创建新的控制文件。


二、如何创建控制文件?


手工创建新的控制文件比较麻烦。不过数据库管理员若按照下面的步骤一步步来的话,还是可以创建一个完好无损的控制文件。


第一步:制作一个包含数据库据所有数据文件和重做日志文件的列表。


因为数据库启动时必须要有数据文件的相关信息。为此要创建新的控制文件,数据库管理员首先就需要收集数据库所有数据文件和重做日志文件的列表。这个列表可以从两个地方取得。一是如果对控制文件进行了备份的话,则可以从备份的控制文件中获取这些数据文件与重做日志文件的相关信息。如果没有控制文件的备份或者控制文件备份损坏的话,则可以从动态性能视图中查询相关的信息。如利用查询语句SELECT NAME FROM V$DATEFILE语句来查询所有的数据文件信息。此时的一个前提条件就是存在控制文件的最新备份文件或者数据库仍然可以正常启动。也就是说,如果需要改变数据库的永久性参数则可以利用这种方式获取所需要的信息。
但是如果此时数据库已经无法启动无法找到这些信息,或者控制文件已经受到严重破坏又没有合适的控制文件备份的话,那么上面这些方法就不适用了。此时数据库管理员只有人工定位构成数据库的所有数据文件和重做日志文件。也就是说,数据库管理员要根据日常工作中的笔记来整理这些记录。通常情况下,笔者新建数据文件的时候,都会有书面的记录。当遇到这个意外情况时,这些书面的记录就起到作用了。
注意如此此时数据库管理员收集到的数据文件不全,那么在数据库启动的时候就会发生错误。此时管理员就需要根据系统提供的错误信息来查找原因。在创建新的控制文件并且使用它打开数据库之后,Oracle会对数据字典和控制文件的内容进行检查。如果发现数据字典包含了某个数据文件、而控制文件中则没有列出这个数据文件,Oracle数据库就会报错。 Oracle将会在新的控制文件中创建一个名为Missingnnn占位符入口。这里最后面的NNN是十进制的文件编号。此时数据库管理员就可以凭借这个信息来判断是否缺少必要的数据文件。找到数据文件之后,可以通过修改这个值,让数据库找到相对应的真正数据文件。


第二步:关闭数据库。


如果数据库仍然处于启动状态,需要把数据库先关闭掉。在关闭的时候,如果能够采用正常模式关闭的,则最好采用正常模式关闭。而其他关闭模式,则是不得已而为之的做法。采用正常模式关闭,可以减少数据库重新启动过程中可能出现的问题。
另外为安全起见,关闭数据库之后,最好把数据库中所有的数据文件、重做日志文件、参数文件备份到其他地方。这主要是为了不小心而给数据库造成无法挽回的损失。虽然这不是必须的,但是笔者强烈建议这么做。


第三步:开始创建新的控制文件。


数据库管理员备份好所有的数据文件、重做日志文件、参数文件之后,就需要启动一个新的例程。但是不要加载数据库或者打开数据库。也就是说,此阿如STARTUP NOMOUNT命令。数据库启动分三个步骤,分别为启动例程、加载数据库、打开数据库。此时数据库管理员一定要注意只要启动一个进程即可,不需要加载数据库或者打开数据库。否则的话,控制文件就无法创建成功。
启动例程后,数据库管理员要采用Create Controfile语句来创建一个新的控制文件。如果除了控制文件外,还丢失了某些重做日志组的话,还需要使用Resetlogs参数。也就是说,需要恢复丢失的重做日志。另外,跟数据库控制文件损害不同,如果只是更改数据库的名字,则也需要使用这个参数。建立好这个控制文件后,还没有全部完工。因为此时的控制文件中还没有初始化参数。数据库管理员还需要手工修改控制文件中的初始化参数。为了防止后续的工作导致新建的控制文件重新损坏,在配制控制文件的初始化参数的之前,最好对这个控制文件先进行备份。如此的话,即使手工修改控制文件初始化参数有错的话,也不用重头来过。而只需要把新建立的控制文件还原即可。


第四步:编辑控制文件初始化参数。


创建了新的控制文件之后,数据库管理员还需要根据实际的情况来修改控制文件的初始化参数。如数据库管理员需要更改数据库名字的话,就需要更改 DB_NAME参数。在修改这个控制文件的时候,一定要小心。他跟微软操作系统的注册表一样,一个字符都不能够差的。为此,对于这些初始化参数,如果能够通过复制、粘贴等手段取得的,最好直接通过复制粘贴来修改初始化参数。手工输入的话,难免为出现错误。另外,再强调一次,跟修改注册表一样,对控制文件中的内容进行修改之前,最好先对这个控制文件进行备份。那么即使控制文件的初始参数有什么不准确的地方,也可以尽量采取一些弥补措施。


第五步:有选择的恢复数据库。


数据库管理员可以根据实际需要,选择是否需要恢复数据库。一般来说,这个步骤不适必须要进行的。即使控制文件重新建立后没有重新恢复数据库,此时也已经可以正常打开数据库了。
虽然Oracle数据库可以通过手工建立控制文件的方式来修复控制文件的错误。但是,笔者还是不建议采用这种方式来挽回控制文件损害而造成的损失。笔者建议,最好在数据库部署的时候采用磁盘阵列技术或者控制文件多路复用技术,在提高控制文件的安全性。并且,最好控制文件的日常备份工作,也可以免去手工建立控制文件的麻烦。手工重新建立控制文件只是一种不得已而为知的方法。而且,收集的资料如果不全的话,还可能会造成一些异常的错误。为此,数据库管理员应该尽量避免这种情况的发生。多采取一些预先防治的措施。而不是等到控制文件损坏了再临阵抱佛脚,这是非常不负责任的方法。总之手工创建新的控制文件是一种应急的方法,不可多行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP从放弃到入门系列之批次派生-Batch Derivation-Part1

文章目录 一、概述二、系统配置三、主数据3.1 分类主数据3.2 派生规则设置3.2.1发送物料3.2.2 接收物料 四、 测试数据(生产订单)五、 最后 Batch Derivation翻译成批次派生(衍生)或批次继承都是问题不大,继承和派生个…

LeetCode104. 二叉树的最大深度

104. 二叉树的最大深度 文章目录 [104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)一、题目二、题解方法一:递归方法二:迭代 一、题目 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶…

机器学习深度学习——线性回归的基本元素

回归用来表示输入输出之间的关系。 用实际例子来解释一下线性回归:根据房屋的面积、房龄来估算房屋价格。为了实现这个预测放假的模型,需要收集一个真实的数据集,该数据集包括了房屋的销售价格、面积和房龄。 在机器学习中,这个数…

lambda匿名函数

问题:什么是lambda函数?它有什么好处?举例说明 解答 含义 在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数,即函数没有具体的名称,你可以理解为一句话写一个函数 Lambda表达式是Python中一类特殊的定义函数的形式,从语义上讲,它…

(学习笔记-IP)Ping的工作原理

Ping是基于ICMP协议工作的,ICMP报文封装在IP包里面,它工作在网络层,是IP协议的助手。 ICMP包头的类型字段,大致可分为两大类: 一类是用于诊断的查询消息,也就是查询报文类型一类是通知出错原因的错误消息&…

Shell编程基础(三)环境变量 位置变量 系统内置变量

环境变量 & 环境变量环境变量范围父子进程之间有效指定用户有效所有用户有效 位置变量系统内置变量 环境变量 在脚本种直接定义的变量,只能在当前shell进程中使用 若想要在其他shell进程中使用,可以将变量声明为 环境变量 export 变量名 &#xff…

Spring 的元注解

一、元注解介绍 1.1.源码引入 1.2.元注解介绍 从上面的图片可知,Spring 有四个【负责注解其他注解】的元注解,分别是: Target:标识该注解可以用于标注哪些程序元素,比如类、方法、字段等。 Retention:标…

Zabbix-server监控mysql及httpd服务

目录 一、Zabbix监控mysql数据库 1、为server.Zabbix.com添加服务模板 2、创建mysql服务图形 二、server.zabbix.com服务器操作 编辑chk_mysql.sh脚本 三、server.Zabbix.com测试 四、查看web效果 五、Zabbix监控apache(httpd服务) 安装master 六、…

C++ 提高编程

C 提高编程 主要针对C泛型编程和STL技术 一、 模板 1、 概念 模板就是建立通用的模具,大大提高代码的复用性 模板特点 模板不可以直接使用,它只是一个框架 ​ 模板的通用并不是万能的 2、 函数模板 C 另一种编程思想为泛型编程,主要利用的…

Ubuntu搭建Samba服务-学习记录

文章目录 Ubuntu安装Samba流程Samba配置文件Samba添加账户配置文件修改Samba服务控制设置开机自动启动通过systemctl 启动服务通过 rc.local 启动 Windows访问参考链接 当前文章仅用于记录,在 Ubuntu中安装使用Samba,在Windows访问 系统环境:…

NestJS 的 Module 学习

Module 概念 模块使用Module()装饰器来装饰的类。装饰器Module()提供 NestJS 用于组织应用程序结构相关的数据,例如提供商和控制器等等。具体的结构图如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T3CAmLIm-16902949…

【JS 同步调用多个函数 Promise.all】

在 JS 异步编程中,可以使用 Promise.all 方法来实现同步调用多个函数。 Promise.all 方法接收一个包含各个 Promise 对象的数组作为参数,返回一个新的 Promise 对象。当数组中所有的 Promise 对象都成功(即状态为 resolved)时&am…

【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?

目录 环境 问题情况 解决思路 原因分析 解决方法 番外知识 环境 VMware Workstation 16 Pro (版本:16.1.2 build-17966106)ubuntu-22.04.2-desktop-amd64 问题情况 本人在运行百万并发的服务端程序时,程序运行报&#xff1a…

JVM运行时数据区——方法区的垃圾回收

方法区的垃圾回收主要是两部分:运行时常量池中废弃的常量和不在使用的类。 类卸载(将不在使用的类回收)的条件: 该类的所有实例均被回收。 加载该类的类加载器被回收(一般很难满足)。 类对象不再引用,通过反射也获取不到。

alias取别名后,另一个shell中和shell脚本中不生效的问题以及crontab执行docker失败问题

目录 问题一:用alias取别名后,另一个shell中不生效描述原因解决 问题二:用alias取别名后,别名在脚本中不生效描述原因解决 问题三:crontab计划任务不能运行docker命令描述原因解决 问题一:用alias取别名后&…

VLAN---虚拟局域网

VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后,将原本的一个广播域逻辑上,拆 分为多个虚拟的广播域。 VLAN配置: 1.创建VLAN VID—VLAN ID------用来区分和…

浅谈能源管理系统在水泥行业中设计分析

安科瑞 华楠 摘要:水泥企业作为我国产业结构中重要的耗能产业,同时对环境的污染也比较大,因此在水泥企业中建立能源管理系统,对水泥企业的生产过程过程进行全过程的监控和管理,对于降低企业的能源消耗和提高企业的经济…

【Ajax】笔记-Axios与函数发送AJAX请求

Axios 和 Ajax 的区别 1、Axios是一个基于Promise的HTTP库,而Ajax是对原生XHR的封装; 2、Ajax技术实现了局部数据的刷新,而Axios实现了对ajax的封装。 优缺点: ajax: 本身是针对MVC的编程,不符合现在前端MVVM的浪潮 基…

Rust中的Iterator和IntoIterator介绍及应用

Iterator即迭代器,它可以用于对数据结构进行迭代。被迭代的数据结构是可迭代的(iterable),所谓的可迭代就是这个数据结构有返回迭代器的方法,由于Rust的所有权机制,对一个数据结构的迭代器,有三种: 拿走数…

【MySQL】之复合查询

【MySQL】之复合查询 基本查询多表查询笛卡尔积自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询 合并查询小练习 基本查询 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J按照部门号升序而雇员的工资降序排序使用…