伺服器重新啟動後,數據庫和備份因係統崩潰而被破壞。在這種情況下,哪些 ACID 屬性被破壞了?
我目前正在研究 ACID 屬性,偶然發現了一個我找不到答案的問題。
讓我們假設在數據庫上執行兩個事務,讀取和寫入。有時,系統崩潰。重新啟動伺服器後,數據庫和備份因崩潰而被破壞,數據庫不再存在。這會破壞哪些 ACID 屬性?
我的第一個猜測是它只破壞了持久性,因為我們可以假設事務對確保原子性的數據庫沒有任何作用,數據庫絕對是一致的,我不確定隔離,但我不知道這會如何破壞隔離。
重新啟動伺服器後,數據庫和備份因崩潰而被破壞,數據庫不再存在。
如果伺服器故障已經破壞了數據庫及其備份,那麼坦率地說,無論誰設置備份都是無能的。
備份的全部意義——事實上,我們在它們上花費這麼多時間、精力和金錢的唯一原因——是即使您失去了整個機器資產並且必須使用驅動的新伺服器重建所有內容,它們也可以被恢復在偉大的大型卡車(Ye Olde Schoole of Recovery)的後面進入您的網站。
好吧,現在一切都是“虛擬的”,但同樣的原則也適用。
如果您在與數據庫伺服器相同的 Hypervisor 上的 VM 上進行備份,您真的對 hypervisor 有任何保護嗎?
這會破壞哪些 ACID 屬性?
ACID 描述了一個正常工作的數據庫中的行為,就像操作手冊描述一個馬車鐘的正常工作一樣。
如果你把時鐘從一棟高樓上掉下來,它就不太可能可靠地報時,或者根本就不能報時。
您的“損壞”數據庫也是如此。
但至少,通過適當的備份,您可以重建您的數據庫(目前還沒有人想出時鐘的等價物)。
它不會破壞有關單個數據庫的任何 ACID 屬性,因為事件發生後數據庫和備份都不存在。
ACID 是一組關於事務的屬性:
在電腦科學中,ACID(原子性、一致性、隔離性、持久性)是數據庫事務的一組屬性,旨在保證數據的有效性,儘管出現錯誤、電源故障和其他事故。在數據庫的上下文中,滿足 ACID 屬性的一系列數據庫操作(可以被視為對數據的單個邏輯操作)稱為事務。例如,將資金從一個銀行賬戶轉移到另一個銀行賬戶,甚至涉及多個更改,例如從一個賬戶借記和貸記另一個賬戶,都是一次交易。
參考: 酸(維基百科)
在您恢復數據庫之前,您不會知道 ACID 屬性的狀態,而您無法做到這一點。
原子性
事務通常由多個語句組成。原子性保證每個事務被視為一個單獨的“單元”,要麼完全成功,要麼完全失敗:如果構成事務的任何語句未能完成,則整個事務失敗,數據庫保持不變。
**答:**我們不知道
一致性
一致性確保事務只能將數據庫從一種有效狀態帶入另一種狀態,維護數據庫不變數:寫入數據庫的任何數據都必鬚根據所有定義的規則有效,包括約束、級聯、觸發器及其任何組合。這可以防止非法事務導致數據庫損壞,但不能保證事務是正確的。
**答:**我們不知道
隔離
事務通常同時執行(例如,多個事務同時讀取和寫入表)。隔離確保事務的並發執行使數據庫處於與按順序執行事務時相同的狀態。隔離是並發控制的主要目標;根據使用的方法,不完整交易的影響甚至可能對其他交易不可見
**答:**我們不知道
耐用性
持久性保證一旦事務被送出,即使在系統故障(例如,斷電或崩潰)的情況下,它也將保持送出。這通常意味著已完成的交易(或其影響)被記錄在非易失性儲存器中。
**答:**我們不知道
然而
…您可以開始做出猜測良好的假設假設:
持久性可能已經過時了,因為事務從未結束並且可能沒有回滾。
一致性可能失敗,因為狀態變得未知。
原子性可能失敗,因為不能保證數據正確寫入數據庫。
隔離可能會獲勝,因為事務主要按照數據庫設置和會話設置所定義的某種順序進行。但這是高度投機的。這取決於整個系統故障的順序以及它在內部如何展開。