冷备,也就说数据库不是运行(热的状态)的备份。有些时候我们的数据库比较小,进行同操作系统数据迁移和恢复的时候就比较好用。下面我们详细介绍下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等热备的形式进行库的备份。但是在一些情况下冷备还是很有用的,例如库小(数据容量大小)的时候,不想通过新建立库的时候完成整库的迁移 ;又或者是库出现故障的时候,需要进行不完全恢复,也可以通过冷备先保护下原始文件,再进行不完全恢复。