Quelles sont les meilleures pratiques pour supprimer définitivement en toute sécurité une base de données?

dba.stackexchange https://dba.stackexchange.com/questions/3139

  •  16-10-2019
  •  | 
  •  

Question

Nous avons un environnement « organique », ce qui signifie des personnes entassées le code sur le code pendant dix ans avec la surveillance ou la documentation minimale. L'utilisation serveur I dispose de plusieurs bases de données que je crois ne sont plus utilisés; J'aimerais les supprimer et laisser juste les trois que je l'utilise en fait.

A l'extrême imprudence, je pouvais désactiver ces bases de données et attendre que quelqu'un crier; à l'autre, je pouvais les laisser courir pour toujours « juste au cas où ». Quelles mesures avez-vous trouvé utile pour déterminer si l'on utilise un serveur, et comment?

En outre, quelles mesures recommanderiez-vous pour faire en sorte que, comme on se déplace vers l'avant dans les systèmes invalidantes, qu'ils restent facilement réversibles pendant une période de temps (par exemple, renommer des objets plutôt que de les supprimer purement et simplement)?

Merci!

Était-ce utile?

La solution

Vous voulez également vous assurer des timbres datetime de chaque table. Rechercher des métadonnées dans le système pour chaque table, commander liste telle par datetime dernière mise à jour, et afficher la sortie dans l'ordre par desc datetime. Vous pouvez également vérifier la taille de la table même pour le léger changement de taille.

Par exemple, dans MySQL 5.x, vous avez INFORMATION_SCHEMA.TABLES qui ressemble à ceci:

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)

La UPDATE_TIME colonne enregistre la dernière fois tout INSERT, UPDATE ou DELETE dernière a été appliquée à la table. Vous pouvez exécuter des requêtes comme celles-ci pour savoir quand chaque base de données du dernier accès:

La dernière fois une table a été consulté dans chaque base de données:

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;

La dernière fois une table a été accessible dans une base de données:

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

Les 10 derniers dates d'une table a été consultée:

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;

Ce ne sont que quelques exemples de la façon d'obtenir ces métadonnées de MySQL. Je suis sûr que Oracle et SQL Server ont des méthodes similaires ou mieux.

Une fois que vous êtes sûr de la fréquence ou rarement une base de données (ou schéma) est accessible, vous devez vider manuellement / exporter des bases de données ans ainsi que des copies du schéma lui-même en dehors des données. S'il vous plaît excuse que ma réponse est non DB agnostique. SQLServer et Oracle devrait exprimer leurs DBAs réponses ici aussi, puisque le concept d'un schéma étant une collection dans une instance de base de données est floue dans MySQL, mais très strictement suivi dans SQLServer et Oracle.

Autres conseils

Vous pouvez essayer de mettre en place une trace que les connexions de capture uniquement et dans quelle base de données se connectent. Je laisserais cette course un peu, puis vous assurer que rien se connecte à elle.

Un problème avec ce serait si vous avez un code d'ouverture sur le db maître mais appeler un autre DB dans le code. Je ne sais pas à quel point le code qui pointe vers vos blocs de données.

Je voudrais aussi Interroger tous vos travaux et assurez-vous qu'aucune pointent que DB

Vous pouvez également utiliser SQL audit si vous avez la bonne version de SQL (2008 R2 Enterprise).

Vous pouvez également utiliser la connexion déclencheurs pour mettre à jour une table quand quelqu'un connecté à ce DB. Cela vous montrer si quelque chose se connectait à ce DB.

  

En outre, quelles mesures recommanderiez-vous pour faire en sorte que, comme on se déplace vers l'avant dans les systèmes invalidantes, qu'ils restent facilement réversibles pendant une période de temps

Dans SQL Server, vous pouvez prendre des bases de données « hors ligne », qui sort de la présente base de données , mais fait s'y connectant via le code pas possible. Si une base de données est « hors ligne », il reste toujours disponible et est réversible en quelques minutes.

A mon dernier emploi, nous avons eu des produits qui étaient en service depuis plusieurs mois par an, afin d'éteindre ou mettre hors ligne, la base de données pendant des mois à un moment n'aurait pas été remarqué par les gens qui travaillent avec ce produit. À titre d'exemple, l'un des produits concernés formes W-2, donc 98% de l'activité se produit en Janvier et Février (pour la plupart des entreprises, les données ne sont pas disponibles jusqu'à la première semaine en Janvier, et la date limite réglementaire fédéral pour le dépôt de la l'information est le dernier jour ouvrable en Janvier). Le serveur Web est généralement coupée de mai / Juin à Décembre.

A cette entreprise, nous avons eu une feuille de calcul avec le « propriétaire » de la base de données - une seule personne responsable du produit. Alors que d'autres pourraient faire des mises à jour à la structure des tables, le « propriétaire » était le feu à la personne quand des questions devaient être posées. Si le propriétaire a quitté l'entreprise (rare jusqu'à l'année dernière), quelqu'un serait affecté à être le nouveau propriétaire avant leur départ.

Dans d'autres sociétés, nous avons pris des bases de données hors ligne pour un quart, si elles restent en ligne avec rupture de rien (comme le mois / rapports trimestriels), ils sont sauvegardés une dernière fois et supprimés. Cela permet à quelqu'un de revenir plus tard et restaurer la base de données (ce qui prend quelques minutes) pour les situations qui ont des histoires comme « oh, qui a été pour le projet jones que nous avons dû mettre de côté pendant que nous avons le projet fred terminé. »

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top