Apa praktik terbaik untuk menghapus basis data secara aman dan aman?

10

Kami memiliki lingkungan "organik", artinya orang menumpuk kode pada kode selama sepuluh tahun dengan pengawasan atau dokumentasi minimal. Server yang saya gunakan memiliki beberapa basis data yang saya yakin tidak lagi digunakan; Saya ingin menghapusnya dan meninggalkan hanya tiga yang benar-benar saya gunakan.

Pada kondisi ekstrim yang gegabah, saya bisa menonaktifkan basis data ini dan menunggu seseorang menjerit; di sisi lain aku bisa membiarkan mereka berjalan selamanya "untuk berjaga-jaga". Langkah apa yang Anda anggap berharga dalam mengidentifikasi apakah server sedang digunakan, dan bagaimana?

Juga, langkah-langkah apa yang akan Anda rekomendasikan untuk memastikan bahwa, ketika seseorang bergerak maju dalam sistem penonaktifan, bahwa mereka tetap dapat dibalik untuk periode waktu tertentu (misalnya, mengganti nama objek daripada menghapusnya langsung)?

Terima kasih!

Jon dari Semua Perdagangan
sumber
1
Ini adalah pertanyaan yang sangat cerdik untuk zaman ini. +1 untuk pertanyaan seperti itu. Saya harap pertanyaan ini memunculkan respons yang lebih besar karena DBA akan lebih cepat menghadapi situasi ini dalam karier mereka.
RolandoMySQLDBA
Wow, poin bagus di sekitar! Dan RolandoMySQLDBA sudah mengucapkan terima kasih kepada semua orang untuk saya :) Saya akan membiarkan ini terbuka sedikit lebih lama untuk melihat apakah ada lebih banyak saran, maka saya akan memiliki tugas yang rumit untuk memilih jawaban yang paling membantu.
Jon of All Trades

Jawaban:

4

Anda juga ingin memastikan perangko datetime dari setiap tabel. Cari metadata apa saja di sistem untuk setiap tabel, pesan daftar seperti itu menurut datetime terakhir diperbarui, dan tampilkan output dalam urutan desc pada datetime. Anda juga bisa memeriksa ukuran tabel meskipun ada sedikit perubahan ukuran.

Misalnya, di MySQL 5.x, Anda memiliki information_schema.tables yang terlihat seperti ini:

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)

Kolom UPDATE_TIME mencatat kapan terakhir kali INSERT, UPDATE, atau DELETE terakhir diterapkan pada tabel. Anda bisa menjalankan kueri seperti ini untuk mencari tahu kapan setiap basis data terakhir diakses:

Terakhir kali tabel diakses di setiap basis data:

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;

Terakhir kali tabel diakses di basis data apa pun:

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

10 tanggal terakhir sebuah tabel diakses:

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;

Ini hanya beberapa contoh cara mendapatkan metadata dari MySQL. Saya yakin Oracle dan SQL Server memiliki metode yang sama atau lebih baik.

Setelah Anda yakin seberapa sering atau jarang suatu basis data (atau skema) diakses, Anda harus secara manual membuang / mengekspor basis data yang berusia bersama dengan salinan skema itu sendiri selain dari data. Maaf, jawaban saya bukan DB agnostik. SQLServer dan Oracle DBAs juga harus menyuarakan jawaban mereka di sini, karena konsep skema yang menjadi kumpulan dalam instance database dikaburkan di MySQL tetapi sangat ketat diikuti dalam SQLServer dan Oracle.

RolandoMySQLDBA
sumber
Tip yang sangat bagus. Saya akan mengumpulkan serangkaian pertanyaan untuk mengawasi pembaruan. Untuk kepentingan generasi masa depan, inilah pertanyaan di tingkat skema, untuk 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

Anda bisa mencoba membuat jejak yang hanya menangkap koneksi dan ke basis data apa mereka terhubung. Saya akan membiarkan ini berjalan sebentar dan kemudian memastikan tidak ada yang terhubung dengannya.

Satu masalah dengan itu adalah jika Anda memiliki beberapa kode yang membuka pada master db tetapi memanggil DB lain dalam kode. Saya tidak yakin seberapa buruk kode ini yang menunjuk ke DB Anda.

Saya juga akan menanyakan semua pekerjaan Anda dan memastikan tidak ada yang menunjuk ke DB itu

Anda juga dapat menggunakan audit SQL jika Anda memiliki versi SQL yang tepat (perusahaan 2008 R2).

Anda juga bisa menggunakan pemicu masuk untuk memperbarui tabel ketika seseorang masuk ke DB itu. Ini akan menunjukkan kepada Anda jika ada sesuatu yang terhubung ke DB itu.

SqlSandwich
sumber
Jawaban yang sangat bagus, terutama tentang pemicu masuk !!! MySQL tidak memiliki yang seperti itu, meskipun saya bisa meniru dengan mengaktifkan log umum dan memeriksa alamat IP dan database yang ditentukan. Milik Anda adalah +1 !!!
RolandoMySQLDBA
4

Juga, langkah-langkah apa yang akan Anda rekomendasikan untuk memastikan bahwa, ketika seseorang bergerak maju dalam menonaktifkan sistem, bahwa mereka tetap dapat dibalik untuk jangka waktu tertentu

Di SQL Server, Anda dapat mengambil basis data " offline " yang membuat basis data tetap ada, tetapi membuat koneksi ke sana melalui kode tidak dimungkinkan. Jika database "offline", ia masih tetap tersedia dan dapat dibalik dalam beberapa menit.

Pada pekerjaan terakhir saya, kami memiliki beberapa produk yang beroperasi selama beberapa bulan per tahun, jadi mematikan, atau offline, database selama berbulan-bulan pada suatu waktu tidak akan diperhatikan oleh orang-orang yang bekerja dengan produk itu. Sebagai salah satu contoh, salah satu produk melibatkan formulir W-2, sehingga 98% bisnis terjadi pada bulan Januari dan Februari (untuk sebagian besar perusahaan, data tidak tersedia hingga minggu pertama bulan Januari, dan batas waktu peraturan federal untuk pengajuan informasi adalah hari kerja terakhir di bulan Januari). Server web biasanya dimatikan dari Mei / Juni hingga Desember.

Di perusahaan itu, kami memiliki spreadsheet dengan "pemilik" database - satu orang yang bertanggung jawab atas produk tersebut. Sementara orang lain dapat membuat pembaruan pada struktur tabel, "pemilik" adalah orang yang tepat ketika ada pertanyaan yang harus diajukan. Jika pemilik meninggalkan perusahaan (jarang sampai tahun lalu), seseorang akan ditugaskan untuk menjadi pemilik baru sebelum mereka pergi.

Di perusahaan lain, kami telah mengambil basis data offline selama seperempat, jika mereka tetap offline tanpa melanggar (seperti pelaporan bulan / triwulanan), mereka dicadangkan untuk terakhir kalinya dan dihapus. Ini memungkinkan seseorang untuk kemudian kembali dan mengembalikan database (yang membutuhkan beberapa menit) untuk situasi yang memiliki cerita seperti "oh, itu untuk proyek jones yang harus kami sisihkan sementara kami menyelesaikan proyek fred."

Tangurena
sumber
Studi kasus mini yang bagus, +1 !!!
RolandoMySQLDBA
@Tanguerna: Saya rasa saya menggunakan fitur ini bertahun-tahun yang lalu, tapi itu sempurna untuk peran semacam ini, terima kasih banyak untuk mengingatkan saya.
Jon of All Trades