mysql目前被廣泛應用於企業中,資料儲存的重要一點就是資料的可靠性。即,當應用提交事物,返回成功後,資料庫必須保證這個修改有效,不會因為意外情況而丟失。
當然,要做到這點,單機是不可能的,所以資料庫大多會有異地容災,來保證單機意外不可用時,有可靠備份。
不過,本文章不討論分布式的情況。只討論,mysql單機的情況。單機可能宕機,但還能啟動回來。這種情況下,mysql會不會丟資料。
acid是資料庫事務正確執行的四個基本要素的縮寫,d就是持久化。mysql對此的實現方法是write ahead logging,即修改資料庫時,不直接修改資料庫內容,而是將修改完的資料寫入日誌中,並同步到磁碟上,這樣對其他讀程序就沒有影響。如果資料庫崩潰,重啟後掃瞄日誌檔案,然後更新的資料庫中。
mysql中,對於事務的實現,是innodb儲存引擎。
我們知道,寫磁碟時,linux為了優化io速度,會有個cache來快取在記憶體中。預設的快取是回寫策略(write-back),即定時,或者特定情況時才刷盤。
如果說,在資料寫到了系統cache後,突然斷電了,那記憶體中的這部分資料就丟失了。所以,資料庫會繞過系統快取,直寫磁碟。後面會有部分內容討論mysql的這個引數。
現在應該已經不叫磁碟了,因為ssd等flash儲存的出現。但無論什麼盤,有個問題都是需要解決的,那就是資料安全性。對此,raid技術使用冗餘硬碟來提高資料安全性。
所以,其實資料落盤後,我們可以認為它是安全的。現在的盤或raid卡都會有cache,即硬體的乙個快取區來加速讀寫。有點類似系統記憶體。一樣的是,如果斷電,在cache中的資料就會丟失。
因此,raid卡和硬碟都會有個電池來保護cache中的資料,以保證在斷電後,cache中的資料還能保留一段時間。
這是innodb資料檔案的刷盤方式。目前支援4種不同的引數值。
大部分情況下,選擇o_direct比較好。o_direct選項意味著讀寫繞過系統的page cache,直接落盤。因為資料檔案大多是隨機寫。而且innodb自己有buffer_pool,再走page cache就多次快取,無意義。
另外,即使是直寫磁碟,在寫完後,mysql還會呼叫一次fsync。這是因為雖然資料讀寫繞過page cache,但類似inode這類的meta資訊依然會有快取(比如檔案位元組數,許可權,時間戳等)。因此需要rsync同步下去。
o_direct_no_fsync是使用o_direct方式開啟檔案,但刷資料後不執行fsync。
這是控制innodb的redo的刷盤策略,可以設定的值是0,1,2。redo log有乙個自己的log buffer,所以redo會先寫到log buffer,然後寫到page cache,最後再落盤。
在這幾個模式中,模式1是最安全的。
sync_binlog是mysql的binlog寫入方式。它可以設定0以上的值。
sync_binlog 的預設值是0,像作業系統刷其他檔案的機制一樣,mysql不會同步到磁碟中去而是依賴作業系統來重新整理binary log。
當sync_binlog =n (n>0) ,mysql 在每寫 n次二進位制日誌binary log時,會使用fdatasync()函式將它的寫二進位制日誌binary log同步到磁碟中去。
很明顯,最安全的設定是1,即寫乙個binlog,同步一次。
innodb_flush_log_at_trx_commit和sync_binlog兩個引數,在均被設定成1的時候,被稱作雙1模式。這個模式下,mysql的資料可靠性是最好的。
前面幾個引數已經極大的保證了mysql不丟資料。但還是可能出現一種情況。那就是,當事物提交時,mysql掛掉。這個時候,binlog已經落盤,而redo中事務未提交。就會回滾掉事物。而binlog是不能回滾的,於是就出現binlog有這個操作,而innodb中沒有。如果有主備複製的話,就會出現主備不一致。
innodb_support_xa在設為on時,會使用二階段提交協議來保證binlog和innodb的一致。
mysql資料持久化 詳解mysql持久化統計資訊
一 持久化統計資訊的意義 統計資訊用於指導mysql生成執行計畫,執行計畫的準確與否直接影響到sql的執行效率 如果mysql一重啟 之前的統計資訊就沒有了,那麼當sql語句來臨時,那麼mysql就要收集統計資訊然後再生成sql語句的執行 計畫。如果能在關閉mysql的時候就把統計資訊儲存起來,那麼...
資料持久化 資料儲存到本地
蘋果手機為了保證自己的資料上的絕對安全.設計了沙盒檔案,每乙個應用程式都配備了自己的沙盒檔案,每一次執行,資料夾的名字就會變成乙個沒有任何規律的字串,第乙個引數 當前要前往哪乙個資料夾,前往 documents 檔案用 nsdocumentdirectory,64行那個,還可以前往caches資料夾...
IOS 本地儲存 資料持久化
沙盒 其實對於每乙個應用程式,都有唯一的乙個本地檔案與之對應,名字由系統隨機生成.這個檔案就是沙盒 沙盒機制 沙盒機制其實就是,對每乙個應用程式的資源起到乙個保護作用,當前程式不允許訪問其他程式的資源,其他程式也不允許訪問當前程式的資源.對於每乙個 應用程式的沙盒檔案中都包含以下檔案 1.docum...