可能的错误和解决方法
备份用来防止错误,也可用来恢复数据用于测试,迁移等。
不同的错误有不同的应对方法,备份和恢复的投资取决于保护的等级。
错误分类
大类可分为物理(硬件或软件)和逻辑(使用数据库的终端用户)的。细分为:
- 语句错误:因为权限,语法和资源限制
- 用户错误:误删表或行(可使用回收站或Flashback恢复)
- 用户进程错误:客户端断连或异常中断
- 网络错误:网络硬件或协议错误
- 实例错误:Bug,操作系统错误,内存,掉电引起实例崩溃
- 介质错误:磁盘损坏
Oracle备份和恢复方案
基于RTO的方法。
天或小时:RMAN
小时或分钟:Flashback
分钟或秒:RAC,ADG
Oracle Data Recover Advisor
可快速确定错误类型并建议最佳的恢复方式。
Recovery Manager (RMAN)
表,数据文件,表空间,实例的备份和恢复。
数据库克隆和复制。
RMAN的关键组件是FRA,用于集中存储备份和恢复对象。FRA可基于ASM或文件系统。
FRA的大小取决于备份窗口和备份频度。
FRA是可选的,但却是最佳建议。
Oracle Secure Backup (OSB)
OSB是备份软件,最主要是备份Oracle数据库,其次还可以备份Linux服务器和NAS。
Oracle Data Guard
物理stand-by:备点由主点的备份实例化后,持续接收主点的redo并应用,以保持与主点的同步。备点是只读的。通常用作灾备。
逻辑standby:备点接受redo后将其转换为同效的DML,这样备点可认为与主点逻辑一致,单物理结构通常不一样。通常用作另一套环境,如数仓。
实例恢复和数据损坏的不可能性
数据库异常关闭或中断会导致实例恢复,实例恢复包括两个阶段,前滚和后滚。两个阶段都会利用redo log.
在数据库打开前,会进行前滚,即利用redo log将已提交但未写入数据文件中的数据写到数据文件。数据库打开后,会利用redo log将未提交但已写入数据文件中的数据清除,即进行回滚。无论如何,由于redo log总是在事务提交时先行记录,因此只要redo log不发生物理损坏,则数据库损坏时不可能发生的。
CHECKPOINTS AND THE REDO LOG
DBWn(Database Writer)负责将buffer中的数据写到数据文件。而数据的变化(Change Vector)由Log Writer(LGWn)写到Redo Log。DBWn采用Lazy模式,而LGWn是积极模式,对于事务是完全实时。
Checkpoint机制
Checkpoint是最近的一个实例恢复点,有DBWn自动向前推进。如果是将buffer中部分脏数据写数据文件,则称为部分checkpoint,否则称为完全Checkpoint。完全Checkpoint一般不推荐做,只有在正常shutdown数据库时才有必要。完全Checkpoint可以手工发起:
alter system checkpoint
正常shutdown的好处是数据库启动时无需实例恢复。
部分Checkpoint的情形包括将表空间,数据文件置为离线,truncate table,备份数据文件等。
保护Online Redo Log 文件
log file group:由于需要轮转,至少需要两个
member:一个group中至少1个member,为物理文件,为安全计,需要2个或以上
online redo log可以在线更改配置。如果数据库用DBCA创建,则有3个log file group。除非使用OMF和FRA只会配置1个member。
V$LOG
和V$LOGFILE
为相关视图。
SQL> select group#, sequence#, members, status from v$log;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 16 1 INACTIVE
2 17 1 INACTIVE
3 18 1 CURRENT
SQL> select group#, status, member from v$logfile;
GROUP# STATUS MEMBER
---------- ------- ------------------------------------------------------------
3 /opt/oracle/oradata/ORCLCDB/redo03.log
2 /opt/oracle/oradata/ORCLCDB/redo02.log
1 /opt/oracle/oradata/ORCLCDB/redo01.log
SQL> alter system switch logfile;
System altered.
SQL> select group#, sequence#, members, status from v$log;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 19 1 CURRENT
2 17 1 INACTIVE
3 18 1 ACTIVE
SEQUENCE#表示log switch的次数。
保护redo log最好的方法是复制(multiplex),即增加member,例如:
alter database add logfile member '/path_to/file' to group 1
归档模式和归档进程
由于online redo log会被重写,为保留online redo log的历史记录,我们需要开启归档。
归档默认未开启,但对于生产系统都建议开启。在log switch时,后台进程会将当前文件写到归档空间。归档文件的大小和名称由初始化参数设定。
归档文件也可以形成多份拷贝(multiplex,即多个归档地点),但最终还是应迁移到离线存储,如磁带。如果归档地点是Oracle Net alias,即另一台机器,此模式称为Data Guard。
必须在正常关闭数据库然后进入mount模式才能开启归档模式。
备份和恢复: 配置
保证系统可恢复,需要形成多份redo和controlfile,前者可以在线做,后者不行。
以下输出表示控制文件有两个拷贝:
SQL> select value from v$parameter2 where name='control_files';
VALUE
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCLCDB/control01.ctl
/opt/oracle/oradata/ORCLCDB/control02.ctl
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCLCDB/control01.ctl
/opt/oracle/oradata/ORCLCDB/control02.ctl
练习:
-- 查看redo状态
SQL> select group#, thread#, bytes, member, v$log.status from v$log join v$logfile using (group#);
GROUP# THREAD# BYTES MEMBER STATUS
---------- ---------- ---------- -------------------------------------------------- ----------------
3 1 209715200 /opt/oracle/oradata/ORCLCDB/redo03.log INACTIVE
2 1 209715200 /opt/oracle/oradata/ORCLCDB/redo02.log INACTIVE
1 1 209715200 /opt/oracle/oradata/ORCLCDB/redo01.log CURRENT
-- 查看归档是否开启
select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
SQL> select archiver from v$instance;
ARCHIVE
-------
STOPPED
-- 为每一个group添加1个member
SQL> alter database add logfile member '/opt/oracle/oradata/ORCLCDB/redo01_2.log' to group 1;
Database altered.
SQL> alter database add logfile member '/opt/oracle/oradata/ORCLCDB/redo02_2.log' to group 2;
Database altered.
SQL> alter database add logfile member '/opt/oracle/oradata/ORCLCDB/redo03_2.log' to group 3;
Database altered.
-- 再次查看
SQL> select group#, thread#, bytes, member, v$log.status from v$log join v$logfile using (group#);
GROUP# THREAD# BYTES MEMBER STATUS
---------- ---------- ---------- -------------------------------------------------- ----------------
3 1 209715200 /opt/oracle/oradata/ORCLCDB/redo03.log INACTIVE
2 1 209715200 /opt/oracle/oradata/ORCLCDB/redo02.log INACTIVE
1 1 209715200 /opt/oracle/oradata/ORCLCDB/redo01.log CURRENT
1 1 209715200 /opt/oracle/oradata/ORCLCDB/redo01_2.log CURRENT
2 1 209715200 /opt/oracle/oradata/ORCLCDB/redo02_2.log INACTIVE
3 1 209715200 /opt/oracle/oradata/ORCLCDB/redo03_2.log INACTIVE
6 rows selected.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_ CON_ID
---------- ------- ------- -------------------------------------------------- --- ----------
3 ONLINE /opt/oracle/oradata/ORCLCDB/redo03.log NO 0
2 ONLINE /opt/oracle/oradata/ORCLCDB/redo02.log NO 0
1 ONLINE /opt/oracle/oradata/ORCLCDB/redo01.log NO 0
1 INVALID ONLINE /opt/oracle/oradata/ORCLCDB/redo01_2.log NO 0
2 INVALID ONLINE /opt/oracle/oradata/ORCLCDB/redo02_2.log NO 0
3 INVALID ONLINE /opt/oracle/oradata/ORCLCDB/redo03_2.log NO 0
6 rows selected.
SQL> alter system switch logfile;
System altered.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_ CON_ID
---------- ------- ------- -------------------------------------------------- --- ----------
3 ONLINE /opt/oracle/oradata/ORCLCDB/redo03.log NO 0
2 ONLINE /opt/oracle/oradata/ORCLCDB/redo02.log NO 0
1 ONLINE /opt/oracle/oradata/ORCLCDB/redo01.log NO 0
1 INVALID ONLINE /opt/oracle/oradata/ORCLCDB/redo01_2.log NO 0
2 ONLINE /opt/oracle/oradata/ORCLCDB/redo02_2.log NO 0
3 INVALID ONLINE /opt/oracle/oradata/ORCLCDB/redo03_2.log NO 0
6 rows selected.
SQL> select group#, thread#, bytes, member, v$log.status from v$log join v$logfile using (group#);
GROUP# THREAD# BYTES MEMBER STATUS
---------- ---------- ---------- -------------------------------------------------- ----------------
3 1 209715200 /opt/oracle/oradata/ORCLCDB/redo03.log INACTIVE
2 1 209715200 /opt/oracle/oradata/ORCLCDB/redo02.log CURRENT
1 1 209715200 /opt/oracle/oradata/ORCLCDB/redo01.log ACTIVE
1 1 209715200 /opt/oracle/oradata/ORCLCDB/redo01_2.log ACTIVE
2 1 209715200 /opt/oracle/oradata/ORCLCDB/redo02_2.log CURRENT
3 1 209715200 /opt/oracle/oradata/ORCLCDB/redo03_2.log INACTIVE
6 rows selected.
配置快速恢复区(FRA)
FRA(Fast Recovery Area)是恢复相关文件存放的默认位置,由两个参数控制:
- db_recovery_file_dest :位置,可以是文件系统或ASM,多个数据库可以共享,以目录分开
- db_recovery_file_dest_size - 大小
FRA的使用情况可参见视图:
v$recovery_file_dest
v$recovery_area_usage
FRA中存放的文件包括归档日志,RMAN备份,flashback日志。
通过删除不再需要的文件,RMAN可以管理FRA空间。
理想的FRA大小可以容纳一个完整的备份,可用于恢复的多个增量备份,redo,归档以及这些文件的多份拷贝。RMAN可以恢复数据库,或将数据库回退到某一时间点。
FRA可在线配置。
SQL> select name, value from v$parameter where name like 'db_recovery%';
NAME VALUE
-------------------------------- --------------------
db_recovery_file_dest
db_recovery_file_dest_size 0
SQL> select name, space_limit, space_used from v$recovery_file_dest;
no rows selected
SQL> alter system set db_recovery_file_dest_size=5g;
System altered.
SQL> alter system set db_recovery_file_dest='/u02/fra';
System altered.
SQL> select name, space_limit, space_used from v$recovery_file_dest;
NAME SPACE_LIMIT SPACE_USED
-------------------------------- ----------- ----------
/u02/fra 5368709120 0
配置归档模式
归档默认未开启。开启需要停数据库。
过程如下:
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 18
Current log sequence 20
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1207955552 bytes
Fixed Size 9134176 bytes
Variable Size 402653184 bytes
Database Buffers 788529152 bytes
Redo Buffers 7639040 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 18
Next log sequence to archive 20
Current log sequence 20
-- 通过log switch确认归档可以工作
SQL> alter system archive log current;
System altered.
-- 确认归档文件已生成
SQL> select name, is_recovery_dest_file from v$archived_log;
NAME IS_
-------------------------------------------------------------------------------- ---
/u02/fra/ORCLCDB/archivelog/2019_11_28/o1_mf_1_20_gxzjs99r_.arc YES
归档的默认位置为LOG_ARCHIVE_DEST_1,然后是$ORACLE_HOME/dbs。在以上命令中,USE_DB_RECOVERY_FILE_DEST表示FRA:
SQL> show parameter DB_RECOVERY_FILE_DEST
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u02/fra
db_recovery_file_dest_size big integer 5G
最后,一定要执行一个全备,才算是完整。因为在转换到归档后,之前所有的备份都无效。