"DELETE 쿼리에 WHERE 조건 안 썼는데 엔터 쳐버렸어요…"
테이블 전체가 사라졌습니다. 회사 업무가 마비됐죠. 작은 수고가 회사를 구합니다.
DB 직접 수정은 위험합니다. SQL 한 줄 실수로 수천, 수만 건 데이터가 날아갑니다. phpMyAdmin, MySQL Workbench 같은 도구는 편리하지만, "실행 취소" 버튼이 없습니다. 한 번 날아가면 끝입니다.
백업 단계별 가이드
1단계: 테이블 단위 백업
특정 테이블만 수정한다면:
-- 백업 테이블 생성
CREATE TABLE users_backup AS SELECT * FROM users;
복원:
DROP TABLE users;
RENAME TABLE users_backup TO users;
2단계: mysqldump로 전체 백업
mysqldump -u root -p database_name > backup_before_edit.sql
특정 테이블만:
mysqldump -u root -p database_name users orders > backup_tables.sql
3단계: phpMyAdmin 내보내기
테이블 선택 → "내보내기" → SQL 형식 → 다운로드
작업 전 안전 수칙
규칙 1: 백업 먼저, 쿼리는 나중
급해도 백업부터. 1분이면 끝납니다.
규칙 2: SELECT로 먼저 확인
-- 삭제 전
SELECT * FROM users WHERE reg_date < '2020-01-01';
-- 확인 후
DELETE FROM users WHERE reg_date < '2020-01-01';
규칙 3: LIMIT 걸기
-- 위험
DELETE FROM users WHERE status = 'inactive';
-- 안전 (10개씩 확인하며)
DELETE FROM users WHERE status = 'inactive' LIMIT 10;
규칙 4: 트랜잭션 사용
START TRANSACTION;
DELETE FROM users WHERE id = 123;
SELECT * FROM users WHERE id = 123; -- 확인
-- 잘못됐으면
ROLLBACK;
-- 맞으면
COMMIT;
규칙 5: UPDATE는 반드시 WHERE 확인
-- 치명적 실수 (전체 비밀번호 같은 값으로!)
UPDATE users SET password = '123456';
-- 올바른 쿼리
UPDATE users SET password = '123456' WHERE id = 99;
백업 파일 관리
/backups/
├── daily/
│ ├── db_20240527.sql
│ ├── db_20240526.sql
│ └── db_20240525.sql
└── before_major_changes/
├── before_user_migration_20240520.sql
└── before_payment_fix_20240515.sql
최소 1주일치 일일 백업 + 중요 작업 전 백업 별도 보관
복원 연습
백업만 하고 복원 안 해봤다면 무용지물. 최소 분기에 한 번, 백업 파일로 실제 복원해보세요.
mysql -u root -p database_name < backup.sql
실전 사례
어떤 업체는 UPDATE orders SET status = 'cancelled' 쿼리에 WHERE 조건을 빼먹어, 전체 주문이 취소 상태로 바뀌었습니다.
다행히 5분 전 백업이 있었고, 3분 안에 복원했습니다. 백업 없었다면? 상상도 하기 싫습니다.
자동 백업 설정
# cron으로 매일 새벽 2시 자동 백업
0 2 * * * mysqldump -u root -p'password' dbname > /backup/db_$(date +\%Y\%m\%d).sql
작은 수고가 회사를 구합니다. "설마 내가 실수하겠어?"는 위험한 생각입니다. 누구나 실수합니다.
백업만이 답입니다. 유지보수는 백업입니다.
'PHP 실무' 카테고리의 다른 글
| 반복 SQL 자동화 팁 (0) | 2026.10.23 |
|---|---|
| 사소한 수정이 시스템 전체에 미친 파장 (0) | 2026.10.09 |
| MySQL → MariaDB 전환 이슈 (0) | 2026.10.02 |
| .htaccess 접근 제한 팁 (0) | 2026.09.25 |
| PHP 4/5 코드를 최신 7/8 서버에서 돌릴 때 체크리스트 (0) | 2026.09.18 |