我们有一个“有机”的环境,这意味着人们在代码上堆积了十年的代码,而几乎没有监督或文档。我使用的服务器有几个我认为不再使用的数据库;我很想删除它们,只留下我实际使用的三个。
在鲁莽的极端情况下,我可以禁用这些数据库并等待有人尖叫;另一方面,我可以让它们永远运行“以防万一”。您发现哪些步骤在确定是否正在使用服务器以及如何使用方面有价值?
此外,您建议采取哪些步骤来确保随着禁用系统的推进,它们在一段时间内仍可方便地可逆(例如,重命名对象而不是彻底删除它们)?
谢谢!
我们有一个“有机”的环境,这意味着人们在代码上堆积了十年的代码,而几乎没有监督或文档。我使用的服务器有几个我认为不再使用的数据库;我很想删除它们,只留下我实际使用的三个。
在鲁莽的极端情况下,我可以禁用这些数据库并等待有人尖叫;另一方面,我可以让它们永远运行“以防万一”。您发现哪些步骤在确定是否正在使用服务器以及如何使用方面有价值?
此外,您建议采取哪些步骤来确保随着禁用系统的推进,它们在一段时间内仍可方便地可逆(例如,重命名对象而不是彻底删除它们)?
谢谢!
您可以尝试设置仅捕获连接以及它们连接到的数据库的跟踪。我会让它运行一段时间,然后确保没有任何东西连接到它。
一个问题是,如果您在主数据库上打开了一些代码,但在代码中调用了另一个数据库。我不确定指向您的数据库的代码有多糟糕。
我还会查询你所有的工作,并确保没有人指向那个数据库
如果您有正确的 SQL 版本(2008 R2 企业版),您也可以使用 SQL 审计。
当有人登录到该数据库时,您还可以使用登录触发器来更新表。这将向您显示是否有任何东西连接到该数据库。
您还想确保每个表的日期时间戳。在系统中为每个表搜索任何元数据,按上次更新的日期时间对此类列表进行排序,并按日期时间以 desc 顺序显示输出。您还可以检查桌子的大小,即使是大小的微小变化。
例如,在 MySQL 5.x 中,您有 info_schema.tables,如下所示:
UPDATE_TIME 列记录最后一次对表应用任何 INSERT、UPDATE 或 DELETE 的时间。您可以运行这样的查询来找出每个数据库最后一次访问的时间:
上次在每个数据库中访问表的时间:
上次在任何数据库中访问表的时间:
访问表的最近 10 个日期:
这些只是如何从 MySQL 获取此类元数据的几个示例。我确信 Oracle 和 SQL Server 有类似或更好的方法。
一旦您确定数据库(或模式)被访问的频率或很少,您应该手动转储/导出老化的数据库以及模式本身的副本,而不是数据。请原谅我的回答与数据库无关。SQLServer 和 Oracle DBA 也应该在这里表达他们的答案,因为模式是数据库实例中的集合的概念在 MySQL 中是模糊的,但在 SQLServer 和 Oracle 中却非常严格地遵循。
在 SQL Server 中,您可以使数据库“脱机”,这会使数据库保持存在,但无法通过代码连接到它。如果数据库处于“离线”状态,它仍然可用并且在几分钟内即可恢复。
在我的上一份工作中,我们有一些产品每年运行数月,因此使用该产品的人不会注意到一次关闭或离线数月的数据库。举个例子,其中一个产品涉及 W-2 表格,因此 98% 的业务发生在 1 月和 2 月(对于大多数公司来说,数据要到 1 月的第一周才能获得,而联邦监管机构提交表格的截止日期是信息是一月份的最后一个工作日)。Web 服务器通常从 5 月/6 月到 12 月关闭。
在那家公司,我们有一个带有数据库“所有者”的电子表格——一个负责产品的人。虽然其他人可以对表格的结构进行更新,但在必须提出任何问题时,“所有者”是首选人。如果所有者离开了公司(直到去年才很少见),那么在他们离开之前会有人被分配为新的所有者。
在其他公司,我们将数据库离线一个季度,如果它们保持离线而没有任何问题(例如月/季度报告),它们会在最后一次备份并删除。这允许某人稍后返回并恢复数据库(这需要几分钟),以应对那些有诸如“哦,那是我们在完成 fred 项目时不得不搁置的 jones 项目”之类的故事的情况。