日志损坏后怎样启数据库

日志损坏后怎样启数据库,第1张

日志损坏后启数据库方法:

SQL>conn / as sysdba

Connected.

SQL>select * from v$log

--当前日志组指定在2号组上

SQL>host cp /home/1.txt /home/app/oracle/oradata/orcl/redo02.log

破坏当前的日志文件,再进行切换

SQL>alter system switch logfile

alter system switch logfile

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

实例崩溃了.因为lgwr死了,它是核心进程,一个核心进程死亡实例就会崩溃

SQL>conn sys /as sysdba

Enter password:

Connected to an idle instance.

SQL>startup

ORACLE instance started.

Total System Global Area 285212672 bytes

Fixed Size 1218992 bytes

Variable Size 121636432 bytes

Database Buffers 159383552 bytes

Redo Buffers2973696 bytes

Database mounted.

ORA-00316: log 2 of thread 1, type 0 in header is not log file

ORA-00312: online log 2 thread 1: '/home/app/oracle/oradata/orcl/redo02.log'

我们想启动数据库,但是失败了.因为我们现在的文件根本不是一个日志文件.

SQL> alter system set _allow_resetlogs_corruption=true scope=spfile

alter system set _allow_resetlogs_corruption=true scope=spfile

*

ERROR at line 1:

ORA-00911: invalid character

修改参数失败了.

SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile

加上双引号,修改成功

System altered.

SQL>shutdown abort

ORACLE instance shut down.

SQL>startup mount

ORACLE instance started.

重新启动实例使修改的参数生效

Total System Global Area 167772160 bytes

Fixed Size 1247900 bytes

Variable Size 75498852 bytes

Database Buffers 88080384 bytes

Redo Buffers2945024 bytes

Database mounted.

SQL>show parameter allow

NAME TYPE VALUE

------------------------------------ ------------------------------ -----

_allow_resetlogs_corruption booleanTRUE

SQL>alter database open resetlogs

alter database open resetlogs

*

ERROR at line 1:

ORA-01139: RESETLOGS option only valid after an incomplete database recovery

我们想以resetlogs模式打开数据库,让数据库重新建立日志,但失败了.

我们做一个假恢复,欺骗数据库.走个形式,因为我们没有备份,不可能真恢复

SQL>recover database until cancel

ORA-00279: change 819512 generated at 11/04/2011 11:44:11 needed for thread 1

ORA-00289: suggestion :

/home/app/oracle/flash_recovery_area/ORCL/archivelog/2011_11_04/o1_mf_1_7_%u_.ar

c

ORA-00280: change 819512 for thread 1 is in sequence #7

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

cancel

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/home/app/oracle/oradata/orcl/system01.dbf'

ORA-01112: media recovery not started

数据库相信了,可以了,但打开的时候又崩溃了.

SQL>alter database open resetlogs

alter database open resetlogs

*

ERROR at line 1:

ORA-01092: ORACLE instance terminated. Disconnection forced

SQL>conn / as sysdba

Connected to an idle instance.

SQL>startup

ORACLE instance started.

Total System Global Area 167772160 bytes

Fixed Size 1247900 bytes

Variable Size 75498852 bytes

Database Buffers 88080384 bytes

Redo Buffers2945024 bytes

Database mounted.

Database opened.

数据库好了!

详细的恢复方法:

1、停止数据库服务。

2、将需要恢复的数据库文件复制到另外的位置。

3、启动数据库服务。

4、确认要恢复的数据库文件已经成功复制到另外的位置,然后在SQL Server Management Studio中删除要恢复的数据库。

5、新建同名的数据库(数据库文件名也要相同)。

6、停止数据库服务。

7、用第2步中备份的.mdf文件覆盖新数据库的同名文件。

8、启动数据库服务。

9、运行alter database dbname set emergency,将数据库设置为emergency mode

10、运行下面的命令就可以恢复数据库:

use master

declare @databasename varchar(255)

set @databasename='要恢复的数据库名称'

exec sp_dboption @databasename, N'single', N'true' --将目标数据库置为单用户状态

dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)

dbcc checkdb(@databasename,REPAIR_REBUILD)

exec sp_dboption @databasename, N'single', N'false'--将目标数据库置为多用户状态

注:这个方法是通过.mdf文件恢复数据库,即使大家的log文件丢失也可以进行恢复。

数据库损坏常见的原因有以下几种:

1、事务日志问题。比如事务日志文件丢失;事务日志文件在 *** 作过程中被误删;事务日志文件被损坏以及事务日志文件过大,导致硬盘的空间不足等;

2、意外掉电或异常强制关机,造成数据文件损坏,主要数据库正在被读写过程中异常关机;

3、数据库的表被破坏或索引等被破坏,或者数据库的其他对象被破坏或丢失等;

4、删除了数据文件,或者更改了它的名字;

5、硬盘损坏,造成数据和日志文件读写错误:

(1)感染病毒或者其他人为因素破坏;

(2)其他文件读写、存储等原因


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

原文地址: https://outofmemory.cn/sjk/9954539.html

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

发表评论

登录后才能评论

评论列表(0条)

保存