天天看點

如何成為一名優秀的DBA培養良好的運維意識和習慣學會學習學會使用資料庫掌握資料庫備份和恢複掌握資料庫運作狀況熟悉資料庫的運作環境學習一些理論的知識

常見的資料庫很多,包括MySQL,Oracle,SQL Server,PostgreSQL,DB2,新型的資料庫如MongoDB,Redis,ElasticSearch,Hbase。國産的資料庫如Oceanbase、Polar DB, 分布式資料庫如DRDS等。

全面掌握所有資料庫的方方面面,當然有難度,一個人的時間是有限的。但是熟練掌握幾種平時工作中最常遇到的資料庫。或者在新的工作任務中,遇到以前沒有接觸過的資料庫,需要有快速學習的能力,能在幾個月或幾周的時間裡迅速上手,并在工作的過程中持續加深掌握的程度,最終成為某一資料庫的熟練工,成為專家。

何為熟練?就是遇到任何問題,都能迅速找到解決思路。

何為專家?就是大家遇到某個解決不了的問題時,第一個想要求助的人就是你,而且在這個問題上,你通常不會讓大家失望,能得到滿意的答案,那你就是解決這個問題的專家。

資料庫種類很多,運維的技術棧很寬,阿裡雲雲産品種類繁多,客戶會遇到的問題也紛繁複雜,很難有一個人在所有的方面都是專家,但是每個人都能在其中某幾個方面成為專家。

培養良好的運維意識和習慣

  1. 具備基本的職業道德。運維和DBA的權限很大,要很清楚哪些事情是不能做的。不檢視和工作無關的資料,不洩漏帳号,不洩漏資料,不執行未經授權的操作。也要清楚哪些事情是要去做的。要有責任心,認真完成每天的日常工作。夥伴遇到麻煩了,要有意願去幫忙。客戶遇到麻煩了,有些事情不在服務範圍,但在我們的能力範圍内的事情,也要通過合适的途徑去支援。心存敬畏之心,不作惡,與人為善。
  2. 運維風險意識。權限越大,風險越大。任何操作都要謹慎,了解任何一個操作的影響(如大表DDL的影響),進行不可逆操作時要尤其謹慎。
  3. 良好的工作習慣。生産環境的變更要做好變更計劃、審批,在測試環境驗證。操作前确認操作環境。注意觀察和記錄變更過程中的日志。變更過程中和變更完成後要确認上下遊是否都正常。平時工作中多做記錄,多總結分享。細心,遇到疑惑的問題多思考、讨論。
  4. 團隊合作。團隊合作分兩方面看,首先要承擔自己在團隊中的那部分職責,做好自己的本職工作,這是最基本的。同時也要關注團隊中發生的事情,如果别的小夥伴遇到麻煩,要能主動提供幫助。另一方面,要利用團隊的力量來完成一些任務。比如我因各種原因休假,就要提前安排好相關工作,讓團隊中其它人能臨時處理相關任務。比如通宵變更釋出,那第二天,要讓團隊中其它人能頂上來做白天的值班和相關任務處理。怎麼讓其他人能接替我在做的任務,或者我如何順利接手其他夥伴手頭的任務?要在平時的工作中培養,要互相關注,了解其它同學在做的事情。避免成為單點。
  5. 應對故障。要迅速評估故障的業務影響面,定位故障原因。重大問題及時(5分鐘)更新。
  6. 提高效率,學會使用自動化工具完成重複的工作。

學會學習

  1. 要有好的學習管道。各類資料庫的官方文檔是最重要的學習資料。MySQL,Oracle,SQL Server,MongoDB,Redis,ElasticSearch等産品都有很詳細的官方文檔。學會看官方文檔。官方文檔通常很長,要熟悉文檔的結構,遇到問題,能快速在文檔中定位到相關的章節。平時也要花一些時間系統地閱讀文檔,關于資料庫架構、運維、優化,很多問題都能從文檔裡都能找到靠譜的答案。除了官方文檔,也要閱讀每個領域内寫得最好的書。
  2. 要實踐,做實驗,設計一些場景,驗證文檔中的内容。
  3. 在工作中學習,從實踐中學習,理論的知識要能和實際工作中遇到的問題結合起來。用理論指導實踐,在實踐中加深對理論的了解。工作中遇到的每一個難題,每一個自己不曾遇到過的問題,每一次故障,都是很好的學習的機會。每一個問題都有一個簡單,但是沒用的答案。要花時間找到那個真正的答案。
  4. 從别人的工作中學習,向同行學習,向合作的夥伴學習。要找到每個領域内做得好的那些人,看看他們是怎麼思考問題解決問題的,看看他們寫的書和文章。
  5. 總結、沉澱、提高。要善于總結,處理了一個故障,就把故障處理的過程記錄下來。問題是怎麼發現的,有哪些征兆,怎麼精确定位問題的,最終又是通過什麼方法解決問題的。用于分析問題的理論,是不是能解釋所有現象,是不是有存在沖突的地方。暫時無法搞清楚所有的問題也不要緊,把現場的各種資料保留下來,進行歸類整理。以後也可能會遇到相同或類似的問題,當時想不清楚的問題,或許過一段時間就能想清楚了。不要輕易放個一個問題,一個疑點。
  6. 持續學習。每天學習。充分利用好自己的時間。如果每天比别人多花1-2個小時學習,一年就能多幾百個小時。長期持續下來,一定能有所收獲。

