Jaki jest Twój najlepszy sposób, aby zachować ostrożność z działającą bazą danych? [Zamknięte]


80

Dla mojego klienta od czasu do czasu pracuję w jego aktywnej bazie danych, aby naprawić problem, który sam stworzył, lub w celu naprawienia złych danych, które utworzyły błędy mojego produktu. Podobnie jak w przypadku dostępu roota w systemie Unix, jest po prostu niebezpieczny. Jakich lekcji powinienem się nauczyć z wyprzedzeniem?

Jaka jest pierwsza rzecz, którą należy zrobić, aby zachować ostrożność podczas pracy na danych w czasie rzeczywistym?

Odpowiedzi:


101

Trzy rzeczy, których nauczyłem się na własnej skórze przez lata ...

Po pierwsze, jeśli aktualizujesz lub usuwasz dane na żywo, najpierw napisz zapytanie SELECT z klauzulą ​​WHERE, której będziesz używać. Upewnij się, że działa. Upewnij się, że jest poprawny. Następnie dołącz instrukcję UPDATE / DELETE do znanej klauzuli roboczej WHERE.

Nigdy nie chcesz

DELETE FROM Customers

siedząc w analizatorze zapytań czekając, aż napiszesz klauzulę WHERE ... przypadkowo naciśniesz „wykonaj” i właśnie zabiłeś tabelę Customer. Ups.

Ponadto, w zależności od platformy, dowiedz się, jak szybko wykonać kopię zapasową tabeli. W SQL Server 2005

SELECT *
INTO CustomerBackup200810032034
FROM Customer

skopiuje każdy wiersz z całej tabeli Customer do nowej tabeli o nazwie CustomerBackup200810032034, którą można następnie usunąć po wykonaniu aktualizacji i upewnieniu się, że wszystko jest w porządku. Jeśli wydarzy się najgorsze, o wiele łatwiej będzie przywrócić brakujące dane z tej tabeli, niż spróbować przywrócić kopię zapasową z zeszłej nocy z dysku lub taśmy.

Na koniec uważaj na usuwanie kaskadowe, pozbywając się rzeczy, których nie zamierzałeś usuwać - sprawdź relacje tabel i kluczowe ograniczenia, zanim cokolwiek zmodyfikujesz.


1
czy nie masz na myśli DELETE FROM Klienci są tylko techniczni :-)
craigmoliver

5
Albo jeszcze lepiej nie używaj niczego kaskadowego.
dkretz

108
BEGIN TRANSACTION;

W ten sposób możesz wycofać się po błędzie.


Tak, właściwie jedyny sposób, aby zapobiec szaleństwu na dłoni.
willasaywhat

11
@Graeme, nie powinieneś robić DDL na produkcyjnych bazach danych. Powinieneś napisać skrypt, uruchomić go na swojej testowej bazie danych, a po przejściu przez testową bazę danych QA, uruchomić go na serwerze produkcyjnym.
Paul Tomblin,

1
@Paul: absolutnie. Można jednak argumentować, że powinieneś robić to samo z każdym rodzajem modyfikacji twojej produkcyjnej bazy danych, czy to DDL, czy DML, w takim przypadku całe to pytanie jest bez znaczenia.
Graeme Perrow

3
Eduardo, jak dotąd zdobyło 45 głosów, ponieważ - przez większość czasu - zimne pocenie zaczyna się, zanim palec przestanie poruszać się całkowicie w dół na klawiaturze - ale po prostu za późno, aby go zatrzymać.
Euro Micelli

1
Przydatne również pod tym względem, że możesz przeprowadzić kilka selekcji w ramach tej samej transakcji, aby zweryfikować wyniki przed zatwierdzeniem - jeśli są nieoczekiwane, nic się nie dzieje - po prostu wycofaj.
Dave Cluderay

50

Najpierw zrób kopię zapasową: i tak powinno to być prawo numer 1 administrowania systemem

EDYCJA : uwzględniając to, co powiedzieli inni, upewnij się, że AKTUALIZACJE mają odpowiednie klauzule WHERE.

W idealnym przypadku zmiana działającej bazy danych nigdy nie powinna mieć miejsca (poza wstawkami INSERT i podstawową konserwacją). Zmiana struktury żywego DB jest szczególnie obarczona potencjalną złą karmą.


25

