Oracle数据库Redo故障恢复

Oracle数据库Redo故障恢复,第1张

一 丢失inactive日志文件组的恢复

由于inactive日志文件组表示已经完成了检查点(dirty数据已经被写入数据文件) 数据库本身不会发生数据库丢失 如果在这个时候相应的redo丢失/损坏 可以通过clear重建日志文件组恢复

通过命令:

alter database clear logfile group n

如果数据库模式是archived的 则需要强制清除

alter database clear unarchived logfile group n

二 丢失active或current日志文件组的恢复

丢失情况分两种:

一个是正常关闭数据库(如shutdown immediate)

另一个是异常关闭数据库(如shutdown abort)

在损失当前日志时 数据库是正常关闭状态

由于shutdown immediate会执行全面的checkpoint 所以当前日志在实例恢复时可以不需要redo

在Oracle i中我们完全可以通过alter database clear logfile group n来进行恢复

但是在Oracle i中 则可能无法对current的redo日志进行clear 需要通过recover database until cancel恢复后(必须要做的)

用resetlogs选项打开

比如

alter database clear logfile group n

recover database until cancel;

alter database open resetlogs;

在损失当前日志时 数据库是异常关闭的

这种情况下 由于没有在执行全面检查点时 数据库就已经关闭了 那么Oracle在进行实例恢复的时候必须要求当前的日志 否则Oracle数据库将无法open

这样的情况下 我们通常需要从备份中恢复数据文件 通过应用归档日志进行向前推演 直到最后一个完好的日志文件 然后可以通过resetlogs启动数据库完成恢复 那么丢失的数据则是被损坏的日志文件中的数据

lishixinzhi/Article/program/Oracle/201311/18418

