- CollectDB 다중 신호 수집 → S&P Global AIS API 단일 수집으로 전환 - sig_src_cd + target_id 이중 식별자 → mmsi(VARCHAR) 단일 식별자 - t_vessel_latest_position → t_ais_position 테이블 전환 - 레거시 배치/유틸 ~30개 클래스 삭제 (VesselAggregationJobConfig, ShipKindCodeConverter 등) - AisTargetCacheManager 기반 캐시 이중 구조 (최신위치 + 트랙 버퍼) - CacheBasedVesselTrackDataReader + CacheBasedTrackJobListener 신규 추가 - VesselStaticStepConfig: 정적정보 CDC 변경 검출 + hourly job 편승 - SignalKindCode enum: vesselType/extraInfo 기반 선종 자동 분류 - WebSocket/STOMP 전체 mmsi 전환 (StompTrackStreamingService ~40곳) - 모니터링/성능 최적화 코드 mmsi 기반 전환 - DataSource 설정 통합 (snpdb 단일 DB) - AreaBoundaryCache Polygon→Geometry 캐스트 수정 (MULTIPOLYGON 지원) - ConcurrentHashMap 적용 (VesselTrackStepConfig 동시성 버그 수정) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
224 lines
6.5 KiB
Bash
224 lines
6.5 KiB
Bash
#!/bin/bash
|
|
|
|
# Spring Batch 메타데이터 강제 초기화 스크립트
|
|
# 실행 중인 작업 상태와 관계없이 강제로 초기화
|
|
|
|
echo "================================================"
|
|
echo "Spring Batch Metadata FORCE Reset"
|
|
echo "WARNING: This will FORCE delete ALL batch job history!"
|
|
echo " Including running jobs!"
|
|
echo "Time: $(date)"
|
|
echo "================================================"
|
|
|
|
# 색상 코드
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
# 데이터베이스 연결 정보
|
|
DB_HOST="localhost"
|
|
DB_PORT="5432"
|
|
DB_NAME="mdadb"
|
|
DB_USER="mda"
|
|
DB_SCHEMA="public"
|
|
|
|
echo -e "${RED}⚠️ CRITICAL WARNING: This is a FORCE reset operation!${NC}"
|
|
echo "This will:"
|
|
echo "- Delete ALL batch job history"
|
|
echo "- Clear ALL running job states"
|
|
echo "- Reset ALL sequences"
|
|
echo "- Cannot be undone (except from backup)"
|
|
echo ""
|
|
echo -e "${YELLOW}This should only be used when normal reset fails!${NC}"
|
|
echo ""
|
|
read -p "Type 'FORCE RESET' to confirm: " CONFIRM
|
|
|
|
if [ "$CONFIRM" != "FORCE RESET" ]; then
|
|
echo "Operation cancelled."
|
|
exit 0
|
|
fi
|
|
|
|
echo ""
|
|
echo "1. Creating full backup before force reset..."
|
|
|
|
# 백업 디렉토리 생성
|
|
BACKUP_DIR="/devdata/apps/bridge-db-monitoring/backup"
|
|
mkdir -p $BACKUP_DIR
|
|
|
|
# 백업 파일명
|
|
BACKUP_FILE="$BACKUP_DIR/batch_metadata_FORCE_backup_$(date +%Y%m%d_%H%M%S).sql"
|
|
|
|
# 전체 메타데이터 백업 (스키마 포함)
|
|
pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME \
|
|
--schema=$DB_SCHEMA \
|
|
--table="batch_*" \
|
|
--file=$BACKUP_FILE 2>/dev/null
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo -e "${GREEN}✓ Full backup created: $BACKUP_FILE${NC}"
|
|
else
|
|
echo -e "${YELLOW}⚠ Backup may have failed, but continuing...${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "2. Stopping application if running..."
|
|
|
|
# PID 확인
|
|
if [ -f "/devdata/apps/bridge-db-monitoring/vessel-batch.pid" ]; then
|
|
PID=$(cat /devdata/apps/bridge-db-monitoring/vessel-batch.pid)
|
|
if kill -0 $PID 2>/dev/null; then
|
|
echo " Stopping application (PID: $PID)..."
|
|
kill -15 $PID
|
|
sleep 5
|
|
if kill -0 $PID 2>/dev/null; then
|
|
echo " Force killing application..."
|
|
kill -9 $PID
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "3. FORCE resetting batch metadata tables..."
|
|
|
|
# CASCADE를 사용한 강제 초기화
|
|
psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME << EOF
|
|
-- 트랜잭션 시작
|
|
BEGIN;
|
|
|
|
-- 외래 키 제약 임시 비활성화
|
|
SET session_replication_role = 'replica';
|
|
|
|
-- 모든 배치 테이블 강제 초기화
|
|
TRUNCATE TABLE $DB_SCHEMA.batch_step_execution_context CASCADE;
|
|
TRUNCATE TABLE $DB_SCHEMA.batch_step_execution CASCADE;
|
|
TRUNCATE TABLE $DB_SCHEMA.batch_job_execution_context CASCADE;
|
|
TRUNCATE TABLE $DB_SCHEMA.batch_job_execution_params CASCADE;
|
|
TRUNCATE TABLE $DB_SCHEMA.batch_job_execution CASCADE;
|
|
TRUNCATE TABLE $DB_SCHEMA.batch_job_instance CASCADE;
|
|
|
|
-- 시퀀스 강제 리셋
|
|
ALTER SEQUENCE IF EXISTS $DB_SCHEMA.batch_job_execution_seq RESTART WITH 1;
|
|
ALTER SEQUENCE IF EXISTS $DB_SCHEMA.batch_job_seq RESTART WITH 1;
|
|
ALTER SEQUENCE IF EXISTS $DB_SCHEMA.batch_step_execution_seq RESTART WITH 1;
|
|
|
|
-- 외래 키 제약 재활성화
|
|
SET session_replication_role = 'origin';
|
|
|
|
-- 커밋
|
|
COMMIT;
|
|
|
|
-- 통계 업데이트
|
|
ANALYZE $DB_SCHEMA.batch_job_instance;
|
|
ANALYZE $DB_SCHEMA.batch_job_execution;
|
|
ANALYZE $DB_SCHEMA.batch_job_execution_params;
|
|
ANALYZE $DB_SCHEMA.batch_job_execution_context;
|
|
ANALYZE $DB_SCHEMA.batch_step_execution;
|
|
ANALYZE $DB_SCHEMA.batch_step_execution_context;
|
|
EOF
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo -e "${GREEN}✓ Batch metadata tables FORCE reset successfully${NC}"
|
|
else
|
|
echo -e "${RED}✗ Force reset encountered errors, but may have partially succeeded${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "4. Verifying force reset..."
|
|
|
|
# 각 테이블 개별 확인
|
|
for table in batch_job_instance batch_job_execution batch_job_execution_params batch_job_execution_context batch_step_execution batch_step_execution_context; do
|
|
COUNT=$(psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -c "
|
|
SELECT COUNT(*) FROM $DB_SCHEMA.$table;" 2>/dev/null | xargs)
|
|
|
|
if [ -z "$COUNT" ]; then
|
|
COUNT="ERROR"
|
|
fi
|
|
|
|
if [ "$COUNT" = "0" ]; then
|
|
echo -e " ${GREEN}✓${NC} $table: $COUNT records"
|
|
elif [ "$COUNT" = "ERROR" ]; then
|
|
echo -e " ${RED}✗${NC} $table: Could not query"
|
|
else
|
|
echo -e " ${YELLOW}⚠${NC} $table: $COUNT records remaining"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "5. Optional: Clear ALL aggregation data (complete fresh start)"
|
|
read -p "Do you want to clear ALL aggregation data too? (yes/no): " CLEAR_ALL
|
|
|
|
if [ "$CLEAR_ALL" = "yes" ]; then
|
|
echo ""
|
|
echo "Clearing ALL aggregation data..."
|
|
|
|
psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME << EOF
|
|
BEGIN;
|
|
|
|
-- 강제로 모든 집계 데이터 초기화
|
|
SET session_replication_role = 'replica';
|
|
|
|
-- 최신 위치 정보
|
|
TRUNCATE TABLE signal.t_vessel_latest_position CASCADE;
|
|
|
|
-- 모든 파티션 테이블 초기화
|
|
DO \$\$
|
|
DECLARE
|
|
r RECORD;
|
|
BEGIN
|
|
FOR r IN
|
|
SELECT tablename
|
|
FROM pg_tables
|
|
WHERE schemaname = 'signal'
|
|
AND (tablename LIKE 't_tile_summary_%'
|
|
OR tablename LIKE 't_area_statistics_%'
|
|
OR tablename LIKE 't_vessel_daily_tracks_%')
|
|
LOOP
|
|
EXECUTE 'TRUNCATE TABLE signal.' || r.tablename || ' CASCADE';
|
|
RAISE NOTICE 'Truncated table: signal.%', r.tablename;
|
|
END LOOP;
|
|
END\$\$;
|
|
|
|
-- 배치 성능 메트릭
|
|
TRUNCATE TABLE signal.t_batch_performance_metrics CASCADE;
|
|
|
|
SET session_replication_role = 'origin';
|
|
|
|
COMMIT;
|
|
EOF
|
|
|
|
echo -e "${GREEN}✓ All aggregation data cleared${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "================================================"
|
|
echo "FORCE Reset Complete!"
|
|
echo ""
|
|
echo -e "${YELLOW}IMPORTANT: The application needs to be restarted!${NC}"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo "1. Start the application:"
|
|
echo " cd /devdata/apps/bridge-db-monitoring"
|
|
echo " ./run-on-query-server.sh"
|
|
echo ""
|
|
echo "2. Verify health:"
|
|
echo " curl http://localhost:8090/actuator/health"
|
|
echo ""
|
|
echo "3. Start fresh batch job:"
|
|
echo " curl -X POST http://localhost:8090/admin/batch/job/run \\"
|
|
echo " -H 'Content-Type: application/json' \\"
|
|
echo " -d '{\"jobName\": \"vesselAggregationJob\", \"parameters\": {\"tileLevel\": 1}}'"
|
|
echo ""
|
|
echo "Full backup saved to: $BACKUP_FILE"
|
|
echo "================================================"
|
|
|
|
# 자동 시작 옵션
|
|
echo ""
|
|
read -p "Do you want to start the application now? (yes/no): " START_NOW
|
|
|
|
if [ "$START_NOW" = "yes" ]; then
|
|
echo "Starting application..."
|
|
cd /devdata/apps/bridge-db-monitoring
|
|
./run-on-query-server.sh
|
|
fi
|