一、資料庫運維工作總原則
1、能不給資料庫做的事情不要給資料庫,資料庫隻做資料容器。
2、對于資料庫的變更必須有記錄,可以復原。
二、權限相關
總原則,以最低粒度控制權限。
SELECT權限:所有開發人員均可擁有自己業務範圍内的表權限。
INSERT/UPDATE/DELETE權限:所有項目經理可以擁有自己業務範圍内的表權限。
Structure權限:資料庫管理者可以擁有。
Administration權限:系統管理者和資料庫管理者可以擁有。
程式通路權限:根據IP和系統名建立使用者名,隻擁有必須表的通路權限。
全部權限:技術總監掌管,MySQL系統表mysql表權限除技術總監任何人不得擁有。
權限粒度:開發人員權限粒度到表一級,資料庫管理者和系統管理者權限粒度到庫一級。
通路限制:除DBA和系統管理者需要24小時保證可以操作資料庫外,其他人均需要綁定IP。
密碼強度:必須根據目标/來源/使用者等資訊設定密碼,保證不用使用者在不同主機從不同來源的密碼不一樣,每隔一段時間需要集中更換密碼。
三、改表相關
總原則,以最少的開銷按需記錄資料,所有變更要有記錄。
表結構修改流程:開發人員送出建/改/删表的SQL(必須有注釋)給DBA,并且說明建/改/删表原因,DBA審查,與開發人員交流修正,由DBA執行SQL操作,并記錄。
表結構改動注意:(越靠前優先級越高)
按需建立字段,不得采用遠大于需求的類型。
盡量采用無符号型資料類型。
盡量采用固定長度類型。
盡量避免TEXT類型。
盡量用數字來代替字元。
可以用ENUM枚舉數量不多的字元。
如果必須采用TEXT類型,如無特殊情況,必須拆表單獨存放TEXT列。
存在必須用函數計算才能做條件的列,建立一存放函數計算結構,對新列進行索引,采用觸發器自動更新。
記錄修改時間盡量采用時間戳,不要采用時間類型列然後手動設定。
分離表中常用和不常用資料,分開存儲。
曆史資料要及時分離,按一定規則命名表或存放到資料倉庫。
類似标記字段設計要合理,盡量避免在SQL中出現<>,盡量使用>/</=來完成條件查找。
類型選擇細則參考已發的類型選擇文檔。
四、索引相關
總原則,以高并發SQL為核心建立索引,盡量複用索引。
除非某個字段經常單獨作為查詢字段,并且不會作為其他組合索引的第一個列,才為本字段建立單獨的索引。
盡可能建組合索引,綜合考量涉及的SQL,遵循盡量複用的原則建立索引。
優先處理高并發SQL的索引,很少使用的SQL或者隻在閑時使用的SQL可以不為其索引。
小表可以不建立索引(如果參與關聯需要為關聯字段索引)。
索引後結果集仍較大可以增加排序字段進索引,若執行計劃不使用,則删除。
關聯字段除特殊情況都需要建索引。
要及時根據SQL的使用情況調整索引。
五、架構相關
總原則,盡可能在記憶體中完成大部分操作。
記憶體足夠選擇InnoDB(高并發資料與記憶體大小相當),記憶體不足用MyISAM,歸檔用Archive,事務相關用InnoDB,臨時高并發資料用Memory。
Master-Slave架構,适合明顯讀大于寫的情況。
Master-Master架構,無比使兩個Master産生不同的主鍵,例如一台産生奇數主鍵,一台産生偶數主鍵,
單機事務用InnoDB,叢集事務用LVS+NDB,切不可直接用NDB,效率極低。
分布式事務盡量避免,如果必須,則采用XA事務,分段送出,或者直接采用NDB叢集引擎。
原則上曆史資料和生産資料不要放在同一資料庫,如曆史資料極少使用,則建立新庫将曆史資料保持表名不變存入,隻要USE改變資料庫就可以查詢曆史資料,比較常用的曆史資料采用表名+日期來存放相應的曆史資料,通過表明和日期拼接來做曆史查詢。
主庫寫壓力較大時采取級聯複制,讀庫壓力更大時采用一對多複制,以平衡壓力為目标。
曆史資料拆分由DBA與開發人員商議拆分時間,每次拆分時間由DBA與開發人員确認則删除或轉移至資料倉庫。
六、SQL相關
總原則,最小化查詢結果集,不做不必要的操作,分散壓力到平時。
盡量不做全表查詢,根據需要選擇需要的字段需要的行。
條件盡可能詳細,不要讓資料庫掃描不必要的行。
選擇條件盡可能按照一緻的順序出現,最大化利用索引。
盡量将大結果集操作拆分到多次執行,避免資料庫長時間被鎖。
七、工作流程
通過Cacti和mysqlreport腳本檢視運作狀态
通過mystat腳本監控實時狀态
通過mysqlsla腳本分析昨日慢查,可作為計劃任務每天定時執行,清空舊慢查
對每日慢查進行調優
通過mysqlidxchx腳本對無效索引進行檢查
建表要詢問哪些字段會用來查詢和連接配接,建立索引
改字段要問清類型和範圍,設立合适的資料類型
表結構的修改必須加注釋,每個字段都要有注釋,除了id
從資料庫删除資料一定要先備份再删除。
每月末要執行曆史資料清理,通過mysqldump –where來導出指定範圍的資料,插入資料倉庫。
無用表和字段要及時清理