Cách số 1 của bạn để cẩn thận với cơ sở dữ liệu trực tiếp là gì? [đóng cửa]


80

Đối với khách hàng của tôi, tôi thỉnh thoảng làm việc trong cơ sở dữ liệu trực tiếp của họ để khắc phục sự cố mà họ đã tự tạo ra hoặc để sửa dữ liệu xấu mà lỗi của sản phẩm của tôi đã tạo ra. Giống như quyền truy cập root Unix, nó rất nguy hiểm. Những bài học nào tôi nên học trước thời hạn?

Điều số 1 bạn làm để cẩn thận khi hoạt động trên dữ liệu trực tiếp là gì?

Câu trả lời:


101

Ba điều tôi đã học được trong suốt nhiều năm qua ...

Trước tiên, nếu bạn đang cập nhật hoặc xóa dữ liệu trực tiếp, trước tiên hãy viết một truy vấn SELECT với mệnh đề WHERE mà bạn sẽ sử dụng. Đảm bảo rằng nó hoạt động. Hãy chắc chắn rằng nó chính xác. Sau đó thêm câu lệnh UPDATE / DELETE vào mệnh đề WHERE đang hoạt động đã biết.

Bạn không bao giờ muốn có

DELETE FROM Customers

đang ngồi trong trình phân tích truy vấn của bạn chờ bạn viết mệnh đề WHERE ... vô tình nhấn "thực thi" và bạn vừa giết bảng Khách hàng của mình. Giáo sư.

Ngoài ra, tùy thuộc vào nền tảng của bạn, hãy tìm hiểu cách sao lưu bảng nhanh chóng. Trong SQL Server 2005,

SELECT *
INTO CustomerBackup200810032034
FROM Customer

sẽ sao chép mọi hàng từ toàn bộ bảng Khách hàng vào một bảng mới có tên là CustomerBackup200810032034, sau đó bạn có thể xóa khi đã cập nhật xong và đảm bảo rằng mọi thứ đều ổn. Nếu điều tồi tệ nhất xảy ra, việc khôi phục dữ liệu bị thiếu từ bảng này sẽ dễ dàng hơn nhiều so với việc thử khôi phục bản sao lưu của đêm qua từ đĩa hoặc băng.

Cuối cùng, hãy cảnh giác với việc xóa theo tầng loại bỏ những thứ bạn không định xóa - hãy kiểm tra các mối quan hệ của bảng và các ràng buộc chính trước khi sửa đổi bất kỳ thứ gì.


1
ý bạn không phải là XÓA KHỎI Khách hàng chỉ là kỹ thuật :-)
craigmoliver

5
Hoặc tốt hơn là không sử dụng bất cứ thứ gì xếp tầng.
dkretz

108
BEGIN TRANSACTION;

Bằng cách đó, bạn có thể khôi phục lại sau khi nhầm lẫn


Đúng vậy, đây là cách duy nhất để ngăn chặn sự điên cuồng của lòng bàn tay.
willasaywhat 3/10/08

11
@Graeme, bạn không nên làm DDL trên cơ sở dữ liệu sản xuất. Bạn nên viết một tập lệnh, chạy nó trên cơ sở dữ liệu thử nghiệm của mình và sau khi cơ sở dữ liệu thử nghiệm của bạn vượt qua QA, sau đó bạn chạy nó trên máy chủ sản xuất.
Paul Tomblin

1
@Paul: hoàn toàn. Nhưng có thể lập luận rằng bạn nên làm điều tương tự với bất kỳ loại sửa đổi nào đối với cơ sở dữ liệu sản xuất của bạn, cho dù là DDL hay DML, trong trường hợp đó toàn bộ câu hỏi này là vô nghĩa.
Graeme Perrow

3
Eduardo, nó đã nhận được 45 phiếu bầu cho đến nay bởi vì - hầu hết thời gian - mồ hôi lạnh của bạn bắt đầu đổ mồ hôi lạnh trước khi ngón tay của bạn di chuyển hết xuống bàn phím - nhưng đã quá muộn để dừng ngón tay lại.
Euro Micelli

