1. 程式人生 > >20、oracle用戶管理恢復

20、oracle用戶管理恢復

oracle 用戶 管理恢復

20、oracle用戶管理恢復

下面會一一講解控制文件、redo文件及非歸檔模式、歸檔模式數據文件丟失的情況下,如何恢復數據?


(1)控制文件(controlfile)丟失

在做恢復實驗之前,先備份好數據。


案例1、模擬一個控制文件丟失

select name from v$controlfile;

SQL> select name from v$controlfile;


NAME

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

/u02/oracle/oradata/orcl/control01.ctl

/u02/oracle/oradata/orcl/control02.ctl


刪除其中一個控制文件

rm -rf /u02/oracle/oradata/orcl/control01.ctl


alter system switch logfile;

create tablespace hello datafile ‘/u02/oracle/oradata/orcl/hello01.dbf‘;


SQL> create tablespace hello datafile ‘/u02/oracle/oradata/orcl/hello01.dbf‘;

create tablespace hello datafile ‘/u02/oracle/oradata/orcl/hello01.dbf‘

*

ERROR at line 1:

ORA-00210: cannot open the specified control file

ORA-00202: control file: ‘/u02/oracle/oradata/orcl/control01.ctl

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3


數據庫啟動不起來

SQL> startup

ORACLE instance started.


Total System Global Area 2772574208 bytes

Fixed Size 2256472 bytes

Variable Size 771752360 bytes

Database Buffers 1979711488 bytes

Redo Buffers 18853888 bytes

ORA-00205: error in identifying control file, check alert log for more info



SQL> select status from v$instance;


STATUS

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

STARTED


查看alert log內容如下:

tail -f /u02/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log


ORA-00210: cannot open the specified control file

ORA-00202: control file: ‘/u02/oracle/oradata/orcl/control01.ctl‘

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

Wed Aug 30 23:30:34 2017

Checker run found 1 new persistent data failures

ORA-205 signalled during: ALTER DATABASE MOUNT...


如何恢復控制文件呢?

cp /u02/oracle/oradata/orcl/control02.ctl /u02/oracle/oradata/orcl/control01.ctl


ALTER DATABASE MOUNT;

ALTER DATABASE open;


案例2、控制文件全部丟失。(前提控制文件有備份)

alter database backup controlfile to ‘/u02/ctlbak001‘;(備份)


rm -rf /u02/oracle/oradata/orcl/control01.ctl

rm -rf /u02/oracle/oradata/orcl/control02.ctl


SQL> startup

ORACLE instance started.


Total System Global Area 2772574208 bytes

Fixed Size 2256472 bytes

Variable Size 771752360 bytes

Database Buffers 1979711488 bytes

Redo Buffers 18853888 bytes

ORA-00205: error in identifying control file, check alert log for more info


ORA-00202: control file: ‘/u02/oracle/oradata/orcl/control02.ctl‘

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

ORA-00210: cannot open the specified control file

ORA-00202: control file: ‘/u02/oracle/oradata/orcl/control01.ctl‘


如何恢復控制文件呢?

cp /u02/ctlbak001 /u02/oracle/oradata/orcl/control01.ctl

cp /u02/ctlbak001 /u02/oracle/oradata/orcl/control02.ctl

啟動數據庫還是報錯

SQL> startup

ORACLE instance started.


Total System Global Area 2772574208 bytes

Fixed Size 2256472 bytes

Variable Size 771752360 bytes

Database Buffers 1979711488 bytes

Redo Buffers 18853888 bytes

Database mounted.

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open



SQL> select GROUP#,FIRST_CHANGE#,NEXT_CHANGE# from v$log;


GROUP# FIRST_CHANGE# NEXT_CHANGE#

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

1 1520101 1520104

3 1540267 2.8147E+14

2 1520104 1540267


繼續執行如下命令:

recover database using backup controlfile;


SQL> recover database using backup controlfile;

