fix(db): V16 补充 conversation 租户时间索引,脚本使用 MYSQL_PWD 避免密码暴露,增加生产部署提示
This commit is contained in:
@@ -1,5 +1,11 @@
|
|||||||
-- Phase 1.5: 为高频表添加 MySQL RANGE 月分区(分区键 create_time)
|
-- Phase 1.5: 为高频表添加 MySQL RANGE 月分区(分区键 create_time)
|
||||||
-- 架构设计文档:docs/architecture/2026-07-06-message-customer-interaction-design.md 第 2.6.2 节
|
-- 架构设计文档:docs/architecture/2026-07-06-message-customer-interaction-design.md 第 2.6.2 节
|
||||||
|
--
|
||||||
|
-- 生产部署注意:
|
||||||
|
-- 1. 本迁移对主键/唯一键和外键做了破坏性调整,上线前请先在预发布环境用真实数据量验证。
|
||||||
|
-- 2. 大表(message_event / send_record)执行 DROP/ADD PRIMARY KEY 可能锁表,建议使用 pt-online-schema-change
|
||||||
|
-- 或预留低峰窗口;当前脚本为开发/MVP 阶段使用。
|
||||||
|
-- 3. 未提供 down migration:取消分区需要重建表并恢复外键,操作复杂,请在上线前自行备份 schema。
|
||||||
|
|
||||||
-- ============================
|
-- ============================
|
||||||
-- 1. mci_message_event(消息事件表)
|
-- 1. mci_message_event(消息事件表)
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Phase 1.5 补充:为 mci_conversation 添加架构设计要求的 (tenant_code, create_time) 索引
|
||||||
|
-- 注意:V15 中为了满足 MySQL 分区规则,唯一键已包含 create_time,导致唯一性约束弱化;
|
||||||
|
-- 业务上应通过 event_id / task_id 等自然业务键保证唯一性。
|
||||||
|
ALTER TABLE mci_conversation ADD KEY idx_tenant_time (tenant_code, create_time);
|
||||||
@@ -17,6 +17,7 @@ MYSQL_USER="${MYSQL_USER:-root}"
|
|||||||
MYSQL_PASSWORD="${MYSQL_PASSWORD:-root}"
|
MYSQL_PASSWORD="${MYSQL_PASSWORD:-root}"
|
||||||
MYSQL_DB="${MYSQL_DB:-sino_mci}"
|
MYSQL_DB="${MYSQL_DB:-sino_mci}"
|
||||||
MONTHS_AHEAD="${MONTHS_AHEAD:-3}"
|
MONTHS_AHEAD="${MONTHS_AHEAD:-3}"
|
||||||
|
DRY_RUN="${DRY_RUN:-0}"
|
||||||
|
|
||||||
TABLES=(
|
TABLES=(
|
||||||
mci_message_event
|
mci_message_event
|
||||||
@@ -24,12 +25,21 @@ TABLES=(
|
|||||||
mci_conversation
|
mci_conversation
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if ! command -v mysql >/dev/null 2>&1; then
|
||||||
|
echo "Error: mysql client not found in PATH" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Extending monthly partitions for database: ${MYSQL_DB}"
|
echo "Extending monthly partitions for database: ${MYSQL_DB}"
|
||||||
echo "Host: ${MYSQL_HOST}:${MYSQL_PORT}, User: ${MYSQL_USER}, Months ahead: ${MONTHS_AHEAD}"
|
echo "Host: ${MYSQL_HOST}:${MYSQL_PORT}, User: ${MYSQL_USER}, Months ahead: ${MONTHS_AHEAD}"
|
||||||
|
|
||||||
for table in "${TABLES[@]}"; do
|
for table in "${TABLES[@]}"; do
|
||||||
echo " -> ${table}"
|
echo " -> ${table}"
|
||||||
mysql -h "${MYSQL_HOST}" -P "${MYSQL_PORT}" -u "${MYSQL_USER}" -p"${MYSQL_PASSWORD}" "${MYSQL_DB}" \
|
if [ "${DRY_RUN}" = "1" ]; then
|
||||||
|
echo " CALL ExtendMonthlyPartitions('${table}', ${MONTHS_AHEAD});"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
MYSQL_PWD="${MYSQL_PASSWORD}" mysql -h "${MYSQL_HOST}" -P "${MYSQL_PORT}" -u "${MYSQL_USER}" "${MYSQL_DB}" \
|
||||||
-e "CALL ExtendMonthlyPartitions('${table}', ${MONTHS_AHEAD});"
|
-e "CALL ExtendMonthlyPartitions('${table}', ${MONTHS_AHEAD});"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user