Wprowadź zmiany w kopii, a gdy będziesz zadowolony, zastosuj poprawkę do opublikowania.


w większości przypadków funkcja copy db różni się od wersji live i nie wszystkie zmiany zachowują się tak samo jak copy and live.
bugBurger

Jeśli baza danych kopii różni się od istniejącej bazy danych, czy nie oznacza to, że w rzeczywistości nie jest to kopia bazy danych? Celem bazy danych test / qa / copy jest testowanie zmian przed ich zastosowaniem w aktywnej / produkcyjnej bazie danych.
Wilco,

22

Często zanim wykonam UPDATE lub DELETE, piszę równoważny SELECT.


W ramach szybkiego i prostego sprawdzenia podoba mi się również ta metoda. W zależności od liczby wyników może nie działać, ale przynajmniej jest to początek AKTUALIZACJI i USUNIĘĆ.
osp70

18

NIGDY nie rób aktualizacji, chyba że jesteś w BEGIN TRAN t1 - nie w bazie danych deweloperów, nie w produkcji, nigdzie. NIGDY nie uruchamiaj COMMIT TRAN t1 poza komentarzem - zawsze pisz

--COMMIT TRAN t1

a następnie wybierz instrukcję, aby ją uruchomić. (Oczywiście dotyczy to tylko klientów zapytań GUI). Jeśli zrobisz te rzeczy, ich robienie stanie się drugą naturą i nie stracisz prawie żadnego czasu.

Właściwie mam makro "aktualizacji", które wpisuje to. Zawsze wklejam to, aby skonfigurować aktualizacje. Możesz zrobić podobny dla usuwania i wstawiania.

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

Tak, właśnie to robię. Zbyt wiele osób mówi „nie zapomnij klauzuli gdzie”, ale co, jeśli jest źle? Nigdy, przenigdy nie aktualizuj aktywnej bazy danych bez tego wzorca begin / rollback / - commit.
Eric Z Beard

Dodatkowym ulepszeniem jest wykonanie najpierw polecenia „select * from” z klauzulą ​​where, aby upewnić się, że jest poprawna, a następnie uruchomienie aktualizacji z tą samą klauzulą ​​where.
Eric Z Beard

Eric ma rację, chociaż pomijam to w moim makrze, aby uniknąć pełzania zakresu. Mam inne makro, które wypisuje „wybierz * z” do ogólnego użytku.
Patrick Szalapski,

Nie ma dobrego powodu, aby tego nie robić w ten sposób. Kiedy musiałem pisać skrypty aktualizacyjne w poprzedniej pracy, robiłem to w ten sposób, razem z SELECT przed aktualizacją i SELECT po , więc mogłem zobaczyć wyniki. Po kilkukrotnym uruchomieniu i sprawdzeniu, że wyniki są poprawne, zmieniłem ROLLBACK na COMMIT.
Ryan Lundy

13

Zawsze upewnij się, że Twoje UPDATE i DELETE mają odpowiednią klauzulę WHERE.


Tak, już wcześniej się tym spaliłem.
Ian Jacobs,

Ja też. Od tamtej pory żałowałem, że SQL nie został zaprojektowany w taki sposób, aby klauzula where była pierwsza.
Greg Hewgill,

Uwielbiam to uczucie tonięcia podczas szybkiego uruchamiania AKTUALIZACJI, a pojawia się komunikat „1279209394 Dotyczy rekordów”. O o. ;)
Kevin Fairchild

13

Odpowiadając na moje własne pytanie:

Pisząc oświadczenie o aktualizacji, napisz je poza kolejnością.

  1. pisać UPDATE [table-name]
  2. pisać WHERE [conditions]
  3. Wróć i napisz SET [columns-and-values]

Wybór wierszy, które chcesz zaktualizować, zanim powiesz, jakie wartości chcesz zmienić, jest o wiele bezpieczniejszy niż zrobienie tego w innej kolejności. Uniemożliwia update person set email = 'bob@bob.com'to siedzenie w oknie zapytania, gotowe do uruchomienia przez niewłaściwe naciśnięcie klawisza, gotowe zepsuć każdy wiersz tabeli.

Edycja: tak jak powiedzieli inni, napisz WHEREklauzulę dotyczącą usunięcia, zanim napiszesz DELETE.


11

Na przykład tworzę SQL w ten sposób

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