ORA-00279: change 1540268 generated at 08/30/2017 23:34:57 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_51_944544087.dbf

ORA-00280: change 1540268 for thread 1 is in sequence #51



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

auto

ORA-00308: cannot open archived log ‘/u02/arch/1_51_944544087.dbf‘

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3



ORA-00308: cannot open archived log ‘/u02/arch/1_51_944544087.dbf‘

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3


SQL> select GROUP#,MEMBER from v$logfile;


GROUP#


MEMBER

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

3

/u02/oracle/oradata/orcl/redo03.log


2

/u02/oracle/oradata/orcl/redo02.log


1

/u02/oracle/oradata/orcl/redo01.log


通過上面分析,可以從/u02/oracle/oradata/orcl/redo03.log 恢復控制文件。

繼續執行recover database using backup controlfile 命令

SQL> recover database using backup controlfile

ORA-00279: change 1540268 generated at 08/30/2017 23:34:57 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_51_944544087.dbf

ORA-00280: change 1540268 for thread 1 is in sequence #51



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

/u02/oracle/oradata/orcl/redo03.log

Log applied.

Media recovery complete.


最後執行命令:

alter database open resetlogs;

搞定。


方法2:通過rman備份恢復控制文件。

下面通過rman備份控制文件來實驗:

rman target /


RMAN> show all;


using target database control file instead of recovery catalog

RMAN configuration parameters for database with db_unique_name ORCL are:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

CONFIGURE BACKUP OPTIMIZATION OFF; # default

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘%F‘; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE MAXSETSIZE TO UNLIMITED; # default

CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

CONFIGURE ENCRYPTION ALGORITHM ‘AES128‘; # default

CONFIGURE COMPRESSION ALGORITHM ‘BASIC‘ AS OF RELEASE ‘DEFAULT‘ OPTIMIZE FOR LOAD TRUE ; # default

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO ‘/u02/oracle/app/dbs/snapcf_orcl.f‘; # default


可以通過 CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default

看到rman沒有自動備份控制文件。

rman手動備份控制文件

backup current controlfile;

RMAN> backup current controlfile;


Starting backup at 31-AUG-17

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=39 device type=DISK

channel ORA_DISK_1: starting full datafile backup set

channel ORA_DISK_1: specifying datafile(s) in backup set

including current control file in backup set

channel ORA_DISK_1: starting piece 1 at 31-AUG-17

channel ORA_DISK_1: finished piece 1 at 31-AUG-17

piece handle=/u02/oracle/app/dbs/02sd9jb1_1_1 tag=TAG20170831T125145 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01

Finished backup at 31-AUG-17


下面模擬刪除所有控制文件

rm -rf /u02/oracle/oradata/orcl/control01.ctl

rm -rf /u02/oracle/oradata/orcl/control02.ctl


shutdown immediate;

startup;


進入rman

[[email protected] ~]$ rman target /


Recovery Manager: Release 11.2.0.4.0 - Production on Thu Aug 31 13:11:34 2017


Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.


connected to target database: ORCL (not mounted)


通過rman備份的控制文件路徑恢復。

restore controlfile from ‘/u02/oracle/app/dbs/02sd9jb1_1_1‘;


RMAN> restore controlfile from ‘/u02/oracle/app/dbs/02sd9jb1_1_1‘;


Starting restore at 31-AUG-17

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=21 device type=DISK


channel ORA_DISK_1: restoring control file

channel ORA_DISK_1: restore complete, elapsed time: 00:00:03

output file name=/u02/oracle/oradata/orcl/control01.ctl

output file name=/u02/oracle/oradata/orcl/control02.ctl

Finished restore at 31-AUG-17


執行命令:

alter database mount;


alter database open;


SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


通過數據文件和控制文件的檢查點信息可以看出,數據文件比控制文件的檢查點要小。

col FILE for a10;

col Name for a20;

col CHECKPOINT_CHANGE for a10;


