라이브 데이터베이스를 조심하는 # 1 방법은 무엇입니까? [닫은]


80

내 고객을 위해 나는 때때로 그들이 스스로 만든 문제를 수정하거나 내 제품의 버그가 만든 잘못된 데이터를 수정하기 위해 라이브 데이터베이스에서 작업합니다. Unix 루트 액세스와 마찬가지로 위험합니다. 미리 어떤 교훈을 배워야합니까?

라이브 데이터에서 작업 할 때 가장주의해야 할 일은 무엇입니까?

답변:


101

내가 수년 동안 힘들게 배운 세 가지 ...

첫째, 라이브 데이터에 대해 업데이트 또는 삭제를 수행하는 경우 먼저 사용할 WHERE 절을 사용하여 SELECT 쿼리를 작성합니다. 작동하는지 확인하십시오. 올바른지 확인하십시오. 그런 다음 UPDATE / DELETE 문을 알려진 작업 WHERE 절 앞에 추가합니다.

당신은 갖고 싶지 않다

DELETE FROM Customers

쿼리 분석기에 앉아 WHERE 절을 작성하기를 기다리고 있습니다. 실수로 "실행"을 누르고 방금 Customer 테이블을 종료했습니다. 죄송합니다.

또한 플랫폼에 따라 테이블의 빠르고 더러운 백업을 수행하는 방법을 찾으십시오. SQL Server 2005에서는

SELECT *
INTO CustomerBackup200810032034
FROM Customer

전체 Customer 테이블의 모든 행을 CustomerBackup200810032034라는 새 테이블로 복사합니다. 그런 다음 업데이트를 완료하고 모든 것이 정상인지 확인하면 삭제할 수 있습니다. 최악의 상황이 발생하면 어젯밤의 백업을 디스크 나 테이프에서 복원하는 것보다이 테이블에서 누락 된 데이터를 복원하는 것이 훨씬 쉽습니다.

마지막으로, 삭제하지 않으려는 항목을 제거하는 계단식 삭제에주의하십시오. 변경하기 전에 테이블의 관계와 키 제약 조건을 확인하십시오.


1
그냥 기술적 인 고객으로부터 삭제를 의미하지
않습니까?

5
또는 계단식으로 아무것도 사용하지 않는 것이 좋습니다.
dkretz 2009

108
BEGIN TRANSACTION;

이렇게하면 실수 후 롤백 할 수 있습니다.


네, 얼굴 손바닥의 광기를 막는 유일한 방법입니다.
willasaywhat

11
@Graeme, 프로덕션 데이터베이스에서 DDL을 수행하면 안됩니다. 스크립트를 작성하고 테스트 데이터베이스에서 실행하고 테스트 데이터베이스가 QA를 통과 한 후 프로덕션 서버에서 실행해야합니다.
Paul Tomblin

1
@Paul : 물론입니다. 그러나 DDL이든 DML이든 상관없이 프로덕션 데이터베이스에 대한 모든 종류의 수정에 대해 동일한 작업을 수행해야한다고 주장 할 수 있습니다.이 경우이 모든 질문은 의미가 없습니다.
Graeme Perrow

3
Eduardo, 지금까지 45 표를 얻었습니다. 왜냐하면 대부분의 경우 손가락이 키보드에서 끝까지 움직이기 전에 식은 땀이 나기 시작하지만 손가락을 멈추기에는 너무 늦었습니다.
Euro Micelli

1
또한 동일한 트랜잭션 내에서 여러 선택 항목을 실행하여 커밋하기 전에 결과를 확인할 수 있다는 점에서 유용합니다. 예상치 못한 경우에는 아무런 해를 끼치 지 않고 롤백 만하면됩니다.
Dave Cluderay

50

먼저 백업을 수행하십시오. 어쨌든 시스템 관리의 첫 번째 법칙이어야합니다.

편집 : 다른 사람들이 말한 것을 통합하여 업데이트에 적절한 WHERE 절이 있는지 확인하십시오.

이상적으로는 라이브 데이터베이스 변경이 발생하지 않아야합니다 (INSERT 및 기본 유지 관리 외에). 라이브 DB의 구조를 변경하는 것은 특히 잠재적 인 업장으로 가득 차 있습니다.


