우분투 도커 환경에서 PostgreSQL 데이터베이스 간 데이터 마이그레이션을 수행하는 방법을 안내합니다.
source_database
target_database
your_username
your_container_id
데이터베이스 목록 확인
sudo docker exec -it <container_id> psql -U <username> -l
소스 데이터베이스 테이블 확인
sudo docker exec -it <container_id> psql -U <username> -d <source_database> -c "SELECT schemaname,tablename FROM pg_tables WHERE schemaname = 'public';"
테이블별 데이터 건수 확인
sudo docker exec -it <container_id> psql -U <username> -d <source_database> -c "
SELECT
'table1' as table_name, COUNT(*) as row_count FROM table1
UNION ALL
SELECT
'table2' as table_name, COUNT(*) as row_count FROM table2
UNION ALL
SELECT
'table3' as table_name, COUNT(*) as row_count FROM table3;
-- 필요한 테이블 추가
"
대상 데이터베이스 백업 (안전을 위해)
sudo docker exec -t <container_id> pg_dump -U <username> -d <target_database> > target_database_backup.sql
소스 데이터베이스에서 데이터만 덤프
sudo docker exec -t <container_id> pg_dump -U <username> -d <source_database> --data-only --inserts --disable-triggers > source_data_only.sql
덤프 파일 크기 확인
ls -lh source_data_only.sql
외래키 제약조건을 고려한 데이터 삭제
sudo docker exec -it <container_id> psql -U <username> -d <target_database> -c "
-- 외래키 체크 비활성화
SET session_replication_role = replica;
-- 모든 테이블 데이터 삭제 (의존성 순서대로)
-- 참조되는 테이블부터 삭제
TRUNCATE TABLE child_table1, child_table2 RESTART IDENTITY CASCADE;
TRUNCATE TABLE parent_table1 RESTART IDENTITY CASCADE;
TRUNCATE TABLE parent_table2 RESTART IDENTITY CASCADE;
-- 외래키 체크 재활성화
SET session_replication_role = DEFAULT;
"
덤프된 데이터를 대상 데이터베이스에 삽입
sudo docker exec -i <container_id> psql -U <username> -d <target_database> < source_data_only.sql
대상 데이터베이스 데이터 건수 확인
sudo docker exec -it <container_id> psql -U <username> -d <target_database> -c "
SELECT
'table1' as table_name, COUNT(*) as row_count FROM table1
UNION ALL
SELECT
'table2' as table_name, COUNT(*) as row_count FROM table2
UNION ALL
SELECT
'table3' as table_name, COUNT(*) as row_count FROM table3;
-- 필요한 테이블 추가
"
RESTART IDENTITY CASCADE
옵션으로 시퀀스도 함께 초기화하세요SUPERUSER
권한이 필요할 수 있습니다2>&1
을 추가하세요--disable-triggers
옵션을 사용하세요SET session_replication_role = replica;
로 제약조건을 일시적으로 비활성화하세요--data-only
옵션을 사용하여 스키마는 제외하고 데이터만 마이그레이션하세요# 특정 테이블만 덤프
sudo docker exec -t <container_id> pg_dump -U <username> -d <source_database> -t <table_name> --data-only --inserts > specific_table_data.sql
# 특정 테이블에만 삽입
sudo docker exec -i <container_id> psql -U <username> -d <target_database> < specific_table_data.sql
# 압축된 덤프 생성
sudo docker exec -t <container_id> pg_dump -U <username> -d <source_database> --data-only | gzip > source_data.sql.gz
# 압축된 덤프 복원
gunzip -c source_data.sql.gz | sudo docker exec -i <container_id> psql -U <username> -d <target_database>
# 병렬 덤프 (디렉토리 형식)
sudo docker exec -t <container_id> pg_dump -U <username> -d <source_database> --data-only -j <num_jobs> -f dump_directory -F d
# 병렬 복원
sudo docker exec -t <container_id> pg_restore -U <username> -d <target_database> -j <num_jobs> dump_directory
<container_id>
, <username>
, <source_database>
, <target_database>
등의 플레이스홀더를 실제 환경에 맞게 변경하세요무작위 포스트가 추천됩니다.
자바의 일반적인 상수는 변수를 선언할 때 final이라는 선언을 추가하면 그 변수는 '상수'가 된다. 그리고 상수는 다음과 같은 특징이 있다.
처음 자바에 대한 글을 작성할때 변수와 자료형에 대해 알아보았다. 그리고 자료형에는 기본 자료형과 참조 자료형이 있다고 하였다. 참조형에 대해선 그 당시에 다루지 않았는데, 참조 자료형은 클래스에 대한 기본적인 지식을 가지고 있어야 이해하기 편하다고 생각하였다.
자바에서 제공하는 this 키워드는 인스턴스 자기 자신를 가리키는 키워드이다. 이 this 키워드를 통해 클래스 메서드 및 생성자에서 자기 자신의 데이터를 업데이트하거나 조작할 수 있다.