首页 > 代码库 > Oracle非关键文件恢复,日志成员、临时文件、索引表空间、口令文件(密码文件)

Oracle非关键文件恢复,日志成员、临时文件、索引表空间、口令文件(密码文件)

 

关键性与非关键性
    非关键性文件是指数据库和大多数应用程序没有它也能继续运行的文件。例如,如果数据库丢失了一个多路复用重做日志文件,仍可使用其它重做日志文件副本来保持数据库持续运行。
    虽然丢失非关键性文件不会导致数据库崩溃,但它会削弱数据库的功能。例如:


丢失索引表空间会导致应用程序和查询的运行速度大幅减慢,或者,如果这些索引用于强制实施约束,则丢失后甚至会导致应用程序无法使用。
丢失联机重做日志组(只要不是当前联机日志组)会导致在 LGWR 下一次尝试写入组时数据库操作被挂起,直到生成新的日志文件为止。


丢失临时表空间会使用户无法运行查询或创建索引,直到将这些用户分配到新的临时表空间为止。
 --10g时丢失临时表空间,数据库不能启动,当11g时,丢失了临时文件,数据库会自动创建一个同名同位的临时文件;
 --11g中发生此情时发生这种情况时,启动过程中会在预警日志中显示类似下面的消息:
 --
Re-creating tempfile /u01/app/oracle/oradata/orcl/temp01.dbf
-----------------------------------------------------------------------------------------------------------------

一、日志成员丢失:
    要处理重做日志文件的丢失问题,了解重做日志组的可能状态非常重要。在 Oracle DB 正常运行过程中,重做日志组会循环经历三种不同的状态。按照循环的顺序,状态分别是:

CURRENT:此状态表明 LGWR 正在向重做日志组写入数据,以记录数据库中正在进行的所有事务处理的重做数据。该日志组将保持此状态,直到切换至其它日志组为止。

ACTIVE:重做日志组仍包含恢复实例所需的重做数据。这是尚未执行检查点期间重做日志组所处的状态,重做日志组中出现的所有数据更改都将写出到数据文件。

INACTIVE:上述检查点已经执行,这表示不再需要该重做日志组来恢复实例,它可以变为下一个 CURRENT 日志组。

 

对在线redo log的操作:

查看日志组的状态:
SYS@PROD>select GROUP#,SEQUENCE#,MEMBERS,ARCHIVED,STATUS from v$log;

    GROUP#  SEQUENCE#    MEMBERS ARC STATUS
---------- ---------- ---------- --- ----------------
         1          7          2 YES INACTIVE
         2          8          2 NO  CURRENT
         3          6          2 YES INACTIVE
查看日志文件的状态:
SYS@PROD>select GROUP# ,TYPE,MEMBER from v$logfile;

    GROUP# TYPE       MEMBER
---------- -----------------------------------------------------------------
         3 ONLINE
/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_3_b22567o2_.log

         3 ONLINE
/u01/app/oracle/fast_recovery_area/PROD/onlinelog/o1_mf_3_b2256827_.log

         2 ONLINE
/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_2_b2255zsg_.log

         2 ONLINE
/u01/app/oracle/fast_recovery_area/PROD/onlinelog/o1_mf_2_b22560gb_.log

         1 ONLINE
/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_1_b2255npg_.log

         1 ONLINE
/u01/app/oracle/fast_recovery_area/PROD/onlinelog/o1_mf_1_b2255nxl_.log


6 rows selected.


1.当某个日志组中的一个数据文件丢失,对其在线操作,先添加,再删除;

alter database add logfile member ‘/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_2_b_.log‘ to group 2;

alter database drop logfile member ‘/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_1_b2255npg_.log‘ to group 2;

2.在线添加一个组,再添加一个成员;

SYS@ORCL>alter database add logfile group 4 ‘/u01/app/oracle/oradata/ORCL/onlinelog/redo04.log‘size 100m;

SYS@ORCL>alter database add logfile member‘/u01/app/oracle/oradata/ORCL/onlinelog/redo04_b.log‘ to group 4;

3.查看日志组及成员;
SYS@ORCL>select GROUP#,members,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

-----------------------------------------------------------------------------------------------------------------
二、丢失临时文件:

1.--查看临时文件的位置及名称
SYS>select name from v$tempfile;
/u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b22570tq_.tmp

