常見的資料庫很多,包括MySQL,Oracle,SQL Server,PostgreSQL,DB2,新型的資料庫如MongoDB,Redis,ElasticSearch,Hbase。國産的資料庫如Oceanbase、Polar DB, 分布式資料庫如DRDS等。
全面掌握所有資料庫的方方面面,當然有難度,一個人的時間是有限的。但是熟練掌握幾種平時工作中最常遇到的資料庫。或者在新的工作任務中,遇到以前沒有接觸過的資料庫,需要有快速學習的能力,能在幾個月或幾周的時間裡迅速上手,并在工作的過程中持續加深掌握的程度,最終成為某一資料庫的熟練工,成為專家。
何為熟練?就是遇到任何問題,都能迅速找到解決思路。
何為專家?就是大家遇到某個解決不了的問題時,第一個想要求助的人就是你,而且在這個問題上,你通常不會讓大家失望,能得到滿意的答案,那你就是解決這個問題的專家。
資料庫種類很多,運維的技術棧很寬,阿裡雲雲産品種類繁多,客戶會遇到的問題也紛繁複雜,很難有一個人在所有的方面都是專家,但是每個人都能在其中某幾個方面成為專家。
培養良好的運維意識和習慣
- 具備基本的職業道德。運維和DBA的權限很大,要很清楚哪些事情是不能做的。不檢視和工作無關的資料,不洩漏帳号,不洩漏資料,不執行未經授權的操作。也要清楚哪些事情是要去做的。要有責任心,認真完成每天的日常工作。夥伴遇到麻煩了,要有意願去幫忙。客戶遇到麻煩了,有些事情不在服務範圍,但在我們的能力範圍内的事情,也要通過合适的途徑去支援。心存敬畏之心,不作惡,與人為善。
- 運維風險意識。權限越大,風險越大。任何操作都要謹慎,了解任何一個操作的影響(如大表DDL的影響),進行不可逆操作時要尤其謹慎。
- 良好的工作習慣。生産環境的變更要做好變更計劃、審批,在測試環境驗證。操作前确認操作環境。注意觀察和記錄變更過程中的日志。變更過程中和變更完成後要确認上下遊是否都正常。平時工作中多做記錄,多總結分享。細心,遇到疑惑的問題多思考、讨論。
- 團隊合作。團隊合作分兩方面看,首先要承擔自己在團隊中的那部分職責,做好自己的本職工作,這是最基本的。同時也要關注團隊中發生的事情,如果别的小夥伴遇到麻煩,要能主動提供幫助。另一方面,要利用團隊的力量來完成一些任務。比如我因各種原因休假,就要提前安排好相關工作,讓團隊中其它人能臨時處理相關任務。比如通宵變更釋出,那第二天,要讓團隊中其它人能頂上來做白天的值班和相關任務處理。怎麼讓其他人能接替我在做的任務,或者我如何順利接手其他夥伴手頭的任務?要在平時的工作中培養,要互相關注,了解其它同學在做的事情。避免成為單點。
- 應對故障。要迅速評估故障的業務影響面,定位故障原因。重大問題及時(5分鐘)更新。
- 提高效率,學會使用自動化工具完成重複的工作。
學會學習
- 要有好的學習管道。各類資料庫的官方文檔是最重要的學習資料。MySQL,Oracle,SQL Server,MongoDB,Redis,ElasticSearch等産品都有很詳細的官方文檔。學會看官方文檔。官方文檔通常很長,要熟悉文檔的結構,遇到問題,能快速在文檔中定位到相關的章節。平時也要花一些時間系統地閱讀文檔,關于資料庫架構、運維、優化,很多問題都能從文檔裡都能找到靠譜的答案。除了官方文檔,也要閱讀每個領域内寫得最好的書。
- 要實踐,做實驗,設計一些場景,驗證文檔中的内容。
- 在工作中學習,從實踐中學習,理論的知識要能和實際工作中遇到的問題結合起來。用理論指導實踐,在實踐中加深對理論的了解。工作中遇到的每一個難題,每一個自己不曾遇到過的問題,每一次故障,都是很好的學習的機會。每一個問題都有一個簡單,但是沒用的答案。要花時間找到那個真正的答案。
- 從别人的工作中學習,向同行學習,向合作的夥伴學習。要找到每個領域内做得好的那些人,看看他們是怎麼思考問題解決問題的,看看他們寫的書和文章。
- 總結、沉澱、提高。要善于總結,處理了一個故障,就把故障處理的過程記錄下來。問題是怎麼發現的,有哪些征兆,怎麼精确定位問題的,最終又是通過什麼方法解決問題的。用于分析問題的理論,是不是能解釋所有現象,是不是有存在沖突的地方。暫時無法搞清楚所有的問題也不要緊,把現場的各種資料保留下來,進行歸類整理。以後也可能會遇到相同或類似的問題,當時想不清楚的問題,或許過一段時間就能想清楚了。不要輕易放個一個問題,一個疑點。
- 持續學習。每天學習。充分利用好自己的時間。如果每天比别人多花1-2個小時學習,一年就能多幾百個小時。長期持續下來,一定能有所收獲。
學會使用資料庫
- 熟練掌握常用的通路資料庫的工具,包括指令行工具和圖形化工具。如MySQL用戶端,Oracle的sqlplus,SQL Server的企業管理器、SQLCMD,ElasticSearch的kibana。
- 掌握和資料庫互動的語言。如SQL(DML,DDL),redis的各類command,mongodb、ElasticSearch的DSL。學會使用存儲過程和觸發器完成特定的需求。
- 掌握資料庫的各類對象(如各種類型的表、索引、分區,redis的list、dict、kv,mongodb的collection、document、index,elasticsearch的index、分片)。
- 熟悉資料庫支援的各自資料類型和存儲方式(精确數字類型int,decimal,非精确的數值類型如float、double,文本類型char,varchar, json,日期和時間),熟悉各類資料類型的使用場景,熟悉操作各類資料類型的常見函數。掌握字元編碼和字元集的概念,掌握各種亂碼問題的分析、解決。
- 能使用腳本自動化處理工作中的需求,如批量資料導入導出、大批量資料訂正。
-
學習使用常用的程式設計語言通路資料庫,學習常用的程式設計接口。如使用jdbc通路資料庫,使用python、perl等接口通路資料庫。
安裝部署資料庫
- 熟悉資料庫的各種安裝部署方式。如rpm安裝、二進制安裝、源碼編譯安裝,Oracle靜默安裝,SQL Server腳本安裝。
- 熟悉資料庫的參數配置方式,核心配置參數的作用和設定标準。(如oracle的pfile, spfile。mysql的session參數和全局參數、參數生效範圍)
- 熟悉組成資料庫的各類檔案和目錄結構。(如軟體二進制檔案和lib,oracle的配置檔案、控制檔案、資料檔案、日志檔案、歸檔檔案、告警日志、監聽日志。MySQL的配置檔案、資料檔案、binlog、relaylog、慢日志、錯誤日志等)
- 熟悉組成資料庫執行個體的相關程序和線程,監聽端口。(如oracle的監聽、各個程序pmon,smon,dbwr,lgwr等,mysql的各類線程如master thread、server thread等)
- 掌握資料庫高可用環境的搭建。如Oracle的DG,SQL Server的mirror、always on,MySQL的slave, group replication。使用proxy進行讀寫分離和高可用環境的搭建。使用keepalived、mha等進行自動切換。
- 了解資料庫叢集的運作方式,資料如何分片,查詢如何路由、聚合,分布式事物。
掌握資料庫備份和恢複
- 熟練掌握資料庫備份的原理、工具、操作。了解資料庫保障資料不丢的機制。掌握不同備份類型的适用場景和作用,如MySQL的實體備份、邏輯備份、binlog備份,全量備份、增量備份、日志備份、快照備份等方式。給自己運維的資料庫制定合理的備份政策,備份檔案的存儲和儲存政策。
- 熟練掌握各類資料庫各種備份方式的恢複原理、工具、操作。熟練掌握各種異常場景下的資料恢複過程。如誤操作delete如何恢複,truncate table如何恢複,sql server資料檔案損害如何恢複,oracle控制檔案丢失如何恢複,線上redo日志丢失如何恢複。如何将資料庫恢複到一個指定的時間點。如何快速恢複資料。
- 定期演練。定期驗證備份的有效性。定期模拟各種資料丢失場景進行恢複演練。
掌握資料庫運作狀況
- 學會觀察資料庫的内部運作情況,觀察資料庫的工作負載和資源消耗情況。如通過mysql的global status, innodb status, Oracle的sysstat, Sql Server的performance counter觀察資料庫的QPS,TPS,網絡吞吐量,IO請求情況等,CPU使用情況。
- 觀察資料庫session運作情況。如mysql的process list,oracle的v$session, sql server的task運作情況,了解任務的運作時間、運作狀态,任務是誰發起的,執行了什麼操作。
- 觀察執行個體SQL的整體運作情況。如mysql的慢sql,oracle的awr,或通過各類審計工具,或通過一些解析網絡封包的工具統計sql執行情況,哪些sql執行次數多,哪些sql運作時間多,哪些sql消耗資源多。
- 觀察空間使用情況。觀察各類檔案占用的空間情況,如資料檔案、日志檔案、臨時檔案的空間使用情況。觀察表空間和表的空間占用情況。
- 觀察執行個體内部鎖定情況,其它各類等待事件。oracle可以通過等待事件相關視圖,active_session_history,sql trace等方式檢視細粒度的情況,其它資料庫或多或少有一些途徑能檢視内部等待情況。
- 觀察執行個體記憶體使用情況。
- 觀察資料庫告警日志。如oracle 的alert log, 監聽日志,mysql的錯誤日志。通過各類告警日志有時能發現其他途徑觀察不到或容易遺漏的問題。
- 觀察單個sql的執行情況,熟練掌握各類SQL優化的技能。熟悉優化器和sql的執行計劃,通過各種方法優化sql執行效率。
- 對于叢集資料庫,觀察叢集的運作情況,觀察各個節點的運作狀況,叢集間的通信情況,不同節點的負載配置設定情況。
- 日常經常用到的工具、指令、小腳本、SQL語句等,記錄下來,整理好,遇到問題時能快速拿來複用。
熟悉資料庫的運作環境
- 我們接觸到的大部分資料庫運作在linux環境下。要熟悉linux的使用。從os層面檢視各類資源(cpu,記憶體,網絡流量,IO等,檔案系統,tcp連接配接等)的消耗情況。熟悉常用工具的使用。檢視OS的各類日志,如/var/log/message。OS的參數配置,如網絡棧參數配置,系統資源限制(ulimit)。
- 如果是windows,同樣有完善的工具集,能檢視各種資料。
- 了解硬體的能力,cpu、io裝置、網絡裝置等能力。
- 熟悉tcp網絡協定。我們接觸到的資料庫,基本上絕大多數都是使用tcp協定通信。熟悉網絡協定,學會使用網絡封包分析,在解決某些類型的問題上很有用。
學習一些理論的知識
- 我們接觸的很多資料庫,都屬于關系型資料庫。學習一些關系型資料庫的理論。大學的資料庫課程,就是很好的一個基礎。學習關系型理論中的幾個範式,每種範式都是為了解決什麼問題,有什麼缺點。
- 關系型資料庫理論中, transaction是很基礎的一個概念。有時間可以讀讀《Transaction Processing》這本書。據說InnoDB的設計,很多就是從這本書裡參考的。關于事物,隔離級别,鎖,資料一緻性,Btree索引,資料庫檔案結構,這本書裡有詳細的描述。
- 對于分布式資料庫,有時間可以學習一些分布式的理論,Cap理論,保障多節點資料一緻性的paxos算法等。
- 學習一些新型資料庫的存儲結構,如LSM tree,Hbase,OceanBase,LevelDB等資料庫就使用LSM tree的存儲模型。也可以了解下Elasticsearch底層索引的存儲格式。
- 這些理論知識不一定你的工作有直接的幫助,但是能幫你更好的認識各種資料庫。
- 學習一些作業系統、網絡的基礎知識。計算機系大學課程應該都有。
- 學習一些程式設計和資料結構和算法的知識。計算機系大學課程應該都有。學習幾門程式設計語言。python就很好,其它一些使用廣泛的語言有時間也可以學學,golang,javascript,c/c++,當然還有java 。
- 我們接觸的大多是OLTP類型的資料庫、OLTP類型的業務場景。有時間也可以了解一些資料倉庫的知識,了解數倉分層模組化的方式,了解MaxCompute或Hive的sql是如何轉化為分布式的map reduce job進行運算、join,了解一些實時計算的原理。