select FILE#,Name,CHECKPOINT_CHANGE# from v$datafile;

select FILE#,Name,CHECKPOINT_CHANGE# from v$datafile_header;


繼續執行recover database using backup controlfile 命令


SQL> select GROUP#,FIRST_CHANGE#,NEXT_CHANGE# from v$log;


GROUP# FIRST_CHANGE# NEXT_CHANGE#

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

1 1540805 2.8147E+14

3 0 0

2 0 0



使用redo日誌推進控制文件。

SQL> recover database using backup controlfile;

ORA-00279: change 1561276 generated at 08/31/2017 00:16:02 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_1_953424962.dbf

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



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

/u02/oracle/oradata/orcl/redo01.log

Log applied.

Media recovery complete.


最後執行命令:

alter database open resetlogs;

搞定。


註意:alter database open resetlogs; 這個命令,表示所有備份都失效了,要重新熱備份哦。


方法3:通過trace恢復控制文件

問題:如果控制文件沒有備份、rman也沒有備份控制文件,只有備份trace文件,如何恢復控制文件呢?


首先,備份 alter database backup controlfile to trace as ‘/u02/ctlbak.trace‘;


然後模擬故障:刪除控制文件:

rm -rf /u02/oracle/oradata/orcl/control01.ctl

rm -rf /u02/oracle/oradata/orcl/control02.ctl


根據trace文件重建控制文件:

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 ‘/u02/oracle/oradata/orcl/redo01.log‘ SIZE 50M BLOCKSIZE 512,

GROUP 2 ‘/u02/oracle/oradata/orcl/redo02.log‘ SIZE 50M BLOCKSIZE 512,

GROUP 3 ‘/u02/oracle/oradata/orcl/redo03.log‘ SIZE 50M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

‘/u02/oracle/oradata/orcl/system01.dbf‘,

‘/u02/oracle/oradata/orcl/sysaux01.dbf‘,

‘/u02/oracle/oradata/orcl/undotbs01.dbf‘,

‘/u02/oracle/oradata/orcl/users01.dbf‘,

‘/u02/oracle/oradata/orcl/test01.dbf‘,

‘/u02/oracle/oradata/orcl/rrr.dbf‘,

‘/u02/oracle/oradata/orcl/tttt.dbf‘,

‘/u02/oracle/oradata/orcl/tttt02.dbf‘,

‘/u02/oracle/oradata/orcl/tttt03.dbf‘

CHARACTER SET AL32UTF8


Control file created.


查看數據庫狀態:

SQL> select status from v$instance;


STATUS

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

MOUNTED


alter database open;


SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01113: file 1 needs media recovery

ORA-01110: data file 1: ‘/u02/oracle/oradata/orcl/system01.dbf‘;


SQL> select GROUP#,SEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE# from v$log;



使用redo推進控制文件。

SQL> recover database using backup controlfile;

ORA-00279: change 1562427 generated at 08/31/2017 13:44:20 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_1_953472820.dbf

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


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

/u02/oracle/oradata/orcl/redo01.log

Log applied.

Media recovery complete.

SQL> alter database open resetlogs;

Database altered.


最後也要重新備份數據庫。


(2)重做日誌丟失

如果丟失重做日誌文件組中的某個成員,並且組中至少還有一個成員,影響如下:

不會影響實例的正常操作,

通過刪除丟失的日誌成員,在添加新成員的方式來恢復。

如果日誌切換,該日誌已經歸檔(不是current log),則可以清空該日誌組,然後重建丟失的日誌成員。


在做實驗之前,先做redo log 的多路復用。

select GROUP#, member from v$logfile;

GROUP# MEMBER

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

1 /u02/oracle/oradata/orcl/redo01.log

3 /u02/oracle/oradata/orcl/redo03.log

2 /u02/oracle/oradata/orcl/redo02.log


下面多路復用。

alter database add logfile member ‘/u01/redo/redo01_1.log‘ to group 1;