1
Cũng hữu ích ở chỗ bạn có thể chạy một loạt các lựa chọn trong cùng một giao dịch để xác minh kết quả trước khi thực hiện - nếu chúng không mong muốn, không gây hại gì - chỉ cần quay lại.
Dave Cluderay

50

Thực hiện sao lưu trước: dù sao nó cũng phải là luật số 1 về phá hoại hệ thống

CHỈNH SỬA : kết hợp những gì người khác đã nói, đảm bảo CẬP NHẬT của bạn có mệnh đề WHERE phù hợp.

Lý tưởng nhất là việc thay đổi cơ sở dữ liệu trực tiếp sẽ không bao giờ xảy ra (ngoài INSERT và bảo trì cơ bản). Việc thay đổi cấu trúc của live DB đặc biệt tiềm ẩn nhiều ác nghiệp.


25

Thực hiện các thay đổi của bạn đối với một bản sao và khi bạn hài lòng, sau đó áp dụng bản sửa lỗi để hoạt động.


hầu hết thời gian, sao chép db là khác nhau sau đó hoạt động và không phải tất cả các thay đổi đều hoạt động giống như sao chép và hoạt động.
bugBurger

Nếu cơ sở dữ liệu sao chép khác với cơ sở dữ liệu trực tiếp, điều đó có nghĩa là nó không thực sự là cơ sở dữ liệu sao chép? Toàn bộ mục đích của cơ sở dữ liệu test / qa / copy là để kiểm tra các thay đổi trước khi chúng được áp dụng cho cơ sở dữ liệu trực tiếp / sản xuất.
Wilco

22

Thường thì trước khi thực hiện CẬP NHẬT hoặc XÓA, tôi viết CHỌN tương đương.


Để kiểm tra nhanh chóng và đơn giản, tôi cũng thích phương pháp này. Tùy thuộc vào số lượng kết quả, nó có thể không hoạt động nhưng ít nhất đó là bước khởi đầu cho việc CẬP NHẬT và XÓA.
osp70

18

KHÔNG BAO GIỜ thực hiện cập nhật trừ khi bạn đang ở BẮT ĐẦU TRẦN t1 - không phải trong cơ sở dữ liệu nhà phát triển, không phải trong sản xuất, không phải ở bất kỳ đâu. KHÔNG BAO GIỜ chạy COMMIT TRAN t1 bên ngoài nhận xét - luôn nhập

--COMMIT TRAN t1

và sau đó chọn câu lệnh để chạy nó. (Rõ ràng, điều này chỉ áp dụng cho các ứng dụng khách truy vấn GUI.) Nếu bạn làm những điều này, nó sẽ trở thành bản chất thứ hai để làm chúng và bạn sẽ không mất nhiều thời gian.

Tôi thực sự có một macro "cập nhật" loại này. Tôi luôn dán cái này vào để thiết lập các bản cập nhật của mình. Bạn có thể tạo một cái tương tự để xóa và chèn.

begin tran t1
update 
set 
where 
rollback tran t1
--commit tran t1

Vâng, đây chính xác là những gì tôi làm. Có quá nhiều người đang nói "đừng quên mệnh đề where", nhưng nếu nó sai thì sao? Đừng bao giờ cập nhật cơ sở dữ liệu trực tiếp mà không có mẫu start / rollback / - commit này.
Eric Z Beard

Một cải tiến bổ sung là trước tiên hãy thực hiện "select * from" với mệnh đề where để đảm bảo nó đúng, sau đó chạy cập nhật với mệnh đề where tương tự.
Eric Z Beard

Eric nói đúng, mặc dù tôi bỏ điều này ra khỏi macro của mình để tránh phạm vi ảnh hưởng. Tôi có một macro khác loại ra "select * from" để sử dụng chung.
Patrick Szalapski

