Bir veritabanını güvenli bir şekilde kalıcı olarak silmek için en iyi uygulamalar nelerdir?


10

"Organik" bir çevreye sahibiz, yani insanlar en az gözetim veya dokümantasyonla on yıl kodda kod biriktirdiler. Kullandığım sunucunun artık kullanılmadığına inandığım birkaç veritabanı var; Onları silmek ve gerçekten kullandığım üç tanesini bırakmak isterim.

Pervasız uçta, bu veritabanlarını devre dışı bırakabilir ve birinin çığlık atmasını bekleyebilirim; diğeri ise onları "her ihtimale karşı" sonsuza kadar çalışır halde bırakabilirdim. Bir sunucunun kullanılıp kullanılmadığını ve nasıl kullanılacağını belirlemek için hangi adımları değerli buldunuz?

Ayrıca, devre dışı bırakma sistemlerinde ilerledikçe, belirli bir süre için kolayca geri çevrilebilir olmalarını sağlamak için hangi adımları önerirsiniz (örneğin, nesneleri doğrudan silmek yerine yeniden adlandırın)?

Teşekkürler!


1
Bu çağlar için çok zekice bir soru. Böyle bir soru için +1. Umarım bu soru daha büyük bir yanıt ortaya çıkarır çünkü DBA'lar daha sonra kariyerlerinde bu durumla yüzleşmelidir.
RolandoMySQLDBA

Vay be, her yerde harika noktalar! Ve RolandoMySQLDBA zaten herkese teşekkür etmekle ilgileniyor :) Daha fazla öneri olup olmadığını görmek için bunu biraz daha açık bırakacağım, o zaman en yararlı cevabı seçmek zor bir görevim olacak.
Tüm Ticaret'ten Jon

Yanıtlar:


4

Ayrıca her tablonun datetime damgalarından emin olmak istersiniz. Her tablo için sistemde herhangi bir meta veri arayın, son güncellenen datetime göre böyle bir liste sipariş edin ve çıktıyı datetime göre azalan sırada görüntüleyin. Ayrıca, boyuttaki ufak bir değişiklik için bile masa boyutunu kontrol edebilirsiniz.

Örneğin, MySQL 5.x'te şu şekilde görünen information_schema.tables var:

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 sütunu, tabloya en son INSERT, UPDATE veya DELETE uygulaması son kez kaydediliyor. Her veritabanına en son ne zaman erişildiğini öğrenmek için aşağıdaki gibi sorgular çalıştırabilirsiniz:

Her veritabanında bir tabloya en son erişildiğinde:

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;

Herhangi bir veritabanında bir tabloya en son erişildiğinde:

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

Bir tabloya erişilen son 10 tarih:

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;

Bunlar, MySQL'den bu tür meta verilerin nasıl alınacağına dair birkaç örnektir. Eminim Oracle ve SQL Server benzer veya daha iyi yöntemlere sahiptir.

Bir veritabanına (veya şemaya) ne sıklıkta veya nadiren erişildiğinden emin olduktan sonra, şemanın kendisinin kopyalarından verilerle birlikte eski veritabanlarını manuel olarak dökmeniz / vermeniz gerekir. Lütfen cevabımın DB agnostik olmadığına izin verin. SQLServer ve Oracle DBA'lar burada da yanıtlarını dile getirmelidir, çünkü bir veritabanı örneği içinde koleksiyon olan bir şema kavramı MySQL'de bulanık, ancak SQLServer ve Oracle'da çok sıkı bir şekilde takip edilir.


Çok iyi bir ipucu. Güncellemeleri takip etmek için bir dizi sorgu hazırlayacağım. Gelecek nesillerin yararı için, MS SQL için şema düzeyinde böyle bir sorgu: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
All Trades of Jon of

6

Yalnızca bağlantıları ve hangi veritabanına bağlandıklarını yakalayan bir iz oluşturmayı deneyebilirsiniz. Bunu biraz çalışır halde bırakıp hiçbir şeyin ona bağlı olmadığından emin olurdum.

Bununla ilgili bir sorun, ana db'de bazı kodların açılması ancak kod içinde başka bir DB çağrılması olabilir. Kod DBs işaret ne kadar kötü olduğundan emin değilim.

Ayrıca tüm işlerinizi sorgulamak ve hiçbirinin bu DB'yi işaret etmediğinden emin olmak istiyorum

SQL'in (2008 R2 Enterprise) doğru sürümüne sahipseniz SQL denetimini de kullanabilirsiniz.

Birisi o DB'de oturum açtığında bir tabloyu güncellemek için oturum açma tetikleyicilerini de kullanabilirsiniz. Bu, DB'ye bir şey bağlanıp bağlanmadığını gösterir.


Çok iyi bir cevap, özellikle giriş tetikleyicileri ile ilgili !!! Genel günlüğü etkinleştirmek ve belirtilen IP adreslerini ve veritabanlarını kontrol etmekle taklit edebilmeme rağmen MySQL'in böyle bir şeyi yok. Sevgiler +1!
RolandoMySQLDBA

4

Ayrıca, devre dışı bırakma sistemlerinde ilerledikçe, belirli bir süre için kolayca geri çevrilebilir olmalarını sağlamak için hangi adımları önerirsiniz?

SQL Server'da veritabanını " çevrimdışı " olarak kaldırabilir , ancak veritabanını mevcut bırakır, ancak kodla bağlanmayı mümkün kılmaz. Bir veritabanı "çevrimdışı" ise, hala kullanılabilir durumdadır ve dakikalar içinde geri alınabilir.

Son işimde, yılda birkaç ay faaliyet gösteren bazı ürünlerimiz vardı, bu nedenle veritabanını bir seferde aylarca kapatmak ya da çevrimdışına almak, o ürünle çalışan insanlar tarafından fark edilmeyecekti. Bir örnek olarak, ürünlerden biri W-2 formları içeriyordu, bu nedenle işin% 98'i Ocak ve Şubat aylarında gerçekleşiyor (çoğu şirket için veriler Ocak ayının ilk haftasına kadar mevcut değil ve federal düzenleme son tarihi bilgiler Ocak ayının son iş günüdür). Web sunucusu genellikle Mayıs / Haziran ayından Aralık ayına kadar kapalıdır.

Bu şirkette, veritabanından "sahibini" içeren bir e-tablo vardı - üründen sorumlu tek bir kişi. Diğerleri tabloların yapısında güncellemeler yapabilirken, herhangi bir soru sorulması gerektiğinde "sahip" kişi olmuştur. Şirket sahibi şirketten ayrılırsa (geçen yıla kadar nadiren), birileri ayrılmadan önce yeni sahip olarak atanır.

Diğer şirketlerde, veritabanlarını bir çeyrek boyunca çevrimdışı duruma getirdik, eğer hiçbir şey kırılmadan çevrimdışı kalırlarsa (ay / üç aylık raporlama gibi), son bir kez yedeklenir ve silinir. Bu, birisinin daha sonra geri gelip "birkaç dakika süren" veritabanını geri yüklemesine izin verir. "Oh, bu, fred projesini bitirirken kenara koymak zorunda olduğumuz jones projesi içindi."


Güzel mini vaka çalışması, +1 !!!
RolandoMySQLDBA

@Tanguerna: Sanırım bu özelliği yıllar önce kullandım, ama bu tür bir rol için mükemmel, hatırlattığınız için çok teşekkürler.
Tüm Ticaret'ten Jon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.