国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

微信SQLite數據庫修復實踐

數據庫 其他數據庫
眾所周知,微信在后臺服務器不保存聊天記錄,微信在移動客戶端所有的聊天記錄都存儲在一個SQLite數據庫中,一旦這個數據庫損壞,將會丟失用戶多年的聊天記錄。而我們監控到現網的損壞率是0.02%,也就是每1w個用戶就有2個會遇到數據庫損壞。

前言

眾所周知,微信在后臺服務器不保存聊天記錄,微信在移動客戶端所有的聊天記錄都存儲在一個 SQLite 數據庫中,一旦這個數據庫損壞,將會丟失用戶多年的聊天記錄。而我們監控到現網的損壞率是0.02%,也就是每 1w 個用戶就有 2 個會遇到數據庫損壞。考慮到微信這么龐大的用戶基數,這個損壞率就很嚴重了。更嚴重的是我們用的官方修復算法,修復成功率只有 30%。損壞率高,修復率低,這兩個問題都需要我們著手解決。

SQLite 損壞原因及其優化

我們首先來看SQLite損壞的原因,SQLite官網(http://www.sqlite.org/howtocorrupt.html )上列出以下幾點:

文件錯寫

文件鎖 bug

文件 sync 失敗

設備損壞

內存覆蓋

操作系統bug

SQLite bug

但是我們通過收集到的大量案例和日志,分析出實際上移動端數據庫損壞的真正原因其實就3個:

空間不足

設備斷電

文件sync失敗

我們需要針對這些原因一一進行優化。

優化空間占用

首先我們來優化微信的空間占用問題。在這之前微信的部分業務也做了空間清理,例如朋友圈會自動刪除7天前緩存的圖片。但是總的來說對文件空間的使用缺乏一個全局把控,全靠各個業務自覺。我們需要做得更積極主動,要讓開發人員意識到用戶的存儲空間是寶貴的。我們采取以下措施:

業務文件先申請后使用,如果某個文件沒有申請就使用了,會被自動掃描出來并刪除;

每個業務文件都要申明有效期,是一天、一個星期、一個月還是***存儲;

過期文件會被自動清理。

文件自動清理 

對于微信之外的空間占用,例如相冊、視頻、其他App的空間占用,微信本身是做不了什么事情的,我們可以提示用戶進行空間清理:

提示進行空間清理 

優化文件 sync

synchronous = FULL

設置SQLite的文件同步機制為全同步,亦即要求每個事物的寫操作是真的flush到文件里去。

fullfsync = 1

通過與蘋果工程師的交流,我們發現在 iOS 平臺下還有 fullfsync (https://www.sqlite.org/pragma.html#pragma_fullfsync) 這個選項,可以嚴格保證寫入順序跟提交順序一致。設備開發商為了測評數據好看,往往會對提交的數據進行重排,再統一寫入,亦即寫入順序跟App提交的順序不一致。在某些情況下,例如斷電,就可能導致寫入文件不一致的情況,導致文件損壞。

優化效果

多管齊下之后,我們成功將損壞率降低了一半多;DB損壞還是無法完全避免,我們還是得提高修復成功率。

提高修復成功率 

SQLite 修復邏輯優化

master 表

首先我們來看 SQLite 的架構。SQLite 使用 B+樹 存儲一個表,整個 SQLite 數據庫就是這些 B+樹 組成的森林。對于每個表的元數據(表名、根節點地址、表 scheme 等),都記錄在一個叫 sql_master 的表中。這個 sql_master 表(下簡稱 master 表) 本身也是一個 B+樹 存儲的普通表。

SQLite 修復邏輯優化 

官方修復算法率低下原因

官方修復算法是這樣一個流程:從 master 表中讀出一個個表的信息,根據根節點地址和創表語句來 select 出表里的數據,能 select 多少是多少,然后插入到一個新 DB 中。要注意的是 master 表他本身也是一個 B+樹 形式的普通表,DB 第0頁就是他的根節點。那么只要 master 表某個節點損壞,這個節點下面記錄的表就都恢復不了。更壞的情況是 DB 第0頁損壞,那么整個 master 表都讀不出來,就導致整個DB都恢復失敗。這就是官方修復算法成功率這么低的原因,太依賴 master 表了。

備份 master 表

那么最自然的想法,自然是另外備份一份 master 表了,也不需要用B+樹,直接用數組序列化存儲就好。我們只需要每隔一段時間輪詢 master 表,看看最近有沒有增刪 table,有的話就全量備份。

備份時機

這里有個擔憂,就是普通數據表的插入會不會導致表的根節點發生變化,也就是說 master 表會不會頻繁變化,如果變化很頻繁的話,我們就不能簡單地進行輪詢方案了。通過分析源碼,我們發現 SQLite 里面 B+樹 算法的實現是 向下分裂 的,也就是說當一個葉子頁滿了需要分裂時,原來的葉子頁會成為內部節點,然后新申請兩個頁作為他的葉子頁。這就保證了根節點一旦定下來,是再也不會變動的。實際的代碼調試也證實了我們這個推論。所以說 master 表只會在新創建表或者刪除一個表時才會發生變化,我們完全可以采用定時輪詢方案。

備份文件有效性

接下來的難題是既然 DB 可以損壞,那么這個備份文件也會損壞,怎么辦呢?我們采用了 雙備份 的機制。具體來說就是會有新舊兩個備份文件,每個文件頭都加上 CRC 校驗;每次備份時,從兩個備份文件中選出一個進行覆蓋。具體怎么選呢?優先選損壞那個備份文件,如果兩個都有效,那么就選相對較舊的。這就保證了即使本次寫入導致文件損壞,還有另外一份備份可以用。這個做法跟 Realm 標榜的 MVCC(多版本并發控制)的做法有異曲同工之妙,相當于確認新寫入的文件有效之后,才使用新寫入的文件,否則還是繼續用舊的有效的文件。

前面提到 DB 損壞的一個常見場景是空間不足,這種情況下還要分配文件空間給備份文件也是會失敗的。為了解決這個問題,我們采取 預先分配空間 的做法,初始值是 32K,大約可存 750 個表的元信息,后續則按照32K的倍數進行增長。

優化效果

通過備份 master 表,我們成功將修復成功率提高了一倍多。

修復成功率提高一倍多 

其他

通過這些優化,我們提高了微信聊天記錄存儲的可靠性。這些優化實踐,會同之前在并發性能方面的優化實踐(微信iOS SQLite源碼優化實踐),將會合并到微信即將開源的 WCDB(WeChat Database)組件中。我們正在進行緊張的代碼整理工作,爭取在 2017 年年中開源 WCDB。

 

責任編輯:杜寧 來源: WeMobileDev
相關推薦

2019-08-15 07:00:54

SQLite數據庫內存數據庫

2011-07-20 12:34:49

SQLite數據庫約束

2017-07-12 09:20:42

SQLite數據庫移植

2011-08-04 18:00:47

SQLite數據庫批量數據

2023-02-21 15:15:23

2011-08-02 16:16:08

iPhone開發 SQLite 數據庫

2024-10-28 16:31:03

2011-04-12 09:43:17

Sybase數據庫修復技巧

2009-02-02 13:16:23

修復數據表MySQL

2011-08-24 13:49:45

Access數據庫轉化

2011-07-05 10:16:16

Qt 數據庫 SQLite

2018-07-13 09:20:30

SQLite數據庫存儲

2016-03-04 10:29:51

微信支付源碼

2011-04-18 13:40:15

SQLite

2011-07-01 14:06:57

Qt sqlite

2023-10-17 08:31:03

SQLite數據庫

2013-04-10 14:21:35

2011-08-30 14:15:34

QTSQLite數據庫

2010-03-04 15:31:44

Python SQLI

2011-07-05 14:46:34

點贊
收藏

51CTO技術棧公眾號

欧美一级二级三级乱码| 日韩一区二区三区精品| 91超碰成人| 911精品国产一区二区在线| 91精品视频免费看| 91xxxxx| 欧美日韩一区二区国产| 欧美日韩综合色| 日韩久久精品一区二区三区| 欧美婷婷久久五月精品三区| 亚洲三级影院| 欧美日韩在线播放三区| 国产乱子伦视频一区二区三区| 亚洲第一福利网站| 亚洲精品一二区| 三区四区在线视频| 亚洲免费观看高清完整版在线观看熊 | 性做久久久久久免费观看欧美| 亚洲а∨天堂久久精品9966 | 国产不卡一区二区视频| 99精品视频在线| 一本久久精品一区二区| 亚洲欧洲久久| 欧美成人亚洲| 久久久国产精品亚洲一区| 狠狠干五月天| 不卡高清视频专区| 97超碰在线播放| 2021中文字幕在线| 日韩欧美久久久| 日韩大片b站免费观看直播| 国产丝袜欧美中文另类| 日韩欧美99| 欧美日韩一二三四| 欧美日韩在线播放一区| a毛片在线看免费观看| 欧美精品自拍偷拍动漫精品| 日韩少妇视频| 欧美日韩一级片网站| 色琪琪原网站亚洲香蕉| 国产麻豆精品theporn| 日本日本精品二区免费| 国产精品成久久久久| 九九九久久久久久| 1stkiss在线漫画| 欧美国产日韩在线| 一道本一区二区三区| 国产精品日韩欧美综合| 国产精品免费大片| 国产日韩精品视频| 日韩理论电影院| 欧美精品1区2区3区| 在线观看操人| 欧美另类z0zxhd电影| www在线观看播放免费视频日本| 希岛爱理av一区二区三区| 污视频在线观看网站| 久久久亚洲高清| 久久久久久亚洲精品不卡| 欧美色欧美亚洲另类七区| 欧美日本精品| 波多野结衣成人在线| 国产精品诱惑| 九九久久久久99精品| 亚洲日本网址| 日韩欧美资源站| 日本精品在线播放 | 欧美日韩aaaaaa| 日本三级韩国三级欧美三级| 亚洲精品第1页| a级网站在线观看| 国产精品看片你懂得 | 国产一区二区三区黄视频 | 国内激情视频在线观看| 国产精品日韩欧美大师| 成人高清在线视频| h视频在线免费| 国产成人av网| 国产欧美日韩在线| 中文字幕资源网在线观看| 亚洲精品国产美女| 中文字幕在线免费| xxxxx91麻豆| 欧美+亚洲+精品+三区| 超碰免费在线公开| 激情深爱一区二区| 日本五十路在线| 一区二区亚洲欧洲国产日韩| bt在线麻豆视频| 日韩精品免费视频| 91丨精品丨国产| 欧美高清中文字幕| 亚洲精品在线观| 国产麻豆欧美日韩一区| 草莓视频丝瓜在线观看丝瓜18| 久久久久久一二三区| 日本一区不卡| 久久精品视频免费| 成人资源www网在线最新版| 久久激情五月丁香伊人| 国产乱理伦片在线观看夜一区| 三级网站视频在在线播放| 黑人中文字幕一区二区三区| 精品国产91乱码一区二区三区| 欧美中文一区二区| 午夜视频你懂的| 亚洲免费小视频| 三级成人在线视频| 北条麻妃在线| 国产免费成人av| 色婷婷国产精品久久包臀| 一区二区三区四区精品视频| 男同互操gay射视频在线看| 欧美精品一级二级三级| 久久国产欧美| 国产成人天天5g影院在线观看| 91av在线网站| 日韩理论片在线| 国产日韩在线| 欧美国产乱视频| 国产高清久久久| 啪啪免费视频一区| 欧美午夜精品久久久久免费视| 亚洲乱码国产乱码精品精可以看 | 欧美一级视频一区二区| 亚洲自拍偷拍网站| 美女mm1313爽爽久久久蜜臀| 一区二区三区四区五区精品| 欧美日韩国产综合一区二区三区 | 蜜臀久久99精品久久久久宅男| 成人线上播放| 成人免费高清在线播放| 亚洲一区二区三区乱码aⅴ| 欧美性极品xxxx娇小| 99久久99久久精品国产片桃花| 在线视频手机国产| 亚洲精品国产精品国自产观看 | 国产一区二区免费| 亚洲欧美日韩中文字幕一区二区三区| 国内一区二区视频| 78精品国产综合久久香蕉| 波多野结衣天堂| 久99久在线| 视频一区视频二区国产精品| 亚洲免费在线观看视频| 欧美一区成人| 美国三级日本三级久久99| 四虎影视国产精品| 国产对白国语对白| 久久艹中文字幕| 97国产精品免费视频| 亚洲精品久久久久中文字幕二区| 亚洲国产精品视频| 色婷婷综合久久久中文字幕| 日韩国产一区二| 国产中文精品久高清在线不| 天天综合网天天| 美国一级片在线免费观看视频| 北条麻妃在线观看| 91免费黄视频| 国产成人亚洲综合91精品| 精品国产第一区二区三区观看体验| 97久久超碰精品国产| 欧美freesex交免费视频| 日韩电影不卡一区| 亚洲播播91| 免费一级欧美在线大片| 小h片在线观看| eeuss影院www在线观看| 青青操视频在线| 尤物视频免费在线观看| 人善交video高清| 99不卡视频| 黄色免费高清视频| 欧美日韩亚洲国产成人| 欧美日韩精品免费观看视一区二区| 国产精品国产精品国产专区蜜臀ah | 久久综合激情| 欧美三级黄网| 理论片在线观看理伦片| 日韩a在线播放| av视屏在线播放| 成熟老妇女视频| xxxx69视频| 91cn在线观看| 白虎精品一区| 91亚洲精品视频在线观看| 亚洲午夜久久久久久久| 色狮一区二区三区四区视频| 国产精品最新| 一区福利视频| 国产精品996| 99国产精品一区二区| 日韩精品三区| 精品一区二区三区免费看| 国产午夜久久av| 欧美久久99| 先锋亚洲精品| 亚洲超碰97人人做人人爱| 亚洲午夜精品17c|