-- IM Kafka foundation tables for tenant databases. -- Date: 2026-08-26 -- Scope: run once in every tenant business database, such as tinode. -- Notes: -- * Do not run in hotgo. Admin/HotGo side needs its own admin_command tables. -- * Kafka consume idempotency/retry state is Redis-backed; MySQL only keeps manual dead letters. DROP TABLE IF EXISTS im_kafka_consume_log; CREATE TABLE IF NOT EXISTS im_kafka_dead_letters ( id BIGINT NOT NULL AUTO_INCREMENT, dead_id VARCHAR(96) NOT NULL, event_id VARCHAR(96) NOT NULL, parent_event_id VARCHAR(96) NOT NULL DEFAULT '', source_topic VARCHAR(128) NOT NULL, consumer_group VARCHAR(128) NOT NULL, event_type VARCHAR(96) NOT NULL DEFAULT '', biz_type VARCHAR(64) NOT NULL DEFAULT '', biz_id VARCHAR(128) NOT NULL DEFAULT '', envelope JSON NOT NULL, retry_count INT NOT NULL DEFAULT 0, last_reason VARCHAR(64) NOT NULL DEFAULT '', last_error VARCHAR(1000) NOT NULL DEFAULT '', status VARCHAR(24) NOT NULL DEFAULT 'dead', replay_count INT NOT NULL DEFAULT 0, resolved_by VARCHAR(64) NOT NULL DEFAULT '', resolved_at DATETIME(3), resolve_note VARCHAR(1000) NOT NULL DEFAULT '', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY(id), UNIQUE INDEX uk_im_kafka_dead_letters_dead(dead_id), INDEX idx_im_kafka_dead_letters_event(event_id), INDEX idx_im_kafka_dead_letters_status(status, created_at), INDEX idx_im_kafka_dead_letters_biz(biz_type, biz_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;