Podświetlam tekst od końca do Select i uruchamiam ten SQL. Po sprawdzeniu, że pobiera rekord, który chcę zaktualizować, naciskam klawisz Shift-up, aby podświetlić instrukcję Update i ją uruchomić.

Zauważ, że użyłem aliasu. Nigdy nie aktualizuję wprost nazwy tabeli. Zawsze używam aliasu.

Jeśli robię to w połączeniu z transakcjami i wycofywaniem / zatwierdzaniem, jestem naprawdę, naprawdę bezpieczny.


Używam również wyboru wyboru - w ten sposób złapałem kilka błędów klauzuli Where. To dobra kontrola poczytalności, zwłaszcza gdy oświadczenia są złożone.
Bob Probst,

Ta metoda została dopracowana przez krótki czas po tym, jak mój przełożony w środku dnia usuwał ważny stół w produkcji.
wcm

Przełączam zaznaczenie i aktualizuję oraz usuwam komentarze w zaznaczeniu. Następnie, gdy jestem gotowy, podświetlam teren i biegnę. Działa również w przypadku usuwania.
rball

11

Mój najlepszy sposób, aby zachować ostrożność z aktywną bazą danych? Nie dotykaj tego. :)

Kopie zapasowe mogą cofnąć szkody, które wyrządzasz w bazie danych, ale nadal istnieje prawdopodobieństwo, że w tym czasie wprowadzisz negatywne skutki uboczne.

Bez względu na to, jak solidny jest skrypt, z którym pracujesz, przeprowadź go przez cykl testowy. Nawet jeśli „cykl testowy” oznacza uruchamianie skryptu na własnej instancji bazy danych, upewnij się, że to robisz. O wiele lepiej jest wprowadzić usterki do lokalnego pudełka niż do środowiska produkcyjnego.


6
  1. Sprawdź, ponownie sprawdź i sprawdź ponownie wszystkie statystyki, które powodują aktualizacje. Nawet jeśli myślisz, że robisz tylko prostą aktualizację w jednej kolumnie, prędzej czy później nie będziesz miał wystarczająco dużo kawy i zapomnisz o klauzuli „gdzie”, niszcząc cały stół.

Kilka innych rzeczy, które uznałem za pomocne:

  • jeśli używasz MySQL, włącz Bezpieczne aktualizacje

  • Jeśli masz administratora DBA, poproś go o zrobienie tego.

Odkryłem, że te 3 rzeczy powstrzymały mnie przed wyrządzeniem poważnej krzywdy.


Tak, klasycznie: UPDATE TABLE_NAME SET FIELD_X = „cokolwiek” [WHERE = brak]
Stefan Steiger

6
  • Nikt nie chce kopii zapasowej, ale wszyscy wołają o powrót do zdrowia
  • Utwórz swoją bazę danych z odniesieniami do kluczy obcych, ponieważ powinieneś:
  • jak najbardziej utrudnij sobie aktualizowanie / usuwanie danych i niszczenie integralności strukturalnej / coś innego z tym
  • Jeśli to możliwe, uruchom w systemie, w którym musisz zatwierdzić zmiany przed ich trwałym przechowywaniem (tj. Dezaktywować automatyczne zatwierdzanie podczas naprawy bazy danych)
  • Spróbuj zidentyfikować klasy swojego problemu, aby zrozumieć, jak rozwiązać go bez problemów
  • Zdobądź rutynę podczas odtwarzania kopii zapasowych w bazie danych, zawsze miej pod ręką drugą bazę danych na serwerze testowym, abyś mógł po prostu nad tym popracować
  • Ponieważ pamiętaj: jeśli coś całkowicie zawiedzie, musisz jak najszybciej ponownie zacząć działać

Cóż, to wszystko, o czym teraz myślę. Weź odważne fragmenty, a zobaczysz, co jest dla mnie nr 1. ;-)


Chciałbym tylko dodać do wzmianki o autocommit, ponieważ jest to ważny mechanizm bezpieczeństwa. Jeśli łączysz się bezpośrednio z bazą danych, zazwyczaj możesz wyłączyć automatyczne zatwierdzanie w parametrach połączenia z bazą danych. W przeciwnym razie (produkt DB front-end) może być konieczne poszukanie ustawienia aplikacji.
Mike Monette,

3