在数据库表丢失或损坏的情况下 备份你的数据库是很重要的 如果发生系统崩溃 你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态 有时 正是MySQL管理员造成破坏 管理员已经知道表以破坏 用诸如vi或Emacs等编辑器试图直接编辑它们 这对表绝对不是件好事!备份数据库两个主要方法是用mysqldump程序或直接拷贝数据库文件(如用cp cpio或tar等) 每种方法都有其优缺点 mysqldump与MySQL服务器协同 *** 作 直接拷贝方法在服务器外部进行 并且你必须采取措施保证没有客户正在修改你将拷贝的表 如果你想用文件系统备份来备份数据库 也会发生同样的问题 如果数据库表在文件系统备份过程中被修改 进入备份的表文件主语不一致的状态 而对以后的恢复表将失去意义 文件系统备份与直接拷贝文件的区别是对后者你完全控制了备份过程 这样你能采取措施确保服务器让表不受干扰 mysqldump比直接拷贝要慢些 mysqldump生成能够移植到其它机器的文本文件 甚至那些有不同硬件结构的机器上 直接拷贝文件不能移植到其它机器上 除非你正在拷贝的表使用MyISAM存储格式 ISAM表只能在相似的硬件结构的机器上拷贝 在MySQL 中引入的MyISAM表存储格式解决了该问题 因为该格式是机器无关的 所以直接拷贝文件可以移植到具有不同硬件结构的机器上 只要满足两个条件 另一台机器必须也运行MySQL 或以后版本 而且文件必须以MyISAM格式表示 而不是ISAM格式 不管你使用哪种备份方法 如果你需要恢复数据库 有几个原则应该遵守 以确保最好的结果 定期实施备份 建立一个计划并严格遵守 让服务器执行更新日志 当你在崩溃后需要恢复数据时 更新日志将帮助你 在你用备份文件恢复数据到备份时的状态后 你可以通过运行更新日志中的查询再次运用备份后面的修改 这将数据库中的表恢复到崩溃发生时的状态 以文件系统备份的术语讲 数据库备份文件代表完全倾倒(full dump) 而更新日志代表渐进倾倒(incremental dump) 使用一种统一的和易理解的备份文件命名机制 象backup buckup 等不是特别有意义 当实施你的恢复时 你将浪费时间找出文件里是什么东西 你可能发觉用数据库名和日期构成备份文件名会很有用 例如 %mysqldump samp_db >/usr/archives/mysql/samp_db %mysqldump menagerie >/usr/archives/mysql/menagerie 你可能想在生成备份后压缩它们 备份一般都很大!你也需要让你的备份文件有过期期限以避免它们填满你的磁盘 就象你让你的日志文件过期那样 用文件系统备份备份你的备份文件 如果遇上了一个彻底崩溃 不仅清除了你的数据目录 也清除了包含你的数据库备份的磁盘驱动器 你将真正遇上了麻烦 也要备份你的更新日志 将你的备份文件放在不同于用于你的数据库的文件系统上 这将降低由于生成备份而填满包含数据目录的文件系统的可能性 用于创建备份的技术同样对拷贝数据库到另一台机器有用 最常见地 一个数据库被转移到了运行在另一台主机上的服务器 但是你也可以将数据转移到同一台主机上的另一个服务器 使用mysqldump备份和拷贝数据库 当你使用mysqldumo程序产生数据库备份文件时 缺省地 文件内容包含创建正在倾倒的表的CREATE语句和包含表中行数据的INSERT语句 换句话说 mysqldump产生的输出可在以后用作mysql的输入来重建数据库 你可以将整个数据库倾倒进一个单独的文本文件中 如下 %mysqldump samp_db >/usr/archives/mysql/samp_db 输出文件的开头看起来象这样 # MySQL Dump ## Host: localhost Database: samp_db# # Server version alpha log## Table structure for table absence #CREATE TABLE absence(student_id int( ) unsigned DEFAULT NOT NULL date date DEFAULT NOT NULL PRIMARY KEY (student_id date));## Dumping data for table absence #INSERT INTO absence VALUES ( );INSERT INTO absence VALUES ( );INSERT INTO absence VALUES ( ); 文件剩下的部分有更多的INSERT和CREATE TABLE语句组成 如果你想压缩备份 使用类似如下的命令 %mysqldump samp_db | gzip >/usr/archives/mysql/samp_db gz如果你要一个庞大的数据库 输出文件也将很庞大 可能难于管理 如果你愿意 你可以在mysqldump命令行的数据库名后列出单独的表名来倾到它们的内容 这将倾倒文件分成较小 更易于管理的文件 下例显示如何将samp_db数据库的一些表倾到进分开的文件中 %mysqldump samp_db student score event absence >grapbook sql%mysqldump samp_db member president >hist league sql如果你生成准备用于定期刷新另一个数据库内容的备份文件 你可能想用 add drop table选项 这告诉服务器将DROP TABLE IF EXISTS语句写入备份文件 然后 当你取出备份文件并把它装载进第二个数据库时 如果表已经存在 你不会得到一个错误 如果你倒出一个数据库以便能把数据库转移到另一个服务器 你甚至不必创建备份文件 要保证数据库存在于另一台主机 然后用管道倾倒数据库 这样mysql能直接读取mysqldump的输出 例如 你想从主机拷贝数据库samp_db到 可以这样很容易做到 %mysqladmin h create samp_db%mysqldump samp_db | mysql h samp_db以后 如果你想再次刷新上的数据库 跳过mysqladmin命令 但要对mysqldump加上 add drop table以避免的得到表已存在的错误 %mysqldump add drop table samp_db | mysql h samp_dbmysqldump其它有用的选项包括 flush logs和 lock tables组合将对你的数据库检查点有帮助 lock tables锁定你正在倾倒的所有表 而 flush logs关闭并重新打开更新日志文件 新的更新日志将只包括从备份点起的修改数据库的查询 这将设置你的更新日志检查点位备份时间 (然而如果你有需要执行个更新的客户 锁定所有表对备份期间的客户访问不是件好事 )如果你使用 flush logs设置检查点到备份时 有可能最好是倾倒整个数据库 如果你倾倒单独的文件 较难将更新日志检查点与备份文件同步 在恢复期间 你通常按数据库为基础提取更新日志内容 对单个表没有提取更新的选择 所以你必须自己提取它们 缺省地 mysqldump在写入前将一个表的整个内容读进内存 这通常确实不必要 并且实际上如果你有一个大表 几乎是失败的 你可用 quick选项告诉mysqldump只要它检索出一行就写出每一行 为了进一步优化倾倒过程 使用 opt而不是 quick opt选项打开其它选项 加速数据的倾倒和把它们读回 用 opt实施备份可能是最常用的方法 因为备份速度上的优势 然而 要警告你 opt选项确实有代价 opt优化的是你的备份过程 不是其他客户对数据库的访问 opt选项通过一次锁定所有表阻止任何人更新你正在倾倒的任何表 你可在一般数据库访问上很容易看到其效果 当你的数据库一般非常频繁地使用 只是一天一次地调节备份 一个具有 opt的相反效果的选项是 dedayed 该选项使得mysqldump写出INSERT DELAYED语句而不是INSERT语句 如果你将数据文件装入另一个数据库并且你想是这个 *** 作对可能出现在该数据库中的查询的影响最小 delayed对此很有帮助 press选项在你拷贝数据库到另一台机器上时很有帮助 因为它减少网络传输字节的数量 下面有一个例子 注意到 press对与远端主机上的服务器通信的程序才给出 而不是对与本地主机连接的程序 %mysqldump opt samp_db | mysql press h samp_dbmysqldump有很多选项 详见《MySQL参考手册》 使用直接拷贝数据库的备份和拷贝方法 另一种不涉及mysqldump备份数据库和表的方式是直接拷贝数据库表文件 典型地 这用诸如cp tar或cpio实用程序 本文的例子使用cp 当你使用一种直接备份方法时 你必须保证表不在被使用 如果服务器在你则正在拷贝一个表时改变它 拷贝就失去意义 保证你的拷贝完整性的最好方法是关闭服务器 拷贝文件 然后重启服务器 如果你不想关闭服务器 要在执行表检查的同时锁定服务器 如果服务器在运行 相同的制约也适用于拷贝文件 而且你应该使用相同的锁定协议让服务器 安静下来 假设服务器关闭或你已经锁定了你想拷贝的表 下列显示如何将整个samp_db数据库备份到一个备份目录(DATADIR表示服务器的数据目录) %cd DATADIR%cp r samp_db /usr/archive/mysql单个表可以如下备份 %cd DATADIR/samp_db%cp member /usr/archive/mysql/samp_db%cp score /usr/archive/mysql/samp_db 当你完成了备份时 你可 lishixinzhi/Article/program/MySQL/201311/29384

