Каковы рекомендации для безопасного безвозвратного удаления базы данных?


10

У нас «органическая» среда, то есть люди накапливали код в течение десяти лет с минимальным контролем или документацией. Сервер, который я использую, имеет несколько баз данных, которые, я считаю, больше не используются; Я хотел бы удалить их и оставить только три, которые я на самом деле использую.

В безрассудной крайности я мог отключить эти базы данных и ждать, пока кто-нибудь закричит; с другой стороны, я могу оставить их работать вечно "на всякий случай". Какие шаги вы нашли ценными при определении того, используется ли сервер и как?

Кроме того, какие шаги вы бы порекомендовали для обеспечения того, чтобы по мере продвижения вперед в отключении систем они оставались удобно обратимыми в течение определенного периода времени (например, переименовывали объекты, а не удаляли их сразу)?

Спасибо!


1
Это очень проницательный вопрос для веков. +1 за такой вопрос. Я надеюсь, что на этот вопрос будет получен более широкий ответ, поскольку администраторы БД должны скорее не столкнуться с этой ситуацией в своей карьере.
RolandoMySQLDBA

Вау, отличные моменты вокруг! И RolandoMySQLDBA уже позаботился о том, чтобы поблагодарить всех за меня :) Я оставлю это открытым немного дольше, чтобы увидеть, есть ли еще предложения, тогда у меня будет сложная задача - выбрать наиболее полезный ответ.
Джон на все руки

Ответы:


4

Вы также хотите удостовериться в отметках даты и времени каждой таблицы. Выполните поиск любых метаданных в системе для каждой таблицы, упорядочите такой список по дате и времени последнего обновления и отобразите выходные данные в порядке убывания по дате и времени. Вы также можете проверить размер таблицы даже для небольшого изменения размера.

Например, в 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 записывает, когда в последний раз любые 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 также должны здесь озвучить свои ответы, поскольку концепция схемы, являющейся коллекцией в экземпляре базы данных, в MySQL размыта, но в SQLServer и Oracle очень строго соблюдается.


Очень хороший совет. Я соберу набор запросов, чтобы следить за обновлениями. В интересах будущих поколений, вот такой запрос на уровне схемы для MS SQL:SELECT S.name, MAX(T.modify_date) AS MostRecentDataModification FROM sys.schemas AS S INNER JOIN sys.tables AS T ON S.schema_id = T.schema_id GROUP BY S.name
Джон на все руки

6

Вы можете попытаться настроить трассировку, которая фиксирует только соединения и к какой базе данных они подключаются. Я бы оставил это включенным на некоторое время, а затем убедился, что к нему ничего не подключено.

Одна проблема с этим будет, если у вас есть код, открывающийся на главной базе данных, но вызывающий другую БД внутри кода. Я не уверен, насколько плох код, который указывает на ваши базы данных.

Я также запросил бы все ваши работы и удостоверился, что никто не указывает на ту DB

Вы также можете использовать аудит SQL, если у вас есть правильная версия SQL (2008 R2 Enterprise).

Вы также можете использовать триггеры входа в систему для обновления таблицы, когда кто-то вошел в эту БД. Это покажет вам, если что-то подключается к этой БД.


Очень хороший ответ, особенно в отношении триггеров входа в систему !!! MySQL не имеет ничего подобного, хотя я мог бы эмулировать его с активацией общего журнала и проверкой указанных IP-адресов и баз данных. Ваш +1!
RolandoMySQLDBA

4

Кроме того, какие шаги вы бы порекомендовали, чтобы по мере продвижения вперед в отключении систем они оставались удобно обратимыми в течение некоторого периода времени?

В SQL Server вы можете переводить базы данных в автономный режим, что оставляет базу данных присутствующей, но делает невозможным подключение к ней через код. Если база данных находится в автономном режиме, она все еще остается доступной и обратимой в течение нескольких минут.

На моей последней работе у нас было несколько продуктов, которые работали в течение нескольких месяцев в году, поэтому люди, работающие с этим продуктом, не заметили бы отключение или отключение базы данных на несколько месяцев подряд. В качестве одного примера, один из продуктов включал формы W-2, поэтому 98% бизнеса происходит в январе и феврале (для большинства компаний данные недоступны до первой недели января и федерального нормативного срока подачи заявок). информация последний рабочий день января). Веб-сервер обычно отключался с мая / июня до декабря.

В этой компании у нас была электронная таблица с «владельцем» базы данных - одним человеком, ответственным за продукт. В то время как другие могли вносить изменения в структуру таблиц, «владелец» был ответственным лицом, когда нужно было задать какие-либо вопросы. Если владелец покинул компанию (редко до прошлого года), кто-то будет назначен новым владельцем до своего ухода.

В других компаниях мы отключаем базы данных на четверть, если они остаются в автономном режиме, не нарушая ничего (например, отчет за месяц / квартал), их резервируют в последний раз и удаляют. Это позволяет кому-то позже вернуться и восстановить базу данных (что занимает несколько минут) для тех ситуаций, в которых есть истории типа «о, это было для проекта Джонса, который нам пришлось отложить, пока мы заканчивали проект fred».


Хороший мини-кейс, +1 !!!
RolandoMySQLDBA

@Tanguerna: Я думаю, что использовал эту функцию много лет назад, но она идеально подходит для такой роли, так что большое спасибо за напоминание.
Джон на все руки
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.