从哪里开始了解未知数据库


12

因此,标题进行了总结。

我有一个包含28个表和86个存储过程的SQL Server数据库,必须对其进行反向工程。我很确定,某些表从未使用过,并且并非所有proc也都使用过。

最大的问题是丢失了为此数据库使用的所有Windows服务以及所有软件和数据库文档,并且找不到整个系统的设计人员。

我已经设法创建了一个ER图来帮助我理解这些关系,但是由于我没有数据库管理经验,所以我不知道应该从哪里开始。

同样,如果您不想在这里提出这样的问题,我也感到抱歉。


1
我不懂 您具有对数据库的完全访问权限,并且您知道您有86个存储过程可以反向工程。那么这些是加密的存储过程吗?您到底需要什么反向工程?
狗仔队2015年

啊对。您的问题是有道理的:数据库正在运行,但是完全是一团糟。索引差,数据类型错误,未规范化,都可归结为性能低下……但是它可以工作。
Human_AfterAll

确保您也做好了情绪准备。拥抱并接受您的挑战。否则,将在整个旅程中引起精神摩擦。
克里斯蒂安·韦斯特贝克

当然!谢谢你的提示!情绪准备是最重要(如果不是最重要)的步骤之一。
Human_AfterAll 2015年

Answers:


5

三个非常快速的步骤来帮助您入门:

1)

USE DatabaseName

SELECT    [TableName] = OBJECT_NAME(object_id),
last_user_update, last_user_seek, last_user_scan, last_user_lookup
FROM    sys.dm_db_index_usage_stats
WHERE    database_id = DB_ID('DatabaseName')

会告诉您上次使用每个索引的时间,包括聚集索引。因此,至少可以让您了解正在访问哪些表(哪些没有访问)。

2)在使用应用程序的情况下,打开扩展事件会话(如果您正在运行SQL 2012之前的版本,则打开服务器端Profiler跟踪)大约一个小时。您还可以要求用户以特定顺序在应用程序中执行各种操作,以便将其与跟踪/会话相关联。

一个有用的建议:如果您完全可以修改应用程序使用的连接字符串,请附加“; Application Name = AppNameGoesHere”,以便可以对该特定的应用程序名称运行跟踪筛选。无论如何都是好的做法。

3)获取在非生产服务器上运行的应用程序的版本。为应用程序开发一个由行为驱动的测试的列表(“当用户单击“新建项目”按钮时,它将为该用户创建一个新项目,等等。”)开始软删除您认为与测试无关的对象(我使用的格式类似于objectName_DEPRECATED_YYYYMMDD-日期是我计划实际删除的日期。)重新验证所有测试。

通过扩展事件会话,索引使用DMV和您的软删除的组合,您应该能够识别应用程序正在使用的主要对象,并且可以很好地就哪个对象执行的操作达成共识。

祝好运!


7

最好的选择是使用SQL Power Doc记录数据库

使用Windows PowerShell的SQL Server和Windows文档

SQL Power Doc是Windows PowerShell脚本和模块的集合,这些脚本和模块可发现,记录和诊断SQL Server实例及其基础Windows OS和计算机配置。SQL Power Doc适用于从SQL Server 2000到2014的所有版本的SQL Server,以及Windows 2000和Windows XP至Windows Server 2012 R2和Windows 8的所有版本的Windows Server和使用者Windows操作系统。SQLPower Doc还能够文档Windows Azure SQL数据库。

注意:我已经使用了它,它将为您提供一个非常好的开始,以记录和理解数据库服务器实例。


谢谢。这肯定会增加我为了理解该死的数据库而必须执行的一系列步骤
Human_AfterAll

嘿! 我对PowerShell确实很不好,无法New-Item -type directory -path "$([Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments))\WindowsPowerShell\Modules"SqlServerInventory ReadMe.txt文件上通过该步骤。我不知道应该在哪里插入新创建的文件夹的路径以及在哪里插入新创建的文件夹的名称。
Human_AfterAll 2015年

3

由于我曾经处于类似的情况,所以我可以告诉你,这将是一件很难甚至不可能的工作。我只有源代码(> 10万行代码),正在运行的服务,正在运行的数据库(〜50个表),并且没有文档,也没有人问这件事,只有该应用程序的用户以及在其中运行的数据库和服务的副本测试环境(前面有几个版本号,但没有源代码)。另一个要求是服务必须运行24/7,因为它们在客户外部。之所以出现这种情况,是因为大多数员工在大约同一时间离开,包括开发人员和文档在混乱中消失了。我花了超过6个月的时间才获得了大致的概述/文档。有许多表和函数没有作用,因为它们是供将来使用或从未完全实现的,错误,不推荐使用或未发布的功能。6个月后,我不得不重写文档,因为我发现了新事物或事物之间的关系,并且之前有错误的假设。

为什么我要告诉这个?因为有时在这种情况下,从头开始并编写新的应用程序更容易且更便宜,以满足新旧应用程序的需求(或新的应用程序,如果它们随着时间的推移而改变,或者您需要新的主要版本)。或告诉您您将要期待什么。

如果您真的想对它进行反向工程,我建议您执行以下步骤:

  • 备份整个系统!(第一:您永远不知道什么时候需要它。第二:您下一步需要它)
  • 重新创建要使用的系统(服务和数据库)的副本,并记下创建方式的副本,因为您肯定会在接下来的几个月中多次执行此操作,因为您将在进行反向工程时将其弄乱多次
  • 使用表之间的依赖关系创建ER图
  • 查看并记录每个表,存储过程等的依赖关系,因为这些关系大多数未包含在ER图中
  • 通过询问用户并自己使用软件来了解软件应该做什么(最好在测试系统上进行)
  • 如果服务的源代码可用:对其进行概述并调用数据库并对其进行文档化(doxygen是获得具有函数调用层次结构的简要文档的好工具)
  • 尝试通过查看表名及其列来大致了解数据库
  • 在使用数据库时观看数据库
  • 通过前面的4个步骤,将表分为3类(可能因您的应用程序而异):静态数据(在运行服务器时像serverconfiguration一样不变的数据,枚举通过使用外键来限制其他表中的有效值,...),配置数据(很少更改的数据,例如用户设置等)和OLTP数据(聊天服务器中的用户消息,论坛中的帖子,机器控制系统中的测量值,在线游戏中的战斗, ...)
  • 重复前5个步骤,直到您满意或放弃为止
  • 记录并编写代码,好像最终维护您的代码/系统/数据库的人将是一个暴力的精神病患者,知道您的住所。

祝你好运 ;)


1
-1,任何认为大型应用程序的“从头开始并重写所有内容都更轻松,更便宜”的人从来不必实际执行此操作。这是业余建议。
BlueRaja-Danny Pflughoeft 2015年

@ BlueRaja-DannyPflughoeft它取决于应用程序的类型,大小和状态以及向后兼容性的要求。我已经用大约100k LoC重新编写了一个应用程序。不需要模仿原始版本,但它是作为新的主要版本发布的,其中添加了一些新功能,删除了一些旧功能,现代化的用户界面以及使用旧数据的能力。原始代码是如此混乱和安全,以至于我们比清理旧代码的估计时间要快。
H. Idden 2015年

尤其是如果代码中包含许多未记录的变通办法,那么它经常会发生,一点点更改就会使某些完全不相关的崩溃。但是我同意你的观点,许多人从头开始低估了这样做的成本(人力,金钱等),因为他们不知道或低估了应用程序的全部需求,尤其是当这些应用程序多年来增长和变化时。
H. Idden

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.