Oracle冷备与恢复

冷备恢复是oracle最快捷方便安全的恢复、拷贝方式。他只有一个缺点:冷备的时候要关闭源库。冷备特别适合搭建跟生产一致的测试环境。

环境

源库跟目的库的Oracle大版本要一致,并且数据库SID要一样。
本文测试环境:

  • 源库操作系统 windows server 2008 R2 x64
    源库数据库版本 11g Enterprise Edition Release 11.2.0.1.0 - 64bit
  • 目的库操作系统 win7 x64 win10 x64 windows server 2008 R2 x64 均测试成功
    目的库数据库版本 11g Enterprise Edition Release 11.2.0.1.0 - 64bit

查看版本:

1
select banner from sys.v_$version;

冷备

在源库(假定SID名为ORCL)执行以下操作:

1. 打开CMD,用sysdba登录数据库。

有些操作系统安装了不止一个数据库实例,为了确保操作的是源库,在CMD命令行中先执行一次set ORACLE_SID=ORCL

1
2
set ORACLE_SID=ORCL
sqlplus / as sysdba

先检查一下登录的数据库:

1
2
3
4
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl

2. 查找并记下各物理文件路径

总共有控制文件、参数文件、数据文件、密码文件、redolog文件
可在SQL*PLUS 也可在 Pl/SQL 里边查看:

  • 控制文件(可不拷贝)

    1
    2
    3
    4
    5
    6
    7
    SQL> set line 200
    SQL> columnn NAME format a60
    SQL> select * from V$CONTROLFILE;
    STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
    ------- ------------------------------------------------------------ --- ---------- --------------
    D:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL NO 16384 636
    D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL NO 16384 636
  • 参数文件(如果没有可不拷贝)

    1
    2
    3
    4
    SQL> show parameter spfile
    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    spfile string
  • 密码文件
    一般在如下路径,以PWD+SID.ora命名。可直接拷贝整个database文件夹(上面的参数文件一般也在这里)。

    1
    D:\app\Administrator\product\11.2.0\dbhome_1\database\PWDorcl.ora
  • 重做日志文件

    1
    2
    3
    4
    5
    6
    SQL> select * from V$LOGFILE;
    GROUP# STATUS TYPE MEMBER IS_
    ---------- ------- ------- ------------------------------------------------------------ ---
    2 ONLINE D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG NO
    1 ONLINE D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG NO
    3 ONLINE D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG NO
  • 数据文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> select name from V$DATAFILE;
    NAME
    ------------------------------------------------------------
    D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF
    D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF
    D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF
    D:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF
    D:\APP\ADMINISTRATOR\ORADATA\ORCL\ORCL.DBF
    已选择5行。

3. 然后关闭数据库,并拷贝物理文件。

1
2
3
4
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

4. 拷贝完文件后备份重建控制文件脚本

1
2
3
4
5
6
7
8
9
10
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 3423965184 bytes
Fixed Size 2180544 bytes
Variable Size 1862273600 bytes
Database Buffers 1543503872 bytes
Redo Buffers 16007168 bytes
数据库装载完毕。
SQL> alter database backup controlfile to trace as 'd:\controlfile.sql';
数据库已更改。

d:\controlfile.sql为建立控制文件的脚本。

5. 重新启动数据库

1
2
3
4
5
6
7
8
9
10
11
SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 3423965184 bytes
Fixed Size 2180544 bytes
Variable Size 1862273600 bytes
Database Buffers 1543503872 bytes
Redo Buffers 16007168 bytes
数据库装载完毕。
数据库已经打开。

如果有问题可直接通过系统服务重启对应的服务

恢复、拷贝

这里只讨论控制文件丢失的情况下的恢复还有拷贝搭建一模一样的测试库的情况。

如果目的库不存在,先新建一个同名目的库(可用Database Configuration Assistant)。建立的时候注意一下字符集还有存储位置(跟源库一样选所有数据库文件使用公共位置)即可。以下操作均在目的库执行:

1. 创建参数化文件

打开CMD并用sqlplus以sysdba身份登陆ORCL(方法如上节)

1
2
SQL> Create pfile from spfile;
文件已创建。

创建结果在product\11.2.0\dbhome_1\database\INIT+DBNAME.ORA 这里是INITorcl.ORA

2. 关闭实例并重命名spfile

1
2
3
4
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

此处将D:\app\Administrator\product\11.2.0\dbhome_1\database\SPFILEORCL.ORA重命名为
D:\app\Administrator\product\11.2.0\dbhome_1\database\SPFILEORCL.ORA.20160525.bak

3. 将数据文件、密码文件、redolog文件拷贝到目的库对应路径

我实际测试的时候win7win2008路径是跟源库一模一样的,win10跟源库对比路径的磁盘位置不一样。

4. 重建控制文件

先修改备份的控制文件。备份的控制文件里边有两种重建脚本。这里选NORESETLOGS case
什么时候用另一个不太清楚,实际测试的时候第二种失败了。应该跟源库的ARCHIVELOG设置有关。
选好后把别的都删除,特别是空行一定要删除!路径有修改的,可以改成目的库的路径,例如我测试的时候数据库在H盘,所以d全部变成h了。
修改后的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 2 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG' SIZE 50M BLOCKSIZE 512,
GROUP 3 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF',
'D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF',
'D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF',
'D:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF',
'D:\APP\ADMINISTRATOR\ORADATA\ORCL\ORCL.DBF'
CHARACTER SET ZHS16GBK
;

把修改后的文件放到目的库所在系统某路径,这里测试的时候放到了d:\,然后在sqlplus以nomount模式启动数据库执行这个脚本:

1
2
3
4
5
6
7
8
9
10
11
SQL> STARTUP NOMOUNT;
ORACLE 例程已经启动。
Total System Global Area 3423965184 bytes
Fixed Size 2180544 bytes
Variable Size 1862273600 bytes
Database Buffers 1543503872 bytes
Redo Buffers 16007168 bytes
SQL> @d:\controlfile.sql;
SQL> @d:\CONTROLFILE_KRCS.SQL
ORA-01081: ????????? ORACLE - ??????
控制文件已创建。

那个ora-01081可以不用管他,出现的原因是本身已经STARTUP NOMOUNT,脚本里边又执行了一次。
此处报01503、01565之类的错的话检查脚本中的datafile在对应路径是否存在,路径对不上的话改对它。
重建控制文件后执行一次恢复:

1
2
3
SQL> recover database;
ORA-00283: ????????????????????
ORA-00264: ??????????

如果弹出ORA-00264错误,表示数据库是一致的,不需要恢复

接着打开数据库

1
2
SQL> alter database open;
数据库已更改。

如果无报错表示数据迁移、恢复成功。

5. 最后把临时表空间重建一下

重建语句可以在原来备份的重建控制文件脚本里边找。

1
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP01.DBF' REUSE;

正在加载中……