最終更新 1756818083

OGG revised this gist 1756818083. Go to revision

1 file changed, 3 insertions, 3 deletions

shp2pgsql_local.sh

@@ -14,7 +14,7 @@ SRID_NEW=0 # 변환 좌표계 (0이면 좌표변환 안함)
14 14 CHARSET="UTF-8" # 문자 인코딩
15 15
16 16 SHP_DIR="./" # shp 파일들이 있는 디렉토리 경로
17 - MAX_JOBS=8 # 병렬 작업 수 (시스템 성능에 따라 조정)
17 + MAX_JOBS=2 # 병렬 작업 수 (시스템 성능에 따라 조정)
18 18
19 19
20 20 # 로그 파일 설정
@@ -52,9 +52,9 @@ function import_append() {
52 52
53 53 # COPY 모드로 처리 (가장 빠름)
54 54 if [ "$SRID_NEW" -ne 0 ]; then
55 - OUTPUT=$(shp2pgsql -D -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
55 + OUTPUT=$(shp2pgsql -D -a -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
56 56 else
57 - OUTPUT=$(shp2pgsql -D -W "$CHARSET" -s $SRID_ORI "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
57 + OUTPUT=$(shp2pgsql -D -a -W "$CHARSET" -s $SRID_ORI "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
58 58 fi
59 59
60 60 EXIT_CODE=$?

OGG revised this gist 1756815380. Go to revision

1 file changed, 69 insertions, 55 deletions

shp2pgsql_local.sh

@@ -16,6 +16,7 @@ CHARSET="UTF-8" # 문자 인코딩
16 16 SHP_DIR="./" # shp 파일들이 있는 디렉토리 경로
17 17 MAX_JOBS=8 # 병렬 작업 수 (시스템 성능에 따라 조정)
18 18
19 +
19 20 # 로그 파일 설정
20 21 LOG_DIR="./" # 로그 디렉토리 (필요시 경로 변경)
21 22 mkdir -p "$LOG_DIR" # 로그 디렉토리가 없으면 생성
@@ -38,7 +39,7 @@ function wait_for_jobs() {
38 39 done
39 40 }
40 41
41 - # append 함수 정의
42 + # append 함수 정의 (COPY 모드 전용)
42 43 function import_append() {
43 44 SHP="$1"
44 45 BASENAME=$(basename "$SHP")
@@ -49,12 +50,13 @@ function import_append() {
49 50
50 51 logger "🚀 [시작] $BASENAME 처리 시작: $FILE_START_TIME"
51 52
52 - # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
53 + # COPY 모드로 처리 (가장 빠름)
53 54 if [ "$SRID_NEW" -ne 0 ]; then
54 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
55 + OUTPUT=$(shp2pgsql -D -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
55 56 else
56 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
57 + OUTPUT=$(shp2pgsql -D -W "$CHARSET" -s $SRID_ORI "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
57 58 fi
59 +
58 60 EXIT_CODE=$?
59 61
60 62 # 처리 종료 시간 기록
@@ -76,19 +78,18 @@ function import_append() {
76 78 else
77 79 logger "❌ [실패] $BASENAME 처리 실패: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
78 80
79 - # 오류 메시지만 추출하여 로그에 기록
80 - ERROR_MSG=$(echo "$OUTPUT" | grep -E "(ERROR|FATAL|WARNING|오류|실패|실패했습니다)" || echo "$OUTPUT")
81 - if [ -n "$ERROR_MSG" ]; then
82 - logger "⚠️ 오류 내용: $ERROR_MSG"
83 - echo "=== $BASENAME 처리 오류 상세 내용 ===" >> "$LOG_FILE"
84 - echo "$OUTPUT" >> "$LOG_FILE"
85 - echo "=====================================" >> "$LOG_FILE"
86 - fi
81 + # 오류 내용을 로그에 기록
82 + logger "⚠️ 오류 내용: $OUTPUT"
83 + echo "=== $BASENAME 처리 오류 상세 내용 ===" >> "$LOG_FILE"
84 + echo "$OUTPUT" >> "$LOG_FILE"
85 + echo "=====================================" >> "$LOG_FILE"
87 86
88 87 logger "🔄 다음 파일 처리를 계속 진행합니다."
89 88 fi
90 89 }
91 90
91 +
92 +
92 93 # 시작 시간 기록
93 94 START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
94 95 START_TIMESTAMP=$(date +%s)
@@ -125,11 +126,35 @@ logger " - 스키마: $SCHEMA"
125 126 logger " - 테이블: $TABLE"
126 127
127 128 # PostgreSQL 연결 테스트
128 - if ! psql -U "$USER" -d "$DB" -c "SELECT 1;" >/dev/null 2>&1; then
129 + if ! psql -q -U "$USER" -d "$DB" -c "SELECT 1;" >/dev/null 2>&1; then
129 130 logger "❌ 오류: PostgreSQL 연결 실패. 데이터베이스 연결을 확인해주세요."
130 131 exit 1
131 132 fi
132 - logger "✅ PostgreSQL 연결 성공"
133 +
134 + # 스키마 존재 확인 및 생성
135 + SCHEMA_EXISTS=$(psql -q -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = '$SCHEMA_LOWER');" 2>/dev/null | xargs)
136 +
137 + if [ "$SCHEMA_EXISTS" != "t" ]; then
138 + logger "📋 스키마 $SCHEMA_LOWER 생성 중..."
139 + SCHEMA_OUTPUT=$(psql -q -U "$USER" -d "$DB" -c "CREATE SCHEMA IF NOT EXISTS $SCHEMA_LOWER;")
140 + if [ $? -ne 0 ]; then
141 + logger "❌ 스키마 생성 실패: $SCHEMA_OUTPUT"
142 + exit 1
143 + fi
144 + fi
145 +
146 + # PostGIS 확장 확인
147 + POSTGIS_EXISTS=$(psql -q -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'postgis');" 2>/dev/null | xargs)
148 +
149 + if [ "$POSTGIS_EXISTS" != "t" ]; then
150 + logger "⚠️ PostGIS 확장 설치 중..."
151 + POSTGIS_OUTPUT=$(psql -q -U "$USER" -d "$DB" -c "CREATE EXTENSION IF NOT EXISTS postgis;")
152 + if [ $? -ne 0 ]; then
153 + logger "❌ PostGIS 확장 설치 실패: $POSTGIS_OUTPUT"
154 + logger "⚠️ PostGIS 확장을 수동으로 설치해주세요."
155 + exit 1
156 + fi
157 + fi
133 158
134 159 # 좌표계 설정 확인 및 로깅
135 160 if [ "$SRID_NEW" -ne 0 ]; then
@@ -142,13 +167,13 @@ logger "=================================="
142 167 logger "🚀 Import 시작: $START_TIME"
143 168 logger "=================================="
144 169
145 - # 테이블 존재 여부 확인
146 - logger "🔍 테이블 존재 여부 확인 중: $SCHEMA_LOWER.$TABLE_LOWER"
147 -
148 - # 테이블 존재 여부를 더 안정적으로 확인 (소문자로 비교)
149 - TABLE_EXISTS=$(psql -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = '$SCHEMA_LOWER' AND table_name = '$TABLE_LOWER');" 2>/dev/null | xargs)
170 + # 성능 최적화 설정 로깅
171 + logger "⚡ 성능 최적화 설정:"
172 + logger " - COPY 모드: ✅ 활성화 (INSERT 대비 10-100배 빠름)"
173 + logger " - 병렬 작업 수: $MAX_JOBS개"
150 174
151 - logger "🔍 테이블 존재 확인 결과: '$TABLE_EXISTS'"
175 + # 테이블 존재 여부 확인
176 + TABLE_EXISTS=$(psql -q -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = '$SCHEMA_LOWER' AND table_name = '$TABLE_LOWER');" 2>/dev/null | xargs)
152 177
153 178 # 모든 SHP 파일을 배열로 수집 (공백이 포함된 파일명도 안전하게 처리)
154 179 mapfile -t SHP_FILES < <(find "$SHP_DIR" -name "*.shp" | sort)
@@ -187,13 +212,13 @@ else
187 212 TABLE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
188 213 TABLE_START_TIMESTAMP=$(date +%s)
189 214
190 - logger "🚀 [시작] 테이블 생성 시작: $FIRST_BASENAME - $TABLE_START_TIME"
215 + logger "🚀 [시작] 테이블 구조 생성 시작: $FIRST_BASENAME - $TABLE_START_TIME"
191 216
192 - # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
217 + # 좌표변환 여부에 따라 shp2pgsql 명령어 결정 (테이블 구조만 생성, 데이터는 나중에)
193 218 if [ "$SRID_NEW" -ne 0 ]; then
194 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
219 + OUTPUT=$(shp2pgsql -p -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
195 220 else
196 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
221 + OUTPUT=$(shp2pgsql -p -W "$CHARSET" -s $SRID_ORI "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -q -U "$USER" -d "$DB")
197 222 fi
198 223 EXIT_CODE=$?
199 224
@@ -212,24 +237,21 @@ else
212 237 if [ $TABLE_MINUTES -lt 1 ]; then TABLE_MINUTES=0; fi
213 238
214 239 if [ $EXIT_CODE -eq 0 ]; then
215 - logger "✅ [완료] 테이블 생성 완료: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
240 + logger "✅ [완료] 테이블 구조 생성 완료: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
216 241
217 - # 나머지 파일들을 append 모드로 병렬 처리
218 - if [ $TOTAL_FILES -gt 1 ]; then
219 - logger "🔄 나머지 $((TOTAL_FILES - 1))개 파일을 append 모드로 병렬 처리합니다..."
220 - for ((i=1; i<TOTAL_FILES; i++)); do
221 - if [ -n "${SHP_FILES[i]}" ]; then
222 - shp="${SHP_FILES[i]}"
223 - wait_for_jobs
224 - import_append "$shp" &
225 - logger "🔄 백그라운드 작업 시작: $(basename "$shp")"
226 - fi
227 - done
228 - wait
229 - logger "✅ 모든 append 작업 완료"
230 - fi
242 + # 모든 파일을 한꺼번에 병렬 처리로 데이터 적재 (첫 번째 파일 포함)
243 + logger "🔄 모든 $TOTAL_FILES개 파일을 병렬 처리로 데이터 적재합니다..."
244 + for shp in "${SHP_FILES[@]}"; do
245 + if [ -n "$shp" ]; then
246 + wait_for_jobs
247 + import_append "$shp" &
248 + logger "🔄 백그라운드 작업 시작: $(basename "$shp")"
249 + fi
250 + done
251 + wait
252 + logger "✅ 모든 데이터 적재 작업 완료"
231 253 else
232 - logger "❌ [실패] 테이블 생성 실패: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
254 + logger "❌ [실패] 테이블 구조 생성 실패: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
233 255 echo "$OUTPUT" >> "$LOG_FILE"
234 256 exit 1
235 257 fi
@@ -264,24 +286,16 @@ INDEX_START_TIMESTAMP=$(date +%s)
264 286 logger "🔍 공간 인덱스 생성 시작: $INDEX_START_TIME"
265 287
266 288 # 공간 인덱스 생성 (PostGIS 확장이 활성화되어 있어야 함)
267 - INDEX_OUTPUT=$(psql -U "$USER" -d "$DB" -c "CREATE INDEX IF NOT EXISTS ${TABLE_LOWER}_geom_idx ON $SCHEMA_LOWER.$TABLE_LOWER USING GIST (geom);" 2>&1)
289 + INDEX_OUTPUT=$(psql -q -U "$USER" -d "$DB" -c "CREATE INDEX IF NOT EXISTS ${TABLE_LOWER}_geom_idx ON $SCHEMA_LOWER.$TABLE_LOWER USING GIST (geom);")
268 290 INDEX_EXIT_CODE=$?
269 291
270 - if [ $INDEX_EXIT_CODE -eq 0 ]; then
271 - logger "✅ Spatial index created successfully"
272 - else
273 - logger "❌ Failed to create spatial index"
274 -
275 - # 오류 메시지만 추출하여 로그에 기록
276 - INDEX_ERROR_MSG=$(echo "$INDEX_OUTPUT" | grep -E "(ERROR|FATAL|WARNING|오류|실패|실패했습니다)" || echo "$INDEX_OUTPUT")
277 - if [ -n "$INDEX_ERROR_MSG" ]; then
278 - logger "⚠️ 인덱스 생성 오류 내용: $INDEX_ERROR_MSG"
279 - echo "=== 공간 인덱스 생성 오류 상세 내용 ===" >> "$LOG_FILE"
280 - echo "$INDEX_OUTPUT" >> "$LOG_FILE"
281 - echo "=====================================" >> "$LOG_FILE"
282 - fi
292 + if [ $INDEX_EXIT_CODE -ne 0 ]; then
293 + # 오류 내용을 로그에 기록
294 + logger "⚠️ 인덱스 생성 오류: $INDEX_OUTPUT"
295 + echo "=== 공간 인덱스 생성 오류 상세 내용 ===" >> "$LOG_FILE"
296 + echo "$INDEX_OUTPUT" >> "$LOG_FILE"
297 + echo "=====================================" >> "$LOG_FILE"
283 298
284 - logger "⚠️ PostGIS 확장이 활성화되어 있는지 확인하세요: CREATE EXTENSION IF NOT EXISTS postgis;"
285 299 logger "🔄 인덱스 생성에 실패했지만 스크립트는 계속 진행됩니다."
286 300 fi
287 301

OGG revised this gist 1756809954. Go to revision

1 file changed, 134 insertions, 109 deletions

shp2pgsql_local.sh

@@ -26,6 +26,69 @@ logger() {
26 26 echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
27 27 }
28 28
29 + # job control 함수 (병렬 처리 제한)
30 + function wait_for_jobs() {
31 + local current_jobs
32 + while true; do
33 + current_jobs=$(jobs -rp | wc -l)
34 + if [ "$current_jobs" -lt "$MAX_JOBS" ]; then
35 + break
36 + fi
37 + sleep 0.5
38 + done
39 + }
40 +
41 + # append 함수 정의
42 + function import_append() {
43 + SHP="$1"
44 + BASENAME=$(basename "$SHP")
45 +
46 + # 처리 시작 시간 기록
47 + FILE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
48 + FILE_START_TIMESTAMP=$(date +%s)
49 +
50 + logger "🚀 [시작] $BASENAME 처리 시작: $FILE_START_TIME"
51 +
52 + # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
53 + if [ "$SRID_NEW" -ne 0 ]; then
54 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
55 + else
56 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
57 + fi
58 + EXIT_CODE=$?
59 +
60 + # 처리 종료 시간 기록
61 + FILE_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
62 + FILE_END_TIMESTAMP=$(date +%s)
63 + FILE_DURATION=$((FILE_END_TIMESTAMP - FILE_START_TIMESTAMP))
64 +
65 + # 파일별 소요시간을 시:분:초 형식으로 변환
66 + FILE_HOURS=$((FILE_DURATION / 3600))
67 + FILE_MINUTES=$(((FILE_DURATION % 3600) / 60))
68 + FILE_SECONDS=$((FILE_DURATION % 60))
69 +
70 + # 1보다 작으면 0으로 표시
71 + if [ $FILE_HOURS -lt 1 ]; then FILE_HOURS=0; fi
72 + if [ $FILE_MINUTES -lt 1 ]; then FILE_MINUTES=0; fi
73 +
74 + if [ $EXIT_CODE -eq 0 ]; then
75 + logger "✅ [완료] $BASENAME 처리 완료: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
76 + else
77 + logger "❌ [실패] $BASENAME 처리 실패: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
78 +
79 + # 오류 메시지만 추출하여 로그에 기록
80 + ERROR_MSG=$(echo "$OUTPUT" | grep -E "(ERROR|FATAL|WARNING|오류|실패|실패했습니다)" || echo "$OUTPUT")
81 + if [ -n "$ERROR_MSG" ]; then
82 + logger "⚠️ 오류 내용: $ERROR_MSG"
83 + echo "=== $BASENAME 처리 오류 상세 내용 ===" >> "$LOG_FILE"
84 + echo "$OUTPUT" >> "$LOG_FILE"
85 + echo "=====================================" >> "$LOG_FILE"
86 + fi
87 +
88 + logger "🔄 다음 파일 처리를 계속 진행합니다."
89 + fi
90 + }
91 +
29 92 # 시작 시간 기록
30 93 START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
31 94 START_TIMESTAMP=$(date +%s)
@@ -87,136 +150,98 @@ TABLE_EXISTS=$(psql -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM info
87 150
88 151 logger "🔍 테이블 존재 확인 결과: '$TABLE_EXISTS'"
89 152
90 - # 모든 SHP 파일을 배열로 수집
91 - SHP_FILES=($(find "$SHP_DIR" -name "*.shp" | sort))
153 + # 모든 SHP 파일을 배열로 수집 (공백이 포함된 파일명도 안전하게 처리)
154 + mapfile -t SHP_FILES < <(find "$SHP_DIR" -name "*.shp" | sort)
92 155 TOTAL_FILES=${#SHP_FILES[@]}
93 156
157 + # 배열이 비어있거나 null인 경우 체크
158 + if [ ${#SHP_FILES[@]} -eq 0 ] || [ -z "${SHP_FILES[0]}" ]; then
159 + logger "❌ 오류: 유효한 SHP 파일을 찾을 수 없습니다."
160 + exit 1
161 + fi
162 +
94 163 if [ "$TABLE_EXISTS" = "t" ]; then
95 164 logger "📋 테이블 $SCHEMA_LOWER.$TABLE_LOWER이 이미 존재합니다. Append 모드로 진행합니다."
96 165 logger "🔄 총 $TOTAL_FILES개 파일을 append 모드로 처리합니다..."
97 166
98 - # 모든 파일을 append 모드로 처리
167 + # 모든 파일을 append 모드로 병렬 처리
99 168 for shp in "${SHP_FILES[@]}"; do
100 - wait_for_jobs
101 - import_append "$shp" &
169 + if [ -n "$shp" ]; then
170 + wait_for_jobs
171 + import_append "$shp" &
172 + logger "🔄 백그라운드 작업 시작: $(basename "$shp")"
173 + fi
102 174 done
103 175 wait
176 + logger "✅ 모든 append 작업 완료"
104 177 else
105 178 logger "📋 테이블 $SCHEMA_LOWER.$TABLE_LOWER이 존재하지 않습니다. 새로 생성합니다."
106 179 logger "🔄 총 $TOTAL_FILES개 파일을 처리합니다..."
107 180
108 181 # 첫 번째 파일로 테이블 생성
109 - FIRST_FILE="${SHP_FILES[0]}"
110 - FIRST_BASENAME=$(basename "$FIRST_FILE")
111 -
112 - # 테이블 생성 시작 시간 기록
113 - TABLE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
114 - TABLE_START_TIMESTAMP=$(date +%s)
115 -
116 - logger "🚀 [시작] 테이블 생성 시작: $FIRST_BASENAME - $TABLE_START_TIME"
117 -
118 - # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
119 - if [ "$SRID_NEW" -ne 0 ]; then
120 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
121 - else
122 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
123 - fi
124 - EXIT_CODE=$?
125 -
126 - # 테이블 생성 종료 시간 기록
127 - TABLE_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
128 - TABLE_END_TIMESTAMP=$(date +%s)
129 - TABLE_DURATION=$((TABLE_END_TIMESTAMP - TABLE_START_TIMESTAMP))
130 -
131 - # 테이블 생성 소요시간을 시:분:초 형식으로 변환
132 - TABLE_HOURS=$((TABLE_DURATION / 3600))
133 - TABLE_MINUTES=$(((TABLE_DURATION % 3600) / 60))
134 - TABLE_SECONDS=$((TABLE_DURATION % 60))
135 -
136 - # 1보다 작으면 0으로 표시
137 - if [ $TABLE_HOURS -lt 1 ]; then TABLE_HOURS=0; fi
138 - if [ $TABLE_MINUTES -lt 1 ]; then TABLE_MINUTES=0; fi
139 -
140 - if [ $EXIT_CODE -eq 0 ]; then
141 - logger "✅ [완료] 테이블 생성 완료: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
182 + if [ $TOTAL_FILES -gt 0 ]; then
183 + FIRST_FILE="${SHP_FILES[0]}"
184 + FIRST_BASENAME=$(basename "$FIRST_FILE")
185 +
186 + # 테이블 생성 시작 시간 기록
187 + TABLE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
188 + TABLE_START_TIMESTAMP=$(date +%s)
189 +
190 + logger "🚀 [시작] 테이블 생성 시작: $FIRST_BASENAME - $TABLE_START_TIME"
191 +
192 + # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
193 + if [ "$SRID_NEW" -ne 0 ]; then
194 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
195 + else
196 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
197 + fi
198 + EXIT_CODE=$?
142 199
143 - # 나머지 파일들을 append 모드로 처리
144 - if [ $TOTAL_FILES -gt 1 ]; then
145 - logger "🔄 나머지 $((TOTAL_FILES - 1))개 파일을 append 모드로 처리합니다..."
146 - for ((i=1; i<TOTAL_FILES; i++)); do
147 - shp="${SHP_FILES[i]}"
148 - wait_for_jobs
149 - import_append "$shp" &
150 - done
151 - wait
200 + # 테이블 생성 종료 시간 기록
201 + TABLE_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
202 + TABLE_END_TIMESTAMP=$(date +%s)
203 + TABLE_DURATION=$((TABLE_END_TIMESTAMP - TABLE_START_TIMESTAMP))
204 +
205 + # 테이블 생성 소요시간을 시:분:초 형식으로 변환
206 + TABLE_HOURS=$((TABLE_DURATION / 3600))
207 + TABLE_MINUTES=$(((TABLE_DURATION % 3600) / 60))
208 + TABLE_SECONDS=$((TABLE_DURATION % 60))
209 +
210 + # 1보다 작으면 0으로 표시
211 + if [ $TABLE_HOURS -lt 1 ]; then TABLE_HOURS=0; fi
212 + if [ $TABLE_MINUTES -lt 1 ]; then TABLE_MINUTES=0; fi
213 +
214 + if [ $EXIT_CODE -eq 0 ]; then
215 + logger "✅ [완료] 테이블 생성 완료: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
216 +
217 + # 나머지 파일들을 append 모드로 병렬 처리
218 + if [ $TOTAL_FILES -gt 1 ]; then
219 + logger "🔄 나머지 $((TOTAL_FILES - 1))개 파일을 append 모드로 병렬 처리합니다..."
220 + for ((i=1; i<TOTAL_FILES; i++)); do
221 + if [ -n "${SHP_FILES[i]}" ]; then
222 + shp="${SHP_FILES[i]}"
223 + wait_for_jobs
224 + import_append "$shp" &
225 + logger "🔄 백그라운드 작업 시작: $(basename "$shp")"
226 + fi
227 + done
228 + wait
229 + logger "✅ 모든 append 작업 완료"
230 + fi
231 + else
232 + logger "❌ [실패] 테이블 생성 실패: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
233 + echo "$OUTPUT" >> "$LOG_FILE"
234 + exit 1
152 235 fi
153 236 else
154 - logger "❌ [실패] 테이블 생성 실패: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
155 - echo "$OUTPUT" >> "$LOG_FILE"
237 + logger "❌ 오류: 처리할 SHP 파일이 없습니다."
156 238 exit 1
157 239 fi
158 240 fi
159 241
160 - # 2. 병렬로 나머지 파일 append (shp2pgsql -a)
161 - function import_append() {
162 - SHP="$1"
163 - BASENAME=$(basename "$SHP")
164 -
165 - # 처리 시작 시간 기록
166 - FILE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
167 - FILE_START_TIMESTAMP=$(date +%s)
168 -
169 - logger "🚀 [시작] $BASENAME 처리 시작: $FILE_START_TIME"
170 -
171 - # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
172 - if [ "$SRID_NEW" -ne 0 ]; then
173 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
174 - else
175 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
176 - fi
177 - EXIT_CODE=$?
178 -
179 - # 처리 종료 시간 기록
180 - FILE_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
181 - FILE_END_TIMESTAMP=$(date +%s)
182 - FILE_DURATION=$((FILE_END_TIMESTAMP - FILE_START_TIMESTAMP))
183 -
184 - # 파일별 소요시간을 시:분:초 형식으로 변환
185 - FILE_HOURS=$((FILE_DURATION / 3600))
186 - FILE_MINUTES=$(((FILE_DURATION % 3600) / 60))
187 - FILE_SECONDS=$((FILE_DURATION % 60))
188 -
189 - # 1보다 작으면 0으로 표시
190 - if [ $FILE_HOURS -lt 1 ]; then FILE_HOURS=0; fi
191 - if [ $FILE_MINUTES -lt 1 ]; then FILE_MINUTES=0; fi
192 -
193 - if [ $EXIT_CODE -eq 0 ]; then
194 - logger "✅ [완료] $BASENAME 처리 완료: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
195 - else
196 - logger "❌ [실패] $BASENAME 처리 실패: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
197 -
198 - # 오류 메시지만 추출하여 로그에 기록
199 - ERROR_MSG=$(echo "$OUTPUT" | grep -E "(ERROR|FATAL|WARNING|오류|실패|실패했습니다)" || echo "$OUTPUT")
200 - if [ -n "$ERROR_MSG" ]; then
201 - logger "⚠️ 오류 내용: $ERROR_MSG"
202 - echo "=== $BASENAME 처리 오류 상세 내용 ===" >> "$LOG_FILE"
203 - echo "$OUTPUT" >> "$LOG_FILE"
204 - echo "=====================================" >> "$LOG_FILE"
205 - fi
206 -
207 - logger "🔄 다음 파일 처리를 계속 진행합니다."
208 - fi
209 - }
210 -
211 - # job control 함수
212 - function wait_for_jobs() {
213 - while (( $(jobs -rp | wc -l) >= MAX_JOBS )); do
214 - sleep 1
215 - done
216 - }
217 -
218 - # 병렬 처리는 이미 위에서 완료되었습니다.
219 - logger "🔄 병렬 처리 완료"
242 + # 병렬 처리 완료 확인 및 요약
243 + logger "🔄 병렬 처리 완료 확인 중..."
244 + logger "📊 처리된 파일 수: $TOTAL_FILES개"
220 245
221 246 # 데이터 입력 완료 시간 기록
222 247 DATA_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')

OGG revised this gist 1756779075. Go to revision

1 file changed, 55 insertions, 30 deletions

shp2pgsql.sh renamed to shp2pgsql_local.sh

@@ -87,14 +87,27 @@ TABLE_EXISTS=$(psql -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM info
87 87
88 88 logger "🔍 테이블 존재 확인 결과: '$TABLE_EXISTS'"
89 89
90 + # 모든 SHP 파일을 배열로 수집
91 + SHP_FILES=($(find "$SHP_DIR" -name "*.shp" | sort))
92 + TOTAL_FILES=${#SHP_FILES[@]}
93 +
90 94 if [ "$TABLE_EXISTS" = "t" ]; then
91 95 logger "📋 테이블 $SCHEMA_LOWER.$TABLE_LOWER이 이미 존재합니다. Append 모드로 진행합니다."
92 - FIRST=""
96 + logger "🔄 총 $TOTAL_FILES개 파일을 append 모드로 처리합니다..."
97 +
98 + # 모든 파일을 append 모드로 처리
99 + for shp in "${SHP_FILES[@]}"; do
100 + wait_for_jobs
101 + import_append "$shp" &
102 + done
103 + wait
93 104 else
94 105 logger "📋 테이블 $SCHEMA_LOWER.$TABLE_LOWER이 존재하지 않습니다. 새로 생성합니다."
95 - # 1. 테이블 먼저 생성 (첫 번째 .shp 기준, 인덱스 없이)
96 - FIRST=$(find "$SHP_DIR" -name "*.shp" | head -n 1)
97 - FIRST_BASENAME=$(basename "$FIRST")
106 + logger "🔄 총 $TOTAL_FILES개 파일을 처리합니다..."
107 +
108 + # 첫 번째 파일로 테이블 생성
109 + FIRST_FILE="${SHP_FILES[0]}"
110 + FIRST_BASENAME=$(basename "$FIRST_FILE")
98 111
99 112 # 테이블 생성 시작 시간 기록
100 113 TABLE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
@@ -104,9 +117,9 @@ else
104 117
105 118 # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
106 119 if [ "$SRID_NEW" -ne 0 ]; then
107 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
120 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
108 121 else
109 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
122 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST_FILE" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
110 123 fi
111 124 EXIT_CODE=$?
112 125
@@ -126,6 +139,17 @@ else
126 139
127 140 if [ $EXIT_CODE -eq 0 ]; then
128 141 logger "✅ [완료] 테이블 생성 완료: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
142 +
143 + # 나머지 파일들을 append 모드로 처리
144 + if [ $TOTAL_FILES -gt 1 ]; then
145 + logger "🔄 나머지 $((TOTAL_FILES - 1))개 파일을 append 모드로 처리합니다..."
146 + for ((i=1; i<TOTAL_FILES; i++)); do
147 + shp="${SHP_FILES[i]}"
148 + wait_for_jobs
149 + import_append "$shp" &
150 + done
151 + wait
152 + fi
129 153 else
130 154 logger "❌ [실패] 테이블 생성 실패: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
131 155 echo "$OUTPUT" >> "$LOG_FILE"
@@ -170,7 +194,17 @@ function import_append() {
170 194 logger "✅ [완료] $BASENAME 처리 완료: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
171 195 else
172 196 logger "❌ [실패] $BASENAME 처리 실패: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
173 - echo "$OUTPUT" >> "$LOG_FILE"
197 +
198 + # 오류 메시지만 추출하여 로그에 기록
199 + ERROR_MSG=$(echo "$OUTPUT" | grep -E "(ERROR|FATAL|WARNING|오류|실패|실패했습니다)" || echo "$OUTPUT")
200 + if [ -n "$ERROR_MSG" ]; then
201 + logger "⚠️ 오류 내용: $ERROR_MSG"
202 + echo "=== $BASENAME 처리 오류 상세 내용 ===" >> "$LOG_FILE"
203 + echo "$OUTPUT" >> "$LOG_FILE"
204 + echo "=====================================" >> "$LOG_FILE"
205 + fi
206 +
207 + logger "🔄 다음 파일 처리를 계속 진행합니다."
174 208 fi
175 209 }
176 210
@@ -181,28 +215,8 @@ function wait_for_jobs() {
181 215 done
182 216 }
183 217
184 - # 병렬 실행 (테이블이 새로 생성된 경우에만)
185 - if [ -n "$FIRST" ]; then
186 - logger "🔄 나머지 파일들을 병렬로 처리합니다..."
187 - for shp in "$SHP_DIR"/*.shp; do
188 - # 첫 번째 파일은 건너뛰기
189 - if [[ "$shp" == "$FIRST" ]]; then
190 - logger "⏭️ Skipping $(basename "$shp") (already processed during table creation)"
191 - continue
192 - fi
193 -
194 - wait_for_jobs
195 - import_append "$shp" &
196 - done
197 - wait
198 - else
199 - logger "🔄 모든 파일을 병렬로 처리합니다..."
200 - for shp in "$SHP_DIR"/*.shp; do
201 - wait_for_jobs
202 - import_append "$shp" &
203 - done
204 - wait
205 - fi
218 + # 병렬 처리는 이미 위에서 완료되었습니다.
219 + logger "🔄 병렬 처리 완료"
206 220
207 221 # 데이터 입력 완료 시간 기록
208 222 DATA_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
@@ -225,14 +239,25 @@ INDEX_START_TIMESTAMP=$(date +%s)
225 239 logger "🔍 공간 인덱스 생성 시작: $INDEX_START_TIME"
226 240
227 241 # 공간 인덱스 생성 (PostGIS 확장이 활성화되어 있어야 함)
228 - psql -U "$USER" -d "$DB" -c "CREATE INDEX IF NOT EXISTS ${TABLE_LOWER}_geom_idx ON $SCHEMA_LOWER.$TABLE_LOWER USING GIST (geom);" >/dev/null 2>&1
242 + INDEX_OUTPUT=$(psql -U "$USER" -d "$DB" -c "CREATE INDEX IF NOT EXISTS ${TABLE_LOWER}_geom_idx ON $SCHEMA_LOWER.$TABLE_LOWER USING GIST (geom);" 2>&1)
229 243 INDEX_EXIT_CODE=$?
230 244
231 245 if [ $INDEX_EXIT_CODE -eq 0 ]; then
232 246 logger "✅ Spatial index created successfully"
233 247 else
234 248 logger "❌ Failed to create spatial index"
249 +
250 + # 오류 메시지만 추출하여 로그에 기록
251 + INDEX_ERROR_MSG=$(echo "$INDEX_OUTPUT" | grep -E "(ERROR|FATAL|WARNING|오류|실패|실패했습니다)" || echo "$INDEX_OUTPUT")
252 + if [ -n "$INDEX_ERROR_MSG" ]; then
253 + logger "⚠️ 인덱스 생성 오류 내용: $INDEX_ERROR_MSG"
254 + echo "=== 공간 인덱스 생성 오류 상세 내용 ===" >> "$LOG_FILE"
255 + echo "$INDEX_OUTPUT" >> "$LOG_FILE"
256 + echo "=====================================" >> "$LOG_FILE"
257 + fi
258 +
235 259 logger "⚠️ PostGIS 확장이 활성화되어 있는지 확인하세요: CREATE EXTENSION IF NOT EXISTS postgis;"
260 + logger "🔄 인덱스 생성에 실패했지만 스크립트는 계속 진행됩니다."
236 261 fi
237 262
238 263 # 인덱스 재생성 완료 시간 기록

OGG revised this gist 1755493908. Go to revision

1 file changed, 60 insertions, 48 deletions

shp2pgsql.sh

@@ -1,20 +1,20 @@
1 1 #!/bin/bash
2 2
3 - DB="" # 실제 데이터베이스 이름으로 변경
4 - USER="postgres" # 실제 PostgreSQL 사용자명으로 변경
5 - SCHEMA="public" # 스키마 이름
6 - TABLE="" # 생성할 테이블 이름
3 + DB="yourDb" # 실제 데이터베이스 이름으로 변경
4 + USER="postgres" # 실제 PostgreSQL 사용자명으로 변경
5 + SCHEMA="yourSchema" # 스키마 이름
6 + TABLE="yourTable" # 생성할 테이블 이름
7 7
8 8 # 대소문자 구분 문제 해결을 위해 소문자로 변환
9 9 SCHEMA_LOWER=$(echo "$SCHEMA" | tr '[:upper:]' '[:lower:]')
10 10 TABLE_LOWER=$(echo "$TABLE" | tr '[:upper:]' '[:lower:]')
11 11
12 - SRID_ORI=5186 # 원본 좌표계
13 - SRID_NEW=0 # 변환 좌표계 (0이면 좌표변환 안함)
14 - CHARSET="EUC-KR" # 문자 인코딩
12 + SRID_ORI=5186 # 원본 좌표계
13 + SRID_NEW=0 # 변환 좌표계 (0이면 좌표변환 안함)
14 + CHARSET="UTF-8" # 문자 인코딩
15 15
16 - SHP_DIR="./" # shp 파일들이 있는 디렉토리 경로
17 - MAX_JOBS=8 # 병렬 작업 수 (시스템 성능에 따라 조정)
16 + SHP_DIR="./" # shp 파일들이 있는 디렉토리 경로
17 + MAX_JOBS=8 # 병렬 작업 수 (시스템 성능에 따라 조정)
18 18
19 19 # 로그 파일 설정
20 20 LOG_DIR="./" # 로그 디렉토리 (필요시 경로 변경)
@@ -94,7 +94,13 @@ else
94 94 logger "📋 테이블 $SCHEMA_LOWER.$TABLE_LOWER이 존재하지 않습니다. 새로 생성합니다."
95 95 # 1. 테이블 먼저 생성 (첫 번째 .shp 기준, 인덱스 없이)
96 96 FIRST=$(find "$SHP_DIR" -name "*.shp" | head -n 1)
97 - logger "Creating table $SCHEMA_LOWER.$TABLE_LOWER using $FIRST (without index)"
97 + FIRST_BASENAME=$(basename "$FIRST")
98 +
99 + # 테이블 생성 시작 시간 기록
100 + TABLE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
101 + TABLE_START_TIMESTAMP=$(date +%s)
102 +
103 + logger "🚀 [시작] 테이블 생성 시작: $FIRST_BASENAME - $TABLE_START_TIME"
98 104
99 105 # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
100 106 if [ "$SRID_NEW" -ne 0 ]; then
@@ -103,11 +109,25 @@ else
103 109 OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
104 110 fi
105 111 EXIT_CODE=$?
112 +
113 + # 테이블 생성 종료 시간 기록
114 + TABLE_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
115 + TABLE_END_TIMESTAMP=$(date +%s)
116 + TABLE_DURATION=$((TABLE_END_TIMESTAMP - TABLE_START_TIMESTAMP))
117 +
118 + # 테이블 생성 소요시간을 시:분:초 형식으로 변환
119 + TABLE_HOURS=$((TABLE_DURATION / 3600))
120 + TABLE_MINUTES=$(((TABLE_DURATION % 3600) / 60))
121 + TABLE_SECONDS=$((TABLE_DURATION % 60))
122 +
123 + # 1보다 작으면 0으로 표시
124 + if [ $TABLE_HOURS -lt 1 ]; then TABLE_HOURS=0; fi
125 + if [ $TABLE_MINUTES -lt 1 ]; then TABLE_MINUTES=0; fi
106 126
107 127 if [ $EXIT_CODE -eq 0 ]; then
108 - logger "✅ Table creation completed successfully"
128 + logger "✅ [완료] 테이블 생성 완료: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
109 129 else
110 - logger "❌ Table creation failed"
130 + logger "❌ [실패] 테이블 생성 실패: $TABLE_END_TIME (소요: ${TABLE_HOURS}시간 ${TABLE_MINUTES}분 ${TABLE_SECONDS}초)"
111 131 echo "$OUTPUT" >> "$LOG_FILE"
112 132 exit 1
113 133 fi
@@ -118,7 +138,11 @@ function import_append() {
118 138 SHP="$1"
119 139 BASENAME=$(basename "$SHP")
120 140
121 - logger "Appending $BASENAME"
141 + # 처리 시작 시간 기록
142 + FILE_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
143 + FILE_START_TIMESTAMP=$(date +%s)
144 +
145 + logger "🚀 [시작] $BASENAME 처리 시작: $FILE_START_TIME"
122 146
123 147 # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
124 148 if [ "$SRID_NEW" -ne 0 ]; then
@@ -128,10 +152,24 @@ function import_append() {
128 152 fi
129 153 EXIT_CODE=$?
130 154
155 + # 처리 종료 시간 기록
156 + FILE_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
157 + FILE_END_TIMESTAMP=$(date +%s)
158 + FILE_DURATION=$((FILE_END_TIMESTAMP - FILE_START_TIMESTAMP))
159 +
160 + # 파일별 소요시간을 시:분:초 형식으로 변환
161 + FILE_HOURS=$((FILE_DURATION / 3600))
162 + FILE_MINUTES=$(((FILE_DURATION % 3600) / 60))
163 + FILE_SECONDS=$((FILE_DURATION % 60))
164 +
165 + # 1보다 작으면 0으로 표시
166 + if [ $FILE_HOURS -lt 1 ]; then FILE_HOURS=0; fi
167 + if [ $FILE_MINUTES -lt 1 ]; then FILE_MINUTES=0; fi
168 +
131 169 if [ $EXIT_CODE -eq 0 ]; then
132 - logger "✅ $BASENAME appended successfully"
170 + logger "✅ [완료] $BASENAME 처리 완료: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
133 171 else
134 - logger "❌ Failed to append $BASENAME"
172 + logger "❌ [실패] $BASENAME 처리 실패: $FILE_END_TIME (소요: ${FILE_HOURS}시간 ${FILE_MINUTES}분 ${FILE_SECONDS}초)"
135 173 echo "$OUTPUT" >> "$LOG_FILE"
136 174 fi
137 175 }
@@ -180,11 +218,6 @@ DATA_SECONDS=$((DATA_DURATION % 60))
180 218 if [ $DATA_HOURS -lt 1 ]; then DATA_HOURS=0; fi
181 219 if [ $DATA_MINUTES -lt 1 ]; then DATA_MINUTES=0; fi
182 220
183 - logger "=================================="
184 - logger "📊 데이터 입력 완료: $DATA_END_TIME"
185 - logger "📊 데이터 입력 소요시간: ${DATA_HOURS}시간 ${DATA_MINUTES}분 ${DATA_SECONDS}초"
186 - logger "=================================="
187 -
188 221 # 3. (선택) 인덱스 재생성 (권장: 한 번에 생성)
189 222 INDEX_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
190 223 INDEX_START_TIMESTAMP=$(date +%s)
@@ -216,35 +249,14 @@ INDEX_SECONDS=$((INDEX_DURATION % 60))
216 249 if [ $INDEX_HOURS -lt 1 ]; then INDEX_HOURS=0; fi
217 250 if [ $INDEX_MINUTES -lt 1 ]; then INDEX_MINUTES=0; fi
218 251
219 - # 전체 종료 시간 및 소요 시간 계산
220 - END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
221 - END_TIMESTAMP=$(date +%s)
222 - TOTAL_DURATION=$((END_TIMESTAMP - START_TIMESTAMP))
223 -
224 - # 전체 시간을 시:분:초 형식으로 변환
225 - TOTAL_HOURS=$((TOTAL_DURATION / 3600))
226 - TOTAL_MINUTES=$(((TOTAL_DURATION % 3600) / 60))
227 - TOTAL_SECONDS=$((TOTAL_DURATION % 60))
228 -
229 - # 1보다 작으면 0으로 표시
230 - if [ $TOTAL_HOURS -lt 1 ]; then TOTAL_HOURS=0; fi
231 - if [ $TOTAL_MINUTES -lt 1 ]; then TOTAL_MINUTES=0; fi
232 -
233 252 logger "=================================="
234 - logger "✅ 전체 작업 완료: $END_TIME"
235 - logger "📊 전체 소요시간: ${TOTAL_HOURS}시간 ${TOTAL_MINUTES}분 ${TOTAL_SECONDS}초"
236 - logger "📋 상세 요약:"
237 - logger " - 전체 시작시간: $START_TIME"
238 - logger " - 데이터 입력 완료: $DATA_END_TIME (소요: ${DATA_HOURS}시간 ${DATA_MINUTES}분 ${DATA_SECONDS}초)"
239 - logger " - 공간 인덱스 생성 시작: $INDEX_START_TIME"
240 - logger " - 공간 인덱스 생성 완료: $INDEX_END_TIME (소요: ${INDEX_HOURS}시간 ${INDEX_MINUTES}분 ${INDEX_SECONDS}초)"
241 - logger " - 전체 종료시간: $END_TIME"
242 - logger " - 대상테이블: $SCHEMA_LOWER.$TABLE_LOWER"
253 + logger "✅ 작업 완료"
254 + logger "📋 대상테이블: $SCHEMA_LOWER.$TABLE_LOWER"
243 255 if [ "$SRID_NEW" -ne 0 ]; then
244 - logger " - 좌표계: $SRID_ORI → $SRID_NEW (변환됨)"
256 + logger "🗺️ 좌표계: $SRID_ORI → $SRID_NEW (변환됨)"
245 257 else
246 - logger " - 좌표계: $SRID_ORI (원본)"
258 + logger "🗺️ 좌표계: $SRID_ORI (원본)"
247 259 fi
248 - logger "📊 데이터 처리 완료"
249 - logger "=================================="
250 - logger "로그 파일: $LOG_FILE"
260 + logger "⏱️ 데이터 입력 소요시간: ${DATA_HOURS}시간 ${DATA_MINUTES}분 ${DATA_SECONDS}초"
261 + logger "⏱️ 공간 인덱스 소요시간: ${INDEX_HOURS}시간 ${INDEX_MINUTES}분 ${INDEX_SECONDS}초"
262 + logger "=================================="

OGG revised this gist 1753775833. Go to revision

1 file changed, 16 insertions, 12 deletions

shp2pgsql.sh

@@ -5,6 +5,10 @@ USER="postgres" # 실제 PostgreSQL 사용자명으로 변경
5 5 SCHEMA="public" # 스키마 이름
6 6 TABLE="" # 생성할 테이블 이름
7 7
8 + # 대소문자 구분 문제 해결을 위해 소문자로 변환
9 + SCHEMA_LOWER=$(echo "$SCHEMA" | tr '[:upper:]' '[:lower:]')
10 + TABLE_LOWER=$(echo "$TABLE" | tr '[:upper:]' '[:lower:]')
11 +
8 12 SRID_ORI=5186 # 원본 좌표계
9 13 SRID_NEW=0 # 변환 좌표계 (0이면 좌표변환 안함)
10 14 CHARSET="EUC-KR" # 문자 인코딩
@@ -76,27 +80,27 @@ logger "🚀 Import 시작: $START_TIME"
76 80 logger "=================================="
77 81
78 82 # 테이블 존재 여부 확인
79 - logger "🔍 테이블 존재 여부 확인 중: $SCHEMA.$TABLE"
83 + logger "🔍 테이블 존재 여부 확인 중: $SCHEMA_LOWER.$TABLE_LOWER"
80 84
81 - # 테이블 존재 여부를 더 안정적으로 확인
82 - TABLE_EXISTS=$(psql -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = '$SCHEMA' AND table_name = '$TABLE');" 2>/dev/null | xargs)
85 + # 테이블 존재 여부를 더 안정적으로 확인 (소문자로 비교)
86 + TABLE_EXISTS=$(psql -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = '$SCHEMA_LOWER' AND table_name = '$TABLE_LOWER');" 2>/dev/null | xargs)
83 87
84 88 logger "🔍 테이블 존재 확인 결과: '$TABLE_EXISTS'"
85 89
86 90 if [ "$TABLE_EXISTS" = "t" ]; then
87 - logger "📋 테이블 $SCHEMA.$TABLE이 이미 존재합니다. Append 모드로 진행합니다."
91 + logger "📋 테이블 $SCHEMA_LOWER.$TABLE_LOWER이 이미 존재합니다. Append 모드로 진행합니다."
88 92 FIRST=""
89 93 else
90 - logger "📋 테이블 $SCHEMA.$TABLE이 존재하지 않습니다. 새로 생성합니다."
94 + logger "📋 테이블 $SCHEMA_LOWER.$TABLE_LOWER이 존재하지 않습니다. 새로 생성합니다."
91 95 # 1. 테이블 먼저 생성 (첫 번째 .shp 기준, 인덱스 없이)
92 96 FIRST=$(find "$SHP_DIR" -name "*.shp" | head -n 1)
93 - logger "Creating table $SCHEMA.$TABLE using $FIRST (without index)"
97 + logger "Creating table $SCHEMA_LOWER.$TABLE_LOWER using $FIRST (without index)"
94 98
95 99 # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
96 100 if [ "$SRID_NEW" -ne 0 ]; then
97 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST" $SCHEMA.$TABLE | psql -U "$USER" -d "$DB" 2>&1)
101 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW "$FIRST" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
98 102 else
99 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST" $SCHEMA.$TABLE | psql -U "$USER" -d "$DB" 2>&1)
103 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI "$FIRST" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
100 104 fi
101 105 EXIT_CODE=$?
102 106
@@ -118,9 +122,9 @@ function import_append() {
118 122
119 123 # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
120 124 if [ "$SRID_NEW" -ne 0 ]; then
121 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW -a "$SHP" $SCHEMA.$TABLE | psql -U "$USER" -d "$DB" 2>&1)
125 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI:$SRID_NEW -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
122 126 else
123 - OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI -a "$SHP" $SCHEMA.$TABLE | psql -U "$USER" -d "$DB" 2>&1)
127 + OUTPUT=$(shp2pgsql -W "$CHARSET" -s $SRID_ORI -a "$SHP" $SCHEMA_LOWER.$TABLE_LOWER | psql -U "$USER" -d "$DB" 2>&1)
124 128 fi
125 129 EXIT_CODE=$?
126 130
@@ -188,7 +192,7 @@ INDEX_START_TIMESTAMP=$(date +%s)
188 192 logger "🔍 공간 인덱스 생성 시작: $INDEX_START_TIME"
189 193
190 194 # 공간 인덱스 생성 (PostGIS 확장이 활성화되어 있어야 함)
191 - psql -U "$USER" -d "$DB" -c "CREATE INDEX IF NOT EXISTS ${TABLE}_geom_idx ON $SCHEMA.$TABLE USING GIST (geom);" >/dev/null 2>&1
195 + psql -U "$USER" -d "$DB" -c "CREATE INDEX IF NOT EXISTS ${TABLE_LOWER}_geom_idx ON $SCHEMA_LOWER.$TABLE_LOWER USING GIST (geom);" >/dev/null 2>&1
192 196 INDEX_EXIT_CODE=$?
193 197
194 198 if [ $INDEX_EXIT_CODE -eq 0 ]; then
@@ -235,7 +239,7 @@ logger " - 데이터 입력 완료: $DATA_END_TIME (소요: ${DATA_HOURS}시
235 239 logger " - 공간 인덱스 생성 시작: $INDEX_START_TIME"
236 240 logger " - 공간 인덱스 생성 완료: $INDEX_END_TIME (소요: ${INDEX_HOURS}시간 ${INDEX_MINUTES}분 ${INDEX_SECONDS}초)"
237 241 logger " - 전체 종료시간: $END_TIME"
238 - logger " - 대상테이블: $SCHEMA.$TABLE"
242 + logger " - 대상테이블: $SCHEMA_LOWER.$TABLE_LOWER"
239 243 if [ "$SRID_NEW" -ne 0 ]; then
240 244 logger " - 좌표계: $SRID_ORI → $SRID_NEW (변환됨)"
241 245 else

OGG revised this gist 1753774957. Go to revision

1 file changed, 22 insertions, 13 deletions

shp2pgsql.sh

@@ -114,12 +114,6 @@ function import_append() {
114 114 SHP="$1"
115 115 BASENAME=$(basename "$SHP")
116 116
117 - # 테이블이 새로 생성된 경우: 첫 번째 파일은 건너뛰기
118 - if [[ -n "$FIRST" ]] && [[ "$SHP" == "$FIRST" ]]; then
119 - logger "⏭️ Skipping $BASENAME (already processed during table creation)"
120 - return
121 - fi
122 -
123 117 logger "Appending $BASENAME"
124 118
125 119 # 좌표변환 여부에 따라 shp2pgsql 명령어 결정
@@ -145,13 +139,28 @@ function wait_for_jobs() {
145 139 done
146 140 }
147 141
148 - # 병렬 실행
149 - for shp in "$SHP_DIR"/*.shp; do
150 - wait_for_jobs
151 - import_append "$shp" &
152 - done
153 -
154 - wait
142 + # 병렬 실행 (테이블이 새로 생성된 경우에만)
143 + if [ -n "$FIRST" ]; then
144 + logger "🔄 나머지 파일들을 병렬로 처리합니다..."
145 + for shp in "$SHP_DIR"/*.shp; do
146 + # 첫 번째 파일은 건너뛰기
147 + if [[ "$shp" == "$FIRST" ]]; then
148 + logger "⏭️ Skipping $(basename "$shp") (already processed during table creation)"
149 + continue
150 + fi
151 +
152 + wait_for_jobs
153 + import_append "$shp" &
154 + done
155 + wait
156 + else
157 + logger "🔄 모든 파일을 병렬로 처리합니다..."
158 + for shp in "$SHP_DIR"/*.shp; do
159 + wait_for_jobs
160 + import_append "$shp" &
161 + done
162 + wait
163 + fi
155 164
156 165 # 데이터 입력 완료 시간 기록
157 166 DATA_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')

OGG revised this gist 1753770156. Go to revision

1 file changed, 23 insertions, 2 deletions

shp2pgsql.sh

@@ -40,6 +40,23 @@ if [ $SHP_COUNT -eq 0 ]; then
40 40 fi
41 41 logger "📁 발견된 SHP 파일 수: $SHP_COUNT개"
42 42
43 + # 필수 변수 검증
44 + if [ -z "$DB" ]; then
45 + logger "❌ 오류: DB 변수가 설정되지 않았습니다. 스크립트 상단에서 DB 변수를 설정해주세요."
46 + exit 1
47 + fi
48 +
49 + if [ -z "$TABLE" ]; then
50 + logger "❌ 오류: TABLE 변수가 설정되지 않았습니다. 스크립트 상단에서 TABLE 변수를 설정해주세요."
51 + exit 1
52 + fi
53 +
54 + logger "📋 설정된 변수:"
55 + logger " - 데이터베이스: $DB"
56 + logger " - 사용자: $USER"
57 + logger " - 스키마: $SCHEMA"
58 + logger " - 테이블: $TABLE"
59 +
43 60 # PostgreSQL 연결 테스트
44 61 if ! psql -U "$USER" -d "$DB" -c "SELECT 1;" >/dev/null 2>&1; then
45 62 logger "❌ 오류: PostgreSQL 연결 실패. 데이터베이스 연결을 확인해주세요."
@@ -60,9 +77,13 @@ logger "=================================="
60 77
61 78 # 테이블 존재 여부 확인
62 79 logger "🔍 테이블 존재 여부 확인 중: $SCHEMA.$TABLE"
63 - TABLE_EXISTS=$(psql -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = '$SCHEMA' AND tablename = '$TABLE');" 2>/dev/null | tail -1 | tr -d ' \n\r')
64 80
65 - if [[ "$TABLE_EXISTS" == *"true"* ]] || [[ "$TABLE_EXISTS" == "true" ]]; then
81 + # 테이블 존재 여부를 더 안정적으로 확인
82 + TABLE_EXISTS=$(psql -U "$USER" -d "$DB" -t -c "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = '$SCHEMA' AND table_name = '$TABLE');" 2>/dev/null | xargs)
83 +
84 + logger "🔍 테이블 존재 확인 결과: '$TABLE_EXISTS'"
85 +
86 + if [ "$TABLE_EXISTS" = "t" ]; then
66 87 logger "📋 테이블 $SCHEMA.$TABLE이 이미 존재합니다. Append 모드로 진행합니다."
67 88 FIRST=""
68 89 else

OGG revised this gist 1753769795. Go to revision

1 file changed, 0 insertions, 0 deletions

sh renamed to shp2pgsql.sh

File renamed without changes

OGG revised this gist 1753769751. Go to revision

1 file changed, 4 insertions, 4 deletions

sh

@@ -1,15 +1,15 @@
1 1 #!/bin/bash
2 2
3 - DB="your_database" # 실제 데이터베이스 이름으로 변경
4 - USER="your_user" # 실제 PostgreSQL 사용자명으로 변경
3 + DB="" # 실제 데이터베이스 이름으로 변경
4 + USER="postgres" # 실제 PostgreSQL 사용자명으로 변경
5 5 SCHEMA="public" # 스키마 이름
6 - TABLE="spatial_data" # 생성할 테이블 이름
6 + TABLE="" # 생성할 테이블 이름
7 7
8 8 SRID_ORI=5186 # 원본 좌표계
9 9 SRID_NEW=0 # 변환 좌표계 (0이면 좌표변환 안함)
10 10 CHARSET="EUC-KR" # 문자 인코딩
11 11
12 - SHP_DIR="./shp_files" # shp 파일들이 있는 디렉토리 경로
12 + SHP_DIR="./" # shp 파일들이 있는 디렉토리 경로
13 13 MAX_JOBS=8 # 병렬 작업 수 (시스템 성능에 따라 조정)
14 14
15 15 # 로그 파일 설정
Newer Older