多工联机重作日志文件

每个数据库实例都有其自己的联机重作日志组 在 *** 作数据库时 Oracle首先将数据库的全部改变保存在重作日志缓冲区中 随后日志记录器进程(LGWR)将数据从系统共用区SGA(System Global Area)的重作日志缓冲区写入联机重作日志文件 在磁盘崩溃或实例失败时 可以通过与之相关的联机重作日志来保护数据库 将损失降至最低 但Oracle在默认的方式下只创建一组重作日志文件(每一组只有一个项目文件) 为了减少丢失这些重要的重作日志文件的危险 因此需要对其进行镜像拷贝

在Oracle级多工联机重作日志文件 即增加多个文件到每个组以便镜像数据 这样I/O故障或写丢失只损坏一个拷贝 从而保证了LGWR后台进程至少能够向一个成员写入信息 数据库仍然可以继续运行 同时应保证日志组的成员不应驻存在同一物理设备上 因为这将削弱多重日志文件的作用

镜像拷贝控制文件

控制文件描述通用的数据库结构 它存储了大量数据库状态信息 包括物理结构和联机重作日志文件在当时的名称 位置 状态 控制文件在数据库启动时被Oracle实例读取 保持打开并随着 *** 作而文件内容更新 直到实例关闭为止 在它打开的过程中能够同步需要恢复的信息 包括检查点信息 因此若损坏或丢失了控制文件 Oracle将不能继续工作 因此应在系统中保持控制文件的多个拷贝 且这些拷贝应置于安装于不同磁盘控制器下的不同磁盘设备中

由于Oracle没有提供对控制文件多工的完整支持 因此应在对控制文件使用 *** 作系统或硬件镜像 即在修改初始化文件的control_files参数后重新启动数据库前 应将控制文件复制到定义的新位置 否则数据库启动时将会出错

激活归档进程

当数据库运行于NOARCHIVELOG模式下时 只能在完全关闭数据库后进行数据库的一致备份 并且同时禁用了联机重作日志的存档 这样在Oracle实例失败时只能将数据库修复到最近的完整数据库备份时的那一点上 不能在失效点处对实例进行恢复 而在ARCHIVELOG模式下 数据库不仅可以进行一致备份 还可以在数据库打开的情况下进行联机备份 通过数据库的备份和联机与存档的重作日志文件 用户可以恢复所有已提交的事务 并允许将数据库恢复到指定的时间 SCN或日志系列号处 增大了恢复的灵活性 减少了故障时的数据丢失 因此数据库应运行于ARCHIVELOG模式

在ARCHIVELOG模式下为了防止文件损坏和介质故障 应把日志归档到不同的磁盘上 这可以通过在初始化文件中为归档重作日志指定多个目标实现

数据库实施较大改变时备份

因为控制文件中保存了数据库的模式结构信息 因此在对数据库进行较大改变(包括改变表结构 增加 删除日志文件或数据文件等)时应立即备份控制文件及相应的数据文件

使用RESETLOGS选项打开数据库后进行备份

在以RESETLOGS选项打开数据库后 应对整个数据库进行脱机或联机的备份 否则将不能恢复重置日志后的改变

