如何成为一名优秀的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,了解一些实时计算的原理。
上一篇:Visual Studio 2013 新增web项目IIS Express的64位版


下一篇:php进制之间相互转换