alter database add logfile member ‘/u01/redo/redo02_1.log‘ to group 2;

alter database add logfile member ‘/u01/redo/redo03_1.log‘ to group 3;


alter system switch logfile;


在查詢結果如下:

select GROUP#, member,status from v$logfile order by 1;

SQL> select GROUP#, member,status from v$logfile order by 1;


GROUP# MEMBER STATUS

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

1 /u02/oracle/oradata/orcl/redo01.log

1 /u01/redo/redo01_1.log

2 /u02/oracle/oradata/orcl/redo02.log

2 /u01/redo/redo02_1.log

3 /u02/oracle/oradata/orcl/redo03.log

3 /u01/redo/redo03_1.log


6 rows selected.


STATUS為空表示redo可以使用。


select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=b.GROUP# order by 1,3;


結果如下:

SQL> set lines 1200;

SQL> select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=

b.GROUP# order by 1,3;

GROUP# MEMBERS ARC STATUS MEMBER STATUS

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

1 2 NO CURRENT /u02/oracle/oradata/orcl/redo01.log

1 2 NO CURRENT /u01/redo/redo01_1.log

2 2 YES INACTIVE /u02/oracle/oradata/orcl/redo02.log

2 2 YES INACTIVE /u01/redo/redo02_1.log

3 2 YES INACTIVE /u02/oracle/oradata/orcl/redo03.log

3 2 YES INACTIVE /u01/redo/redo03_1.log


6 rows selected.


案例1:刪除日誌組成員中一個(不管是不是單前的還是非單前的redolog,下面方法都適用。)

rm -rf /u02/oracle/oradata/orcl/redo03.log


alter system switch logfile;


tail -f /u02/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log

看到報錯信息如下:

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1: ‘/u02/oracle/oradata/orcl/redo03.log‘

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory


如何解決呢?先刪除,在添加。

alter database drop logfile member ‘/u02/oracle/oradata/orcl/redo03.log‘;

alter database add logfile member ‘/u02/oracle/oradata/orcl/redo03.log‘ to group 3;


看log 沒有報錯:

Thread 1 advanced to log sequence 27 (LGWR switch)

Current log# 3 seq# 27 mem# 0: /u01/redo/redo03_1.log

Current log# 3 seq# 27 mem# 1: /u02/oracle/oradata/orcl/redo03.log

Thu Aug 31 19:28:50 2017

Archived Log entry 53 added for thread 1 sequence 26 ID 0x58497805 dest 1:

Archived Log entry 54 added for thread 1 sequence 26 ID 0x58497805 dest 2:

搞定。。。。。。


補充一下:

如果丟非當前的redolog 屬於group 3 ,還可以這樣解決:

alter database clear logfile group 3;



如果丟當前的redolog 屬於group 3 ,還可以這樣解決:

首先切換日誌,讓當前的redolog不屬於group 3。

alter system switch logfile;

alter database checkpoint;

alter database clear logfile group 3;


案例2: 如果redo日誌沒有多路復用,如果redo日誌丟了,怎麽辦?

alter database drop logfile member ‘/u01/redo/redo01_1.log‘;

alter database drop logfile member ‘/u01/redo/redo02_1.log‘;

alter database drop logfile member ‘/u01/redo/redo03_1.log‘;


目前redo日誌沒有多路復用,信息如下:

select GROUP#, member,status from v$logfile order by 1;

SQL> select GROUP#, member,status from v$logfile order by 1;


GROUP# MEMBER STATUS

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

1 /u02/oracle/oradata/orcl/redo01.log

2 /u02/oracle/oradata/orcl/redo02.log

3 /u02/oracle/oradata/orcl/redo03.log

select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=b.GROUP# order by 1,3;


GROUP# MEMBERS ARC STATUS MEMBER STATUS

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

1 1 YES ACTIVE /u02/oracle/oradata/orcl/redo01.log

2 1 NO CURRENT /u02/oracle/oradata/orcl/redo02.log

