Stage3
ORACLE冷备份及恢复
一、备份
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。
冷备份是将关键性文件拷贝到另外的位置,可以根据重要性文件克隆一份数据库。
冷备份还原注意事项: 两台数据库服务器的操作系统必须是同构的
(即:aix->aix或者linux->linux),不能是异构的(linux->aix),
否则是没有用的。如果是异构的,那么一般采用数据泵的方式。
1.编写备份脚本
通过操作系统的命令来实现的备份机制:cp、scp
1.1 查询所有的文件所在位置
(数据文件,控制文件,参数文件,重做日志文件,归档日志文件,初始化参数文件,密码文件)
--查看参数文件位置 SQL> show parameter spfile; --查看实例和数据库的相关信息 SQL> select instance_name,version,status,archiver,database_status from v$instance;
1.数据文件 2.控制文件 3.重做日志文件 4.参数文件 5.监听文件tnsnames.ora listener.ora 6.密码文件PWDfile
直接拷贝oracle目录下的admin、oradata(datafile, controlfile,redo)、flash_recovery_area三个文件夹,
db_1目录下database(PWDfile、pfile)、dbs(spfile)、NETWORK/ADMIN(listener.ora、tnsnames.ora),到其他存储实现备份。
# 查看字符集,最好将字符集保持一致
SQL> select * from v$nls_parameters;
# 查看实例和数据库的相关信息
SQL> select instance_name,version,status,archiver,database_status from v$instance;
# 控制文件
select * from v$controlfile;
# 数据文件
select name from v$datafile;
# REDO LOG文件
select * from v$logfile;
# 参数文件
select * from V$PARAMETER where name like '%spfile%';
show parameter spfile
# 临时文件
select name from v$tempfile;
1.2 创建备份的路径
mkdir /u01/app/backup
1.3 通过select语句构建拷贝脚本
set trim on #截取掉不必要的空格
set trims on #每个行的空格
set heading off #去掉标题
set echo off #去掉反馈
set feedback off #去掉回显
set term off #关闭终端信息
spool /home/oracle/cp_db.sh
select 'cp '||name||' /u01/app/backup' from v$datafile
union
select 'cp '||name||' /u01/app/backup' from v$controlfile
union
select 'cp '||member||' /u01/app/backup' from v$logfile
spool off
# 授权,构建拷贝命令
chmod +x cp_db.sh
/home/oracle/cp_db.sh --停止数据库,执行脚本
或者通过awk构建命令:
ls -lSr /test | awk '{print "mv " $NF" /tmp/test/t"NR".conf"}' | bash
二、恢复
1.脱机恢复到原来位置的步骤:
方法一:最简单的方法(需建库)
1.创建一个和原来一样的数据库。(安装路径和数据库名必须和原来一致)
2.停止数据库 shutdown immediate;
3.复制安装目录下的admin、oradata、flash_recovery_area覆盖,复制database(PWDfile、pfile) 覆盖
4.启动数据库 startup;
方法二:(不需建库,稍麻烦点)
(1):操作系统重装,如果做冷备恢复,要保证相同操作系统,相同的数据库版本。
(2):正常安装oracle软件,只需要安装软件,不用建实例。
(3):数据覆盖,包括数据文件、参数文件、控制文件、日志文件、pwd文件,放在与原系统相同的目录。如果目录有所改变,则需要另外建立控制文件,修改pfile。
(4):建立服务:
使用oradim 命令 cmd下 oradim -new -sid ggdb(实际sid名) ,表示建立一个服务,sid为ggdb。
如果是在linux下,不需要此步。
oradim -new -sid xxx -intpwd xxx -startmode a -pfile E:\xxx\xxx\xxx\init.ora
(5):建立监听: netca 来建立(建议将源系统的network下的文件拷过来,根据实际情况修改)。
(6):打开数据库: cmd
set oracle_sid=orcl;
sqlplus /nolog;
conn / as sysdba;
startup;
验证数据库
SQL> select count(*) from user_tables;
至此,冷备份恢复成功。
2.脱机恢复到非原来位置的步骤:
有时候储存数据文件的磁盘坏了,可能需要改变数据文件的恢复位置。
1. 将备份文件恢复到正常的磁盘上
2. 将数据库加载为mount状态(startup mount)
3. alter database rename file 'u01/xxx.DBF' to 'u02/xxx.DBF' (u01磁盘损坏)
4. alter database open
ORACLE热备份
一、热备份
初始化日志:重置redo日志号 首先关闭数据库
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
进入到mount状态
SQL> startup mount;
ORACLE instance started.
Total System Global Area 838860800 bytes
Fixed Size 8626240 bytes
Variable Size 348131264 bytes
Database Buffers 473956352 bytes
Redo Buffers 8146944 bytes
Database mounted.
查看当前redo log号
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive2/
Oldest online log sequence 4
Next log sequence to archive 6
Current log sequence 6
重置redo log号
SQL> recover database until cancel;
Media recovery complete.
SQL> alter database open resetlogs;
Database altered.
重置完成
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive2/
Oldest online log sequence 1
Next log sequence to archive 1
Current log sequence 1
SQL>
创建测试数据
创建hr的t1表,并插入两行数据
SQL> create table hr.t1(id number);
Table created.
SQL> insert into hr.t1 values(1);
1 row created.
SQL> insert into hr.t1 values(2);
1 row created.
SQL> commit;
Commit complete.
执行日志切换
SQL> alter system switch logfile;
System altered.
切换后redo log号变为了2.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive2/
Oldest online log sequence 1
Next log sequence to archive 2
Current log sequence 2
SQL>
查看归档记录:归档生成
此时我们再插入两条数据:
SQL> insert into hr.t1 values(3);
1 row created.
SQL> insert into hr.t1 values(4);
1 row created.
SQL> commit;
Commit complete.
日志切换,查看redo备份,
SQL> alter system switch logfile;
System altered.
SQL> host ls -l /u01/app/oracle/archive2/
total 1336
-rw-r----- 1 oracle oinstall 1343488 Feb 14 04:34 arch_orcl_1_1_1064464371.dbf
-rw-r----- 1 oracle oinstall 22016 Feb 14 06:43 arch_orcl_1_2_1064471384.dbf
redo log号更新
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive2/
Oldest online log sequence 1
Next log sequence to archive 3
Current log sequence 3
初始化日志完成,开始备份
开始备份 开始备份之前我们查看一下当前的scn号
SQL> select current_scn from v$database;
CURRENT_SCN
.----------
2350352
SQL>
从当前scn号开始进行备份
SQL> alter database begin backup;
Database altered.
查看状态:ACTIVE
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME CON_ID
.---------- ------------------ ---------- ------------------- ----------
1 ACTIVE 2350453 2021-02-14 06:51:33 0
2 ACTIVE 2350453 2021-02-14 06:51:33 0
3 ACTIVE 2350453 2021-02-14 06:51:33 0
4 ACTIVE 2350453 2021-02-14 06:51:33 0
5 ACTIVE 2350453 2021-02-14 06:51:33 0
7 ACTIVE 2350453 2021-02-14 06:51:33 0
8 ACTIVE 2350453 2021-02-14 06:51:33 0
9 ACTIVE 2350453 2021-02-14 06:51:33 0
10 ACTIVE 2350453 2021-02-14 06:51:33 0
11 ACTIVE 2350453 2021-02-14 06:51:33 0
10 rows selected.
SQL>
此时scn号已经改变
SQL> select current_scn from v$database;
CURRENT_SCN
.-----------
2350489
SQL>
确认当前数据文件的路径(执行命令,以实际路径为主)
SQL> select name from v$datafile;
NAME
.--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/testbs_01.dbf
/u01/app/oracle/oradata/orcl/undotbs02.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/testbs_02.dbf
/u01/app/oracle/oradata/orcl/testbs_03.dbf
/u01/app/oracle/oradata/orcl/bigtbs_01.dbf
/u01/app/oracle/oradata/orcl/data1_1.dbf
10 rows selected.
SQL>
创建备份目录:
[oracle@MiWiFi-R4CM-srv archive2]$ mkdir -p $ORACLE_BASE/hot/fulldb_20210214/archive/
将除了控制文件外的所有数据文件进行拷贝到我们创建的备份目录:(控制文件使用二进制备份)
[oracle@MiWiFi-R4CM-srv archive2]$ cp $ORACLE_BASE/oradata/orcl/*.dbf $ORACLE_BASE/hot/fulldb_20210214/archive/
[oracle@MiWiFi-R4CM-srv archive2]$ cp $ORACLE_BASE/oradata/orcl/redo0* $ORACLE_BASE/hot/fulldb_20210214/archive/
此时的备份目录:
备份控制文件:(备份二进制的控制文件)
SQL> alter database backup controlfile to ‘$ORACLE_BASE/hot/fulldb_20210214/archive/control01.ctl’;
Database altered.
备份成创建语句的文件:
SQL> alter database backup controlfile to trace as ‘$ORACLE_BASE/hot/fulldb_20210214/ctl_create.sql’;
Database altered.
SQL>
此时的备份目录状态:
此时我们的数据文件已经备份完成,结束数据文件的备份,还需要备份归档文件和密码文件以及spfile
结束数据文件的备份
SQL> alter database end backup;
Database altered.
SQL>
记录一下redo log号
SQL> select current_scn from v$database;
CURRENT_SCN
.-----------
2351333
SQL>
备份归档日志
SQL> srchive log list;
SP2-0734: unknown command beginning “srchive lo…” - rest of line ignored.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive2/
Oldest online log sequence 1
Next log sequence to archive 3
Current log sequence 3
切换日志
SQL> alter system switch logfile;
System altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive2/
Oldest online log sequence 2
Next log sequence to archive 4
Current log sequence 4
SQL>
将归档日志进行拷贝到备份目录,进行备份:
SQL> host ls -l /u01/app/oracle/archive2/
total 7604
-rw-r----- 1 oracle oinstall 1343488 Feb 14 04:34 arch_orcl_1_1_1064464371.dbf
-rw-r----- 1 oracle oinstall 22016 Feb 14 06:43 arch_orcl_1_2_1064471384.dbf
-rw-r----- 1 oracle oinstall 6417920 Feb 14 07:11 arch_orcl_1_3_1064471384.dbf
SQL> host cp /u01/app/oracle/archive2/* $ORACLE_BASE/hot/fulldb_20210214/archive/
SQL>
最后备份密码文件和spfile
[oracle@MiWiFi-R4CM-srv archive2]$ cp $ORACLE_HOME/dbs/spfile* $ORACLE_BASE/hot/fulldb_20210214/archive/
[oracle@MiWiFi-R4CM-srv archive2]$ cp $ORACLE_HOME/dbs/orapw* $ORACLE_BASE/hot/fulldb_20210214/archive/
所有备份完成