从开发人员到开发DBA需要哪些技术加持

标签:数据库

访客:4825  发表于:2016-11-24 10:10:27

DBA在企业中有着举重若轻的地位,很多问题的解决都是起承转DBA,但是在很多小型公司中由于受规模和成本的限制没有专门的DBA,在这种情况下就需要开发人员去充当DBA的角色,监测和维护数据库的性能,解决一些常规性的问题。那么开发人员应该学习哪些方面的知识才能快速顶替DBA呢?

很多项目都是一开始很小,但是随着时间的推移,复杂性就会慢慢增加,所以在数据库或系统的原始设计中一开始是一个很好的决定可能之后就会变成一个次优的决定。小型企业,尤其是初创企业为了快速实现产品价值,往往追求速度而忽略了质量,导致很多问题的出现。

开发人员DBA的三个核心问题应该是系统稳定性、数据完整性或数据质量、速度,基于这三点考虑,我们将介绍一些对这三方面有利的东西。

成为开发人员DBA应该掌握的数据库知识

开发人员DBA首先要做的一件事情就是了解数据库的架构和用途,如果能够有一个懂行的人带领你那是再好不过了,如果没有的话,那也没关系,现在市面上有很多商业或免费的工具可供你使用。

开发人员DBA需要了解的基础信息:

(1)确认数据库的备份和恢复

顾名思义,没有数据库就没有DBA,所以开发人员DBA第一步要做的第一步就是确保数据库的备份和恢复,平时要适时的对数据库进行备份和还原,必要时可以做一些测试工作。

(2)确定数据来源、哪些表拥有较多的数据、运行速度

通过运行一系列脚本来获得数据库的状态信息,并制定下一步计划。找出哪些表具有最多的数据,哪些表最常更改数据,哪些表具有潜在的索引问题,哪些索引占用比实际数据更多的空间等。

(3)找出表之间的关系

找出表之间的依赖关系,更加深入的了解数据库的设计。

(4)了解数据如何进出(数据采集/报告)。

找出数据是进入数据库的方式以及何时会失效,并寻找在数据的进入路线上寻找潜在的故障点。

(5)研究数据的转换方式和目的。

有些系统会把数据转换成表格、模型或其它数据类型,所以找出数据转换的位置、方式和目的就变得尤为关键,尤其是在数据出错的时候,例如一个表中数据的插入可能会触发触发器,导致另一个看起来不相关表的删除或更新。

(6)做记录。

如果你使用的是一个没有文件记录的系统,那么你要做的工作就是记录数据库的变化。

(7)使用内置报告。

MS SQL是指微软的SQLServer数据库服务器,它是一个数据库平台,提供了一些即用型系统报告,可以帮助你实时的监控数据库的变化,选择数据库后,右键单击并运行你所需的报告即可。


开发人员应该掌握的DBA技术

如何让你的数据库更健壮

使用数据时,健壮的代码是至关重要的,需要注意的事项是事务,错误捕获和日志。 在对数据库结构和架构设计时,一定会面临存储过程的选择,存储过程是指在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。当使用C#写服务代码或使用JavaScript写前端代码时,允许有错误的处理,出现问题时也会被记录在日志中。但是存储过程就不一样了,它很少与用户交互,所以在使用过程中一定要注意以下三个方面:

(1)如果允许,请把脚本写到事务块中

事务是指要么不做要么全做,也就是说,它必须一切正常工作,否则就会返回到之前的状态。


开发人员应该掌握的DBA技术

(2)使用try...catch...来捕获错误信息

如果脚本发生数据转换错误,数据不匹配或可用性等问题时,我们需要知道错误的原因,这时我们可以利用try...catch...来捕获错误信息。下面的示例是通过插入已经存在的主键来模拟错误。


开发人员应该掌握的DBA技术

示例输出如下:


开发人员应该掌握的DBA技术

(3)记录错误信息

当错误信息被捕获后,我们需要记录它们。 你可以使用内置的MS SQL错误日志记录系统来记录,如果你不具有权限的话,可以自己创建一张错误日志表来记录。

如果你理解并好好运用了以上3条建议,那么就会得到一个比较好的结果。

下图是来自msdn的一个示例:


开发人员应该掌握的DBA技术

速度问题

速度问题是每个DBA都会遇到的问题,其实数据库速度慢无非就是那么几个原因:数据量大、处理脚本效率低下、无索引或索引创建不合理以及硬件或系统配置等。解决性能问题你第一个要考虑的就是索引,但是索引也不是万能的,索引太多也会造成性能问题, Pinal Dave的网站上有一组可爱的脚本,可以帮助你找到冗余的索引,并提醒你可能丢失的索引。除此之外,字段类型的选择失误也会拖慢速度,尽量在数据库中使用Varchar来代替nVarchar。

使用索引

(1)了解如何正确使用索引

我相信大多数的人都知道索引是什么,但是真正能用好索引的人没有几个,在这里向大家推荐Marcus Winand的《SQL Performance Explained》。

举个例子,查找2012年的所有行,性能优化之前:


开发人员应该掌握的DBA技术

性能优化后,将连续周期的查询写为显式范围条件:


