PHP 실무

DB 직접 수정 전 필수 백업 팁

프리터코더 2026. 10. 16. 14:40

"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

작은 수고가 회사를 구합니다. "설마 내가 실수하겠어?"는 위험한 생각입니다. 누구나 실수합니다.
백업만이 답입니다. 유지보수는 백업입니다.