운영 데이터를 개발 환경에서 테이블로 넣는 방법
운영 환경의 데이터를 개발 환경으로 옮겨 테스트하거나 디버깅할 때, 데이터베이스 테이블에 운영 데이터를 삽입하는 작업은 필수적입니다. 이번 포스팅에서는 이를 효율적으로 수행하는 방법을 단계별로 알아보겠습니다.
1. 데이터 추출: 운영 환경에서 데이터 백업
운영 데이터를 안전하게 다루기 위해, 먼저 필요한 데이터를 백업합니다. 주로 SQL 덤프 파일이나 CSV 형식으로 내보냅니다.
방법: mysqldump 사용
MySQL을 예로 들면, 아래 명령어로 특정 테이블을 백업할 수 있습니다:
mysqldump -u [운영DB_유저] -p [운영DB_이름] [테이블_이름] > backup_table.sql
비밀번호를 입력하면 backup_table.sql
파일이 생성됩니다.
2. 개발 환경 준비: 테이블 구조 확인
운영 데이터베이스와 개발 데이터베이스의 테이블 구조가 동일해야 합니다. 운영 DB의 스키마를 확인하고, 개발 DB에 동일하게 생성합니다.
-- 운영 DB에서 테이블 구조 확인
SHOW CREATE TABLE [테이블_이름];
-- 개발 DB에서 동일 구조 생성
CREATE TABLE [테이블_이름] (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP
);
3. 데이터 삽입: SQL 파일 실행
운영에서 추출한 SQL 파일을 개발 DB에 삽입합니다. MySQL CLI를 사용하면 간단합니다:
mysql -u [개발DB_유저] -p [개발DB_이름] < backup_table.sql
이 명령어는 백업된 데이터를 개발 DB의 테이블에 그대로 삽입합니다.
4. 대량 데이터 처리: CSV 활용
운영 데이터가 크다면 CSV 파일로 내보내고 삽입하는 방법이 효율적입니다.
운영 DB에서 CSV 내보내기
SELECT * FROM [테이블_이름]
INTO OUTFILE '/tmp/data.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
개발 DB에 CSV 삽입
LOAD DATA INFILE '/tmp/data.csv'
INTO TABLE [테이블_이름]
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
주의: MySQL에서 LOAD DATA INFILE
은 서버 설정에 따라 권한 문제가 생길 수 있으니, local_infile
옵션을 활성화하세요.
5. 스크립트로 자동화: Python 예제
반복 작업이라면 Python으로 자동화하면 편리합니다. 아래는 운영 DB에서 데이터를 읽어 개발 DB에 삽입하는 코드입니다:
import mysql.connector
# 운영 DB 연결
prod_db = mysql.connector.connect(
host="prod_host",
user="prod_user",
password="prod_password",
database="prod_db"
)
# 개발 DB 연결
dev_db = mysql.connector.connect(
host="dev_host",
user="dev_user",
password="dev_password",
database="dev_db"
)
prod_cursor = prod_db.cursor()
dev_cursor = dev_db.cursor()
# 데이터 읽기
prod_cursor.execute("SELECT * FROM [테이블_이름]")
rows = prod_cursor.fetchall()
# 데이터 삽입
for row in rows:
dev_cursor.execute("INSERT INTO [테이블_이름] (id, name, created_at) VALUES (%s, %s, %s)", row)
dev_db.commit()
# 연결 종료
prod_cursor.close()
dev_cursor.close()
prod_db.close()
dev_db.close()
위 코드는 테이블 이름과 컬럼을 실제 환경에 맞게 수정해야 합니다.
6. 주의사항
- 개인정보 보호: 운영 데이터에 개인정보가 포함된 경우, 마스킹하거나 테스트용 데이터로 대체하세요.
- 트랜잭션 관리: 삽입 중 오류가 발생하면 롤백할 수 있도록 트랜잭션을 사용하세요.
- 성능 최적화: 대량 데이터 삽입 시 인덱스를 비활성화한 뒤 작업 후 재활성화하면 속도가 빨라집니다.