Może rozważ w ogóle nieużywanie żadnych usuwania ani upuszczania. A może zmniejsz uprawnienia użytkownika, aby tylko specjalny użytkownik bazy danych mógł usuwać / upuszczać rzeczy.


3

Jeśli używasz Oracle lub innej bazy danych, która to obsługuje, sprawdź wprowadzone zmiany przed wykonaniem polecenia COMMIT.


Musisz być ostrożny, ponieważ rekordy mogą być zablokowane podczas oczekiwania na transakcję.
Greg Ogle,

Zwykle używam programisty SQL dla Oracle i nigdy nie jest on zatwierdzany automatycznie nawet po wykonaniu. Mamy więc podgląd, a następnie zatwierdzamy. Fajna funkcja !!
lakshminb7

3

Dane powinny być zawsze wdrażane na żywo za pomocą skryptów, które można ćwiczyć tyle razy, ile jest to wymagane, aby uzyskać je dobrze w środowisku deweloperskim. Kiedy istnieją zależne dane, aby skrypt działał poprawnie na dev, przygotuj go odpowiednio - nie możesz uciec od tego kroku, jeśli naprawdę chcesz być ostrożny.




2

Aby dodać do tego, co powiedział @ Wayne , napisz swoje WHEREprzed nazwą tabeli w instrukcji DELETElub UPDATE.


2

Zrób kopię zapasową swoich danych. Nauczyłem się tego trudnego sposobu pracy z bazami danych klientów.



2

Moja zasada (jako twórcy aplikacji): Nie dotykaj tego! Do tego służą wyszkoleni administratorzy baz danych. Heck, nie chcę nawet pozwolenia, żeby go dotykać. :)


2

Różne kolory na środowisko: Ustawiliśmy naszego programistę PL \ SQL (IDE dla Oracle) tak, aby po zalogowaniu się do produkcyjnej bazy danych wszystkie okna były w kolorze jasnoczerwonym. Niektórzy posunęli się nawet do przypisania innego koloru dla deweloperów i testów.



1

zawsze najpierw testuj zapytania poza select w danych programistycznych, aby upewnić się, że mają one odpowiedni wpływ.


1
  1. jeśli to możliwe, poproś o sparowanie z kimś
  2. zawsze licz do 3 przed naciśnięciem Enter (jeśli jesteś sam, ponieważ rozwścieczy to twojego partnera w parze!)

1

Jeśli aktualizuję bazę danych za pomocą skryptu, zawsze upewniam się, że na początku mojego skryptu umieszczam punkt przerwania lub dwa, na wypadek, gdyby przypadkowo trafiłem na polecenie uruchom / wykonaj.


1

Dodam do zaleceń robienia BEGIN TRAN przed AKTUALIZACJĄ, po prostu nie zapomnij wykonać polecenia COMMIT; możesz wyrządzić tyle samo szkód, jeśli pozostawisz niezatwierdzoną transakcję otwartą. Nie daj się rozproszyć telefonom, współpracownikom, obiadom itp., Gdy jesteś w trakcie aktualizacji, bo zobaczysz, że wszyscy inni są zamknięci, dopóki nie ZATWIERDZISZ lub ODWRÓCENIE.


1

Zawsze komentuję wszelkie destrukcyjne zapytania (wstawianie, aktualizowanie, usuwanie, upuszczanie, zmiana) podczas pisania zapytań adhoc w Query Analyzer. W ten sposób jedynym sposobem na ich uruchomienie jest zaznaczenie ich bez zaznaczania komentowanej części i naciśnięcie F5.

Myślę też, że dobrym pomysłem jest, jak już wspomniano, napisanie najpierw instrukcji Where z zaznaczeniem i upewnienie się, że zmieniasz właściwe dane.


1
  1. Zawsze wykonaj kopię zapasową przed zmianą.
  2. Zawsze twórz mody (np. ALTER TABLE) za pomocą skryptu.
  3. Zawsze modyfikuj dane (np. DELETE) za pomocą procedury składowanej.

1

Utwórz użytkownika tylko do odczytu (lub poproś o to administratora DBA) i używaj go tylko do przeglądania bazy danych. Dodaj odpowiednie uprawnienia do schematu, aby można było wyświetlić zawartość procedur składowanych / widoków / wyzwalaczy / itp. ale nie mają możliwości ich zmiany.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.