2.--删除临时文件
SYS>!rm /u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b22570tq_.tmp

3.--触发错误,临时文件未找到
SYS>create global temporary table tab_temp as select * from dba_objects;
create global temporary table tab_temp as select * from dba_objects
                                                        *
ERROR at line 1:
ORA-01116: error in opening database file 201
ORA-01110: data file 201:
‘/u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b22570tq_.tmp‘
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

4.在知道临时数据文件丢失时,可以不需要重新启动数据库就可以在丢失了临时文件后进行恢复;

SQL> ALTER TABLESPACE temp ADD TEMPFILE ‘/u01/app/oracle/oradata/orcl/temp02.dbf‘ SIZE 20M;
 Tablespace altered.

 

SQL> ALTER TABLESPACE temp DROP TEMPFILE ‘/u01/app/oracle/oradata/orcl/temp01.dbf‘;
 

Tablespace altered.
 

5. 1)在11g中还可以重启数据库,数据库会自动重建临时数据文件,可以查看alert日志看相关信息(一般直接第4步就可以了)

shutdown immediate;

SYS>startup
ORACLE instance started.
Total System Global Area  839282688 bytes
Fixed Size                  2257880 bytes
Variable Size             545262632 bytes
Database Buffers          289406976 bytes
Redo Buffers                2355200 bytes
Database mounted.
Database opened.

SYS>select name from v$tempfile;
/u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b29o0g6r_.tmp

1 row selected.
   --数据库重建

2)在11g以前,如数据库不能重起,可以创建新的临时表空间:

create temporary tablespace temp2 tempfile
‘/u01/app/oracle/oradata/orcl/temp2.dbf‘ size 10m reuse autoextend on  maxsize  200m;

SQL>alter database default temporary tablespace temp2;
   --将新的表空间设置为默认的临时表空间

SQL>drop tablespace temp including contents and datafiles;
   --删除旧的表空间及其数据

SQL>ALTER TABLESPACE temp ADD TEMPFILE ‘/u01/app/oracle/oradata/orcl/temp2.dbf‘ SIZE 20M;
   --给临时表空间添加文件

SYS>select * from database_properties
        where property_name=‘DEFAILT_TEMP_TABLESPACE‘;  --查看当前数据库默认数据库


-----------------------------------------------------------------------------------------------------------------
三、重建索引、丢失了索引表空间后进行恢复

重新创建索引

使用以下选项可缩短创建索引所花费的时间:

PARALLEL NOLOGGING

   PARALLEL(NOPARALLEL 是默认值):多个进程可以同时协同工作来创建索引。与单个服务器进程按顺序创建索引相比,通过在多个服务器进程之间分配创建索引所需的工作,Oracle 服务器可以更快速地创建索引。将随机对表取样并找到一组索引关键字,这些索引关键字按照指定的并行度将索引平均分为相同数目的片段。第一组查询进程将扫描表,提取关键字、行 ID 对并基于关键字将每个对发送到第二组查询进程中的一个进程中。第二组中的每个进程都对关键字进行排序并按常规方式构建索引。所有索引片段构建完成后,并行协调程序会将这些片段(已进行排序)级联以形成最终的索引。

SQL> CREATE INDEX rname_idx 
  ON hr.regions (region_name)
   PARALLEL 4;

  
   NOLOGGING:使用此关键字会加快索引的创建速度,因为创建进程创建的重做日志 条目极少。这种工作量大幅减小的重做生成也适用于直接路径插入和 Direct Loader (SQL*Loader) 插入。这是永久性属性,因此将显示在数据字典中。可以随时使用 ALTER INDEX NOLOGGING/LOGGING 命令来加以更新。
注:若数据库在nologging状态时,所操作的数据应该备份,再将nologging改回来,以免重大失误难以恢复
 
丢失了索引表空间后进行恢复:
   索引丢失时,更为快速、简单的方法是重新创建而不是尝试恢复索引。
 
 索引是计算得到的对象,因为它们不提供任何原始数据,只是已存在数据的另一表示形式。因此,在大多数情况下,可以很容易地重新创建索引。
如果您的表空间仅包含索引,则可以简化在丢失了属于该表空间的数据文件后的恢复工作。
如果丢失了此类数据文件,则可以执行以下步骤:

1.删除数据文件。

2.删除表空间。 3.重新创建索引表空间。