开发人员应该掌握的DBA技术

(2)使用SQL Management Studio索引提示

MS SQL Management Studio中的索引提示功能是一个非常有用的工具,可帮助识别可能加快速度的缺失索引。 我把一个100k记录的示例数据库与没有索引的parent/child 伪数据组合在一起, 当我们在两个表之间运行一个简单的连接查询时,如果我们选择“显示执行计划”,那么Studio将会提示它认为缺少索引:


开发人员应该掌握的DBA技术

深入剖析其它性能问题

1.非数据库引起的问题

相比于深度分析数据库,其实在一般情况下很多的性能问题都是因为我们不规范的写法造成的。

举个例子,假设客户与销售之间有一对多的关系,如果我们想获得某月的客户销售列表,可以这样做:


开发人员应该掌握的DBA技术

但是在C#和Java中有了变化:


开发人员应该掌握的DBA技术

图中的查询要分成两步才能完成,第一步获取到所有客户列表,第二步获取每个客户的销售列表, 在这种情况下效率当然低下,补救措施是在C#中使用正确的连接,生成单个有效的查询并发送到服务器。

从这个例子中,我们应该活动的启示是不能把速度慢的问题全部归罪于数据库本省,其它地方也可能会导致速度慢,我们需要做的就是尽可能的消除这些可能。

2.查询复杂来源的数据消耗太多时间

(1)前期预加载,规范写法

到目前为止,添加索引和优化查询语句都能够很好的进行性能优化。但是还有一种情况,有时数据量可能非常大,而且这些数据还是从其他数据量很大的地方拉取过来的,因此要花费很多时间。在这种情况下,最好的办法就是预加载数据或规范数据。如果你的查询来源是pivot表,并且是由一系列很复杂的连接、视图和存储过程提供的,那么好的解决方案就是创建一个新的存储过程,然后把这些数据存储在更规范的数据表中。通过对数据以及格式的规范和预加载,可以节省很多时间。例如,你需要访问JSON格式的数据,那你完全可以在不需访问时将这些数据预加载成JSON格式。

(2)多线程执行存储过程

有些存储过程的运行可能会需要较长的时间,但是当你访问运行这些存储过程的时候很可能会遇到超时错误,对用户来说,系统已经崩溃了,而对数据库而言,仍然在工作。在这样的情况下,最好的做法就是执行存储过程去查看它是否完成,而不是等待。这种情况通常发生在一个脚本本来运行的很快,但是数据量的增加,时间消耗越来越久最后超时,你可以使用SqlCommand.BeginExecuteNonQuery()方法来启动存储过程的异步执行,该操作在执行过程中,主程序仍然可以执行其它操作。


开发人员应该掌握的DBA技术

导入数据

MS SQL Server提供了一些优秀的内置工具,可以通过文本文件、数据库文件、csv和XML导入数据。

工具

(1) DBCC

“数据库控制台命令”(DBCC)是一个非常有必要了解并且有用的工具, 您可以使用它来检查数据库或表级别的数据完整性,重建索引表,并执行一系列维护工作。 以下是Management Studio中的查询窗口的一些亮点:

DBCC CHECKDB:检查数据库的逻辑和物理完整性

DBCC CheckTable('tablename”):检查表或视图的结构完整性

DBCC ShrinkDatabase('databasename”):尽最大的可能压缩数据库的物理大小

(2)WHO

有两个内置的系统存储过程非常实用,它们分别是SP_WHO和SP_WHO2。 这些脚本提供了当前SQL连接的相关信息,连接到服务器的不同应用程序、连接类型、进程锁定等等。

exec sp_who2的用法:

其输出提供了非常有用的信息,例如谁连接了数据库,他们消耗什么样的资源,当前操作/状态,并且如果有'BlkBy'列时,它可以记录一个进程是否被另一个进程阻止。

(3)SQL Server Profiler

SQL Server Profiler与SQL Management Studio捆绑在一起,允许您对数据库进行实时跟踪,既可以跟踪执行过的语句,也可以查看C#代码中EF/Linq的语法生成后的sql语句。


开发人员应该掌握的DBA技术

(4)RedGate SQL搜索

这是一款很好用的免费工具,它的功能很简单,输入关键词,它就会在数据库中跨表,触发器,存储过程,索引等等中进行查找。


开发人员应该掌握的DBA技术

(5)Brent Ozar

Brent Ozar包含一组免费实用的脚本和电子书等,其中脚本包括服务器/数据库健康检查,索引分析的实用程序以及查询出哪些地方导致性能低下。除此之外,还有一个很实用的健康检查清单。

(6) Server monitor

Server monitor会使用不同的工具来监视服务器,一旦出现问题,它会抢在客户之前将错误信息以电子邮件或短信的形式发送给你。

后记

开发人员华丽转身为开发人员DBA其实并不难,一旦你正确掌握了基础知识、合理利用工具,你就会发现这种兼职DBA是非常有趣也是非常有意义的。

评论(0)

您可以在评论框内@您的好友一起参与讨论!

<--script type="text/javascript">BAIDU_CLB_fillSlot("927898");