zoukankan      html  css  js  c++  java
  • 测试oracle数据库的脱机备份和恢复

    环境:windows7、Oracle11g

    一、脱机备份
    脱机备份是指在数据库关闭情况下的数据备份,也称为冷备份。

    在书上学到的备份步骤:
    1、记录所要备份数据库文件所在的操作系统路径;
    2、关闭数据库,不要使用shutdown abort这种关闭方式;
    3、拷贝数据库文件到备份目录中;
    4、重启数据库,完成备份。

    了解到这些步骤后,做了一个备份测试,要备份的数据库为testdb。

    1、记录所要备份数据库文件所在的操作系统路径
       
    (1)查看数据文件的路径(用管理员账户连接)
    备注:可以在sqlplus命令行或者plsql执行下面sql语句   

    select file_name,tablespace_name from dba_data_files;

    D:APPLCORADATATESTDBUSERS01.DBF     USERS
    D:APPLCORADATATESTDBUNDOTBS01.DBF   UNDOTBS1
    D:APPLCORADATATESTDBSYSAUX01.DBF    SYSAUX
    D:APPLCORADATATESTDBSYSTEM01.DBF    SYSTEM

    (2)查看控制文件的路径
    select name from v$controlfile;

    D:APPLCORADATATESTDBCONTROL01.CTL
    D:APPLCFLASH_RECOVERY_AREATESTDBCONTROL02.CTL

    (3)查看重做日志文件的路径
    select member from v$logfile;

    D:APPLCORADATATESTDBREDO03.LOG
    D:APPLCORADATATESTDBREDO02.LOG
    D:APPLCORADATATESTDBREDO01.LOG

    2、关闭数据库

    SQL> conn system/Oracle123456@testdb as sysdba
    已连接。
    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。

    3、拷贝数据库文件到备份目录中;
    如果在sqlplus下可以使用host copy拷贝,也可以直接选择文件拷贝,把第1步的所有文件拷贝到D:dbbackup中。

    4、启动数据库。

    SQL> startup
    ORACLE 例程已经启动。
    ......

    二、数据库恢复
    为了模拟数据库恢复,在DBCA工具中把testdb删除掉,删除成功后,执行下面恢复步骤。
    1、把D:dbbackup中的文件拷贝到原来的D:APPLCORADATATESTDB等目录下。
    2、新建一个实例
      用管理员权限,在cmd窗口执行下面语句,其中testdb名称要与备份的名字一样
      oradim -new -sid testdb
    3、查看oracle服务和监听是否启动,如果没启动,则到控制面板的服务或cmd下运行命令启动。
       启动服务 net start OracleServicetestdb
       启动监听 lsnrctl start
    4、启动数据库
       cmd命令窗口中
       输入   set oracle_sid=testdb回车
       再输入 sqlplus  /nolog 回车
       再输入 conn / as sysdba 回车
       再输入startup 回车

       这时却出现了错误:
    ORA-01078: failure in processing system parameters
    LRM-00109: could not open parameter file 'D:/app/LC/product/11.2.0/dbhome_1/database/inittestdb.ora'

    检查了这个路径,没有inittestdb.ora这个文件。

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

    网上搜索了下,解决方法基本和下面大同小异:

    解决方法:将$ORACLE_BASE/admin/数据库名称/pfile目录下的init.ora.012009233838形式的文件copy 到$ORACLE_HOME/database 目录下
    initoracle.ora即可。(注:initoracle.ora中的oracle为你的实例名 ORACLE_SID
    ------------------------------------------------------
    在电脑找了下,在D:appLCadminorclpfile目录下有一个init.ora.9182016154717文件,把它复制到
    D:/app/LC/product/11.2.0/dbhome_1/database目录下,把里面内容的所有“orcl”改为“testdb”,保存为inittestdb.ora。
    在D:appLCadmin目录下建立testdb及它的子目录pfile。
    这时候再回到cmd命令行窗口执行startup,终于成功启动数据库了。

    这时候用plsql登录却提示ORA-12154: TNS: 无法解析指定的连接标识符。
    解决方法:
    打开 D:appLCproduct11.2.0dbhome_1NETWORKADMIN nsnames.ora,模仿里面的ORCL代码,手动添加下面语句
    TESTDB =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = testdb)
        )
      )

    三、总结
    通过上面例子,知道除了备份数据文件、控制文件、重做日志文件,还要备份参数文件。
    于是重新建立一个数据库tdb,这次备份除了数据文件、控制文件、重做日志文件,还备份了
    (1)D:appLCproduct11.2.0dbhome_1database目录下的3个文件:hc_tdb.dat、PWDtdb.ora、SPFILETDB.ORA
    (2)D:appLCadmin db整个目录,里面有adump、dpdump、pfile共3个目录,其中pfile下面有个init.ora.919201613321文件。
    (3)D:appLCproduct11.2.0dbhome_1NETWORKADMIN nsnames.ora

    恢复的时候把数据文件、控制文件、重做日志文件、SPFILETDB.ORA、tnsnames.ora内容还原。
    终于成功恢复数据库。
    hc_tdb.dat、PWDtdb.ora、D:appLCadmin db目录似乎恢复没用到,但最好也是还原下。

    附,恢复时候执行的命令行:

    C:Windowssystem32>oradim -new -sid tdb
    实例已创建。
    C:Windowssystem32>set oracle_sid=tdb
    C:Windowssystem32>sqlplus /nolog
    SQL*Plus: Release 11.2.0.1.0 Production on 星期三 10月 19 15:25:45 2016
    Copyright (c) 1982, 2010, Oracle.  All rights reserved.
    SQL> conn /as sysdba
    已连接到空闲例程。
    SQL> startup
    ORACLE 例程已经启动。
    Total System Global Area 1686925312 bytes
    Fixed Size                  2176368 bytes
    Variable Size             989858448 bytes
    Database Buffers          687865856 bytes
    Redo Buffers                7024640 bytes
    数据库装载完毕。
    数据库已经打开。
    SQL>

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

    20190110 补充:

    今天和同事用上面这种脱机方式恢复数据库,电脑A是外来的,对方人员不知道数据库账户,现在打算在电脑B上恢复数据库。

    操作过程:

    1、电脑A数据库已经脱机,把上面数据库相关文件复制到电脑B上;

    2、电脑B数据库shutdown immediate,替换第1步的文件,之前已经建了数据库实例,替换后直接startup;

    3、不知道电脑A数据库的用户名和密码,只知道表名和大概表个数。在数据库管理员账户下,通过下面sql语句一步步排查

    --查询非默认账户(没有过滤掉SCOTT和HR用户)
    select t.username,t.account_status,t.created 
    from dba_users t
     where t.username not in 
           ('MDDATA', 'MDSYS', 'ORDSYS', 'CTXSYS', 'ANONYMOUS', 'EXFSYS',
            'OUTLN', 'DIP', 'DMSYS', 'WMSYS','XDB', 'ORACLE_OCM', 'TSMSYS',
            'ORDPLUGINS', 'SI_INFORMTN_SCHEMA','OLAPSYS', 'SYSTEM', 'SYS', 'SYSMAN',
            'DBSNMP', 'PERFSTAT', 'PUBLIC','MGMT_VIEW','WK_TEST', 'WKPROXY', 'WKSYS');
    
    --查询所有用户对应的表个数,通过这步基本可以确定了
    select t.owner, count(*) 
    from all_tables t 
    where t.owner not in 
           ('MDDATA', 'MDSYS', 'ORDSYS','CTXSYS', 'ANONYMOUS', 'EXFSYS',
            'OUTLN', 'DIP', 'DMSYS', 'WMSYS','XDB', 'ORACLE_OCM', 'TSMSYS',
            'ORDPLUGINS', 'SI_INFORMTN_SCHEMA','OLAPSYS', 'SYSTEM', 'SYS', 'SYSMAN',
            'DBSNMP', 'PERFSTAT', 'PUBLIC','MGMT_VIEW','WK_TEST', 'WKPROXY', 'WKSYS')
    group by t.owner;
    
    --最后验证是否正确:查询指定用户下面的表名
    select t.table_name from all_tables t where t.owner='用户名' and t.table_name='表名';
    

    4、确定是哪个用户后,重新设置密码

    alter user 用户名 identified by 密码;

    搞完之后过不久才发现,原来电脑A的某个WEB应用下面的配置文件就有数据库用户名和密码。

  • 相关阅读:
    iOS应用内支付(内购)的个人开发过程及坑!
    AJAX实现仿Google Suggest效果
    jquery的show/hide性能测试
    如何做到尽可能不使用庞大的jQuery
    CSS3 transition规范的实际使用经验
    jQuery提升性能技巧及个人总结
    使用CSS3实现超炫的Loading(加载)动画效果
    一个有趣的Ajax Hack示范
    使用ajax技术无刷新动态调用股票信息
    将Asp.Net页面输出到EXCEL里去
  • 原文地址:https://www.cnblogs.com/gdjlc/p/5977669.html
Copyright © 2011-2022 走看看