3 1 YES ACTIVE /u02/oracle/oradata/orcl/redo03.log


情況1:非當前redo日誌丟失。

rm -rf /u02/oracle/oradata/orcl/redo03.log


模擬日誌切換

alter system switch logfile;


報錯信息:

ORA-00312: online log 3 thread 1: ‘/u02/oracle/oradata/orcl/redo03.log‘

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory


執行命令:

alter database clear logfile group 3;

SQL> alter database clear logfile group 3;


alter database clear logfile group 3

*

ERROR at line 1:

ORA-00350: log 3 of instance orcl (thread 1) needs to be archived

ORA-00312: online log 3 thread 1: ‘/u02/oracle/oradata/orcl/redo03.log‘

發現日誌沒有歸檔:

select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=b.GROUP# order by 1,3;

select name,SEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE# from v$archived_log;


SQL> select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=

b.GROUP# order by 1,3;

GROUP# MEMBERS ARC STATUS MEMBER STATUS

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

1 1 NO INACTIVE /u02/oracle/oradata/orcl/redo01.log

2 1 NO CURRENT /u02/oracle/oradata/orcl/redo02.log

3 1 NO INACTIVE /u02/oracle/oradata/orcl/redo03.log


執行命令:alter system checkpoint;


使用清空非歸檔的日誌組命令:

alter database clear unarchived logfile group 3;


SQL> alter database clear unarchived logfile group 3;


Database altered.


在看看日誌組3,結果有了:

[[email protected] ~]$ ll /u02/oracle/oradata/orcl/redo03.log

-rw-r----- 1 oracle dba 52429312 Aug 31 21:29 /u02/oracle/oradata/orcl/redo03.log


在看看信息如下:

SQL> select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=

b.GROUP# order by 1,3;

GROUP# MEMBERS ARC STATUS MEMBER STATUS

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

1 1 NO CURRENT /u02/oracle/oradata/orcl/redo01.log

2 1 YES ACTIVE /u02/oracle/oradata/orcl/redo02.log

3 1 YES ACTIVE /u02/oracle/oradata/orcl/redo03.log

搞定了。。。。。。。。。。。。。。。

註意一下:之前的備份失效了,重新進行熱備份哦。(因為刪除了redo03日誌,導致redo03日誌沒有歸檔,導致歸檔scn不連續。因此需要重新備份。)


情況2:如果當前日誌組丟了怎麽辦?

select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=b.GROUP# order by 1,3;


SQL> select a.GROUP#,a.MEMBERS,a.ARCHIVED,a.STATUS,b.MEMBER,b.STATUS from v$log a,v$logfile b where a.GROUP#=

b.GROUP# order by 1,3;

GROUP# MEMBERS ARC STATUS MEMBER STATUS

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

1 1 NO CURRENT /u02/oracle/oradata/orcl/redo01.log

2 1 YES INACTIVE /u02/oracle/oradata/orcl/redo02.log

3 1 YES INACTIVE /u02/oracle/oradata/orcl/redo03.log


create table redo_01 as select * from scott.dept;


刪除當前日誌:

rm -rf /u02/oracle/oradata/orcl/redo01.log


SQL> startup;

ORACLE instance started.


Total System Global Area 2772574208 bytes

Fixed Size 2256472 bytes

Variable Size 771752360 bytes

Database Buffers 1979711488 bytes

Redo Buffers 18853888 bytes

Database mounted.

ORA-00313: open failed for members of log group 1 of thread 1

ORA-00312: online log 1 thread 1: ‘/u02/oracle/oradata/orcl/redo01.log‘

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3


數據庫啟動不了。具體信息上面。如何處理呢?

要利用熱備份文件進行恢復,但是要丟失數據。。。。。

利用之前的備份文件還原回去。

之前的備份腳本如下:

[[email protected] ~]$ cat hotbackup.sh

sqlplus / as sysdba <<eof

!echo ‘begin hot backup ‘