Không có lý do chính đáng để không làm theo cách này. Khi tôi phải viết các tập lệnh cập nhật ở công việc trước, tôi đã làm theo cách này, cùng với CHỌN trước khi cập nhật và CHỌN sau đó , để tôi có thể xem kết quả. Sau khi chạy nó vài lần và thấy kết quả là chính xác, tôi đã thay đổi ROLLBACK thành COMMIT.
Ryan Lundy

13

Luôn đảm bảo CẬP NHẬT và XÓA của bạn có mệnh đề WHERE thích hợp.


Vâng, tôi đã bị bỏng về điều này trước đây.
Ian Jacobs,

Tôi cũng vậy. Kể từ đó, tôi đã ước rằng SQL đã được thiết kế để mệnh đề where đứng trước.
Greg Hewgill 3/10/08

Tôi thích cảm giác chìm đó khi chạy CẬP NHẬT nhanh và có nội dung "1279209394 Bản ghi bị ảnh hưởng." Ồ. ;)
Kevin Fairchild

13

Để trả lời câu hỏi của riêng tôi:

Khi viết một câu lệnh cập nhật, hãy viết nó không theo thứ tự.

  1. Viết UPDATE [table-name]
  2. Viết WHERE [conditions]
  3. Quay lại và viết SET [columns-and-values]

Chọn các hàng bạn muốn cập nhật trước khi nói giá trị nào bạn muốn thay đổi sẽ an toàn hơn nhiều so với thực hiện theo thứ tự khác. Nó khiến bạn không update person set email = 'bob@bob.com'thể ngồi trong cửa sổ truy vấn của mình, sẵn sàng chạy bởi một lần nhấn phím không đúng chỗ, sẵn sàng làm xáo trộn mọi hàng trong bảng.

Chỉnh sửa: Như những người khác đã nói, hãy viết WHEREđiều khoản xóa của bạn trước khi bạn viết DELETE.


11

Ví dụ, tôi tạo SQL như thế này

--Update P Set
--Select ID, Name as OldName, 
    Name='Jones'
From Person P
Where ID = 1000

Tôi đánh dấu văn bản từ cuối cho đến Chọn và chạy SQL đó. Khi tôi xác minh rằng nó đang kéo bản ghi tôi muốn cập nhật, tôi nhấn shift-up để đánh dấu câu lệnh Cập nhật và chạy điều đó.

Lưu ý rằng tôi đã sử dụng một bí danh. Tôi không bao giờ cập nhật tên bảng rõ ràng. Tôi luôn sử dụng một bí danh.

Nếu tôi làm điều này cùng với các giao dịch và khôi phục / cam kết, thì tôi thực sự rất, thực sự an toàn.


Tôi cũng sử dụng kiểm tra chọn - Tôi đã gặp một số lỗi mệnh đề where theo cách này. Đó là một kiểm tra sự tỉnh táo tốt, đặc biệt là khi các câu lệnh phức tạp.
Bob Probst 3/10/08

Phương pháp này đã được rèn giũa trong một thời gian ngắn sau khi xem người giám sát của tôi xóa một bảng quan trọng trong quá trình sản xuất vào giữa ngày.
wcm

Tôi chuyển lựa chọn và cập nhật và xóa các nhận xét trên lựa chọn. Sau đó, khi tôi đã sẵn sàng, tôi đánh dấu khu vực và chạy. Hoạt động cho quá trình xóa.
rball

11

Cách số 1 của tôi để cẩn thận với cơ sở dữ liệu trực tiếp? Đừng chạm vào nó. :)

Các bản sao lưu có thể hoàn tác các thiệt hại mà bạn gây ra trên cơ sở dữ liệu, nhưng bạn vẫn có khả năng gây ra các tác dụng phụ tiêu cực trong khoảng thời gian đó.