25

사본을 변경하고 만족 스러우면 수정 사항을 적용하십시오.


대부분의 경우 복사 db는 라이브와 다르며 모든 변경 사항이 복사 및 라이브와 동일하지는 않습니다.
bugBurger

복사 데이터베이스가 라이브 데이터베이스와 다른 경우 실제로 복사 데이터베이스가 아님을 의미하지 않습니까? 테스트 / QA / 복사 데이터베이스의 전체 목적은 변경 사항이 라이브 / 프로덕션 데이터베이스에 적용되기 전에 테스트하는 것입니다.
Wilco

22

종종 UPDATE 또는 DELETE를 수행하기 전에 동등한 SELECT를 작성합니다.


빠르고 간단한 확인으로이 방법도 마음에 듭니다. 결과 수에 따라 작동하지 않을 수 있지만 적어도 UPDATES 및 DELETES의 시작입니다.
osp70

18

BEGIN TRAN t1에 있지 않는 한 업데이트를 수행하지 마십시오. 개발 데이터베이스가 아니고 프로덕션이 아닙니다. 주석 외부에서 COMMIT TRAN t1을 실행하지 마십시오.

--COMMIT TRAN t1

실행하려면 문을 선택하십시오. (분명히 이것은 GUI 쿼리 클라이언트에만 적용됩니다.) 이러한 작업을 수행하면이 작업을 수행하는 것이 제 2의 천성이되고 거의 시간을 잃지 않을 것입니다.

실제로 이것을 입력하는 "업데이트"매크로가 있습니다. 업데이트를 설정하기 위해 항상 이것을 붙여 넣습니다. 삭제 및 삽입을 위해 유사한 것을 만들 수 있습니다.

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

네, 바로 제가하는 일입니다. 너무 많은 사람들이 "where 절을 잊지 마세요"라고 말하지만, 그것이 틀렸다면 어떻게 될까요? 절대로이 시작 / 롤백 /-커밋 패턴없이 라이브 데이터베이스를 업데이트하지 마십시오.
Eric Z Beard

추가 개선 사항은 먼저 where 절을 사용하여 "select * from"을 수행하여 올바른지 확인한 다음 동일한 where 절로 업데이트를 실행하는 것입니다.
Eric Z Beard

Eric의 말이 맞지만, 스코프 크립을 피하기 위해 이것을 내 매크로에서 제외합니다. 일반적인 용도로 "select * from"을 입력하는 다른 매크로가 있습니다.
Patrick Szalapski

이렇게하지 않을 이유가 없습니다. 이전 작업에서 업데이트 스크립트를 작성해야했을 때 업데이트 SELECT, 이후 SELECT와 함께 이렇게했기 때문에 결과를 볼 수있었습니다. 여러 번 실행하고 결과가 올바른지 확인한 후 ROLLBACK을 COMMIT로 변경했습니다.
Ryan Lundy

13

항상 UPDATE 및 DELETE에 적절한 WHERE 절이 있는지 확인하십시오.


네, 전에 불에 탔어요.
Ian Jacobs

나도. 그 이후로 저는 where 절이 먼저 나오도록 SQL을 설계했으면합니다.
Greg Hewgill

빠른 UPDATE를 실행할 때 가라 앉는 느낌을 좋아하고 "1279209394 레코드가 영향을 받았습니다."라고 말합니다. 어 오. ;)
Kevin Fairchild

13

내 질문에 답하려면 :

업데이트 문을 작성할 때 순서대로 작성하십시오.

  1. 쓰다 UPDATE [table-name]
  2. 쓰다 WHERE [conditions]
  3. 돌아가서 쓰기 SET [columns-and-values]

변경하려는 값을 말하기 전에 업데이트 할 행을 선택하는 것이 다른 순서로 수행하는 것보다 훨씬 안전합니다. update person set email = 'bob@bob.com'쿼리 창에 앉아 잘못 배치 된 키 입력으로 실행할 준비가되어 테이블의 모든 행을 엉망으로 만들 준비가되어있는 것은 불가능 합니다.

