我们有一个“有机”的环境,这意味着人们在密码上堆积了代码十年,而监督或文档最少。我使用的服务器有几个数据库,我认为不再使用这些数据库。我想删除它们,只留下我实际使用的三个。

在鲁ck的极端情况下,我可以禁用这些数据库并等待某人尖叫。另一方面,我可以让他们永远奔跑“以防万一”。您发现哪些步骤在识别是否正在使用服务器方面,以及如何使用?

另外,您建议采取什么步骤,以确保随着一个人在禁用系统中向前发展,它们在一段时间内保持方便可逆(例如,重命名对象而不是直接删除它们)?

谢谢!

有帮助吗?

解决方案

您还需要确保每个表的日期邮票。搜索系统中每个表中的任何元数据,最后更新的DateTime订购此类列表,然后按DateTime以DESC顺序显示输出。您也可以检查表尺寸是否有略有变化的大小。

例如,在MySQL 5.X中,您有Information_Schema.Tables,看起来像这样:

mysql> desc information_schema.tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG   | varchar(512)        | NO   |     |         |       |
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |
| TABLE_TYPE      | varchar(64)         | NO   |     |         |       |
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |
| VERSION         | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT      | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH     | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE       | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTO_INCREMENT  | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_TIME     | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| CHECK_TIME      | datetime            | YES  |     | NULL    |       |
| TABLE_COLLATION | varchar(32)         | YES  |     | NULL    |       |
| CHECKSUM        | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_OPTIONS  | varchar(255)        | YES  |     | NULL    |       |
| TABLE_COMMENT   | varchar(2048)       | NO   |     |         |       |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.01 sec)

列UPDATE_TIME上次记录任何插入,更新或删除的最后一次应用于表。您可以运行类似的查询,以找出上次访问每个数据库何时:

上一次在每个数据库中访问了一个表:

SELECT table_schema,MAX(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL
GROUP BY table_schema;

上次在任何数据库中访问表:

SELECT MAX(update_time) last_accessed FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql');

最后10个日期访问了一张桌子:

SELECT * FROM
(SELECT * FROM
(SELECT last_accessed,COUNT(1) access_count
FROM (SELECT DATE(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL) A
GROUP BY last_accessed) AA
ORDER BY last_accessed DESC) AAA
LIMIT 10;

这些只是如何从MySQL获取此类元数据的一些示例。我确定Oracle和SQL Server具有相似或更好的方法。

一旦确定访问数据库(或架构)的频率或很少一次,则应手动转储/导出老化数据库以及模式本身的副本,除了数据外。请原谅我的答案不是DB不可知论。 SQLServer和Oracle DBA也应该在此处表达答案,因为在MySQL中模糊了数据库实例中的架构的概念,但在SQLServer和Oracle中非常严格遵循。

其他提示

您可以尝试设置仅捕获连接以及与它们连接到哪个数据库的跟踪。我会让此运行稍微一会儿,然后确保没有任何连接。

一个问题是,如果您在主DB上打开了一些代码,但是在代码中调用了另一个DB。我不确定指向您的DB的代码有多糟糕。

我还会查询您的所有工作,并确保没有人指向该数据库

如果您具有SQL(2008 R2 Enterprise)的正确版本,也可以使用SQL Audit。

当有人登录该数据库时,您也可以使用登录触发器更新表。这将向您展示是否有任何连接到该DB。

另外,您建议采取什么步骤,以确保随着人们在禁用系统方面的前进,它们在一段时间内保持方便地可逆

在SQL Server中,您可以使用数据库”离线“这使数据库存在,但通过代码不可能连接到它。如果数据库“离线”仍然可用,并且在几分钟内可逆。

在我的最后一份工作中,我们有一些每年运行几个月的产品,因此关闭或脱机,使用该产品的人们不会注意到数据库一次数月。作为一个例子,其中一种涉及W-2表格的产品,因此98%的业务发生在1月和2月(对于大多数公司而言,直到1月的第一周才可用数据,联邦监管截止日期用于提交该数据信息是一月份的最后一个工作日)。通常从5月/6月到12月关闭Web服务器。

在那家公司,我们与数据库的“所有者”一起使用了电子表格,该产品负责该产品。尽管其他人可以对表的结构进行更新,但当必须提出任何疑问时,“所有者”是首选人。如果所有者离开公司(直到去年很少),将在离开之前被任命为新所有者。

在其他公司,我们将数据库离线延续了四分之一,如果它们没有破坏(例如月/季度报告),他们最后一次备份并删除。这使某人以后可以回来并恢复数据库(需要几分钟),这些情况有“哦,那是为琼斯项目,我们在完成Fred Project完成的过程中必须放置的故事。”

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top