一、备份简介
1.备份策略
完全备份:一个或多个数据文件的完整副本,包括从备份开始的所有级的数据块
增量备份:有两种,差异增量和累积增量。包含从最近一次备份以来被修改过或增加过的数据块。增量备份又分为0级增量备份、1级差异增量备份、1级累积增量备份。增量备份支持归档和非归档模式,而且只能使用rman的时候才能实现增量备份
差异增量:是备份上级及同级备份以来所有变化的数据块,差异增量是默认的增量备份。备份新增加的数据。
累积增量:是备份上级备份以来所有变化的数据块,备份之前所有的数据(使用这个,安全)
2. 备份分类
全备:包括所有的数据文件、控制文件、密码文件、在线重做日志文件、归档日志文件
非全备:比如备份一个或多个数据文件,一个表空间等,只在归档模式下有效
冷备:在数据库关闭时发生的备份,是在一致性关闭数据库后,控制文件scn与数据库文件头部的scn一致。又称为脱机备份
热备:在数据库使用时发生的备份,联机备份一个数据文件的scn与控制文件不一致。可以是全备,也可以是部分备份,在归档模式下才能完成。又称作联机备份、非一致性备份。
3. 备份方式
物理备份:所有物理文件的一个副本,如数据文件、日志文件等,这些文件都存在本地磁盘或相应的存储上面,包括冷备(非归档模式)、热备(归档模式)
逻辑备份:将表、索引、存储过程等,可以使用oracle exp/expdp导出来的二进制文件,后面在通过oracle的imp/impdp可以导入数据库。一般用于数据迁移
4. 备份中涉及的文件
数据文件
控制文件
重做日志文件
参数文件
归档日志文件
5. 备份恢复的工具
1、imp/impdp、exp/expdp:进行逻辑备份恢复,可以跨平台迁移,支持全库、用户、表级的备份与恢复
2、rman:物理备份恢复,支持命令行及图形接口可以通过第三方软件(nbu/legato/tsm)及磁盘带机进行备份。
支持备份整个数据库、表空间、数据文件等,可以通过rman脚本来实现快捷的备份操作。支持增量备份,跳过部分块设备,可以调整备份速度
3、第三方工具:可以使用操作系统命令,其他工具来实现一些特殊情况下的备份恢复
4、dataguard、goldengate可以实现数据库的容灾备份恢复
二、备份还原实例
测试数据准备
SQL> create tablespace cat datafile '/u01/app/oracle/oradata/orcl/cat01.dbf' size 10M autoextend off; #创建一个表空间,关闭自动扩展
SQL> create user c##cat identified by cat default tablespace cat; #创建一个用户
SQL> grant dba to c##cat; #授权
SQL> conn c##cat/cat;
SQL> create table test(id number(3),name varchar2(10));
SQL> insert into test values(1,'test1');
SQL> insert into test values(2,'test2');
SQL> insert into test values(3,'test3');
SQL> commit;
SQL> select * from test;
ID NAME
---------- ----------
1 test1
2 test2
3 test3
1. exp-imp
1.1 使用exp备份整个数据库
SQL> select * from props$; #查看数据库字符集
[oracle@localhost ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 #查看字符集并设定
[oracle@localhost ~]$ exp system/oracle buffer=65536 feedback=100000 full=y file=exp.dmp log=imp.log
1.2 使用imp恢复
删除用户
SQL> drop user c##cat cascade; #删除用户
SQL> drop tablespace c##cat including contents and datafiles; #删除表空间
先创建表空间,在创建用户授权
SQL> create tablespace cat datafile '/u01/app/oracle/oradata/orcl/cat01.dbf' size 10M autoextend off; #创建一个表空间,关闭自动扩展
SQL> create user c##cat identified by cat default tablespace cat; #创建一个用户
SQL> grant dba to c##cat; #授权
恢复数据
[oracle@localhost ~]$ imp system/oracle fromuser=c##cat touser=c##cat commit=y buffer=65536 feedback=100000 ignore=y file=exp.dmp log=imp2.log;
SQL> select * from cat.test;
编译无效对象
SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql
2. expdp/impdp
2.1使用expdp备份数据库
[oracle@localhost ~]$ mkdir /u01/app/oracle/dump
SQL> create directory dump_dir as '/u01/app/oracle/dump';
SQL> grant read,write on directory dump_dir to system;
[oracle@localhost ~]$ expdp system/oracle directory=dump_dir dumpfile=full_expdp.dmp full=y logfile=expdp.lpg parallel=2
2.2 使用impdp恢复数据库
删除用户及表空间
SQL> drop user c##cat cascade; #删除用户
SQL> drop tablespace c##cat including contents and datafiles; #删除表空间
创建数据库(dbca),在创建表空间,无需创建用户
SQL> create tablespace cat datafile '/u01/app/oracle/oradata/orcl/cat01.dbf' size 10M autoextend off; #创建一个表空间,关闭自动扩展
配置目录
SQL> create directory dump_dir as '/u01/app/oracle/dump';
SQL> grant read,write on directory dump_dir to system;
恢复
[oracle@localhost ~]$ impdp system/oracle directory=dump_dir dumpfile=full_expdp.dmp full=y logfile=imp2.log
编译无效对象
SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql
3. tar/cp
一般停机检测时,使用这种备份方式
1.1 使用tar备份
停止监听,关闭数据库
[oracle@localhost ~]$ lsnrctl stop
SQL> shutdown immediate;
备份
[root@localhost ~]$ mkdir /u01/app/backup
[root@localhost ~]$ cd /u01/app/ backup
[root@localhost ~]$ tar cvf oraclebak190510.tar /u01/app/oracle
1.2 恢复
[root@localhost ~]$ rm -rf /u01/app/oracle/*
[root@localhost ~]$ cd /
[root@localhost ~]$ tar xvf /u01/app/backup/
[root@localhost ~]$ su - oracle
[oracle@localhost ~]$ lsnrctl start
SQL> startup;
4. rman
4.1 使用rman备份数据库
注意:使用rman备份一定要保证数据库处于归档模式
[root@localhost ~]$ mkdir /u01/app/backup #新建一个备份目录
[oracle@localhost ~]$ rman target / #登录rman
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; #把自动备份打开
RMAN> run{
allocate channel d1 type disk; #分配命名一个d1的磁盘通道
sql 'alter system archive log current'; #做一次数据归档
backup format '/u01/app/backup/catpdbfull_%U' database include current controlfile
plus archivelog; #备份的数据库包含控制文件,包含当前归档日志
release channel d1; #释放磁盘通道
}
4.2 rman恢复
[root@localhost ~]$ rm -rf /u01/app/oracle/oradata/orcl/*
SQL> shutdown abort;
startup pfile='/u01/app/backup/catpdbfull_03u6tot2_1_1 '; #写一个pfile文件去启动这里的路径写之前备份时参数文件(03)下piece handle后的路径
[oracle@localhost ~]$ rman target /
RMAN> restore controlfile from '/u01/app/backup/catpdbfull_05u6tovb_1_1'; #恢复控制文件之前备份时控制文件下piece handle后的路径
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
SQL> alter database open resetlogs;
SQL> select * from cat.test;