zoukankan      html  css  js  c++  java
  • OCP读书笔记(6)

    6.Restore and Recovery Task

    非关键性文件丢失的恢复

    临时文件丢失的恢复

    临时表空间文件丢失的恢复:

    查看数据库中的临时文件:

    SQL> select file#,STATUS,NAME from v$tempfile;

    临时文件丢失后,一些操作,比如排序,有可能不能执行

    排序:首先在pga中进行,如果pga中空间不够,就会将数据库临时放入临时文件

    模拟损坏:

    SQL> alter system set pga_aggregate_target=10M;
    SQL> !rm -rf /u01/app/oracle/oradata/orcl/temp01.dbf;
    SQL> select * from dba_objects order by 1,2,3,4,5,6,7,8,9,10,11,12,13; 

    恢复:

    SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' size 100M;
    SQL> select * from dba_objects order by 1,2,3,4,5,6,7,8,9,10,11,12,13; --error
    SQL> alter tablespace temp drop tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf';--删除丢失的临时文件 SQL>select * from dba_objects order by 1,2,3,4,5,6,7,8,9,10,11,12,13;

    如果数据库在启动的时候发现临时文件丢失,oracle会自动创建临时文件

    SQL> select file#,STATUS,NAME from v$tempfile;
    
    SQL> !cd $ORACLE_BASE/diag/rdbms/orcl/orcl;
    SQL> !tail -f alert_orcl.ora;
    
    SQL> startup force;

    日志文件丢失的恢复

    联机重做日志文件丢失的恢复

    如果每组日志中有多个成员,当其中一个成员损坏时,如何恢复

    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member
    from v$log a,v$logfile b
    where a.group#=b.group#;

    此时每组中只用一个成员,为每组添加一个成员文件:

    SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo0101.log' to group 1;
    SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo0201.log' to group 2;
    SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo0301.log' to group 3;
    
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#; 

    此时,每组日志中有两个成员

    状态为INACTIVE的日志组中的某个成员损坏的恢复:

    删除第2中的成员文件:

    SQL> ! rm -rf /u01/app/oracle/oradata/orcl/redo0201.log;
    SQL> !ls /u01/app/oracle/oradata/orcl/redo0201.log;
    
    SQL> alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo0201.log';
    SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo0201.log' to group 2;

    状态为ACTIVE的日志组中的某个成员损坏的恢复:

    SQL> alter system switch logfile;
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#;
    
    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo0101.log;
    SQL> !ls /u01/app/oracle/oradata/orcl/redo0101.log;
    
    SQL> alter system checkpoint;--执行检查点,写脏块,使其变为INACTIVE
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#;
    
    SQL> alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo0101.log';
    SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo0101.log' to group 1;

    状态为的CURRENT日志组中的某个成员损坏的恢复:

    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo0201.log;
    SQL> !ls /u01/app/oracle/oradata/orcl/redo0201.log;
    
    SQL> alter system switch logfile;--切换日志,使其变为ACTIVE
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#;
    
    SQL> alter system checkpoint;--执行检查点,使其变为INACTIVE
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#;
    
    SQL> alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo0201.log';
    SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo0201.log' to group 2;

    如果每组日志中有多个成员,当所有的成员损坏时,如何恢复

    状态为INACTIVE的日志组中的所有成员损坏的恢复:

    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#;
    
    --删除第2组中的所有日志文件:
    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo02.log;
    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo0201.log;
    
    SQL> alter database clear logfile group 2;
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#;

    状态为ACTIVE的日志组中的所有成员损坏的恢复:

    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#; 
    
    --删除第3组日志中的所有成员:
    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo03.log;
    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo0301.log;
    
    SQL> alter system checkpoint;--执行检查点,使其变为INACTIVE
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#; 
    
    SQL>alter database clear logfile group 3;
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#; 

    状态为CURRENT的日志组中的所有成员损坏的恢复:

    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo02.log;
    SQL> !rm -rf /u01/app/oracle/oradata/orcl/redo0201.log;
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#; 
    
    SQL> alter system switch logfile; --切换日志,使其变为ACTIVE
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#; 
    
    SQL> alter system checkpoint; --执行检查点,使其变为INACTIVE
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#; 
    
    SQL> alter database clear unarchived logfile group 2;
    SQL> select a.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile b
    where a.group#=b.group#;  

    要对数据库进行全备,因为oracle将没有归档的日志清除,之前的备份不能进行完全恢复

    口令文件丢失的恢复

    1. 模拟损坏:

    删除口令文件:

    cd $ORACLE_HOME/dbs/
    rm -rf orapworcl

    2. 如何修复口令文件:

    1)使用操作系统验证登陆数据库:

    [oracle@nylg dbs]$ sqlplus sys/a@orcl as sysdba

    口令文件丢失,使用口令验证无法登陆,只能通过操作系统验证登陆

    [oracle@nylg dbs]$ su - oracle
    [oracle@nylg dbs]$ sqlplus / as sysdba

    2)将 REMOTE_LOGIN_PASSWORDFILE 参数设置为 NONE 并重新启动数据库

    REMOTE_LOGIN_PASSWORDFILE 参数有三个值:
    NONE禁止使用口令登陆
    EXCLUSIVE:主要是针对于多实例来说的,如果数据库是多实例的,也就是RAC,只允许某个单实例使用口令文件
    SHARE:主要是针对于多实例来说的,如果数据库是多实例的,也就是RAC,允许所有的实例共享使用一个口令文件

    SQL> alter system set REMOTE_LOGIN_PASSWORDFILE=NONE scope=spfile;
    SQL> startup force;

    3)使用口令实用程序orapwd创建口令文件
    orapwd file=filename password=password entries=max_users

    其中:
    filename 是口令文件的名称
    password 是 SYSOPER 和 SYSDBA 的口令
    Entries 是允许以 SYSDBA 或 SYSOPER 身份连接的最大不同用户数
    如果超出了此数值,必须创建新口令文件,使用较大的数值比较保险
    等号 (=) 字符两边没有空格

    [oracle@nylg dbs]$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=a entries=5

    测试entries:

    SQL> alter system set REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
    SQL> startup force;
    SQL> select * from v$pwfile_users;

    发现口令文件里有一个用户的口令

    往口令文件中添加用户:

    SQL> set serveroutput on 
    SQL> begin
    for i in 1..10 loop
        dbms_output.put_line('grant sysdba,sysoper to a'||i||' identified by a;');
    end loop;
    end;
    /

    entries=5是不准确的,但是能够起到限制用户数的作用

    SQL> select * from v$pwfile_users;

    4)将 REMOTE_LOGIN_PASSWORDFILE参数设置为EXCLUSIVE

    SQL> alter system set REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
    SQL> startup force;

    5)使用在步骤 3 中创建的口令文件连接到数据库

    SQL> CONNECT sys/a@orcl AS SYSDBA;

    索引表空间文件丢失的恢复

    索引表空间文件丢失的恢复:

    数据库中有一个表空间单独的存储数据库中的索引,如果这个表空间的文件丢失,应该如何恢复:

    SQL> conn /as sysdba;
    SQL> create tablespace ind_tbs datafile '/u01/app/oracle/oradata/orcl/ind_tbs01.dbf' size 10M;
    
    SQL> conn /as sysdba;
    SQL> grant select on dba_objects to scott;
    
    SQL> conn scott/tiger;
    SQL> create table t as select * from dba_objects;
    SQL> create index ind_t on t(object_id) tablespace ind_tbs;
    
    SQL> conn /as sysdba;
    SQL> execute dbms_stats.gather_table_stats('scott','t',cascade=>true);
    
    SQL> @?/sqlplus/admin/plustrce.sql---安装autotrace
    
    SQL> grant plustrace to scott;
    SQL> select min(object_id) from dba_objects;
    
    SQL> conn scott/tiger;
    SQL> set autotrace traceonly exp;
    SQL> select * from t where object_id=2;

    此时走索引

    SQL> conn /as sysdba;
    SQL> alter system flush buffer_cache;
    SQL> alter system flush shared_pool;
    
    SQL> conn scott/tiger;
    SQL> set autotrace traceonly exp;
    SQL> select * from t where object_id=2;
    
    SQL> set autotrace off;
    SQL> select * from t where object_id=2;--此查询使用索引,但是索引表空的文件丢失,所以报错
    
    SQL> set autotrace traceonly exp;
    SQL> select /*+ full(t) */ * from t where object_id=2;--可以使用全表扫描,但是性能会下降
    
    SQL> set autotrace off;
    SQL> select /*+ full(t) */ * from t where object_id=2;

    通过提取元数据,来恢复索引表空间下的数据:

    SQL> conn /as sysdba;
    
    SQL> spool /u01/app/oracle/create_ind.sql;
    SQL> set trims on;
    SQL> set long 10000;
    SQL> select dbms_metadata.get_ddl('INDEX',a.SEGMENT_NAME,a.owner) from dba_segments a
    where a.segment_type='INDEX'
    and a.owner<>'SYS'
    and a.tablespace_name='IND_TBS'
    SQL> /
    SQL> spool off;
    
    SQL> alter database datafile 7 offline drop;
    SQL> drop tablespace ind_tbs including contents and datafiles;
    SQL> create tablespace ind_tbs datafile '/u01/app/oracle/oradata/orcl/ind_tbs01.dbf' size 10M;
    
    SQL> get /u01/app/oracle/create_ind.sql;
    SQL> /
    SQL> exec dbms_stats.gather_table_stats('scott','t',cascade=>true);
    
    SQL> conn scott/tiger;
    SQL> set autotrace traceonly exp;
    SQL> select * from t where object_id=2;
    SQL> set autotrace off;
    SQL> select * from t where object_id=2;--恢复成功

    只读表空间文件丢失的恢复

    只读表空间的备份:

    SQL> alter tablespace users read only;
    SQL> !cp /u01/app/oracle/oradata/orcl/users01.dbf /u01/app/oracle/backup/hotbk/;

    只读表空间的恢复

    1. 如果表空间从备份到损害时,一直是read only的
    直接将备份复制到文件位置:

    SQL> alter database datafile offline;
    SQL> !cp /u01/app/oracle/backup/hotbk/users01.dbf /u01/app/oracle/oradata/orcl;
    SQL> alter database datafile online;

    2. 如果表空间在备份完成之后,修改为read write:

    SQL> alter database datafile offline;
    SQL> !cp /u01/app/oracle/backup/hotbk/users01.dbf /u01/app/oracle/oradata/orcl;
    SQL> recover datafile;
    SQL> alter database datafile online;

    NOLOGING对象的恢复

    SQL> CREATE TABLE sales_copy NOLOGGING;
    SQL> INSERT /*+ APPEND */ INTO sales_copy SELECT * FROM sales_history;

    如果sales_copy所在的表空间损害,在执行恢复的时候,会报逻辑损害,此时应该删除该表,重新创建

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

    日志组状态
    CURRENT: LGWR进程正在将日志写入该日志组。
    ACTIVE:没有被写入,但是对于实例恢复仍然是必须的。执行checkpoint后,可以当做INACTIVE。
    INACTIVE:没有被写入,而且对于实力恢复不是必须的。足够多的日志切换之后,可以被使用。CLEAR之后,也可以被重新使用。

    Clearinig日志文件
    ALTER DATABASE CLEAR [UNARCHIVED] LOGFILE GROUP <n> [UNRECOVERABLE DATAFILE]
    ALTER DATABASE CLEAR LOGFILE (Log file is archived)
    ALTER DATABASE CLEAR UNARCHIVED LOGFILE (Log file is not archived and not needed for data file)
    ALTER DATABASE CLEAR UNARCHIVED LOGFILE ... UNRECOVERABLE DATAFILE (Log file is not archived and needed for data file)

    SQL> select group#, status, archived from v$log;
    SQL> alter database clear logfile group 3;

    索引表空间的恢复
    不需要执行RECOVER任务,可以通过重新创建表空间以及重新创建索引进行恢复。
    当属于该表空间的某一数据文件丢失,可以执行如下步骤:
    1.drop掉该数据文件
    2.drop掉该表空间
    3.重新创建索引表空间
    4.重建位于该表空间的索引

    使用以下选项可以减少重建索引的时间
    PARALLEL
    NOLOGGING
    SQL> CREATE INDEX rname_idx
    2 ON hr.regions (region_name)
    3 PARALLEL 4;

    数据库管理员认证方法
    操作系统认证
    口令文件

    重建口令文件

    $ orapwd file=$ORACLE_HOME/dbs/orapworcl password=admin entries=5
    filename: the name of the password file (mandatory).
    password: the password for SYS (optional).
    entries: the maximum number of distinct users allowed to connect as SYSDBA or SYSOPER. If you exceed this number, you must create a new password file.

    SQL> CONNECT sys/admin AS SYSDBA
    SQL> grant sysdba to admin2;

    完全恢复与不完全恢复的比较
    完全恢复:恢复到数据库发生崩溃的时间点,所有提交的数据均得到恢复。
    不完全恢复:恢复到过去某一指定时间点。

    完全恢复过程
    1.将损坏或丢失的文件从备份拷贝到数据文件目录
    2.执行前滚操作(cache recovery)
    3.恢复的数据文件可能包含提交的和未提交的改变
    4.执行回滚操作(transaction recovery)
    5.数据文件现在处于复原状态并且去其他数据文件保持一致

    不完全恢复过程
    1.将损坏或丢失的文件从备份拷贝到数据文件目录
    2.使用RECOVER命令,从归档重做日志文件中应用重做,包含尽可能多内容以达到指定时间点目标
    3.恢复的数据文件包含一些提交的和未提交的事物,因为重做可能包含未提交数据
    4.使用ALTER DATABASE OPEN命令,数据库在回滚被应用之前打开。
    5.应用回滚数据,当重做被应用后,重做所支持的回滚数据文件同样被应用了,因此可以进行回滚。
    6.过程结束

    将read-only表空间改为read/write:
    1. 对只读表空间进行备份。不许要将表空间或者数据文件离线。
    2. 将表空间改为read/werite.
    3. 使用备份的只读表空间restore后,还需要进行recover操作,因为只读表空间在备份后,改为读写后的表空间有可能被写入.

    恢复NOLOGGING数据库对象
    需要及时备份,因为不能应用重做。
    当执行介质恢复过程中包含NOLOGGING对戏那个,这些对象会被逻辑标识为corrupt状态,在这种情况下,需要对这些对象进行drop然后重建。
    使用RMAN> REPORT UNRECOVERABLE命令可以列出包含NOLOGGING操作对象的表空间名称。

    控制文件丢失的恢复
    1. 当在线日志状态为可用时,不论数据文件为可用还是备份
    恢复备份的控制文件,执行完全恢复,然后OPEN RESETLOGS

    2.当在线日志状态为不可用时,如果数据文件状态为可用
    重新创建(Re-create)控制文件,然后OPEN RESETLOGS

    3.当在线日志状态为不可用时,如果数据文件状态为备份
    恢复备份的控制文件,执行不完全恢复,然后OPEN RESETLOGS

    % cp /backup/control01.dbf /disk1/oradata/trgt/control01.dbf
    % cp /backup/control02.dbf /disk2/oradata/trgt/control02.dbf
    SQL> startup mount
    SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;

    备注:非归档模式全备不能使用RMAN RECOVER命令,仅归档模式全备以及增量备份(归档或非归档均可)

  • 相关阅读:
    KMP算法
    Python 正则表达式
    Python 装饰器
    C/C++ 之输入输出
    PAT(Basic Level)--个位数统计
    Java 接口与抽象类
    Java集合-01概述
    数据结构--红黑树
    数据结构--(AVL)平衡二叉树
    数据结构--二叉搜索树
  • 原文地址:https://www.cnblogs.com/thlzhf/p/3382682.html
Copyright © 2011-2022 走看看