4.重新创建包含在表空间中的索引。
1.可以在不执行 RECOVER 任务的情况下恢复仅包含索引的表空间。

2.如果属于仅包含索引的表空间的数据文件丢失,则更为简单的方法可能是重新创建表空间和重新创建索引。

-----------------------------------------------------------------------------------------------------------------
四、重新创建口令验证文件


1.密码文件丢失
cd  $ORACLE_HOME/dbs  --密码文件的位置
ls -lrt|grep orapw
rm orapw...  --删除密码文件

2.登陆
SQL> CONNECT sys/admin AS SYSDBA
  --登陆失败,未找到密码文件

3.另一种方式登录:
sqlplus / as sysdba
   --os级别登陆
grant sysdba to hr;
  --授权sysdba给hr,会报错;
SQL> grant sysdba to admin2;

grant sysdba to admin2

*

ERROR at line 1:

ORA-01994: GRANT failed: password file missing or disabled

4.创建密码文件
[oracle@ocum ~]$ orapwd
Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>

  where
    file - name of password file (required),
    password - password for SYS will be prompted if not specified at command line,
    entries - maximum number of distinct DBA (optional),
    force - whether to overwrite existing file (optional),
    ignorecase - passwords are case-insensitive (optional),
    nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only).
   
  There must be no spaces around the equal-to (=) character.

 --使用口令实用程序 orapwd 创建口令文件。
orapwd file=filename password=password entries=max_users
其中:
 --
filename 是口令文件的名称(必需)。
 --
password 是 SYS 的口令(可选)。如果未包含 password 参数,则会收到提示,要求您输入口令。
 --
Entries 是允许以 SYSDBA 或 SYSOPER 身份连接的不同用户的最大数量。如果超出了此数值,必须创建新口令文件。使用较大的数值比较保险。
 --“等号”(=) 字符两边没有空格。
 
 --示例:$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=5

5.验证密码文件是否可用

SQL> CONNECT sys/admin AS SYSDBA


SQL> grant sysdba to admin2;


面向数据库管理员的验证方法  

根据是希望在数据库所在的那一台计算机上本地管理数据库,还是希望从一个远程客户机管理许多不同的数据库服务器,可以选择使用操作系统验证或口令文件验证来验证数据库管理员:

如果数据库具有口令文件且您已经具有 SYSDBA 或 SYSOPER 系统权限,则可以通过口令文件进行验证。 

如果服务器未使用口令文件,或者您不具有 SYSDBA 或 SYSOPER 权限因而不在口令文件中,则可以使用操作系统验证。在大多数操作系统中,数据库管理员的验证需要将数据库管理员的操作系统用户名放置到一个特殊组中,一般称为 OSDBA。该组中的用户将被授予 SYSDBA 权限。一个类似的组 OSOPER 用于向用户授予 SYSOPER 权限。

操作系统验证优先于口令文件验证。特别是,如果您是操作系统的 OSDBA 或 OSOPER 组的成员,并且以 SYSDBA 或 SYSOPER 身份连接,则连接时您将具有相关的管理权限,而与您指定的用户名/口令无关。

Oracle DB 提供了一个口令实用程序 orapwd 来创建口令文件。使用 SYSDBA 权限连接时,是以 SYS 方案连接,而不是以与用户名关联的方案连接。对于 SYSOPER,则将连接到 PUBLIC 方案。使用口令文件访问数据库的权限由授权用户发出的 GRANT 命令提供。 
   通常,口令文件不包含在备份中,因为几乎在所有情况下,均可方便地重新创建口令文件。
保护口令文件以及标识口令文件位置的环境变量对于系统安全性是至关重要的。对这些文件和环境变量具有访问权限的任何用户都可能潜在地影响连接的安全性。 
如果使用 REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE 或 SHARED 装载了数据库或实例,则不应删除或修改口令文件。否则,将无法使用该口令文件从远程重新连接。
注:口令区分大小写,在重新创建口令文件时必须考虑到这一点。

 

 

了解数据库设置表:
SYS@PROD>desc database_properties
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PROPERTY_NAME                             NOT NULL VARCHAR2(30)
 PROPERTY_VALUE                                     VARCHAR2(4000)
 DESCRIPTION                                        VARCHAR2(4000)

 

 

 

 


 

Oracle非关键文件恢复,日志成员、临时文件、索引表空间、口令文件(密码文件)