1. 程式人生 > >數據庫的幾種模式

數據庫的幾種模式

sysdba critical set 產生 trunc into rds rdquo bsp

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模式。

最大保護模式:
主庫上設置:

  1. SQL> alter database mount;
  2. Database altered.
  3. SQL> alter database set standby database to maximize protection;
  4. Database altered.
  5. SQL> alter database open;
  6. Database altered.
  7. SQL> select protection_mode from v$database;
  8. PROTECTION_MODE
  9. --------------------
  10. MAXIMUM PROTECTION
  11. 另一個session:
  12. SQL> alter system switch logfile;
  13. 系統已更改。
  14. SQL> create table t (id number(20));
  15. 表已創建。
  16. SQL> insert into t values (2);
  17. 已創建 1 行。
  18. SQL> commit;
  19. 提交完成。
  20. SQL> select * from t;
  21. ID
  22. ----------
  23. 2
  24. SQL> select * from t;
  25. ID
  26. ----------
  27. 2
復制代碼



備機上:

  1. SQL> select GROUP#,THREAD#,SEQUENCE#,USED,ARCHIVED,STATUS from v$standby_log;
  2. GROUP# THREAD# SEQUENCE# USED ARC STATUS
  3. ---------- ---------- ---------- ---------- --- ----------
  4. 4 1 0 512 NO UNASSIGNED
  5. 5 1 7 4608 YES ACTIVE
  6. 6 0 0 512 YES UNASSIGNED
  7. 7 0 0 512 YES UNASSIGNED
復制代碼


無法關閉備機數據庫,進備機系統禁用網卡:

  1. SQL> shutdown immediate;
  2. ORA-01154: database busy. Open, close, mount, and dismount not allowed now
  3. SQL>
復制代碼 然後主機上執行insert和commit操作,發現執行commit的時候被阻塞。 但其它session可以查詢: 當將備機上的網卡重新啟用後,過一會不再阻塞。 所以我觀察的結果是,當設置為maximize protection時,備機數據庫無法關閉。當備機無法連接時,主機上的數據庫事務提交被阻塞(但其它session的查詢操作仍有響應),直到備機重新能夠連接(此時日誌應該自動同步過去)。 最大高可用配置:
主機上設置最大可用模式:
進備機系統禁用網卡:
然後主機上執行insert和commit操作,發現執行commit的時候被阻塞。
但過一會不再阻塞 : 此時再查數據庫模式:
數據庫模式顯示是最大可用模式,但此時操作不再阻塞(實際上和最大性能模式是一樣的)。
在最大可用模式下備機數據庫可以關閉。
主機可以查詢完整數據
但備機數據不是最新:
重新進入備機模式,待同步後查詢:
此時數據已經同步。
所以在最大可用模式下,當redo到達不了備機時,數據庫雖然顯示模式還是最大可用模式,但實際上和最大性能模式一致。此時,和最大保護模式不一樣的是,主庫可以任意地進行寫入提交操作,不會阻塞,而當備庫可用時,這些操作會同步到備庫。

最大性能模式:
主庫上配置和執行:

  1. SQL> conn / as sysdba
  2. Connected to an idle instance.
  3. SQL> startup mount;
  4. ORACLE instance started.
  5. Total System Global Area 285212672 bytes
  6. Fixed Size 1218992 bytes
  7. Variable Size 79693392 bytes
  8. Database Buffers 201326592 bytes
  9. Redo Buffers 2973696 bytes
  10. Database mounted.
  11. SQL> alter database set standby database to maximize performance;
  12. Database altered.
  13. SQL> select protection_mode from v$database;
  14. PROTECTION_MODE
  15. --------------------
  16. MAXIMUM PERFORMANCE
  17. SQL> alter database open;
  18. Database altered.
  19. SQL> select * from t;
  20. ID
  21. ----------
  22. 100
  23. 1001
  24. 200
  25. SQL> alter system switch logfile;
  26. System altered.
復制代碼
備機可以關閉:
  1. SQL> shutdown immediate;
  2. Database closed.
  3. Database dismounted.
  4. ORACLE instance shut down.
復制代碼
備機進入mount和standby模式:
  1. SQL> startup mount;
  2. ORACLE instance started.
  3. Total System Global Area 285212672 bytes
  4. Fixed Size 1218992 bytes
  5. Variable Size 79693392 bytes
  6. Database Buffers 201326592 bytes
  7. Redo Buffers 2973696 bytes
  8. Database mounted.
  9. SQL> alter database recover managed standby database disconnect from session;
  10. Database altered.
  11. SQL> select GROUP#,THREAD#,SEQUENCE#,USED,ARCHIVED,STATUS from v$standby_log;
  12. GROUP# THREAD# SEQUENCE# USED ARC STATUS
  13. ---------- ---------- ---------- ---------- --- ----------
  14. 4 1 0 512 NO UNASSIGNED
  15. 5 1 0 512 NO UNASSIGNED
  16. 6 0 0 512 YES UNASSIGNED
  17. 7 0 0 512 YES UNASSIGNED
復制代碼
看數據是否同步:
  1. SQL> alter database open read only;
  2. alter database open read only
  3. *
  4. ERROR at line 1:
  5. ORA-01154: database busy. Open, close, mount, and dismount not allowed now
  6. SQL> alter database recover managed standby database cancel;
  7. Database altered.
  8. SQL> alter database open read only;
  9. Database altered.
  10. SQL> select * from t;
  11. ID
  12. ----------
  13. 100
  14. 1001
  15. 200
復制代碼
可以看到表t的數據刪除操作已經得到同步。

數據庫的幾種模式