AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 3139
Accepted
Jon of All Trades
Jon of All Trades
Asked: 2011-06-03 15:18:49 +0800 CST2011-06-03 15:18:49 +0800 CST 2011-06-03 15:18:49 +0800 CST

安全永久删除数据库的最佳做法是什么?

  • 772

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

在鲁莽的极端情况下,我可以禁用这些数据库并等待有人尖叫;另一方面,我可以让它们永远运行“以防万一”。您发现哪些步骤在确定是否正在使用服务器以及如何使用方面有价值?

此外,您建议采取哪些步骤来确保随着禁用系统的推进,它们在一段时间内仍可方便地可逆(例如,重命名对象而不是彻底删除它们)?

谢谢!

maintenance delete
  • 3 3 个回答
  • 2242 Views

3 个回答

  • Voted
  1. SqlSandwiches
    2011-06-03T20:20:55+08:002011-06-03T20:20:55+08:00

    您可以尝试设置仅捕获连接以及它们连接到的数据库的跟踪。我会让它运行一段时间,然后确保没有任何东西连接到它。

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

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

    如果您有正确的 SQL 版本(2008 R2 企业版),您也可以使用 SQL 审计。

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

    • 6
  2. Best Answer
    RolandoMySQLDBA
    2011-06-04T10:24:28+08:002011-06-04T10:24:28+08:00

    您还想确保每个表的日期时间戳。在系统中为每个表搜索任何元数据,按上次更新的日期时间对此类列表进行排序,并按日期时间以 desc 顺序显示输出。您还可以检查桌子的大小,即使是大小的微小变化。

    例如,在 MySQL 5.x 中,您有 info_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 列记录最后一次对表应用任何 INSERT、UPDATE 或 DELETE 的时间。您可以运行这样的查询来找出每个数据库最后一次访问的时间:

    上次在每个数据库中访问表的时间:

    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 有类似或更好的方法。

    一旦您确定数据库(或模式)被访问的频率或很少,您应该手动转储/导出老化的数据库以及模式本身的副本,而不是数据。请原谅我的回答与数据库无关。SQLServer 和 Oracle DBA 也应该在这里表​​达他们的答案,因为模式是数据库实例中的集合的概念在 MySQL 中是模糊的,但在 SQLServer 和 Oracle 中却非常严格地遵循。

    • 4
  3. Tangurena
    2011-06-04T10:39:51+08:002011-06-04T10:39:51+08:00

    此外,您建议采取哪些步骤来确保随着禁用系统的推进,它们在一段时间内保持方便可逆

    在 SQL Server 中,您可以使数据库“脱​​机”,这会使数据库保持存在,但无法通过代码连接到它。如果数据库处于“离线”状态,它仍然可用并且在几分钟内即可恢复。

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

    在那家公司,我们有一个带有数据库“所有者”的电子表格——一个负责产品的人。虽然其他人可以对表格的结构进行更新,但在必须提出任何问题时,“所有者”是首选人。如果所有者离开了公司(直到去年才很少见),那么在他们离开之前会有人被分配为新的所有者。

    在其他公司,我们将数据库离线一个季度,如果它们保持离线而没有任何问题(例如月/季度报告),它们会在最后一次备份并删除。这允许某人稍后返回并恢复数据库(这需要几分钟),以应对那些有诸如“哦,那是我们在完成 fred 项目时不得不搁置的 jones 项目”之类的故事的情况。

    • 4

相关问题

  • 在 MS SQL 中,我如何找出哪些表长时间没有被查询或更新?

  • 维护计划的备份数据库任务信息的位置 (SQL Server 2005)

  • 打破和恢复镜子

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve