OGG ревизий этого фрагмента . К ревизии
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 ревизий этого фрагмента . К ревизии
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 ревизий этого фрагмента . К ревизии
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 ревизий этого фрагмента . К ревизии
1 file changed, 55 insertions, 30 deletions
shp2pgsql.sh переименован в 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 ревизий этого фрагмента . К ревизии
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 ревизий этого фрагмента . К ревизии
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 ревизий этого фрагмента . К ревизии
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 ревизий этого фрагмента . К ревизии
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 ревизий этого фрагмента . К ревизии
1 file changed, 0 insertions, 0 deletions
sh переименован в shp2pgsql.sh
Файл переименован без изменений
OGG ревизий этого фрагмента . К ревизии
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 | # 로그 파일 설정 | |