冷备,也就说数据库不是运行(热的状态)的备份。有些时候我们的数据库比较小,进行同操作系统数据迁移和恢复的时候就比较好用。下面我们详细介绍下oracle数据库的冷备(我们使用最简单的拷贝数据文件方式进行冷备,暂时不介绍rman下的copy)。

一、适用模式

    不管oracle是在归档模式下还是在非归档模式下,都可以使用冷备。本次我们测试在归档模式下的数据库:

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     31
Next log sequence to archive   33
Current log sequence           33
SQL> 

二、冷备流程

2.1,工作流程

    首先在运行的库中得到数据库运行的所有的物理文件,然后再计划内关闭数据库。再执行物理文件到备份路径,备份完成后立即启动数据库让其提供正常服务。

2.2,基础信息查询

    查询v$database

SQL> select name,log_mode,open_mode from v$database;

NAME                                               LOG_MODE     OPEN_MODE
-------------------------------------------------- ------------ --------------------
ORCL                                               ARCHIVELOG   READ WRITE

SQL> 

    查询数据文件


SQL> select file#,ts#,name from v$datafile;

     FILE#        TS# NAME
---------- ---------- --------------------------------------------------
         1          0 /oracle/app/data/ORCL/system01.dbf
         2          1 /oracle/app/data/ORCL/sysaux01.dbf
         3          2 /oracle/app/data/ORCL/undotbs01.dbf
         4          4 /oracle/app/data/ORCL/users01.dbf
         5          5 /oracle/app/data/ORCL/DT_TPC_DAT.DBF
         6          6 /oracle/app/data/ORCL/DT_CAT_DAT.DBF
         7          8 /oracle/app/data/ORCL/DT_TEST_DAT.DBF

7 rows selected.

    查询控制文件


SQL> select name,status from v$controlfile;

NAME                                               STATUS
-------------------------------------------------- -------
/oracle/app/data/ORCL/control01.ctl
/oracle/app/oracle/flash_recovery_area/ORCL/contro
l02.ctl

    查询redo文件


SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                                       IS_
---------- ------- ------- ------------------------------------------------------------ ---
         1         ONLINE  /oracle/app/data/ORCL/redo01.log                             NO
         3         ONLINE  /oracle/app/data/ORCL/redo03.log                             NO
         2         ONLINE  /oracle/app/data/ORCL/redo02.log                             NO

    查询临时数据文件

SQL> select file#,ts#,name from v$tempfile;

     FILE#        TS# NAME
---------- ---------- --------------------------------------------------
         1          3 /oracle/app/data/ORCL/temp01.dbf

SQL> 

    查询参数文件(我本地使用的是spfile)

SQL> show parameter spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /oracle/app/oracle/db11g/produ
                                                 ct/dbs/spfileORCL.ora
SQL> 

2.3,制作备份脚本

    制作查询语句,查询出所有备份数据文件的脚本(大家可以把后续控制文件和日志文件的弄成一个语句,我这里为了分类,就没有合并了):


SQL> select 'cp '||name||' /colbackup/' backname from v$datafile;

BACKNAME
------------------------------------------------------------
cp /oracle/app/data/ORCL/system01.dbf /colbackup/
cp /oracle/app/data/ORCL/sysaux01.dbf /colbackup/
cp /oracle/app/data/ORCL/undotbs01.dbf /colbackup/
cp /oracle/app/data/ORCL/users01.dbf /colbackup/
cp /oracle/app/data/ORCL/DT_TPC_DAT.DBF /colbackup/
cp /oracle/app/data/ORCL/DT_CAT_DAT.DBF /colbackup/
cp /oracle/app/data/ORCL/DT_TEST_DAT.DBF /colbackup/

7 rows selected.

SQL> 

    查询出备份控制文件的脚本


SQL> select 'cp '||name||' /colbackup/' backname from v$controlfile;

BACKNAME
------------------------------------------------------------
cp /oracle/app/data/ORCL/control01.ctl /colbackup/
cp /oracle/app/oracle/flash_recovery_area/ORCL/control02.ctl
 /colbackup/


SQL> 

    查询出备份redo文件的脚本

SQL> select 'cp '||member||' /colbackup/' backname from v$logfile;

BACKNAME
------------------------------------------------------------
cp /oracle/app/data/ORCL/redo01.log /colbackup/
cp /oracle/app/data/ORCL/redo03.log /colbackup/
cp /oracle/app/data/ORCL/redo02.log /colbackup/

SQL> 

    查询备份临时数据文件的脚本

SQL> select 'cp '||name||' /colbackup/' backname from v$tempfile;

BACKNAME
------------------------------------------------------------
cp /oracle/app/data/ORCL/temp01.dbf /colbackup/

SQL> 

    参数文件我采取生成pfile的形式进行备份:


SQL> create pfile='/colbackup/pfile20241121.ora' from spfile;

File created.

SQL> 

2.4,停止数据库

    我们开始冷备份前,先停止数据库,确保备份后的数据文件保持一致性。

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> 

2.5,开始备份

    我们在colbackup目录下面新建立一个bak.sh文件,把之前生成的所有脚本放入其中,然后执行脚本开始备份

[root@oracle11g colbackup]# pwd
/colbackup
[root@oracle11g colbackup]# cat bak.sh
cp /oracle/app/data/ORCL/system01.dbf /colbackup/
cp /oracle/app/data/ORCL/sysaux01.dbf /colbackup/
cp /oracle/app/data/ORCL/undotbs01.dbf /colbackup/
cp /oracle/app/data/ORCL/users01.dbf /colbackup/
cp /oracle/app/data/ORCL/DT_TPC_DAT.DBF /colbackup/
cp /oracle/app/data/ORCL/DT_CAT_DAT.DBF /colbackup/
cp /oracle/app/data/ORCL/DT_TEST_DAT.DBF /colbackup/
cp /oracle/app/data/ORCL/control01.ctl /colbackup/
cp /oracle/app/oracle/flash_recovery_area/ORCL/control02.ctl /colbackup/
cp /oracle/app/data/ORCL/redo01.log /colbackup/
cp /oracle/app/data/ORCL/redo03.log /colbackup/
cp /oracle/app/data/ORCL/redo02.log /colbackup/
cp /oracle/app/data/ORCL/temp01.dbf /colbackup/
[root@oracle11g colbackup]# 

三、说明

    至此我们整个库的冷备就完成了,冷备一般情况下用得比较少,毕竟oracle一般采用rman等热备的形式进行库的备份。但是在一些情况下冷备还是很有用的,例如库小(数据容量大小)的时候,不想通过新建立库的时候完成整库的迁移 ;又或者是库出现故障的时候,需要进行不完全恢复,也可以通过冷备先保护下原始文件,再进行不完全恢复。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