편집 : 다른 사람들이 말했듯이 작성 WHERE하기 전에 삭제 조항을 작성하십시오 DELETE.


11

예를 들어 다음과 같은 SQL을 만듭니다.

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

마지막부터 SQL 선택 및 실행까지 텍스트를 강조 표시합니다. 업데이트하려는 레코드를 가져 오는지 확인한 후 Shift-up을 눌러 Update 문을 강조 표시하고 실행합니다.

별칭을 사용했습니다. 테이블 이름을 명시 적으로 업데이트하지 않습니다. 나는 항상 별칭을 사용합니다.

트랜잭션 및 롤백 / 커밋과 함께이 작업을 수행하면 정말 안전합니다.


나는 또한 선택 검사를 사용합니다-나는 이런 식으로 여러 where 절 오류를 발견했습니다. 특히 문장이 복잡 할 때 좋은 온 전성 검사입니다.
Bob Probst

이 방법은 관리자가 한낮에 생산에서 중요한 테이블을 삭제하는 것을보고 짧은 시간에 연마되었습니다.
wcm

나는 선택을 전환하고 선택에 대한 주석을 업데이트하고 제거합니다. 그런 다음 준비가되면 영역을 강조 표시하고 실행합니다. 삭제도 가능합니다.
rball

11

라이브 데이터베이스를 조심하는 # 1 방법? 만지지 마십시오. :)

백업은 데이터베이스에 가한 손상을 되돌릴 수 있지만 그 기간 동안 여전히 부정적인 부작용을 일으킬 가능성이 있습니다.

작업중인 스크립트가 아무리 견고하다고 생각하더라도 테스트주기를 통해 실행하십시오. "테스트주기"가 자신의 데이터베이스 인스턴스에 대해 스크립트를 실행하는 것을 의미하더라도 반드시 수행하십시오. 프로덕션 환경보다 로컬 박스에 결함을 도입하는 것이 훨씬 낫습니다.


6
  1. 업데이트를 수행하는 모든 설명을 확인하고 다시 확인하고 다시 확인하십시오. 간단한 단일 열 업데이트를 수행한다고 생각하더라도 조만간 커피가 충분하지 않고 'where'절을 잊어 버리고 전체 테이블을 누를 수 있습니다.

도움이되는 몇 가지 다른 사항 :

이 3 가지가 심각한 해를 끼치 지 못하도록했습니다.


예, 클래식 : UPDATE TABLE_NAME SET FIELD_X = 'whatever'[WHERE = missing]
Stefan Steiger

6
  • 아무도 백업을 원하지 않지만 모두는 복구를 위해 울고
  • 다음을 수행해야하므로 외래 키 참조로 DB를 생성합니다.
  • 데이터를 업데이트 / 삭제하고 구조적 무결성 / 다른 것을 파괴하는 것을 가능한 한 어렵게 만듭니다.
  • 가능하면 변경 사항을 영구적으로 저장하기 전에 커밋해야하는 시스템에서 실행하십시오 (예 : db를 복구하는 동안 자동 커밋 비활성화).
  • 문제의 클래스를 식별하여 문제없이 해결하는 방법을 이해하십시오.
  • 데이터베이스에 백업을 재생하는 루틴을 확보하고 항상 테스트 서버에 두 번째 데이터베이스를 보유하고 있으므로 작업 만 수행 할 수 있습니다.
  • 기억하기 : 무언가가 완전히 실패하면 가능한 한 빨리 다시 실행해야합니다.

그게 제가 지금 생각할 수있는 전부입니다. 대담한 구절을 보시면 제 1 위가 무엇인지 알 수 있습니다. ;-)


중요한 안전 메커니즘이기 때문에 자동 커밋에 대한 언급을 추가하고 싶습니다. 데이터베이스에 직접 연결하는 경우 일반적으로 db 연결 매개 변수에서 자동 커밋을 끌 수 있습니다. 그렇지 않으면 (db 프런트 엔드 제품) 애플리케이션 설정을 찾아야 할 수도 있습니다.
Mike Monette

3

