测试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应用下面的配置文件就有数据库用户名和密码。

原文地址:https://www.cnblogs.com/gdjlc/p/5977669.html