第十八章 数据库的联机备份及备份的自动化
<p>[TOC]</p>
<h2>十七章回顾</h2>
<ul>
<li>启动归档模式详情
<pre><code>archive log list
show parameter log_archive_dest_
show parameter log_archive_min_succeed_dest
show parameter log_archive_max_processes
alter system switch logfile;
alter system archive log current;</code></pre></li>
</ul>
<h2>联机备份的重要性和特点</h2>
<ul>
<li>表空间一级和数据文件一级的联机备份</li>
<li>控制文件、重做日志文件、归档日志文件靠冗余来保护,不需要备份保护</li>
</ul>
<h2>联机备份步骤的演示</h2>
<ul>
<li>
<p>创建表空间备份存放目录
根据数据文件的存放路径创建</p>
<pre><code>/home/oracle/TBSBackup/disk1
/home/oracle/TBSBackup/disk2</code></pre>
</li>
<li>
<p>备份数据文件,物理cp
选择12号没使用的表空间数据文件做试验</p>
<pre><code>--查看数据文件备份情况
select * from v$backup;
--查看数据文件对应的表空间,PIONEER_INDX file_id=12
select file_id,file_name,tablespace_name from dba_data_files;
--先将该文件对应的表空间设置为备份状态
alter tablespace PIONEER_INDX begin backup;
--确认文件已经设置为备份状态
select * from v$backup;
--在数据文件备份状态下复制数据文件进行备份
SQL> host cp /home/oracle/dbdata/disk2/orcl/PIONEER_INDX01.dbf /home/oracle/TBSBackup/disk2/orcl/
--物理文件cp完成,将表空间恢复为正常非备份状态
alter tablespace PIONEER_INDX end backup;</code></pre>
</li>
<li>查看重做日志交换情况
<pre><code>--显示最近的重做志信息
select * from v$log_history where sequence# > 1520 ;
select * from v$log;
--执行日志交换即再产生一个记录
alter system archive log current;
alter system switch logfile;</code></pre></li>
</ul>
<h2>联机备份步骤的解释</h2>
<p>1.使用<code>dba_data_files</code>确认要备份的表空间和数据文件
2.使用<code>v$backup</code>数据字典确认数据文件是否备份状态
3.<code>alter tablespace PIONEER_INDX begin backup;</code>将要备份的表空间设置为备份状态
4.使用系统操作命令CP表空间对应的所有数据文件到备份磁介质上
5.用<code>alter tablespace PIONEER_INDX end backup;</code>结束表空间备份状态
6.<code>alter system switch logfile;</code>重做日志文件写到归档文件
7.使用<code>v$backup</code>确认数据文件备份状态
8.使用系统命令确认备份数据文件已经生成</p>
<p><strong>备注</strong>
1.第三步命令数据文件文件头被冻结,产生检查点,
此时可能表空间查询,可对表空间DML写改,但是数据是在重做日志的。</p>
<p><strong>问题</strong>
1.当表空间或者数据文件在备份状态,是否可以对表空间上的数据进行读操作?
2.当表空间或者数据文件在备份状态,是否可以对表空间上的数据进行DML操作?</p>
<h3>联机备份注意点</h3>
<ul>
<li>重做日志缓冲区和重做日志文件适当加大</li>
<li>在进行联机备份时,每次只备份一个表空间</li>
<li>在DML操作最少的时间段进行联机备份</li>
</ul>
<h2>联机备份的其他问题</h2>
<ul>
<li>
<p>只读表空间处理数据文件减少备份压力
在程序设计之初就规划好只读表宰
<code>alter tablespace "表空间名" read only;</code></p>
</li>
<li>数据文件在进行物理备份时被意外终止
在mount状态结束数据文件的备份状态
<code>alter database datafile "对应数据文件" end backup;</code></li>
</ul>
<h2>联机备份的应用实例</h2>
<h3>对所有的表空间进行联机备份</h3>
<ul>
<li>
<p>查看状态</p>
<pre><code>select * from v$backup;
select file_id,file_name,tablespace_name from dba_data_files;</code></pre>
</li>
<li>
<p>备份路径</p>
<pre><code>/home/oracle/dbdata/disk1/orcl /home/oracle/TBSBackup/disk1/orcl
/home/oracle/dbdata/disk2/orcl /home/oracle/TBSBackup/disk2/orcl</code></pre>
</li>
<li>备份脚本hotbackup.sql</li>
</ul>
<pre><code>connect system/system as sysdba
alter system archive log start;
alter tablespace USERS begin backup;
host cp /home/oracle/dbdata/disk2/orcl/users01.dbf /home/oracle/TBSBackup/disk2/orcl
alter tablespace USERS end backup;
alter system switch logfile;
alter tablespace UNDOTBS1 begin backup;
host cp /home/oracle/dbdata/disk1/orcl/undotbs01.dbf /home/oracle/TBSBackup/disk1/orcl
alter tablespace UNDOTBS1 end backup;
alter system switch logfile;
alter tablespace TS_DATA begin backup;
host cp /home/oracle/dbdata/disk2/orcl/ts_data01.dbf /home/oracle/TBSBackup/disk2/orcl
alter tablespace TS_DATA end backup;
alter system switch logfile;
alter tablespace INDX begin backup;
host cp /home/oracle/dbdata/disk2/orcl/indx02.dbf /home/oracle/TBSBackup/disk2/orcl
alter tablespace INDX end backup;
alter system switch logfile;
alter tablespace TBS01 begin backup;
host cp /home/oracle/dbdata/disk2/orcl/tbs02.dbf /home/oracle/TBSBackup/disk2/orcl
host cp /home/oracle/dbdata/disk2/orcl/tbs01.dbf /home/oracle/TBSBackup/disk2/orcl
alter tablespace TBS01 end backup;
alter system switch logfile;
alter tablespace SYSTEM begin backup;
host cp /home/oracle/dbdata/disk1/orcl/system02.dbf /home/oracle/TBSBackup/disk1/orcl
host cp /home/oracle/dbdata/disk1/orcl/system01.dbf /home/oracle/TBSBackup/disk1/orcl
alter tablespace SYSTEM end backup;
alter system switch logfile;
alter tablespace SYSAUX begin backup;
host cp /home/oracle/dbdata/disk1/orcl/sysaux01.dbf /home/oracle/TBSBackup/disk1/orcl
alter tablespace SYSAUX end backup;
alter system switch logfile;
alter tablespace PIONEER_INDX begin backup;
host cp /home/oracle/dbdata/disk2/orcl/PIONEER_INDX01.dbf /home/oracle/TBSBackup/disk2/orcl
alter tablespace PIONEER_INDX end backup;
alter system switch logfile;
alter tablespace PIONEER_DATA begin backup;
host cp /home/oracle/dbdata/disk2/orcl/PIONEER_DATA01.dbf /home/oracle/TBSBackup/disk2/orcl
alter tablespace PIONEER_DATA end backup;
alter system switch logfile;</code></pre>
<ul>
<li>执行脚本、检查
<pre><code>SQL> @/home/oracle/script/hotbackup.sql
select * from v$backup;
--再检查物理文件</code></pre></li>
</ul>
<h2>备份操作自动化的实例</h2>
<ul>
<li>做一个bat文件或者sh文件,调用之前的sql文件</li>
</ul>
<h2>恢复管理器简介(rman)</h2>
<ul>
<li>rman的优点</li>
<li>映像拷贝、备份集概念</li>
<li>完全备份</li>
<li>增量备份</li>
<li>差异备份</li>
<li>累积增量备份</li>
</ul>
<h2>快速增量备份</h2>
<ul>
<li>开启快速增量备份功能(块更改追踪功能)
<pre><code>-- 查看块更改追踪状态
select filename,status,bytes from v$block_change_tracking;
alter database enable block change tracking using file '/home/oracle/backup/database/rman_change_track.f' reuse;
--更改追踪写进程(CTWR)的相关信息
select pid,username,program from v$process where background='1' and program like '%CT%' ;</code></pre></li>
</ul>
<h2>配置快速恢复区</h2>
<ul>
<li>
<p>快速恢复区是在硬盘上,存储归档日志、备份、闪回日志、冗余的控制文件和冗余的重做日志文件</p>
</li>
<li>设置快速恢复区
<pre><code>SQL> show parameter db_recovery_
alter system set db_recovery_file_dest_size='8G';
alter system set db_recovery_file_dest='/home/oracle/backup/FRA' scope=spfile;
shutdown immediate
startup
SQL> show parameter db_recovery_</code></pre></li>
</ul>
<h2>使用RMAN备份和恢复ORACLE数据库</h2>
<pre><code>--登录rman
$: rman target /
--显示所有配置参数
rman> show all;
--冷备份整个数据库,包括归档日志文件
--报错,因为我删除了/u01/app/oracle/product/12.2.0/db_1/dbs这个路径下旧的归档文件
RMAN> backup database plus archivelog;
Starting backup at 2021-07-24 18:02:39
current log archived
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=55 device type=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup plus archivelog command at 07/24/2021 18:02:40
RMAN-06059: expected archived log not found, loss of archived log compromises recoverability
ORA-19625: error identifying file /u01/app/oracle/product/12.2.0/db_1/dbs/arch1_1432_1048239854.dbf
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
--检查控制文件和实际物理文件的差别,如果一些归档日志已经删除或丢失,那么设置它们为expired。
crosscheck archivelog all;
--同步控制文件的信息和实际物理文件的信息(it will delete expired archivelog and updates your controlfile)。
delete expired archivelog all;
--冷备份成功
RMAN> backup database plus archivelog;
--快速恢复区(信息存放在如下路径)
/home/oracle/backup/FRA
--尝试恢复以上的备份
select * from dba_tablespaces ;
PIONEER_DATA;
select * from dba_users where username='PJINLIAN';
PIONEER_DATA
select * from dba_tables where owner='PJINLIAN';
--以上确认PJINLIAN.SALES表存放PIONEER_DATA表空间
select * from pjinlian.SALES;
--删除pjinlian.SALES表
drop table pjinlian.sales ;
RMAN> SQL 'alter tablespace PIONEER_DATA offline immediate';
SQL> select tablespace_name,status from dba_tablespaces;
RMAN> restore tablespace PIONEER_DATA;
RMAN> recover tablespace PIONEER_DATA;
RMAN> SQL 'alter tablespace PIONEER_DATA online';
--数据恢复向导,收集所有错误信息
RMAN> list failure all;</code></pre>