安全地永久删除数据库的最佳实践是什么?
-
16-10-2019 - |
题
我们有一个“有机”的环境,这意味着人们在密码上堆积了代码十年,而监督或文档最少。我使用的服务器有几个数据库,我认为不再使用这些数据库。我想删除它们,只留下我实际使用的三个。
在鲁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完成的过程中必须放置的故事。”