Bất kể bạn nghĩ tập lệnh bạn đang làm việc chắc chắn đến mức nào, hãy chạy nó qua một chu kỳ thử nghiệm. Ngay cả khi "chu kỳ kiểm tra" có nghĩa là chạy tập lệnh dựa trên phiên bản cơ sở dữ liệu của riêng bạn, hãy đảm bảo rằng bạn làm điều đó. Tốt hơn là giới thiệu các khiếm khuyết trên hộp cục bộ của bạn hơn là môi trường sản xuất.


6
  1. Kiểm tra, kiểm tra lại và kiểm tra lại bất kỳ trạng thái nào đang thực hiện cập nhật. Ngay cả khi bạn nghĩ rằng bạn chỉ đang thực hiện cập nhật một cột đơn giản, sớm hay muộn, bạn sẽ không có đủ cà phê và quên một mệnh đề 'ở đâu', gây ảnh hưởng đến cả một bảng.

Một số điều khác mà tôi thấy hữu ích:

  • nếu sử dụng MySQL, hãy bật Cập nhật an toàn

  • Nếu bạn có DBA, hãy yêu cầu họ làm điều đó.

Tôi nhận thấy 3 điều này đã giúp tôi không gây ra bất kỳ tổn hại nghiêm trọng nào.


Đúng vậy, cổ điển: UPDATE TABLE_NAME SET FIELD_X = 'anything' [WHERE = thiếu]
Stefan Steiger 13/12/11

6
  • Không ai muốn sao lưu nhưng mọi người đều khóc cho sự phục hồi
  • Tạo DB của bạn với các tham chiếu khóa ngoại, vì bạn nên:
  • làm cho bản thân bạn khó cập nhật / xóa dữ liệu và phá hủy tính toàn vẹn của cấu trúc / thứ gì đó khác với điều đó
  • Nếu có thể, hãy chạy trên một hệ thống mà bạn phải thực hiện các thay đổi trước khi lưu trữ vĩnh viễn (tức là hủy kích hoạt tính năng tự động gửi trong khi sửa chữa db)
  • Cố gắng xác định các lớp của sự cố để bạn hiểu cách khắc phục mà không gặp sự cố
  • Có thói quen chơi các bản sao lưu vào cơ sở dữ liệu, luôn có cơ sở dữ liệu thứ hai trên máy chủ thử nghiệm để bạn có thể làm việc trên đó
  • Bởi vì hãy nhớ: Nếu một cái gì đó thất bại hoàn toàn, bạn cần phải bắt đầu và chạy lại càng nhanh càng tốt

Chà, đó là tất cả những gì tôi có thể nghĩ đến bây giờ. Hãy thực hiện những đoạn táo bạo và bạn thấy đâu là số 1 đối với tôi. ;-)


Tôi chỉ muốn thêm vào đề cập đến autocommit, bởi vì nó là một cơ chế an toàn quan trọng. Nếu bạn đang kết nối thẳng với cơ sở dữ liệu, bạn thường có thể tắt tính năng tự động gửi trong các tham số kết nối db. Nếu không (sản phẩm db front-end), bạn có thể cần tìm cài đặt ứng dụng.
Mike Monette 03/10/08

3

Có thể xem xét không sử dụng bất kỳ xóa hoặc giảm nào cả. Hoặc có thể giảm quyền người dùng để chỉ một người dùng DB đặc biệt mới có thể xóa / bỏ mọi thứ.


3

Nếu bạn đang sử dụng Oracle hoặc cơ sở dữ liệu khác hỗ trợ nó, hãy xác minh các thay đổi của bạn trước khi thực hiện CAM KẾT.


Bạn phải cẩn thận vì hồ sơ có thể bị khóa trong khi giao dịch của bạn đang chờ xử lý.
Greg Ogle

Tôi thường sử dụng nhà phát triển SQL cho oracle và nó không bao giờ được cam kết tự động ngay cả sau khi thực thi. Vì vậy, chúng tôi có một bản xem trước và sau đó cam kết. Tính năng thú vị !!
lakshminb7

