Thực hành tốt nhất để xóa vĩnh viễn một cơ sở dữ liệu là gì?


10

Chúng tôi có một môi trường "hữu cơ", nghĩa là mọi người xếp chồng mã lên mười năm với sự giám sát hoặc tài liệu tối thiểu. Máy chủ tôi sử dụng có một số cơ sở dữ liệu mà tôi tin rằng không còn được sử dụng; Tôi muốn xóa chúng và chỉ để lại ba cái tôi thực sự sử dụng.

Ở cực kỳ liều lĩnh, tôi có thể vô hiệu hóa các cơ sở dữ liệu này và chờ đợi ai đó hét lên; mặt khác tôi có thể để chúng chạy mãi mãi "chỉ trong trường hợp". Những bước nào bạn đã thấy có giá trị trong việc xác định liệu một máy chủ đang được sử dụng hay không và bằng cách nào?

Ngoài ra, những bước nào bạn muốn đề xuất để đảm bảo rằng, khi một người tiến lên trong việc vô hiệu hóa các hệ thống, chúng vẫn có thể đảo ngược thuận tiện trong một khoảng thời gian (ví dụ: đổi tên các đối tượng thay vì xóa chúng hoàn toàn)?

Cảm ơn!


1
Đây là một câu hỏi rất sắc sảo cho các lứa tuổi. +1 cho một câu hỏi như vậy. Tôi hy vọng câu hỏi này gợi ra một câu trả lời lớn hơn vì các DBA sẽ sớm phải đối mặt với tình huống này trong sự nghiệp của họ.
RolandoMySQLDBA

Wow, điểm tuyệt vời xung quanh! Và RolandoMySQLDBA đã sẵn sàng cảm ơn mọi người vì tôi :) Tôi sẽ để mở này lâu hơn một chút để xem có thêm gợi ý nào không, sau đó tôi sẽ có nhiệm vụ khó khăn là chọn câu trả lời hữu ích nhất.
Jon của tất cả các giao dịch

Câu trả lời:


4

Bạn cũng muốn đảm bảo tem datetime của mỗi bảng. Tìm kiếm bất kỳ siêu dữ liệu nào trong hệ thống cho mỗi bảng, sắp xếp danh sách như vậy theo datetime được cập nhật lần cuối và hiển thị đầu ra theo thứ tự desc theo datetime. Bạn cũng có thể kiểm tra kích thước bảng để biết sự thay đổi nhỏ về kích thước.

Ví dụ: trong MySQL 5.x, bạn có information_schema.tables trông như thế này:

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)

Cột UPDATE_TIME ghi lại lần cuối cùng bất kỳ CHERTN, CẬP NHẬT hoặc XÓA nào được áp dụng lần cuối vào bảng. Bạn có thể chạy các truy vấn như thế này để tìm hiểu khi nào mỗi cơ sở dữ liệu được truy cập lần cuối:

Lần cuối một bảng được truy cập trong mỗi cơ sở dữ liệu:

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;

Lần cuối một bảng được truy cập trong bất kỳ cơ sở dữ liệu nào:

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

10 ngày qua, một bảng đã được truy cập:

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;

Đây chỉ là một vài ví dụ về cách lấy siêu dữ liệu đó từ MySQL. Tôi chắc chắn rằng Oracle và SQL Server có các phương thức tương tự hoặc tốt hơn.

Khi bạn chắc chắn về mức độ thường xuyên hoặc hiếm khi cơ sở dữ liệu (hoặc lược đồ) được truy cập, bạn nên kết xuất / xuất thủ công cơ sở dữ liệu cũ cùng với các bản sao của lược đồ ngoài dữ liệu. Xin thứ lỗi rằng câu trả lời của tôi không phải là thuyết bất khả tri. SQLServer và Oracle DBA cũng nên nói câu trả lời của họ ở đây, vì khái niệm lược đồ là một bộ sưu tập trong một cá thể cơ sở dữ liệu bị mờ trong MySQL nhưng được tuân thủ rất nghiêm ngặt trong SQLServer và Oracle.


Một mẹo rất tốt. Tôi sẽ tập hợp một bộ các truy vấn để theo dõi cập nhật. Vì lợi ích của các thế hệ tương lai, đây là một truy vấn như vậy ở cấp lược đồ, cho 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