學會使用資料庫

  1. 熟練掌握常用的通路資料庫的工具,包括指令行工具和圖形化工具。如MySQL用戶端,Oracle的sqlplus,SQL Server的企業管理器、SQLCMD,ElasticSearch的kibana。
  2. 掌握和資料庫互動的語言。如SQL(DML,DDL),redis的各類command,mongodb、ElasticSearch的DSL。學會使用存儲過程和觸發器完成特定的需求。
  3. 掌握資料庫的各類對象(如各種類型的表、索引、分區,redis的list、dict、kv,mongodb的collection、document、index,elasticsearch的index、分片)。
  4. 熟悉資料庫支援的各自資料類型和存儲方式(精确數字類型int,decimal,非精确的數值類型如float、double,文本類型char,varchar, json,日期和時間),熟悉各類資料類型的使用場景,熟悉操作各類資料類型的常見函數。掌握字元編碼和字元集的概念,掌握各種亂碼問題的分析、解決。
  5. 能使用腳本自動化處理工作中的需求,如批量資料導入導出、大批量資料訂正。
  6. 學習使用常用的程式設計語言通路資料庫,學習常用的程式設計接口。如使用jdbc通路資料庫,使用python、perl等接口通路資料庫。

    安裝部署資料庫

  7. 熟悉資料庫的各種安裝部署方式。如rpm安裝、二進制安裝、源碼編譯安裝,Oracle靜默安裝,SQL Server腳本安裝。
  8. 熟悉資料庫的參數配置方式,核心配置參數的作用和設定标準。(如oracle的pfile, spfile。mysql的session參數和全局參數、參數生效範圍)
  9. 熟悉組成資料庫的各類檔案和目錄結構。(如軟體二進制檔案和lib,oracle的配置檔案、控制檔案、資料檔案、日志檔案、歸檔檔案、告警日志、監聽日志。MySQL的配置檔案、資料檔案、binlog、relaylog、慢日志、錯誤日志等)
  10. 熟悉組成資料庫執行個體的相關程序和線程,監聽端口。(如oracle的監聽、各個程序pmon,smon,dbwr,lgwr等,mysql的各類線程如master thread、server thread等)
  11. 掌握資料庫高可用環境的搭建。如Oracle的DG,SQL Server的mirror、always on,MySQL的slave, group replication。使用proxy進行讀寫分離和高可用環境的搭建。使用keepalived、mha等進行自動切換。
  12. 了解資料庫叢集的運作方式,資料如何分片,查詢如何路由、聚合,分布式事物。

掌握資料庫備份和恢複

  1. 熟練掌握資料庫備份的原理、工具、操作。了解資料庫保障資料不丢的機制。掌握不同備份類型的适用場景和作用,如MySQL的實體備份、邏輯備份、binlog備份,全量備份、增量備份、日志備份、快照備份等方式。給自己運維的資料庫制定合理的備份政策,備份檔案的存儲和儲存政策。
  2. 熟練掌握各類資料庫各種備份方式的恢複原理、工具、操作。熟練掌握各種異常場景下的資料恢複過程。如誤操作delete如何恢複,truncate table如何恢複,sql server資料檔案損害如何恢複,oracle控制檔案丢失如何恢複,線上redo日志丢失如何恢複。如何将資料庫恢複到一個指定的時間點。如何快速恢複資料。
  3. 定期演練。定期驗證備份的有效性。定期模拟各種資料丢失場景進行恢複演練。