当以RESETLOGS选项打开数据库时 Oracle将抛弃恢复中没有应用的重复信息 并确保永远不再运用 同时还将初始化控制文件中关于联机日志和重作线程的信息 清除联机日志中的内容 因此 RESETLOGS前的归档日志的序列号将与RESETLOGS后的Oracle控制文件的要求值不相符(备份文件中的检查点比控制文件中的检查点旧) 即在恢复中不能应用以前的归档日志文件 从而导致RESETLOGS *** 作之前的备份在新形体中无用

避免备份联机重作日志文件

由于文中提出了多工联机重作日志文件且数据库运行于ARCHIVELOG模式 ARCH进程能够将联机重作日志归档 因此不必对其进行备份 若用备份的联机重作日志文件重建它 可能会引起日志文件序列号的混乱 从而破坏数据库 得到适得其反的结果

重置联机日志

在进行了不完全恢复或用备份控制文件进行恢复后 应重置联机日志

为了确保数据库的一致性 必须保证在恢复后所有数据文件都恢复到同一个时间点 但不完全恢复可能导致数据文件中具有一个与其它文件不同的检查点 导致数据库的一致性受到破坏 同样 备份的控制文件中保存的SCN和计数器与当前日志文件中的值可能不同 从而也破坏了数据库的一致性 因此应在进行完上述两项 *** 作后重置联机日志

数据库的逻辑备份

以上所述备份都为物理备份 是实际物理数据库文件从一处拷贝到另一处的备份 除此之外还可使用Oracle提供的导出实用程序进行数据库的逻辑备份 Oracle同时还提供了相应的导入实用程序重建逻辑备份中保存的信息

逻辑备份只拷贝数据库中的数据 而不记录数据位置的备份过程 它利用SQL语句 从数据库中导出数据到一个存放在合适位置的外部文件中 同时并可检测到数据块的损坏 因此可用其作为物理备份的补充

备份策略

考虑到如今大部分信息系统每周的业务是 × *** 作 因此采用联机备份 否则可每隔一定时间进行一次脱机备份

应用上述规则 可得出下述典型的备份策略

①镜像拷贝重作日志文件

②镜像拷贝控制文件

③激活归档进程 即以ARCHIVELOG模式 *** 作数据库

④每天进行数据库的部分联机备份(每天进行数据库的完全热备份将无畏地增加数据库的负担且没有必要 同时也增加了数据库恢复时的灵活性)

⑤每隔一周或几周进行一次数据库的逻辑备份

实际项目应用

当数据库中的文件达到一定数量后 DBA可能记不住该备份的文件的名或位置 因此 若能使备份过程自动化可有效地减轻DBA的负担 同时不会遗漏应备份的文件 应用自动批处理文件及脚本文件可实现备份 恢复的自动化 下面简介了在实际项目开发中应用本文所提出的自动备份 恢复策略 通过实际应用 证明了该策略的正确性和可行性

( )下述脚本实现联机重作日志的多工

connect 账户名/密码    alter database ktgis add logfile member 日志文件的存储位置 to group 联机日志组号;    shutdown immediate    startup pfile=初始化文件的存放位置 exclusive mount; 装载数据库且不打开    alter database archivelog; 激活归档进程    alter database open;    exit

( )下列VB代码自动建立联机备份的批处理文件及相应的脚本文件