Bạn có thể thử thiết lập một dấu vết chỉ ghi lại các kết nối và cơ sở dữ liệu mà chúng kết nối. Tôi sẽ để nó chạy một chút và sau đó đảm bảo không có gì kết nối với nó.

Một vấn đề với điều đó là nếu bạn có một số mã mở trên db chính nhưng gọi một DB khác trong mã. Tôi không chắc mã xấu đến mức nào khi trỏ đến DB của bạn.

Tôi cũng truy vấn tất cả các công việc của bạn và đảm bảo không có công việc nào được trỏ đến DB đó

Bạn cũng có thể sử dụng kiểm toán SQL nếu bạn có phiên bản SQL (doanh nghiệp 2008 R2) phù hợp.

Bạn cũng có thể sử dụng trình kích hoạt đăng nhập để cập nhật bảng khi ai đó đăng nhập vào DB đó. Điều này sẽ cho bạn thấy nếu có bất cứ điều gì đang kết nối với DB đó.


Câu trả lời rất tốt, đặc biệt là liên quan đến các kích hoạt đăng nhập !!! MySQL không có gì giống như vậy, mặc dù tôi có thể mô phỏng nó bằng cách kích hoạt nhật ký chung và kiểm tra địa chỉ IP và cơ sở dữ liệu được chỉ định. Của bạn là +1 !!!
RolandoMySQLDBA

4

Ngoài ra, những bước bạn muốn giới thiệu để đảm bảo rằng, khi một người tiến lên trong việc vô hiệu hóa các hệ thống, chúng vẫn có thể đảo ngược thuận tiện trong một khoảng thời gian

Trong SQL Server, bạn có thể lấy cơ sở dữ liệu " ngoại tuyến " để lại cơ sở dữ liệu, nhưng không thể kết nối với cơ sở dữ liệu qua mã. Nếu một cơ sở dữ liệu là "ngoại tuyến", nó vẫn có sẵn và có thể đảo ngược trong vòng vài phút.

Ở công việc cuối cùng của chúng tôi, chúng tôi đã có một số sản phẩm hoạt động được vài tháng mỗi năm, do đó, tắt hoặc ngoại tuyến, cơ sở dữ liệu trong nhiều tháng sẽ không được mọi người làm việc với sản phẩm đó chú ý. Lấy một ví dụ, một trong những sản phẩm liên quan đến mẫu W-2, vì vậy 98% doanh nghiệp xảy ra vào tháng 1 và tháng 2 (đối với hầu hết các công ty, dữ liệu không có sẵn cho đến tuần đầu tiên vào tháng 1 và thời hạn quy định của liên bang để nộp thông tin là ngày làm việc cuối cùng trong tháng 1). Máy chủ web thường bị tắt từ tháng 5 / tháng 6 đến tháng 12.

Tại công ty đó, chúng tôi đã có một bảng tính với "chủ sở hữu" cơ sở dữ liệu - một người duy nhất chịu trách nhiệm về sản phẩm. Trong khi những người khác có thể cập nhật cấu trúc của các bảng, thì "chủ sở hữu" là người trực tiếp khi có bất kỳ câu hỏi nào được đặt ra. Nếu chủ sở hữu rời công ty (hiếm cho đến năm ngoái), một người nào đó sẽ được chỉ định làm chủ sở hữu mới trước khi họ rời đi.

Tại các công ty khác, chúng tôi đã lấy cơ sở dữ liệu ngoại tuyến trong một phần tư, nếu họ ở chế độ ngoại tuyến mà không có gì vi phạm (chẳng hạn như báo cáo hàng tháng / hàng quý), họ sẽ được sao lưu lần cuối và xóa. Điều này cho phép ai đó quay lại và khôi phục cơ sở dữ liệu (mất vài phút) cho những tình huống có câu chuyện như "ồ, đó là cho dự án jones mà chúng tôi phải đặt sang một bên trong khi chúng tôi hoàn thành dự án fred."


Nghiên cứu trường hợp nhỏ đẹp, +1 !!!
RolandoMySQLDBA

@Tanguerna: Tôi nghĩ rằng tôi đã sử dụng tính năng này từ nhiều năm trước, nhưng nó hoàn hảo cho loại vai trò này, rất cảm ơn vì đã nhắc nhở tôi.
Jon của tất cả các giao dịch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.