数据库备份与恢复是数据库管理员必须掌握的. 没有任何系统能免遭硬盘物理损坏, 粗心用户的错误操作, 或一些可能会威胁到存储数据的潜在灾难的侵袭. 为了能够最大限度地恢复数据库数据, 保证数据库的安全运行, 应该选择最合理的备份方法来防止各种故障所导致的用户数据丢失.
一, Oracle 常见的数据丢失的情况:
1, 语句故障
语句故障时在执行 sql 语句过程中发生的逻辑故障. 例如: 向表中插入违反约束的无效数据, 或者表空间没有空间了导致无法插入数据等. 这时, 应用人员或者 DBA 根据情况进行相应处理及可.
2, 用户进程故障
当用户程序出错而无法访问 oracle 数据库时, 就会发生用户进程故障, 原因是异常断开连接或终止进程, 如果网络不通, 客户端计算机以外重新启动, 这些故障会导致用户进程与服务器的连接意外终止.
用户进程故障只会导致当前用户无法正常操作数据库, 但不会影响其他用户进程. 当用户进程出现故障时, 进程监控程序 (PMON) 会自动执行进程恢复. PMON 是 oracle 的后台进程, 用于检测与用户进程失去连接的服务器进程. PMON 会通过回滚事务来处理故障, 还将释放进程当前占用的资源.
3, 实例故障
当 oracle 的数据库实例由于硬件故障或软件问题而无法继续运行时, 就会发生实例故障. 硬件问题包括意外断电, 而软件问题可能是服务器操作系统崩溃.
当重新启动数据库时, 如果发现实例故障, oracle 会自动完成实例恢复. 实例恢复将数据库恢复到与故障之前的事务一致的状态, oracle 会自动回滚未提交的数据.
4, 介质故障
介质故障是当一个数据库文件, 文件的部分或磁盘不能读或不能写时出现的故障. 例如: 硬盘磁头损坏会导致而数据库文件完全损坏. 要修复由于介质故障引起的数据库文件损坏, 需要使用介质恢复.
二, 备份的分类
1, 从物理和逻辑角度分:
1)物理备份: 对数据库操作系统的物理文件 (如数据文件, 控制文件和日志文件) 的备份. 物理备份又可以分为脱机备份 (冷备份) 和联机备份 (热备份), 前者是在关闭数据库的时候进行的, 后者对正以归档日志方式运行的数据库进行备份. 可以使用 oracle 的恢复管理器(RMAN) 或操作系统命令进行数据库的物理备份.
2)逻辑备份: 对数据库逻辑组件 (如表和存储过程等数据库对象) 的备份. 逻辑备份的手段很多, 如传统的 EXP, 数据泵 EXPDP, 数据库闪回技术及第三方工具, 都可以进行数据库的逻辑备份.
2, 从备份策略角度上
1)完全备份: 每次对数据进行完整的备份. 当发生数据丢失的灾难情况时, 完全备份无须依赖其他信息, 即可实现 100% 数据恢复, 其恢复时间最短且操作最方便.
2)增量备份: 只有那些在上次完全备份或者增量备份后被修改的文件才会备份. 优点是备份数据量小, 需要的时间短, 缺点是恢复的时候需要依赖之前的备份记录, 出问题的风险较大.
3)差异备份: 备份相对于上次完全备份之后被修改过的文件. 从差异备份中恢复数据库时间较短, 因此只需要两份数据(最后一次完全备份和最后一次差异备份), 缺点是每次备份需要的时间较长.
3, 有效的备份策略建议
1)每隔 3 天的晚上 2 点进行一次完全备份.
2)每天的 3 点进行一次差异备份.
3)各根据以上备份策略指定计划任务
三, 恢复
恢复就是发生故障后, 利用已备份的数据或控制文件, 重新建立一个完整的数据库. 恢复分为以下两种类型.
1, 实例恢复: 当 oracle 实例出现失败后, oracle 自动进行的恢复.
2, 介质恢复: 当存放数据库的介质出现故障时所做的恢复. 介质恢复又分为完全恢复和不完全恢复.
完全恢复: 将数据库恢复到数据库失败时的状态. 这种恢复是通过装载数据库备份, 并用全部的重做日志做到的.
不完全恢复: 将数据库恢复到数据库失败前的某一时刻的状态. 这种恢复是通过装载数据库备份并应用部分的重做日志做到的. 进行不完全恢复后, 必须在启动数据库时用 resetlogs 选型重设联机重做日志.
RMAN 操作
1, 准备工作
首先 RMAN 工作在归档日志模式下, 所以我们要开启该模式
- [root@oracle uniread-1.01]# uniread sqlplus sys/123456 as sysdba
- SQL> shutdown immediate
- SQL> startup mount
- SQL> alter database archivelog;
- SQL> alter database open;
用 root 建立 / usr/local/rman 目录, 并给 oracle 授权
- [root@oracle local]# mkdir -p /usr/local/rman
- [root@oracle local]# chown -R oracle /usr/local/rman/
- [root@oracle local]# chmod -R 775 /usr/local/rman/
2,RMAN 正式操作
用 oracle 用户登陆操作; 创建 RMAN 的恢复目录以及注册目标数据库到恢复目录
- [oracle@oracle local]$ uniread sqlplus sys/123456 as sysdba
- SQL> create tablespace rman_ts datafile '/usr/local/rman/rman.ora' size
- 20M autoextend on next 5M maxsize unlimited;
- SQL> create user zhangsan identified by pwd123 default tablespace rman_ts temporary tablespace temp;
- SQL> grant connect,resource to zhangsan;
- SQL> grant recovery_catalog_owner to zhangsan;
- SQL> quit
- [oracle@oracle local]$ rman catalog zhangsan/pwd123
- RMAN> create catalog tablespace rman_ts;
- RMAN> quit
切换登陆 RMAN
- [oracle@oracle local]$ rman catalog zhangsan/pwd123 target /
- RMAN> register database;
自动备份分配通道
- RMAN> configure device type disk parallelism 5;
- RMAN> configure default device type to disk;
手动备份分配通道(手动和自动二者选一即可)
- RMAN> RUN
- 2> {
- 3> ALLOCATE CHANNEL ch1 DEVICE TYPE disk;
- 4> ALLOCATE CHANNEL ch2 DEVICE TYPE disk;
- 5> ALLOCATE CHANNEL ch3 DEVICE TYPE disk;
- 6>
- }
开始备份(下面的命令表示备份整个数据库和归档日志, 不指定备份路径会备份到默认路径)
RMAN> backup database plus archivelog;
3, 恢复数据
查看备份的文件
1)模拟故障 users01.dbf 丢失
数据库已经无法关闭了, 报错: 找不到 file4 也就是 users01.dbf 这个文件
执行如下命令恢复丢失的 users01.dbf
- [oracle@oracle local]$ rman target sys/123456
- RMAN> run
- 2> {
- 3> sql 'alter tablespace users offline immediate';
- 4> restore tablespace users;
- 5> recover tablespace users;
- 6> sql 'alter tablespace users online';
- 7>
- }
这时可以发现, 数据库可以正常关闭了, 然后也能开启了
2)模拟 system01.dbf 丢失(不是很确定能不能弄好..)
登陆 rman 报了一堆错, 估计是废了.~ 嗯, 关键是勇于尝试~~
sys 登陆不了了
system 也登陆不了了
注释: 事实上 system01.dbf 丢失, 如果 Oracle 在 mount 状态是可以通过 rman 恢复的; 但是这次我的 Oracle 是在 open 状态, 这样我就登陆不了 rman 进行恢复操作了(* ~ー~) (~ー~")
4, 其他操作
1)备份时指定备份目录, 备份文件的命名格式 (以 / usr/local/rman) 为例
RMAN> backup databse FORMAT '/usr/local/rman/%U';
2)备份单个表空间
RMAN> backup tablespace users;
3)Oracle 在 mount 下恢复 system01.dbf
- [oracle@oracle local]$ rman target sys/123456
- RMAN> restore database;
- RMAN> recover database;
- RMAN> alter database open resetlogs;
- [oracle@oracle local]$ uniread sqlplus sys/123456 as sysdba
- SQL> alter database open;
最后的话:
有些博主可能会注意到我的截图中在登陆 Oracle 的语句 sqlplus 前加了一个 uniread; 实际上它是 Oracle 的清屏翻页工具. 装上之后在 Oracle 中输入 SQL 语句就可以使用 ctrl+L 和 "上键" 翻出之前输入的 SQL 语句了.
来源: http://www.linuxidc.com/Linux/2018-11/155178.htm