Set adoTmp = objConnect Execute( select tablespace_name from sys dba_data_files ) 得到数据库中的表空间名    Dim lnum As Long    Dim lnum As Long    lNum = FreeFile    Open 自动备份批处理文件路径 For Binary As lNum    lnum = FreeFile    Open onlinebegin sql For Binary As lnum onlinebegin sql为设置表空间进入热备份模式的脚本文件文件名    lnum = FreeFile    Open onlineend sql For Binary As lnum onlinebegin sql为结束表空间热备份模式的脚本文件文件名    strTmp = connect 账户名/密码 & Chr( ) & Chr( )    Put lnum strTmp    strTmp = shutdown immediate & Chr( ) & Chr( )    Put lnum strTmp    strTmp = startup pfile=初始化文件的存放位置exclusive mount; & Chr( ) & Chr( )    Put lnum strTmp    strTmp = alter database archivelog; & Chr( ) & Chr( )    Put lnum strTmp    strTmp = alter database open; & Chr( ) & Chr( )    Put lnum strTmp    strTmp = connect 账户名/密码 & Chr( ) & Chr( )    Put lnum strTmp    strTmp = Oracle服务管理器路径 & @ & onlinebegin sql & Chr( ) & Chr( ) 在服务管理器中执行脚本文件onlinebegin sql    Put lNum strTmp    Do While Not adoTmp EOF    Set adoTmp = objConnect Execute( select file_name from sys dba_data_files where tablespace_name= & adoTmp Fields( ) & ) 得到当前表空间所对应的所有数据文件名 通过循环即可得到所有表空间所对应数据文件名 若只备份指定的表空间 可指定表空间名从而得到其对应的物理数据文件    strTmp = alter tablespace & adoTmp Fields( ) & begin backup; & Chr( ) & Chr( ) 将表空间置于热备份模式    Put lnum strTmp    strTmp = Oracle的ocopy exe工具全路径 & adoTmp Fields( ) & & 备份文件存放路径 & Chr( ) & Chr( )    Put lNum strTmp    strTmp = alter tablespace & adoTmp Fields( ) & end backup; & Chr( ) & Chr( ) 表空间恢复正常模式    Put lnum strTmp    adoTmp MoveNext    Loop    strTmp = Oracle服务管理器路径 & @ & onlineend sql & Chr( ) & Chr( ) 在服务管理器中执行脚本文件onlineend sql    Put lNum strTmp    strTmp = exit & Chr( ) & Chr( ) 退出服务管理器    Put lnum strTmp    strTmp = alter system switch logfile; & Chr( ) & Chr( ) 强制日志转换 使Oracle创建一个归档日志文件    Put lnum strTmp    strTmp = exit & Chr( ) & Chr( )    Put lnum strTmp    Close    Set adoTmp = Nothing    Set adoTmp = Nothing

运行得到的自动批处理文件 即可自动进行数据库的联机备份

( )在从备份中恢复数据文件后 执行下列脚本将数据库的恢复程序

connect账户名/密码    shutdown abort    startup mount pfile=初始化文件的存放位置; 装载数据库    set autorecovery on; 打开自动恢复    recover database;    alter database open; 打开数据库

结束语

lishixinzhi/Article/program/Oracle/201311/18527

对于数据库系统可能发生的故障可以咨询专业的数据恢复机构。

北亚文件系统数据恢复Windows版可以恢复Windows用户在使用过程中丢失的数据(误删除文件、误格式化硬盘、U盘/手机存储卡数据丢失、误清空回收站、磁盘分区消失)。软件 *** 作简单,易用。

可恢复故障:

误删除文件:

1:可只恢复指定路径的文件

2:支持恢复原来的文件名

3:恢复后保持原有目录结构

误格式化硬盘:

1:重装系统时,误格式化硬盘

2:磁盘文件全部异常消失

3:磁盘文件变成奇怪文件名

4:文件夹双击提示错误

U盘/手机存储卡数据丢失:

1:立即抢救U盘、手机存储卡、数码相机存储卡等设备

2:系统提示未格式化的设备

3:可抢救除硬件损坏外的数据丢失

误清空回收站:

1:Vista\\Win7\\Win8系统支持恢复原来的文件名

2:Win XP回收站中的文件名会被系统改名

磁盘分区消失:

1:误删除分区或重新分区后分区丢失

2:整个硬盘变为一个分区

3:分区无法打开,提示需要格式化

4:系统Ghost后,变为一个分区或几个分区

万能恢复:

1:对数据存储区直接进行扫描

2:深度恢复丢失的文件

3:将按文件类型对文件分类

4:不能恢复原来文件名

二、运行环境

软件可运行的 *** 作系统: Windows XP,Windows 2000,Windows 2003,Windows 2008,Windows 7。

数据库系统数据量大、数据结构复杂、软件内容较多,而且通常被多个应用程序和用户共享,因而要求支撑的硬件设备能够快速处理各类用户需求。这就需要硬件的数据存储容量大、数据处理速度 和数据输入、输出速度快。因此,对数据库系统的硬件资源,有以下几点特殊的要求:

1电脑的内存足够大

数据库系统要有足够大的内存放 *** 作系统和数据库管理的核心模块。如前面所讲数据库软件系统的各软件工作时都需要内存作为工作区或缓冲区。计算机内存的大小对数据库系统性能有着直接影响, 内存大就可以建立较多较大的程序工作区或数据缓冲区,减少外存的访问次数,以管理更多的数据文件和控制更多的程序过程,进行比较复杂的数据管理和进行的更快数据 *** 作。

2电脑的外存足够大

数据库系统需要足够大且快速的外存来存放数据库数据、各类程序文件及数据备份。参考:>

以上就是关于Oracle数据库Redo故障恢复全部的内容,包括:Oracle数据库Redo故障恢复、如何实现MySQL数据库的备份与恢复、Oracle数据库的备份及恢复策略研究等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9454875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存