Jakie są najlepsze praktyki bezpiecznego bezpiecznego usuwania bazy danych?

10

Mamy środowisko „organiczne”, co oznacza, że ​​ludzie nakładają kod na kod przez dziesięć lat przy minimalnym nadzorze lub dokumentacji. Serwer, którego używam, ma kilka baz danych, które moim zdaniem nie są już używane; Chciałbym je usunąć i zostawić tylko te trzy, których faktycznie używam.

Na skraju lekkomyślności mógłbym wyłączyć te bazy danych i czekać, aż ktoś krzyknie; z drugiej mógłbym zostawić ich działających na zawsze „na wszelki wypadek”. Jakie kroki uznałeś za przydatne w określeniu, czy serwer jest używany i jak?

Jakie kroki zaleciłbyś w celu zapewnienia, że ​​w miarę postępów w wyłączaniu systemów, będą one przez pewien czas wygodnie odwracalne (np. Zmienią nazwy obiektów, a nie usuwają je całkowicie)?

Dzięki!

Jon of All Trades
źródło
1
To bardzo mądre pytanie od wieków. +1 za takie pytanie. Mam nadzieję, że to pytanie wywołuje większą odpowiedź, ponieważ DBA powinny wcześniej stawić czoła tej sytuacji w swojej karierze.
RolandoMySQLDBA
Wow, świetne punkty dookoła! A RolandoMySQLDBA już zadbał o to, aby podziękować wszystkim za mnie :) Zostawię to trochę dłużej, aby zobaczyć, czy są więcej sugestii, a następnie będę miał trudne zadanie wybrania najbardziej pomocnej odpowiedzi.
Jon of All Trades

Odpowiedzi:

4

Chcesz również upewnić się, że znaczniki daty i godziny każdej tabeli. Wyszukaj dowolne metadane w systemie dla każdej tabeli, uporządkuj listę według daty ostatniej aktualizacji i wyświetl dane wyjściowe w kolejności malejącej według daty. Możesz również sprawdzić rozmiar stołu pod kątem nawet niewielkiej zmiany rozmiaru.

Na przykład w MySQL 5.x masz information_schema.tables, które wyglądają tak:

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)

Kolumna UPDATE_TIME zapisuje ostatni raz, kiedy INSERT, UPDATE lub DELETE zostały ostatnio zastosowane do tabeli. Możesz uruchomić takie zapytania, aby dowiedzieć się, kiedy ostatnio uzyskiwano dostęp do każdej bazy danych:

Ostatni dostęp do tabeli w każdej bazie danych:

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;

Ostatni dostęp do tabeli w dowolnej bazie danych:

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

Ostatnie 10 dat dostępu do tabeli:

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;

To tylko kilka przykładów, jak uzyskać takie metadane z MySQL. Jestem pewien, że Oracle i SQL Server mają podobne lub lepsze metody.

Po upewnieniu się, jak często lub rzadko uzyskuje się dostęp do bazy danych (lub schematu), należy ręcznie zrzucić / wyeksportować przestarzałe bazy danych wraz z kopiami samego schematu oprócz danych. Przepraszam, że moja odpowiedź nie jest DB agnostyczna. SQLServer i Oracle DBA również powinny wyrazić swoje odpowiedzi tutaj, ponieważ koncepcja schematu będącego kolekcją w instancji bazy danych jest niewyraźna w MySQL, ale bardzo ściśle przestrzegana w SQLServer i Oracle.

RolandoMySQLDBA
źródło
Bardzo dobra wskazówka. Przygotuję zestaw zapytań, aby mieć oko na aktualizacje. Dla korzyści przyszłych pokoleń, oto takie zapytanie na poziomie schematu, dla 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
Jon of All Trades
6

Możesz spróbować skonfigurować śledzenie, które przechwytuje tylko połączenia i do jakiej bazy danych się łączą. Chciałbym zostawić to uruchomione na chwilę, a następnie upewnić się, że nic się z nim nie łączy.

Jednym z problemów może być otwarcie kodu na głównej bazie danych, ale wywołanie innej bazy danych w kodzie. Nie jestem pewien, jak zły jest ten kod, który wskazuje na twoje bazy danych.

Zapytam również wszystkie twoje zadania i upewnię się, że żadne nie wskazuje tego DB

Możesz także użyć audytu SQL, jeśli masz odpowiednią wersję SQL (2008 R2 Enterprise).

Możesz także użyć wyzwalaczy logowania, aby zaktualizować tabelę, gdy ktoś zaloguje się do tej bazy danych. To pokaże, czy coś łączyło się z tą bazą danych.

SqlSandwiches
źródło
Bardzo dobra odpowiedź, szczególnie w przypadku wyzwalaczy logowania !!! MySQL nie ma czegoś takiego, chociaż mógłbym go emulować poprzez aktywację ogólnego dziennika i sprawdzenie podanych adresów IP i baz danych. Twój jest +1!
RolandoMySQLDBA
4

Jakie kroki zaleciłbyś, aby zapewnić, że w miarę postępów w wyłączaniu systemów, będą one dogodnie odwracalne przez pewien czas

W SQL Server można przełączyć bazy danych w tryboffline ”, co powoduje, że baza danych jest obecna, ale uniemożliwia połączenie z nią za pomocą kodu. Jeśli baza danych jest „offline”, nadal jest dostępna i można ją przywrócić w ciągu kilku minut.

Podczas mojej ostatniej pracy mieliśmy kilka produktów, które działały przez kilka miesięcy w roku, więc wyłączanie bazy danych na kilka miesięcy jednocześnie nie byłoby zauważane przez ludzi pracujących z tym produktem. Jako jeden z przykładów, jeden z produktów dotyczył formularzy W-2, więc 98% działalności ma miejsce w styczniu i lutym (w przypadku większości firm dane są niedostępne dopiero w pierwszym tygodniu stycznia, a federalny termin składania wniosków informacja to ostatni dzień roboczy w styczniu). Serwer WWW był zwykle wyłączany od maja / czerwca do grudnia.

W tej firmie mieliśmy arkusz kalkulacyjny z „właścicielem” bazy danych - jedną osobą odpowiedzialną za produkt. Podczas gdy inni mogli aktualizować strukturę tabel, „właściciel” był osobą, do której trzeba było zadawać pytania. Jeśli właściciel opuści firmę (rzadko do zeszłego roku), ktoś zostanie wyznaczony na nowego właściciela przed odejściem.

W innych firmach przełączyliśmy bazy danych na kwartał offline, jeśli pozostaną one offline i nic się nie psuje (np. Raporty miesięczne / kwartalne), kopie zapasowe są tworzone po raz ostatni i usuwane. To pozwala komuś później wrócić i przywrócić bazę danych (co zajmuje kilka minut) w sytuacjach, które zawierają takie historie, jak „och, to było dla projektu Jonesa, który musieliśmy odłożyć na bok, gdy zakończyliśmy projekt Fred”.

Tangurena
źródło
Ładne mini studium przypadku, +1 !!!
RolandoMySQLDBA,
@Tanguerna: Myślę, że korzystałem z tej funkcji wiele lat temu, ale jest ona idealna do tego rodzaju roli, bardzo dziękuję za przypomnienie.
Jon of All Trades