• RMAN异机恢复步骤及故障处理


    一、測试机安装OS+Oracle Software。包含配置oracle用户、组和环境变量(略)

    二、開始异机恢复

    1. 复制源库最新备份集、初始化參数、password文件到測试机
    [oracle@ora10g backupsets]$ scp *20141012* 192.168.1.213:/tmp
    The authenticity of host '192.168.1.213 (192.168.1.213)' can't be established.
    RSA key fingerprint is 78:0e:33:cb:3f:04:e4:5d:d1:71:29:a4:3f:3a:79:41.
    Are you sure you want to continue connecting (yes/no)?

    yes

    Warning: Permanently added '192.168.1.213' (RSA) to the list of known hosts.
    oracle@192.168.1.213's password: 
    Connection closed by 192.168.1.213
    lost connection
    [oracle@ora10g backupsets]$ scp *20141012* 192.168.1.213:/tmp
    oracle@192.168.1.213's password: 
    ora10g-4175411955_20141012_860776699_315.arc                                                       100% 4336KB   2.1MB/s   00:02    
    ora10g-4175411955_20141012_860776704_316.db                                                        100%  165MB   2.1MB/s   01:20    
    ora10g-4175411955_20141012_860776830_317.arc                                                       100%  418KB 417.5KB/s   00:00    
    ora10g-c-4175411955-20141012-00.ctl                                                                100% 7424KB   2.4MB/s   00:03    
    [oracle@ora10g backupsets]$ scp $ORACLE_HOME/dbs/initora10g.ora oracle@192.168.1.213:/tmp
    oracle@192.168.1.213's password: 
    initora10g.ora                                                                                     100% 1136     1.1KB/s   00:00  
    [oracle@ora10g backupsets]$ scp $ORACLE_HOME/dbs/orapwora10g oracle@192.168.1.213:/tmp
    oracle@192.168.1.213's password: 
    orapwora10g                                                                                        100% 1536     1.5KB/s   00:00  

    假设没有生成过initora10g.ora初始化參数文件。则创建一个:
    SQL> create pfile from spfile;
    创建完默认路径是放在$ORACLE_HOME/dbs以下

    2. 改动初始化參数
    [root@bak tmp]# cat initora10g.ora 
    ora10g.__db_cache_size=0
    ora10g.__java_pool_size=0
    ora10g.__large_pool_size=0
    ora10g.__shared_pool_size=0
    ora10g.__streams_pool_size=0
    *.audit_file_dest='/oracle/admin/ora10g/adump'
    *.background_dump_dest='/oracle/admin/ora10g/bdump'
    *.compatible='10.2.0.1.0'
    *.control_files='/oradata/ora10g/control01.ctl','/oradata/ora10g/control02.ctl','/oradata/ora10g/control03.ctl'#Restore Controlfile
    *.core_dump_dest='/oracle/admin/ora10g/cdump'
    *.db_block_size=8192
    *.db_domain=''
    *.db_file_multiblock_read_count=16
    *.db_name='ora10g'
    *.db_recovery_file_dest='/oracle/flash_recovery_area'
    *.db_recovery_file_dest_size=2147483648
    *.dispatchers='(PROTOCOL=TCP) (SERVICE=ora10gXDB)'
    *.job_queue_processes=10
    *.log_archive_format='%t_%s_%r.dbf'
    *.nls_language='SIMPLIFIED CHINESE'
    *.nls_territory='CHINA'
    *.open_cursors=300
    *.pga_aggregate_target=0
    *.processes=150
    *.remote_login_passwordfile='EXCLUSIVE'
    *.sga_target=0
    *.undo_management='AUTO'
    *.undo_tablespace='UNDOTBS1'
    *.user_dump_dest='/oracle/admin/ora10g/udump'

    注意。如果我这里測试机使用的文件夹和源库不同,注意红色部分为改动的内容

    3. 把password文件和改动好的初始化參数文件复制到測试机对应位置
    [oracle@bak ~]$ mv /tmp/initora10g.ora $ORACLE_HOME/dbs
    [oracle@bak ~]$ mv /tmp/orapwora10g $ORACLE_HOME/dbs

    4. 在測试机依据初始化參数文件里指定的路径创建文件夹(注意文件夹必须对于oracle用户有读写权限)
    [root@bak tmp]# mkdir /oradata/ora10g -p
    [root@bak tmp]# mkdir /oracle/admin/ora10g/adump -p
    [root@bak tmp]# mkdir /oracle/admin/ora10g/bdump
    [root@bak tmp]# mkdir /oracle/admin/ora10g/cdump
    [root@bak tmp]# mkdir /oracle/admin/ora10g/udump
    [root@bak tmp]# chown oracle:oinstall /oradata -R
    [root@bak tmp]# chmod 755 /oradata -R
    [root@bak tmp]# chown oracle:oinstall /oracle -R
    [root@bak tmp]# chmod 755 /oracle -R

    5. 启动实例到nomount
    SQL> startup nomount
    ORA-00371: not enough shared pool memory, should be atleast 72265318 bytes

    因为如果測试机配置要比源库低,而临时不确定怎样分配SGA,刚才在初始化參数中把内存分配的值,都设置成了0。包含sga_target,既然没有自己主动分配内存组件,那么手动设置sga_target=1G

    SQL> !
    [oracle@bak ~]$ vim /u01/app/oracle/product/10.2.0/db_1/dbs/initora10g.ora 
    ...
    *.sga_target=1G
    ...
    改动保存后。又一次启动实例

    [oracle@bak ~]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.1.0 - Production on Sun Oct 12 17:25:50 2014

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL> startup nomount
    ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
    ORA-01262: Stat failed on a file destination directory
    Linux Error: 2: No such file or directory

    因为刚才忘记创建了/oracle/flash_recovery_area这个文件夹,因此报错,假设測试机并不想启用FRA的话,能够把该參数凝视掉

    SQL> !
    [oracle@bak ~]$ vim /u01/app/oracle/product/10.2.0/db_1/dbs/initora10g.ora 
    ...
    #*.db_recovery_file_dest='/oracle/flash_recovery_area'
    #*.db_recovery_file_dest_size=2147483648
    ...

    [oracle@bak ~]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.1.0 - Production on Sun Oct 12 17:28:08 2014

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL> startup nomount
    ORACLE instance started.

    Total System Global Area 1073741824 bytes
    Fixed Size                  1223512 bytes
    Variable Size             264242344 bytes
    Database Buffers          805306368 bytes
    Redo Buffers                2969600 bytes
    SQL> 

    注意,假设登陆SQLPLUS时碰到无法用OS Local验证,仅仅需用netca创建一个监听就可以解决

    6. 恢复測试机控制文件
    [oracle@bak ~]$ rman target /

    Recovery Manager: Release 10.2.0.1.0 - Production on Sun Oct 12 17:42:07 2014

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    connected to target database: ora10g (not mounted)

    RMAN> restore controlfile from '/tmp/ora10g-c-4175411955-20141012-00.ctl';

    Starting restore at 12-OCT-14
    using target database control file instead of recovery catalog
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=156 devtype=DISK

    channel ORA_DISK_1: restoring control file
    channel ORA_DISK_1: restore complete, elapsed time: 00:00:05
    output filename=/oradata/ora10g/control01.ctl
    output filename=/oradata/ora10g/control02.ctl
    output filename=/oradata/ora10g/control03.ctl
    Finished restore at 12-OCT-14

    RMAN> alter database mount;

    database mounted
    released channel: ORA_DISK_1

    7. 恢复測试机数据文件
    RMAN> restore database;

    Starting restore at 12-OCT-14
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=156 devtype=DISK

    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of restore command at 10/12/2014 17:43:29
    ORA-01220: file based sort illegal before database is open

    RMAN> host!
    [oracle@bak ~]$ oerr ora 01220
    01220, 00000, "file based sort illegal before database is open"
    // *Cause:  A query issued against a fixed table or view required a temporary
    //          segment for sorting before the database was open.  Only in-memory
    //          sorts are supported before the database is open.
    // *Action: Re-phrase the query to avoid a large sort, increase the values
    //          of the SORT_AREA_SIZE and/or SORT_AREA_RETAINED_SIZE 
    //          initialization parameters to enable the sort to be done in memory.

    SQL> show parameter sort_

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    sort_area_retained_size              integer     0
    sort_area_size                       integer     65536

    查看源库也是这个配置,感觉提示中添加SORT_AREA_SIZE and/or SORT_AREA_RETAINED_SIZE是误导,怀疑是pga_aggregate_target设置为0引起的,有点不解的是,为什么RMAN做restore database还须要用到排序区

    [oracle@bak ~]$ vim $ORACLE_HOME/dbs/initora10g.ora
    ...
    *.pga_aggregate_target=90M    --调整到和源库一致
    ...

    调整完该參数后重新启动实例,再连接RMAN尝试一次

    SQL> startup nomount force
    ORACLE instance started.

    Total System Global Area 1073741824 bytes
    Fixed Size                  1223512 bytes
    Variable Size             264242344 bytes
    Database Buffers          805306368 bytes
    Redo Buffers                2969600 bytes
    SQL> show parameter pga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_target                 big integer 90M

    [oracle@bak ~]$ rman target /

    Recovery Manager: Release 10.2.0.1.0 - Production on Sun Oct 12 17:59:06 2014

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    connected to target database: ora10g (not mounted)

    RMAN> restore database;

    Starting restore at 12-OCT-14
    using target database control file instead of recovery catalog
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=156 devtype=DISK
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of restore command at 10/12/2014 17:59:15
    ORA-01507: database not mounted

    RMAN> alter database mount;

    database mounted
    released channel: ORA_DISK_1

    RMAN> restore database;

    Starting restore at 12-OCT-14
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=156 devtype=DISK

    channel ORA_DISK_1: starting datafile backupset restore
    channel ORA_DISK_1: specifying datafile(s) to restore from backup set
    restoring datafile 00001 to /u01/app/oracle/oradata/ora10g/system01.dbf
    restoring datafile 00002 to /u01/app/oracle/oradata/ora10g/undotbs01.dbf
    restoring datafile 00003 to /u01/app/oracle/oradata/ora10g/sysaux01.dbf
    restoring datafile 00004 to /u01/app/oracle/oradata/ora10g/users01.dbf
    restoring datafile 00005 to /u01/app/oracle/oradata/ora10g/example01.dbf
    restoring datafile 00006 to /u01/app/oracle/oradata/ora10g/zlm01.dbf
    channel ORA_DISK_1: reading from backup piece /u01/orabackup/backupsets/ora10g-4175411955_20141012_860776704_316.db
    ORA-19870: error reading backup piece /u01/orabackup/backupsets/ora10g-4175411955_20141012_860776704_316.db
    ORA-19505: failed to identify file "/u01/orabackup/backupsets/ora10g-4175411955_20141012_860776704_316.db"
    ORA-27037: unable to obtain file status
    Linux Error: 2: No such file or directory
    Additional information: 3
    failover to previous backup

    channel ORA_DISK_1: starting datafile backupset restore
    channel ORA_DISK_1: specifying datafile(s) to restore from backup set
    restoring datafile 00001 to /u01/app/oracle/oradata/ora10g/system01.dbf
    restoring datafile 00002 to /u01/app/oracle/oradata/ora10g/undotbs01.dbf
    restoring datafile 00003 to /u01/app/oracle/oradata/ora10g/sysaux01.dbf
    restoring datafile 00004 to /u01/app/oracle/oradata/ora10g/users01.dbf
    restoring datafile 00005 to /u01/app/oracle/oradata/ora10g/example01.dbf
    restoring datafile 00006 to /u01/app/oracle/oradata/ora10g/zlm01.dbf
    channel ORA_DISK_1: reading from backup piece /u01/orabackup/backupsets/ora10g-4175411955_20141011_860666488_312.db
    ORA-19870: error reading backup piece /u01/orabackup/backupsets/ora10g-4175411955_20141011_860666488_312.db
    ORA-19505: failed to identify file "/u01/orabackup/backupsets/ora10g-4175411955_20141011_860666488_312.db"
    ORA-27037: unable to obtain file status
    Linux Error: 2: No such file or directory
    Additional information: 3
    failover to previous backup

    channel ORA_DISK_1: starting datafile backupset restore
    channel ORA_DISK_1: specifying datafile(s) to restore from backup set
    restoring datafile 00001 to /u01/app/oracle/oradata/ora10g/system01.dbf
    restoring datafile 00002 to /u01/app/oracle/oradata/ora10g/undotbs01.dbf
    restoring datafile 00003 to /u01/app/oracle/oradata/ora10g/sysaux01.dbf
    restoring datafile 00004 to /u01/app/oracle/oradata/ora10g/users01.dbf
    restoring datafile 00005 to /u01/app/oracle/oradata/ora10g/example01.dbf
    restoring datafile 00006 to /u01/app/oracle/oradata/ora10g/zlm01.dbf
    channel ORA_DISK_1: reading from backup piece /u01/orabackup/backupsets/ora10g-4175411955_20140928_859456907_308.db
    ORA-19870: error reading backup piece /u01/orabackup/backupsets/ora10g-4175411955_20140928_859456907_308.db
    ORA-19505: failed to identify file "/u01/orabackup/backupsets/ora10g-4175411955_20140928_859456907_308.db"
    ORA-27037: unable to obtain file status
    Linux Error: 2: No such file or directory
    Additional information: 3
    failover to previous backup

    creating datafile fno=6 name=/u01/app/oracle/oradata/ora10g/zlm01.dbf
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of restore command at 10/12/2014 17:59:33
    ORA-01119: error in creating database file '/u01/app/oracle/oradata/ora10g/zlm01.dbf'
    ORA-27040: file create error, unable to create file
    Linux Error: 2: No such file or directory

    RMAN> 

    注意,这里有2个问题:
    1.找备份集的路径为/u01/orabackup/backupsets/,而在測试机上并没有此路径。之前仅仅是把备份集拷贝到了/tmp文件夹以下而已。并且能够发现一个非常有趣的现象。除了找最新的备份集xxx_316.db之外,还会往前去找之前的xxx_312.db,xxx_308这2个备份集,当然,这也是找不到的
    2.刚才在初始化參数中还改动过了数据文件路径,对于这些信息的改变。刚恢复出来的控制文件自然是不知道的
    对于第1个问题,须要把备份集的新位置告知RMAN,能够用catalog start with 'xxx'
    对于第2个问题,须要用set newname for datafile xxx 来调整,并用run脚本执行

    RMAN> catalog start with '/tmp';

    searching for all files that match the pattern /tmp
    no files found to be unknown to the database

    RMAN> exit


    Recovery Manager complete.

    [root@bak ~]# ll / |grep tmp
    drwxrwxrwx   4 root   root      4096 Oct 12 18:28 tmp

    [oracle@bak ~]$ ll /tmp
    total 181172
    srwxr-xr-x 1 root   root             0 Aug 22 13:28 mapping-root
    -rw-r----- 1 oracle oinstall   4440064 Oct 12 16:46 ora10g-4175411955_20141012_860776699_315.arc
    -rw-r----- 1 oracle oinstall 172843008 Oct 12 16:47 ora10g-4175411955_20141012_860776704_316.db
    -rw-r----- 1 oracle oinstall    427520 Oct 12 16:47 ora10g-4175411955_20141012_860776830_317.arc
    -rw-r----- 1 oracle oinstall   7602176 Oct 12 16:47 ora10g-c-4175411955-20141012-00.ctl
    srw------- 1 root   root             0 Aug 22 13:28 scim-panel-socket:0-root

    虽然备份集在tmp文件夹下,可是属主为root,RMAN自然无法对其进行操作。而对于tmp文件夹。也不方便把它作为oracle自己的文件夹,由于系统本身也会对该文件夹进行操作。由于那么我们为oracle用户单独创建个文件夹存放这些归档日志,并赋予权限

    [root@bak ~]# mkdir /oracle/backupsets -p
    [root@bak ~]# chmod 755  /oracle/backupsets -R
    [root@bak ~]# mv /tmp/*20141012* /oracle/backupsets

    [oracle@bak ~]$ rman target /

    Recovery Manager: Release 10.2.0.1.0 - Production on Sun Oct 12 18:31:16 2014

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    connected to target database: ORA10G (DBID=4175411955, not open)

    RMAN> catalog start with '/oracle/backupsets';

    using target database control file instead of recovery catalog
    searching for all files that match the pattern /oracle/backupsets

    List of Files Unknown to the Database
    =====================================
    File Name: /oracle/backupsets/ora10g-4175411955_20141012_860776704_316.db
    File Name: /oracle/backupsets/ora10g-4175411955_20141012_860776830_317.arc
    File Name: /oracle/backupsets/ora10g-c-4175411955-20141012-00.ctl
    File Name: /oracle/backupsets/ora10g-4175411955_20141012_860776699_315.arc

    Do you really want to catalog the above files (enter YES or NO)? yes
    cataloging files...
    cataloging done

    List of Cataloged Files
    =======================
    File Name: /oracle/backupsets/ora10g-4175411955_20141012_860776704_316.db
    File Name: /oracle/backupsets/ora10g-4175411955_20141012_860776830_317.arc
    File Name: /oracle/backupsets/ora10g-c-4175411955-20141012-00.ctl
    File Name: /oracle/backupsets/ora10g-4175411955_20141012_860776699_315.arc

    RMAN> 

    如今能够把文件夹catalog到控制文件了。事实上ora10g-c-4175411955-20141012-00.ctl已经用不到。我们须要的是.db,.arc这几个备份集

    RMAN>run{

    set newname for datafile  1 to"/oradata/ora10g/system01.dbf";

    set newname for datafile  2 to"/oradata/ora10g/undotbs01.dbf";

    set newname for datafile  3 to"/oradata/ora10g/sysaux01.dbf";

    set newname for datafile  4 to"/oradata/ora10g/users01.dbf";

    set newname for datafile  5 to"/oradata/ora10g/example01.dbf";

    set newname for datafile  6 to"/oradata/ora10g/zlm01.dbf";

    restore database;

    switch datafile all;

    }


    executing command: SET NEWNAME


    executing command: SET NEWNAME


    executing command: SET NEWNAME


    executing command: SET NEWNAME


    executing command: SET NEWNAME


    executing command: SET NEWNAME


    Starting restore at 12-OCT-14

    allocated channel: ORA_DISK_1

    channel ORA_DISK_1: sid=159 devtype=DISK


    channel ORA_DISK_1: starting datafile backupset restore

    channel ORA_DISK_1: specifying datafile(s) to restore from backup set

    restoring datafile 00001 to /oradata/ora10g/system01.dbf

    restoring datafile 00002 to /oradata/ora10g/undotbs01.dbf

    restoring datafile 00003 to /oradata/ora10g/sysaux01.dbf

    restoring datafile 00004 to /oradata/ora10g/users01.dbf

    restoring datafile 00005 to /oradata/ora10g/example01.dbf

    restoring datafile 00006 to /oradata/ora10g/zlm01.dbf

    channel ORA_DISK_1: reading from backup piece /u01/orabackup/backupsets/ora10g-4175411955_20141012_860776704_316.db

    channel ORA_DISK_1: restored backup piece 1

    failover to piece handle=/oracle/backupsets/ora10g-4175411955_20141012_860776704_316.db tag=DB_BAK

    channel ORA_DISK_1: restore complete, elapsed time: 00:02:17

    Finished restore at 12-OCT-14


    datafile 1 switched to datafile copy

    input datafile copy recid=18 stamp=860783911 filename=/oradata/ora10g/system01.dbf

    datafile 2 switched to datafile copy

    input datafile copy recid=19 stamp=860783911 filename=/oradata/ora10g/undotbs01.dbf

    datafile 3 switched to datafile copy

    input datafile copy recid=20 stamp=860783911 filename=/oradata/ora10g/sysaux01.dbf

    datafile 4 switched to datafile copy

    input datafile copy recid=21 stamp=860783911 filename=/oradata/ora10g/users01.dbf

    datafile 5 switched to datafile copy

    input datafile copy recid=22 stamp=860783911 filename=/oradata/ora10g/example01.dbf

    datafile 6 switched to datafile copy

    input datafile copy recid=23 stamp=860783911 filename=/oradata/ora10g/zlm01.dbf


    RMAN> 


    注意,这里会有一个failover to的操作。先是去/u01/orabackup/backupsets读取,可是发现没有,但不会像之前那么样报错。而是转到了刚才我们catalog过的文件夹“/oracle/backupsets”中去读取,这次非常顺利就把数据文件恢复出来了

    [oracle@bak ~]$ ll -lrth /oradata/ora10g/
    total 1.2G
    -rw-r----- 1 oracle oinstall  21M Oct 12 18:36 zlm01.dbf
    -rw-r----- 1 oracle oinstall  31M Oct 12 18:36 users01.dbf
    -rw-r----- 1 oracle oinstall 101M Oct 12 18:36 example01.dbf
    -rw-r----- 1 oracle oinstall 166M Oct 12 18:37 undotbs01.dbf
    -rw-r----- 1 oracle oinstall 271M Oct 12 18:37 sysaux01.dbf
    -rw-r----- 1 oracle oinstall 561M Oct 12 18:38 system01.dbf
    -rw-r----- 1 oracle oinstall 7.2M Oct 12 18:50 control03.ctl
    -rw-r----- 1 oracle oinstall 7.2M Oct 12 18:50 control02.ctl
    -rw-r----- 1 oracle oinstall 7.2M Oct 12 18:50 control01.ctl

    8. 还原測试机数据库
    RMAN> recover database;

    Starting recover at 12-OCT-14
    using channel ORA_DISK_1

    starting media recovery

    channel ORA_DISK_1: starting archive log restore to default destination
    channel ORA_DISK_1: restoring archive log
    archive log thread=1 sequence=24
    channel ORA_DISK_1: reading from backup piece /u01/orabackup/backupsets/ora10g-4175411955_20141012_860776830_317.arc
    channel ORA_DISK_1: restored backup piece 1
    failover to piece handle=/oracle/backupsets/ora10g-4175411955_20141012_860776830_317.arc tag=ARC_BAK
    channel ORA_DISK_1: restore complete, elapsed time: 00:00:02
    archive log filename=/u01/app/oracle/product/10.2.0/db_1/dbs/arch1_24_858698568.dbf thread=1 sequence=24
    unable to find archive log
    archive log thread=1 sequence=25
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of recover command at 10/12/2014 18:52:11
    RMAN-06054: media recovery requesting unknown log: thread 1 seq 25 lowscn 1091432

    RMAN> exit


    Recovery Manager complete.

    因为RMAN是不全然恢复,无法保证数据与源库是全然一致的,仅仅能恢复到做备份集的那个时刻

    [oracle@bak ~]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.1.0 - Production on Sun Oct 12 18:56:43 2014

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options

    SQL> alter database open;
    alter database open
    *
    ERROR at line 1:
    ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


    SQL> alter database open resetlogs;
    alter database open resetlogs
    *
    ERROR at line 1:
    ORA-00344: unable to re-create online log
    '/u01/app/oracle/oradata/ora10g/redo01.log'
    ORA-27040: file create error, unable to create file
    Linux Error: 2: No such file or directory


    SQL> alter database add logfile '/oradata/ora10g/redo01.log' size 50m;

    Database altered.

    SQL> alter database add logfile '/oradata/ora10g/redo02.log' size 50m;
    alter database add logfile '/oradata/redo02.log' size 50m
    *
    ERROR at line 1:
    ORA-19502: write error on file "/oradata/ora10g/redo02.log", blockno 26625
    (blocksize=512)
    ORA-27072: File I/O error
    Linux Error: 2: No such file or directory
    Additional information: 4
    Additional information: 26625
    Additional information: 52736

    SQL> !
    [oracle@bak ~]$ df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                          7.7G  7.3G   13M 100% /
    /dev/sda1              99M   12M   82M  13% /boot
    tmpfs                 506M     0  506M   0% /dev/shm
    /dev/sdb1             5.0G  541M  4.2G  12% /data

    非常不幸。用作存放数据文件的磁盘是挂在/以下的,正好碰到磁盘空间不足。仅仅剩13M了。导致无法创建之后的redo日志
    把备份集删除,释放部分磁盘空间

    [oracle@bak ~]$ cd /oracle/backupsets
    [oracle@bak backupsets]$ rm -f *
    rm: cannot remove `ora10g-4175411955_20141012_860776699_315.arc': Permission denied
    rm: cannot remove `ora10g-4175411955_20141012_860776704_316.db': Permission denied
    rm: cannot remove `ora10g-4175411955_20141012_860776830_317.arc': Permission denied
    rm: cannot remove `ora10g-c-4175411955-20141012-00.ctl': Permission denied
    [oracle@bak backupsets]$ exit
    logout
    [root@bak oradata]# cd /oracle/backupsets/
    [root@bak backupsets]# ll
    total 181172
    -rw-r----- 1 oracle oinstall   4440064 Oct 12 16:46 ora10g-4175411955_20141012_860776699_315.arc
    -rw-r----- 1 oracle oinstall 172843008 Oct 12 16:47 ora10g-4175411955_20141012_860776704_316.db
    -rw-r----- 1 oracle oinstall    427520 Oct 12 16:47 ora10g-4175411955_20141012_860776830_317.arc
    -rw-r----- 1 oracle oinstall   7602176 Oct 12 16:47 ora10g-c-4175411955-20141012-00.ctl
    [root@bak backupsets]# rm -f *
    [root@bak backupsets]# ll
    total 0
    [root@bak backupsets]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                          7.7G  7.1G  240M  97% /
    /dev/sda1              99M   12M   82M  13% /boot
    tmpfs                 506M     0  506M   0% /dev/shm
    /dev/sdb1             5.0G  541M  4.2G  12% /data

    [root@bak backupsets]# su - oracle
    [oracle@bak ~]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.1.0 - Production on Sun Oct 12 19:21:27 2014

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    Connected to an idle instance.

    SQL> startup mount
    ORACLE instance started.

    Total System Global Area 1073741824 bytes
    Fixed Size                  1223512 bytes
    Variable Size             264242344 bytes
    Database Buffers          805306368 bytes
    Redo Buffers                2969600 bytes
    Database mounted.
    SQL> alter database add logfile '/oradata/ora10g/redo01.log' size 50m;

    Database altered.

    SQL> alter database add logfile '/oradata/ora10g/redo02.log' size 50m;

    Database altered.

    SQL> alter database add logfile '/oradata/ora10g/redo03.log' size 50m;

    Database altered.

    SQL> alter database open resetlogs;
    alter database open resetlogs
    *
    ERROR at line 1:
    ORA-00344: unable to re-create online log
    '/u01/app/oracle/oradata/ora10g/redo01.log'
    ORA-27040: file create error, unable to create file
    Linux Error: 2: No such file or directory

    因为控制文件里记录的redo日志是在/u01/app/oracle/oradata/ora10g以下的,而因为測试机改到/oradata/ora10g以下。因此要改动控制文件里的内容,我们来重建一下控制文件

    SQL> oradebug setmypid
    Statement processed.
    SQL> alter database backup controlfile to trace;

    Database altered.

    SQL> oradebug tracefile_name
    /oracle/admin/ora10g/udump/ora10g_ora_30187.trc
    SQL> !

    查看ora10g_ora_30187.trc,复制当中resetlog部分的重建控制文件的SQL语句出来

    CREATE CONTROLFILE REUSE DATABASE "ORA10G" RESETLOGS  ARCHIVELOG
        MAXLOGFILES 16
        MAXLOGMEMBERS 3
        MAXDATAFILES 100
        MAXINSTANCES 8
        MAXLOGHISTORY 292
    LOGFILE
      GROUP 1 '/u01/app/oracle/oradata/ora10g/redo01.log'  SIZE 50M,
      GROUP 2 '/u01/app/oracle/oradata/ora10g/redo02.log'  SIZE 50M,
      GROUP 3 '/u01/app/oracle/oradata/ora10g/redo03.log'  SIZE 50M,
      GROUP 4 '/oradata/ora10g/redo01.log'  SIZE 50M,
      GROUP 5 '/oradata/ora10g/redo02.log'  SIZE 50M,
      GROUP 6 '/oradata/ora10g/redo03.log'  SIZE 50M
    -- STANDBY LOGFILE
    DATAFILE
      '/oradata/ora10g/system01.dbf',
      '/oradata/ora10g/undotbs01.dbf',
      '/oradata/ora10g/sysaux01.dbf',
      '/oradata/ora10g/users01.dbf',
      '/oradata/ora10g/example01.dbf',
      '/oradata/ora10g/zlm01.dbf'
    CHARACTER SET ZHS16GBK
    ;

    能够看到,刚才创建控制redo logfile时并没有指定group xxx,默认就会从未使用的组号開始命名。所以这里相应的就是group 4,group 5。group 6。因此仅仅要把之前3组的语句删除,再重建一下控制文件就可以

    SQL> shutdown immediate
    ORA-01109: database not open


    Database dismounted.
    ORACLE instance shut down.
    SQL> startup nomount
    ORACLE instance started.

    Total System Global Area 1073741824 bytes
    Fixed Size                  1223512 bytes
    Variable Size             264242344 bytes
    Database Buffers          805306368 bytes
    Redo Buffers                2969600 bytes
    SQL> CREATE CONTROLFILE REUSE DATABASE "ORA10G" RESETLOGS  ARCHIVELOG
    DATAFILE
        MAXLOGFILES 16
        MAXLOGMEMBERS 3
        MAXDATAFILES 100
        MAXINSTANCES 8
        MAXLOGHISTORY 292
    LOGFILE
      GROUP 4 '/oradata/ora10g/redo01.log'  SIZE 50M,
      GROUP 5 '/oradata/ora10g/redo02.log'  SIZE 50M,
      GROUP 6 '/oradata/ora10g/redo03.log'  SIZE 50M
    -- STANDBY LOGFILE
    DATAFILE
      '/oradata/ora10g/system01.dbf',
      '/oradata/ora10g/undotbs01.dbf',
      '/oradata/ora10g/sysaux01.dbf',
      '/oradata/ora10g/users01.dbf',
      '/oradata/ora10g/example01.dbf',
      '/oradata/ora10g/zlm01.dbf'
    CHARACTER SET ZHS16GBK
    ;


    Control file created.


    SQL> alter database mount;
    alter database mount
    *
    ERROR at line 1:
    ORA-01100: database already mounted


    SQL> alter database open resetlogs;

    Database altered.

    SQL> select open_mode,database_role from v$database;

    OPEN_MODE  DATABASE_ROLE
    ---------- ----------------
    READ WRITE PRIMARY

    SQL> select group#,sequence#,(bytes/1024/1024) "SIZE(MB)",archived,status from v$log;

        GROUP#  SEQUENCE#   SIZE(MB) ARC STATUS
    ---------- ---------- ---------- --- ----------------
             4          0         50 YES UNUSED
             5          0         50 YES UNUSED
             6          1         50 NO  CURRENT

    至此,数据库已经顺利恢复完成,当然,假设认为redo logfile从group 4開始有点不顺眼。那么能够再做一下调整

    SQL> shutdown immediate
    ORA-01507: database not mounted


    ORACLE instance shut down.

    SQL> startup mount
    ORACLE instance started.

    Total System Global Area 1073741824 bytes
    Fixed Size                  1223512 bytes
    Variable Size             264242344 bytes
    Database Buffers          805306368 bytes
    Redo Buffers                2969600 bytes
    Database mounted.

    SQL> alter database drop logfile '/oradata/ora10g/redo01.log';

    Database altered.

    SQL> alter database drop logfile '/oradata/ora10g/redo02.log';
    alter database drop logfile '/oradata/ora10g/redo02.log'
    *
    ERROR at line 1:
    ORA-01567: dropping log 5 would leave less than 2 log files for instance ora10g
    (thread 1)
    ORA-00312: online log 5 thread 1: '/oradata/ora10g/redo02.log'

    oralce要求1个数据库实例至少要有2组日志。因此不同意删除剩余2组日志

    SQL> alter database drop logfile '/oradata/ora10g/redo03.log';
    alter database drop logfile '/oradata/ora10g/redo03.log'
    *
    ERROR at line 1:
    ORA-01623: log 6 is current log for instance ora10g (thread 1) - cannot drop
    ORA-00312: online log 6 thread 1: '/oradata/ora10g/redo03.log'

    无法删除日志组6,是由于它是当前使用的日志文件。

    当然了,即使不是当前日志也无法删除,由于相同要遵循至少剩余2组日志的必要条件


    SQL> alter database add logfile group 1 '/oradata/ora10g/redo01.log' size 50m;
    alter database add logfile group 1 '/oradata/ora10g/redo01.log' size 50m
    *
    ERROR at line 1:
    ORA-00301: error in adding log file '/oradata/ora10g/redo01.log' - file cannot
    be created
    ORA-27038: created file already exists
    Additional information: 1

    因为仅仅是从控制文件里删除。而在OS物理级别该文件依旧存在,所以提示无法创建

    SQL> !
    [oracle@bak ~]$ ll /oradata/ora10g
    total 1349168
    -rw-r----- 1 oracle oinstall   7389184 Oct 12 19:55 control01.ctl
    -rw-r----- 1 oracle oinstall   7389184 Oct 12 19:55 control02.ctl
    -rw-r----- 1 oracle oinstall   7389184 Oct 12 19:55 control03.ctl
    -rw-r----- 1 oracle oinstall 104865792 Oct 12 19:49 example01.dbf
    -rw-r----- 1 oracle oinstall  52429312 Oct 12 19:36 redo01.log
    -rw-r----- 1 oracle oinstall  52429312 Oct 12 19:36 redo02.log
    -rw-r----- 1 oracle oinstall  52429312 Oct 12 19:49 redo03.log
    -rw-r----- 1 oracle oinstall 283123712 Oct 12 19:49 sysaux01.dbf
    -rw-r----- 1 oracle oinstall 587210752 Oct 12 19:49 system01.dbf
    -rw-r----- 1 oracle oinstall 173023232 Oct 12 19:49 undotbs01.dbf
    -rw-r----- 1 oracle oinstall  31465472 Oct 12 19:49 users01.dbf
    -rw-r----- 1 oracle oinstall  20979712 Oct 12 19:49 zlm01.dbf
    [oracle@bak ~]$ rm -f /oradata/ora10g/redo01.log
    [oracle@bak ~]$ exit
    exit

    SQL> alter database add logfile group 1 '/oradata/ora10g/redo01.log' size 50m;

    Database altered.

    先在OS上物理删除日志组1相应的文件redo01.log,再又一次加入,加入时指定新的组号group 1

    SQL> alter database drop logfile '/oradata/ora10g/redo02.log';

    Database altered.

    加入完日志组1,就能够删除日志组2,由于仅仅要满足仍然有2组日志这个条件就可以

    SQL> !
    [oracle@bak ~]$ rm -f /oradata/ora10g/redo02.log
    [oracle@bak ~]$ exit
    exit

    SQL> alter database add logfile group 2 '/oradata/ora10g/redo02.log' size 50m;

    Database altered.

    相同地,继续完毕日志组2的更新,先物理删除文件,再指定组名加入

    因为日志组6是当前日志。因此不能直接删除,须要先切换日志

    SQL> alter system switch logfile;
    alter system switch logfile
    *
    ERROR at line 1:
    ORA-01109: database not open


    SQL> alter database open;

    Database altered.

    SQL> select group#,sequence#,(bytes/1024/1024) "SIZE(MB)",archived,status from v$log;

        GROUP#  SEQUENCE#   SIZE(MB) ARC STATUS
    ---------- ---------- ---------- --- ----------------
             1          0         50 YES UNUSED
             2          0         50 YES UNUSED
             6          1         50 NO  CURRENT

    SQL> alter system switch logfile;

    System altered.

    SQL> select group#,sequence#,(bytes/1024/1024) "SIZE(MB)",archived,status from v$log;

        GROUP#  SEQUENCE#   SIZE(MB) ARC STATUS
    ---------- ---------- ---------- --- ----------------
             1          2         50 NO  CURRENT
             2          0         50 YES UNUSED
             6          1         50 NO  ACTIVE

    切换一次日志后。group 1成为当前日志组。如今能够删除日志组3了

    SQL> alter database drop logfile '/oradata/ora10g/redo03.log';

    Database altered.

    SQL> !
    [oracle@bak ~]$ rm -f /oradata/ora10g/redo03.log
    [oracle@bak ~]$ exit
    exit

    SQL> alter database add logfile group 3 '/oradata/ora10g/redo03.log' size 50m;

    Database altered.

    SQL> select group#,sequence#,(bytes/1024/1024) "SIZE(MB)",archived,status from v$log;

        GROUP#  SEQUENCE#   SIZE(MB) ARC STATUS
    ---------- ---------- ---------- --- ----------------
             1          2         50 NO  CURRENT
             2          0         50 YES UNUSED
             3          0         50 YES UNUSED

    如今,已经把日志组编号调整到正常状态了,当然了,假设不改也不会影响数据库的正常使用
















  • 相关阅读:
    IE678下,select 诡异的样式
    跟着我一步一步的搭建一个基于springcloud的微服务实例
    关于Future踩过的坑
    Apache下的SocketClient的使用
    Jaxb处理泛型,转化成xml字符串
    Linux Centos虚拟机扩容
    docker 搭建zookeeper集群和kafka集群
    sysbench 数据库性能测试工具的使用
    docker 容器技术
    自己手写实现Dubbo
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6753871.html
Copyright © 2020-2023  润新知