alter database begin backup;

!echo ‘copy files‘

!cp -v /u02/oracle/oradata/orcl/system01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/sysaux01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/undotbs01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/users01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/test01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/rrr.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/tttt.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/tttt02.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/tttt03.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/temp01.dbf /home/oracle/hot_backup/


!echo ‘end backup database‘

alter database end backup;

exit

eof


還原數據。

cp /home/oracle/hot_backup/*.dbf /u02/oracle/oradata/orcl/


執行命令:

recover database until cancel;

SQL> recover database until cancel;

ORA-00279: change 1575684 generated at 08/31/2017 21:51:18 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_34_953475378.dbf

ORA-00280: change 1575684 for thread 1 is in sequence #34



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


CANCEL

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

ORA-01195: online backup of file 1 needs more recovery to be consistent

ORA-01110: data file 1: ‘/u02/oracle/oradata/orcl/system01.dbf‘


填寫 AUTO | CANCEL都不行,怎麽辦呢?

SQL> alter database open resetlogs;

alter database open resetlogs

*

ERROR at line 1:

ORA-01195: online backup of file 1 needs more recovery to be consistent

ORA-01110: data file 1: ‘/u02/oracle/oradata/orcl/system01.dbf‘



也不行。。。。。z在線求解答!!!!!!


(3)非歸檔模式丟失數據文件(不完全恢復---丟數據)

如果數據庫處於noarchivelog模式下,如果丟失了任何數據文件,請執行如下任務:

1、如果實例沒有關閉,請關閉實例

2、從備份還原整個數據庫,包括所有數據文件、控制文件和重做redo文件。

3、打開數據庫

4、讓用戶重新輸入自上次備份以來所做的所有更改。


startup mount;

alter database noarchivelog;//改成非歸檔模式!!!!!!!

archive log list;

做一次冷備份。

select * from v$log;

select current_scn from v$database;


創建一張表,insert 一些數據。


影響:只能還原到備份之前的數據。備份之後的所有操作數據都丟了,好悲吹。這裏我就不做實驗了。

備註:數據庫處於非歸檔狀態,其聯機日誌循環覆蓋使用,這意味著如果數據庫需要進行介質恢復應用相關歸檔,

又由於非歸檔導致歸檔文件不存在,那麽此時數據庫只能執行基於取消的恢復,回退整個數據庫到上一次全備份狀態。

或者修改數據文件頭部信息,來規避缺失歸檔。但不管怎麽樣都會丟失數據。



(4)歸檔模式丟失非關鍵數據文件

如果丟失某個數據文件,且該文件不屬於system或undo表空間,則可以還原並恢復缺少的數據文件。。。。

已經打開歸檔模式:

SQL> archive log list

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /u02/arch

Oldest online log sequence 47

Next log sequence to archive 49

Current log sequence 49


scott用戶登錄,創建一張表:

create table test as select * from dept;

select table_name,tablespace_name from dba_tables where table_name=‘TEST‘ and owner=‘SCOTT‘;


SQL> select table_name,tablespace_name from dba_tables where table_name=‘TEST‘ and owner=‘SCOTT‘;


TABLE_NAME TABLESPACE_NAME

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

TEST USERS


查看表空間和文件名對應關系:

col file_name for a50

col tablespace_name for a10

col file_id for a50


select file_name,tablespace_name,file_id from dba_data_files where tablespace_name=‘USERS‘;

FILE_NAME TABLESPACE FILE_ID

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

/u02/oracle/oradata/orcl/users01.dbf USERS ##########


刪除users表空間對應的數據文件。

rm -rf /u02/oracle/oradata/orcl/users01.dbf


SQL> select * from test;

select * from test

*

ERROR at line 1:

ORA-01116: error in opening database file 4

ORA-01110: data file 4: ‘/u02/oracle/oradata/orcl/users01.dbf‘

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3


利用熱備份的數據 cp

[[email protected] ~]$ cat hotbackup.sh

sqlplus / as sysdba <<eof

!echo ‘begin hot backup ‘

alter database begin backup;

!echo ‘copy files‘

!cp -v /u02/oracle/oradata/orcl/system01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/sysaux01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/undotbs01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/users01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/test01.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/rrr.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/tttt.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/tttt02.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/tttt03.dbf /home/oracle/hot_backup/

!cp -v /u02/oracle/oradata/orcl/temp01.dbf /home/oracle/hot_backup/


!echo ‘end backup database‘

alter database end backup;

exit

eof



sys用戶先執行:

alter database datafile 4 offline;

執行copy命令:

cp /home/oracle/hot_backup/users01.dbf /u02/oracle/oradata/orcl/users01.dbf


alter database datafile 4 online;

SQL> alter database datafile 4 online;

alter database datafile 4 online

*

ERROR at line 1:

ORA-01113: file 4 needs media recovery

ORA-01110: data file 4: ‘/u02/oracle/oradata/orcl/users01.dbf‘


繼續執行命令:(對該文件單獨恢復!!!)

recover datafile 4;


SQL> recover datafile 4;

ORA-00279: change 1443443 generated at 08/31/2017 23:21:10 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_44_944544087.dbf

ORA-00280: change 1443443 for thread 1 is in sequence #44



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

auto

ORA-00279: change 1447568 generated at 09/01/2017 01:05:39 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_45_944544087.dbf

ORA-00280: change 1447568 for thread 1 is in sequence #45



Log applied.

Media recovery complete.


執行online

SQL> alter database datafile 4 online;


Database altered.


繼續查詢test表;

SQL> select * from test;


DEPTNO DNAME LOC

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

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS

30 SALES CHICAGO

40 OPERATIONS BOSTON


test表已經恢復了。。。。。。。搞定。


(5)歸檔模式丟失系統關鍵數據文件

如果丟失system或者undo表空間。

處理步驟:

1、shutdown abort關閉實例

2、裝卸數據庫 (mount狀態)

3、還原並恢復丟失的數據文件

4、打開數據庫


案例1:假如丟失undo表空間(先備份數據庫)

SQL> select name from v$datafile;

/u02/oracle/oradata/orcl/system01.dbf

/u02/oracle/oradata/orcl/sysaux01.dbf

/u02/oracle/oradata/orcl/undotbs01.dbf

/u02/oracle/oradata/orcl/users01.dbf

/u02/oracle/oradata/orcl/test01.dbf

/u02/oracle/oradata/orcl/rrr.dbf

/u02/oracle/oradata/orcl/tttt.dbf

/u02/oracle/oradata/orcl/tttt02.dbf

/u02/oracle/oradata/orcl/tttt03.dbf


rm -rf /u02/oracle/oradata/orcl/undotbs01.dbf


錯誤信息:

ORA-01110: data file 3: ‘/u02/oracle/oradata/orcl/undotbs01.dbf‘

ORA-1157 signalled during: ALTER DATABASE OPEN...


SQL> shutdown abort

ORACLE instance shut down.

SQL> startup

ORACLE instance started.


Total System Global Area 2772574208 bytes

Fixed Size 2256472 bytes

Variable Size 771752360 bytes

Database Buffers 1979711488 bytes

Redo Buffers 18853888 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: ‘/u02/oracle/oradata/orcl/undotbs01.dbf‘


把之前熱備份uodo表空間的數據cp到相關目錄:

cp /home/oracle/hot_backup/undotbs01.dbf /u02/oracle/oradata/orcl/


根據上面錯誤信息恢復數據文件3:

SQL> recover datafile 3;

ORA-00279: change 1467926 generated at 09/09/2017 08:56:55 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_50_944544087.dbf

ORA-00280: change 1467926 for thread 1 is in sequence #50



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

auto

ORA-00279: change 1475654 generated at 09/09/2017 14:00:58 needed for thread 1

ORA-00289: suggestion : /u02/arch/1_51_944544087.dbf

ORA-00280: change 1475654 for thread 1 is in sequence #51



Log applied.

Media recovery complete.


最後打開數據庫:

SQL> alter database open;


Database altered.


搞定!!!!!!!!!!!!!


(6)歸檔模式下,用戶誤刪除表(日誌挖掘)

通過日誌挖掘恢復表。註意:之後的操作都失效了。

1、確保歸檔模式、確保備份有效。

使用scott模擬誤刪除,刪除emp表

SQL> conn scott/tiger;

Connected.

SQL> select * from tab;


TNAME TABTYPECLUSTERID

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

BONUS TABLE

DEPT TABLE

EMP TABLE

SALGRADE TABLE

TEST TABLE


SQL> drop table emp purge;


Table dropped.


2、使用sys用戶,日誌挖掘,找到誤操作準確的scn

conn / as sysdba


構造日誌挖掘隊列語句。

select ‘exec dbms_logmnr.add_logfile(‘‘‘||member||‘‘‘)‘ from v$logfile;

SQL> select ‘exec dbms_logmnr.add_logfile(‘‘‘||member||‘‘‘)‘ from v$logfile;


exec dbms_logmnr.add_logfile(‘/u02/oracle/oradata/orcl/redo03.log‘)

exec dbms_logmnr.add_logfile(‘/u02/oracle/oradata/orcl/redo02.log‘)

exec dbms_logmnr.add_logfile(‘/u02/oracle/oradata/orcl/redo01.log‘)



3、執行構造挖掘語句,把當前3個redo文件都添加到挖掘隊列中去。

SQL> exec dbms_logmnr.add_logfile(‘/u02/oracle/oradata/orcl/redo02.log‘)


PL/SQL procedure successfully completed.


SQL> exec dbms_logmnr.add_logfile(‘/u02/oracle/oradata/orcl/redo01.log‘)


PL/SQL procedure successfully completed.


SQL> exec dbms_logmnr.add_logfile(‘/u02/oracle/oradata/orcl/redo03.log‘)


PL/SQL procedure successfully completed.


4、執行挖掘:

exec dbms_logmnr.start_logmnr();


SQL> exec dbms_logmnr.start_logmnr();


PL/SQL procedure successfully completed.


5、查詢挖掘出來信息,找出誤操作的scn

select scn,sql_redo from v$logmnr_contents where seg_name=‘EMP‘ and seg_owner=‘SCOTT‘ and sql_redo like ‘drop table emp%‘;


SQL> select scn,sql_redo from v$logmnr_contents where seg_name=‘EMP‘ and seg_owner=‘SCOTT‘ and sql_red

o like ‘drop table emp%‘;

SCN

----------

SQL_REDO

1440820

drop table emp purge;


6、停止數據庫。

把熱備份的數據文件cp到相關目錄:


cp /home/oracle/hot_backup/*.dbf /u02/oracle/oradata/orcl/ (生產環境要備份好。)



啟動數據庫到mount狀態

startup mount;


7、執行恢復,把數據庫恢復到誤操作的scn(1440820)的前一刻 1440819

recover database until change 1440819;


8、 resetlogs 方式打開數據庫。

alter database open resetlogs;


SQL> shutdown abort;

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.


Total System Global Area 2772574208 bytes

Fixed Size 2256472 bytes

Variable Size 771752360 bytes

Database Buffers 1979711488 bytes

Redo Buffers 18853888 bytes

Database mounted.

SQL> recover database until change 1440819;

Media recovery complete.

SQL> alter database open resetlogs;


Database altered.


最後看emp表:

SQL> select count(*) from emp;


COUNT(*)

----------

14

emp表找到了。。搞定了。。。。(最後重新備份。)


本文出自 “梁小明的博客” 博客,請務必保留此出處http://7038006.blog.51cto.com/7028006/1966880

20、oracle用戶管理恢復