掌握資料庫運作狀況

  1. 學會觀察資料庫的内部運作情況,觀察資料庫的工作負載和資源消耗情況。如通過mysql的global status, innodb status, Oracle的sysstat, Sql Server的performance counter觀察資料庫的QPS,TPS,網絡吞吐量,IO請求情況等,CPU使用情況。
  2. 觀察資料庫session運作情況。如mysql的process list,oracle的v$session, sql server的task運作情況,了解任務的運作時間、運作狀态,任務是誰發起的,執行了什麼操作。
  3. 觀察執行個體SQL的整體運作情況。如mysql的慢sql,oracle的awr,或通過各類審計工具,或通過一些解析網絡封包的工具統計sql執行情況,哪些sql執行次數多,哪些sql運作時間多,哪些sql消耗資源多。
  4. 觀察空間使用情況。觀察各類檔案占用的空間情況,如資料檔案、日志檔案、臨時檔案的空間使用情況。觀察表空間和表的空間占用情況。
  5. 觀察執行個體内部鎖定情況,其它各類等待事件。oracle可以通過等待事件相關視圖,active_session_history,sql trace等方式檢視細粒度的情況,其它資料庫或多或少有一些途徑能檢視内部等待情況。
  6. 觀察執行個體記憶體使用情況。
  7. 觀察資料庫告警日志。如oracle 的alert log, 監聽日志,mysql的錯誤日志。通過各類告警日志有時能發現其他途徑觀察不到或容易遺漏的問題。
  8. 觀察單個sql的執行情況,熟練掌握各類SQL優化的技能。熟悉優化器和sql的執行計劃,通過各種方法優化sql執行效率。
  9. 對于叢集資料庫,觀察叢集的運作情況,觀察各個節點的運作狀況,叢集間的通信情況,不同節點的負載配置設定情況。
  10. 日常經常用到的工具、指令、小腳本、SQL語句等,記錄下來,整理好,遇到問題時能快速拿來複用。

熟悉資料庫的運作環境

  1. 我們接觸到的大部分資料庫運作在linux環境下。要熟悉linux的使用。從os層面檢視各類資源(cpu,記憶體,網絡流量,IO等,檔案系統,tcp連接配接等)的消耗情況。熟悉常用工具的使用。檢視OS的各類日志,如/var/log/message。OS的參數配置,如網絡棧參數配置,系統資源限制(ulimit)。
  2. 如果是windows,同樣有完善的工具集,能檢視各種資料。
  3. 了解硬體的能力,cpu、io裝置、網絡裝置等能力。
  4. 熟悉tcp網絡協定。我們接觸到的資料庫,基本上絕大多數都是使用tcp協定通信。熟悉網絡協定,學會使用網絡封包分析,在解決某些類型的問題上很有用。

學習一些理論的知識

  1. 我們接觸的很多資料庫,都屬于關系型資料庫。學習一些關系型資料庫的理論。大學的資料庫課程,就是很好的一個基礎。學習關系型理論中的幾個範式,每種範式都是為了解決什麼問題,有什麼缺點。
  2. 關系型資料庫理論中, transaction是很基礎的一個概念。有時間可以讀讀《Transaction Processing》這本書。據說InnoDB的設計,很多就是從這本書裡參考的。關于事物,隔離級别,鎖,資料一緻性,Btree索引,資料庫檔案結構,這本書裡有詳細的描述。
  3. 對于分布式資料庫,有時間可以學習一些分布式的理論,Cap理論,保障多節點資料一緻性的paxos算法等。
  4. 學習一些新型資料庫的存儲結構,如LSM tree,Hbase,OceanBase,LevelDB等資料庫就使用LSM tree的存儲模型。也可以了解下Elasticsearch底層索引的存儲格式。
  5. 這些理論知識不一定你的工作有直接的幫助,但是能幫你更好的認識各種資料庫。
  6. 學習一些作業系統、網絡的基礎知識。計算機系大學課程應該都有。
  7. 學習一些程式設計和資料結構和算法的知識。計算機系大學課程應該都有。學習幾門程式設計語言。python就很好,其它一些使用廣泛的語言有時間也可以學學,golang,javascript,c/c++,當然還有java 。
  8. 我們接觸的大多是OLTP類型的資料庫、OLTP類型的業務場景。有時間也可以了解一些資料倉庫的知識,了解數倉分層模組化的方式,了解MaxCompute或Hive的sql是如何轉化為分布式的map reduce job進行運算、join,了解一些實時計算的原理。