153 lines
4.5 KiB
Bash
Executable File
153 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage:
|
|
migrate_workbench_tables.sh --host HOST --port PORT --user USER --password PASSWORD --source meeting_im --target workbench [--backup-dir DIR]
|
|
|
|
Migrates im_workbench-owned tables from the shared IM database into the standalone workbench database.
|
|
The target tables are dropped and recreated from the source dump. Source and target table dumps are
|
|
written before any target changes.
|
|
EOF
|
|
}
|
|
|
|
HOST=""
|
|
PORT="3306"
|
|
USER=""
|
|
PASSWORD=""
|
|
SOURCE_DB="meeting_im"
|
|
TARGET_DB="workbench"
|
|
BACKUP_DIR=""
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--host) HOST="$2"; shift 2 ;;
|
|
--port) PORT="$2"; shift 2 ;;
|
|
--user) USER="$2"; shift 2 ;;
|
|
--password) PASSWORD="$2"; shift 2 ;;
|
|
--source) SOURCE_DB="$2"; shift 2 ;;
|
|
--target) TARGET_DB="$2"; shift 2 ;;
|
|
--backup-dir) BACKUP_DIR="$2"; shift 2 ;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*) echo "unknown argument: $1" >&2; usage >&2; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$HOST" || -z "$USER" || -z "$PASSWORD" || -z "$SOURCE_DB" || -z "$TARGET_DB" ]]; then
|
|
usage >&2
|
|
exit 2
|
|
fi
|
|
|
|
TABLES=(
|
|
im_workbench_apps
|
|
im_org_departments
|
|
im_org_members
|
|
im_org_visibility_overrides
|
|
im_attendance_rules
|
|
im_attendance_shifts
|
|
im_attendance_records
|
|
im_attendance_checkins
|
|
im_attendance_appeals
|
|
im_meetings
|
|
im_meeting_participants
|
|
im_meeting_note_files
|
|
im_daily_reports
|
|
im_monthly_reports
|
|
im_mailbox_config
|
|
im_mailbox_submissions
|
|
im_feedback_config
|
|
im_feedback_submissions
|
|
wb_ai_capability_config
|
|
wb_ai_document
|
|
wb_ai_idempotency_record
|
|
wb_ai_meeting_summary
|
|
wb_ai_prompt_template
|
|
wb_ai_record
|
|
wb_ai_table_analysis
|
|
wb_ai_task
|
|
wb_ai_task_step
|
|
wb_ai_usage_log
|
|
)
|
|
|
|
timestamp="$(date +%Y%m%d%H%M%S)"
|
|
if [[ -z "$BACKUP_DIR" ]]; then
|
|
BACKUP_DIR="./tmp/workbench_migration_${HOST}_${PORT}_${timestamp}"
|
|
fi
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
MYSQL=(mysql -h "$HOST" -P "$PORT" -u "$USER" "-p$PASSWORD" --default-character-set=utf8mb4)
|
|
MYSQLDUMP=(mysqldump -h "$HOST" -P "$PORT" -u "$USER" "-p$PASSWORD" --default-character-set=utf8mb4 --single-transaction --skip-add-locks --set-gtid-purged=OFF)
|
|
|
|
echo "backup dir: $BACKUP_DIR"
|
|
echo "checking source tables..."
|
|
"${MYSQL[@]}" -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='${SOURCE_DB}'" > "$BACKUP_DIR/${SOURCE_DB}_tables.txt"
|
|
|
|
existing_tables=()
|
|
for table in "${TABLES[@]}"; do
|
|
if grep -qx "$table" "$BACKUP_DIR/${SOURCE_DB}_tables.txt"; then
|
|
existing_tables+=("$table")
|
|
else
|
|
echo "warning: source table ${SOURCE_DB}.${table} does not exist, skipping" >&2
|
|
fi
|
|
done
|
|
|
|
if [[ ${#existing_tables[@]} -eq 0 ]]; then
|
|
echo "no source tables found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "creating target database if needed..."
|
|
"${MYSQL[@]}" -e "CREATE DATABASE IF NOT EXISTS \`${TARGET_DB}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci"
|
|
|
|
echo "backing up source tables..."
|
|
"${MYSQLDUMP[@]}" "$SOURCE_DB" "${existing_tables[@]}" > "$BACKUP_DIR/${SOURCE_DB}_workbench_tables.sql"
|
|
|
|
target_existing=()
|
|
for table in "${existing_tables[@]}"; do
|
|
if "${MYSQL[@]}" -N -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='${TARGET_DB}' AND TABLE_NAME='${table}'" | grep -qx "1"; then
|
|
target_existing+=("$table")
|
|
fi
|
|
done
|
|
if [[ ${#target_existing[@]} -gt 0 ]]; then
|
|
echo "backing up existing target tables..."
|
|
"${MYSQLDUMP[@]}" "$TARGET_DB" "${target_existing[@]}" > "$BACKUP_DIR/${TARGET_DB}_workbench_tables_before.sql"
|
|
fi
|
|
|
|
drop_sql="SET FOREIGN_KEY_CHECKS=0;"
|
|
for table in "${existing_tables[@]}"; do
|
|
drop_sql+="DROP TABLE IF EXISTS \`${TARGET_DB}\`.\`${table}\`;"
|
|
done
|
|
drop_sql+="SET FOREIGN_KEY_CHECKS=1;"
|
|
|
|
echo "dropping target tables..."
|
|
"${MYSQL[@]}" -e "$drop_sql"
|
|
|
|
echo "importing source dump into target..."
|
|
sed -E \
|
|
-e "s/^\s*CREATE DATABASE .*//" \
|
|
-e "s/^\s*USE \`${SOURCE_DB}\`;//" \
|
|
-e "s/^\s*USE ${SOURCE_DB};//" \
|
|
-e "/^\s*LOCK TABLES /d" \
|
|
-e "/^\s*UNLOCK TABLES;/d" \
|
|
"$BACKUP_DIR/${SOURCE_DB}_workbench_tables.sql" | "${MYSQL[@]}" "$TARGET_DB"
|
|
|
|
echo "row count comparison:"
|
|
printf "%-34s %12s %12s\n" "table" "source" "target"
|
|
failed=0
|
|
for table in "${existing_tables[@]}"; do
|
|
src_count="$("${MYSQL[@]}" -N -e "SELECT COUNT(*) FROM \`${SOURCE_DB}\`.\`${table}\`")"
|
|
dst_count="$("${MYSQL[@]}" -N -e "SELECT COUNT(*) FROM \`${TARGET_DB}\`.\`${table}\`")"
|
|
printf "%-34s %12s %12s\n" "$table" "$src_count" "$dst_count"
|
|
if [[ "$src_count" != "$dst_count" ]]; then
|
|
failed=1
|
|
fi
|
|
done | tee "$BACKUP_DIR/row_counts.txt"
|
|
|
|
if [[ "$failed" -ne 0 ]]; then
|
|
echo "row count mismatch" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "migration complete"
|