SQL Server数据库有三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式:
1.Simple 简单恢复模式,
Simple模式的旧称叫”Checkpoint with truncate log“,其实这个名字更形象,在Simple模式下,SQL Server会在每次checkpoint或backup之后自动截断log,也就是丢弃所有的inactive log records,仅保留用于实例启动时自动发生的instance recovery所需的少量log,这样做的好处是log文件非常小,不需要DBA去维护、备份log,但坏处也是显而易见的,就是一旦数据库出现异常,需要恢复时,最多只能恢复到上一次的备份,无法恢复到最近可用状态,因为log丢失了。 Simple模式主要用于非critical的业务,比如开发库和测试库,但是道富这边的SQL Server(即使是生产库)大都采用Simple模式,是因为这边的SQL Server大都用于非critical的业务(critical的数据库大都采用Oracle和DB2),可以忍受少于1天的数据丢失(我们的job每天都会定时备份全库)。
如果需要压缩数据库日志(Shrink语句),将数据库模式切换到简单恢复模式后压缩率才是最高的,如果你的数据库在完整恢复模式或大容量日志回复模式下采用日志压缩,压缩后的日志大小并不会很理想。
2.Full 完整恢复模式,
和Simple模式相反,Full模式的旧称叫”Checkpoint without truncate log“,也就是SQL Server不主动截断log,只有备份log之后,才可以截断log,否则log文件会一直增大,直到撑爆硬盘,因此需要部署一个job定时备份log。Full的好处是可以做point-in-time恢复,最大限度的保证数据不丢失,一般用于critical的业务环境里。缺点就是DBA需要维护log,增加人员成本(其实也就是多了定时备份log这项工作而已)。
3.Bulk-logged 大容量日志恢复
Bulk-logged模式和full模式类似,唯一的不同是针对以下Bulk操作,会产生尽量少的log: 1) Bulk load operations (bcp and BULK INSERT). 2) SELECT INTO. 3) Create/drop/rebuild index 众所周知,通常bulk操作会产生大量的log,对SQL Server的性能有较大影响,bulk-logged模式的作用就在于降低这种性能影响,并防止log文件过分增长,但是它的问题是无法point-in-time恢复到包含bulk-logged record的这段时间。 Bulk-logged模式的最佳实践方案是在做bulk操作之前切换到bulk-logged,在bulk操作结束之后马上切换回full模式。
最大保护模式:
主库上设置:
- SQL> alter database mount;
- Database altered.
- SQL> alter database set standby database to maximize protection;
- Database altered.
- SQL> alter database open;
- Database altered.
- SQL> select protection_mode from v$database;
- PROTECTION_MODE
- --------------------
- MAXIMUM PROTECTION
- 另一个session:
- SQL> alter system switch logfile;
- 系统已更改。
- SQL> create table t (id number(20));
- 表已创建。
- SQL> insert into t values (2);
- 已创建 1 行。
- SQL> commit;
- 提交完成。
- SQL> select * from t;
- ID
- ----------
- 2
- SQL> select * from t;
- ID
- ----------
- 2
备机上:
- SQL> select GROUP#,THREAD#,SEQUENCE#,USED,ARCHIVED,STATUS from v$standby_log;
- GROUP# THREAD# SEQUENCE# USED ARC STATUS
- ---------- ---------- ---------- ---------- --- ----------
- 4 1 0 512 NO UNASSIGNED
- 5 1 7 4608 YES ACTIVE
- 6 0 0 512 YES UNASSIGNED
- 7 0 0 512 YES UNASSIGNED
无法关闭备机数据库,进备机系统禁用网卡:
- SQL> shutdown immediate;
- ORA-01154: database busy. Open, close, mount, and dismount not allowed now
- SQL>
主机上设置最大可用模式:
进备机系统禁用网卡:
然后主机上执行insert和commit操作,发现执行commit的时候被阻塞。
但过一会不再阻塞 :
数据库模式显示是最大可用模式,但此时操作不再阻塞(实际上和最大性能模式是一样的)。
在最大可用模式下备机数据库可以关闭。
主机可以查询完整数据
但备机数据不是最新:
重新进入备机模式,待同步后查询:
此时数据已经同步。
所以在最大可用模式下,当redo到达不了备机时,数据库虽然显示模式还是最大可用模式,但实际上和最大性能模式一致。此时,和最大保护模式不一样的是,主库可以任意地进行写入提交操作,不会阻塞,而当备库可用时,这些操作会同步到备库。
最大性能模式:
主库上配置和执行:
- SQL> conn / as sysdba
- Connected to an idle instance.
- SQL> startup mount;
- ORACLE instance started.
- Total System Global Area 285212672 bytes
- Fixed Size 1218992 bytes
- Variable Size 79693392 bytes
- Database Buffers 201326592 bytes
- Redo Buffers 2973696 bytes
- Database mounted.
- SQL> alter database set standby database to maximize performance;
- Database altered.
- SQL> select protection_mode from v$database;
- PROTECTION_MODE
- --------------------
- MAXIMUM PERFORMANCE
- SQL> alter database open;
- Database altered.
- SQL> select * from t;
- ID
- ----------
- 100
- 1001
- 200
- SQL> alter system switch logfile;
- System altered.
备机可以关闭:
- SQL> shutdown immediate;
- Database closed.
- Database dismounted.
- ORACLE instance shut down.
备机进入mount和standby模式:
- SQL> startup mount;
- ORACLE instance started.
- Total System Global Area 285212672 bytes
- Fixed Size 1218992 bytes
- Variable Size 79693392 bytes
- Database Buffers 201326592 bytes
- Redo Buffers 2973696 bytes
- Database mounted.
- SQL> alter database recover managed standby database disconnect from session;
- Database altered.
- SQL> select GROUP#,THREAD#,SEQUENCE#,USED,ARCHIVED,STATUS from v$standby_log;
- GROUP# THREAD# SEQUENCE# USED ARC STATUS
- ---------- ---------- ---------- ---------- --- ----------
- 4 1 0 512 NO UNASSIGNED
- 5 1 0 512 NO UNASSIGNED
- 6 0 0 512 YES UNASSIGNED
- 7 0 0 512 YES UNASSIGNED
看数据是否同步:
- SQL> alter database open read only;
- alter database open read only
- *
- ERROR at line 1:
- ORA-01154: database busy. Open, close, mount, and dismount not allowed now
- SQL> alter database recover managed standby database cancel;
- Database altered.
- SQL> alter database open read only;
- Database altered.
- SQL> select * from t;
- ID
- ----------
- 100
- 1001
- 200
可以看到表t的数据删除操作已经得到同步。