삭제 또는 삭제를 전혀 사용하지 않는 것이 좋습니다. 또는 특정 DB 사용자 만 항목을 삭제 / 삭제할 수 있도록 사용자 권한을 줄이십시오.


3

Oracle 또는이를 지원하는 다른 데이터베이스를 사용하는 경우 COMMIT를 수행하기 전에 변경 사항을 확인하십시오.


거래가 보류되는 동안 레코드가 잠길 수 있으므로주의해야합니다.
Greg Ogle

나는 보통 오라클에 SQL 개발자를 사용하며 실행 후에도 자동으로 커밋되지 않습니다. 그래서 우리는 미리보기를 한 다음 커밋합니다. 멋진 기능 !!
lakshminb7

3

데이터는 항상 스크립트를 통해 라이브로 배포되어야하며, dev에서 올바르게 가져 오는 데 필요한만큼 여러 번 연습 할 수 있습니다. dev에서 스크립트가 올바르게 실행되는 데 필요한 종속 데이터가있는 경우 적절하게 스테이징하십시오. 진정으로 조심하고 싶다면이 단계에서 벗어날 수 없습니다.




2

@ Wayne이 말한 내용을 추가하려면 or 문 WHERE에서 테이블 이름 앞에 씁니다 .DELETEUPDATE


2

데이터를 백업하십시오. 정기적으로 고객 데이터베이스로 작업하는 것이 어려운 방법임을 배웠습니다.



2

내 규칙 (앱 개발자로서) : 만지지 마십시오! 이것이 훈련 된 DBA의 목적입니다. 도대체 만져도 괜찮아요. :)


2

환경마다 다른 색상 : PL \ SQL 개발자 (Oracle 용 IDE)를 설정하여 프로덕션 DB에 로그온 할 때 모든 창이 밝은 빨간색으로 표시됩니다. 일부는 개발 및 테스트에 대해 다른 색상을 할당하는 데까지 이르렀습니다.



1

항상 개발 데이터에 대한 선택 이외의 쿼리를 먼저 테스트하여 올바른 영향이 있는지 확인하십시오.


1
  1. 가능하면 누군가와 페어링하도록 요청하십시오.
  2. Enter를 누르기 전에 항상 3까지 세십시오 (혼자라면 쌍 파트너를 화나게 할 것입니다!)

1

스크립트로 데이터베이스를 업데이트하는 경우 실수로 실행 / 실행할 경우를 대비하여 스크립트 시작 부분에 중단 점을 한두 개 넣었는지 항상 확인합니다.


1

UPDATE 전에 BEGIN TRAN을 수행하는 권장 사항을 추가 할 것입니다. 실제로 COMMIT를 수행하는 것을 잊지 마십시오. 커밋되지 않은 트랜잭션을 열어두면 많은 피해를 입을 수 있습니다. 업데이트 중일 때 전화, 동료, 점심 등으로 인해주의가 산만 해지지 마십시오. 그렇지 않으면 COMMIT 또는 ROLLBACK을 수행 할 때까지 다른 모든 사람이 갇혀있는 것을 알 수 있습니다.


1

쿼리 분석기에서 임시 쿼리를 작성할 때 항상 파괴적인 쿼리 (삽입, 업데이트, 삭제, 삭제, 변경)를 주석 처리합니다. 이렇게하면 주석 처리 된 부분을 선택하지 않고 강조 표시 한 다음 F5 키를 눌러 실행할 수 있습니다.

또한 이미 언급했듯이 select를 사용하여 where 문을 먼저 작성하고 올바른 데이터를 변경하고 있는지 확인하는 것이 좋습니다.


1
  1. 변경하기 전에 항상 백업하십시오.
  2. 항상 스크립트를 통해 모드 (예 : ALTER TABLE)를 만드십시오.
  3. 항상 저장 프로 시저를 통해 데이터를 수정하십시오 (예 : DELETE).

1

읽기 전용 사용자를 만들고 (또는 DBA에게 요청) 해당 사용자 만 사용하여 DB를 확인합니다. 저장 프로 시저 /보기 / 트리거 등의 내용을 볼 수 있도록 스키마에 적절한 권한을 추가합니다. 그러나 그것들을 바꿀 수있는 능력은 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.