3

Dữ liệu phải luôn được triển khai để tồn tại thông qua các tập lệnh, có thể được diễn tập nhiều lần tùy theo yêu cầu để có được nó ngay trên nhà phát triển. Khi có dữ liệu phụ thuộc để tập lệnh chạy chính xác trên nhà phát triển, hãy phân đoạn nó một cách thích hợp - bạn không thể bỏ qua bước này nếu thực sự muốn cẩn thận.




2

Để thêm vào những gì @ Wayne đã nói, hãy viết WHEREtrước tên bảng của bạn trong một DELETEhoặc UPDATEcâu lệnh.


2

LẠI DỮ LIỆU CỦA BẠN. Học được rằng một trong những cách chăm chỉ làm việc với cơ sở dữ liệu khách hàng một cách thường xuyên.



2

Quy tắc của tôi (với tư cách là nhà phát triển ứng dụng): Đừng chạm vào nó! Đó là những gì các DBA được đào tạo dành cho. Heck, tôi thậm chí không muốn được phép chạm vào nó. :)


2

Các màu khác nhau cho mỗi môi trường: Chúng tôi đã thiết lập nhà phát triển PL \ SQL (IDE cho Oracle) để khi bạn đăng nhập vào DB sản xuất, tất cả các cửa sổ đều có màu đỏ tươi. Một số đã đi xa đến mức chỉ định một màu khác cho nhà phát triển và thử nghiệm.



1

luôn kiểm tra bất kỳ truy vấn nào vượt quá lựa chọn trên dữ liệu phát triển trước để đảm bảo nó có tác động chính xác.


1
  1. nếu có thể, hãy yêu cầu ghép nối với ai đó
  2. luôn đếm đến 3 trước khi nhấn Enter (nếu ở một mình, vì điều này sẽ khiến đối tác trong cặp của bạn tức giận!)

1

Nếu tôi đang cập nhật cơ sở dữ liệu với một tập lệnh, tôi luôn đảm bảo rằng tôi đặt một hoặc hai điểm ngắt ở đầu tập lệnh của mình, đề phòng trường hợp tôi vô tình chạy / thực thi.


1

Tôi sẽ thêm vào các khuyến nghị thực hiện BEGIN TRAN trước khi CẬP NHẬT của bạn, chỉ cần đừng quên thực hiện CAM KẾT; bạn có thể bị thiệt hại nhiều như vậy nếu bạn để mở giao dịch chưa cam kết của mình. Đừng để bị phân tâm bởi điện thoại, đồng nghiệp, bữa trưa, v.v. khi đang cập nhật, nếu không bạn sẽ thấy mọi người khác đều bị khóa cho đến khi bạn COMMIT hoặc ROLLBACK.


1

Tôi luôn nhận xét bất kỳ truy vấn phá hoại nào (chèn, cập nhật, xóa, thả, thay đổi) khi viết ra các truy vấn adhoc trong Trình phân tích truy vấn. Theo cách đó, cách duy nhất để chạy chúng là đánh dấu chúng mà không cần chọn phần đã nhận xét và nhấn F5.

Tôi cũng nghĩ rằng bạn nên viết câu lệnh where trước tiên, với một lựa chọn và đảm bảo rằng bạn đang thay đổi dữ liệu phù hợp.


1
  1. Luôn sao lưu trước khi thay đổi.
  2. Luôn tạo mod (ví dụ: ALTER TABLE) thông qua script.
  3. Luôn sửa đổi dữ liệu (ví dụ: DELETE) thông qua một thủ tục được lưu trữ.

1

Tạo một người dùng chỉ đọc (hoặc nhờ DBA làm việc đó) và chỉ sử dụng người dùng đó để xem DB. Thêm các quyền thích hợp vào lược đồ để bạn có thể xem nội dung của các thủ tục / chế độ xem / trình kích hoạt / v.v. được lưu trữ. nhưng không có khả năng thay đổi chúng.

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.