-- ============================================================================ -- 数据双向同步 —— 影子表建表脚本 -- 运行库:2 期业务库(默认数据源 master,例如 zfjd_ef20_07_08) -- 依赖:无。执行本脚本后再运行 002-初始化数据.sql 写入配置初始数据。 -- 作者:zrb -- 说明:本脚本严格遵循《数据双向同步详细计划.md》第四章"影子表设计"。 -- 所有表均建在 2 期库;1 期业务表结构不做任何变更。 -- ============================================================================ -- ---------------------------------------------------------------------------- -- 1. biz_sync_config —— 同步配置运行时表 -- JSON 配置文件为默认值,DB 记录为运行时覆盖 / 开关控制 -- ---------------------------------------------------------------------------- DROP TABLE IF EXISTS `biz_sync_config`; CREATE TABLE `biz_sync_config` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `config_key` varchar(128) NOT NULL COMMENT '配置Key,与 resources/businessdatasyn 下 JSON 文件名(不含扩展名)一致', `description` varchar(500) DEFAULT NULL COMMENT '描述', `enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用:0=禁用,1=启用', `scan_batch_size` int NOT NULL DEFAULT 1000 COMMENT '单次扫描批量大小', `max_retry` int NOT NULL DEFAULT 5 COMMENT '单行失败最大重试次数,超过后置为DEAD', `first_owner_fallback` varchar(4) NOT NULL DEFAULT 'V1' COMMENT '首次双侧共存时归属方回退值:V1/V2', `strict_owner_mode` tinyint(1) NOT NULL DEFAULT 0 COMMENT '严格归属模式(非归属侧变更是否回滚):0=否,1=是', `delete_mode` varchar(16) NOT NULL DEFAULT 'physical' COMMENT '删除模式:physical=物理删除,logical=逻辑删除', `full_scan` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否全表扫描(无 update_time 字段时使用):0=否,1=是', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), UNIQUE KEY `uk_config_key` (`config_key`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-配置运行时表'; -- ---------------------------------------------------------------------------- -- 2. biz_sync_record —— 行级影子表(每一行业务数据的同步状态与快照) -- ---------------------------------------------------------------------------- DROP TABLE IF EXISTS `biz_sync_record`; CREATE TABLE `biz_sync_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `config_key` varchar(128) NOT NULL COMMENT '关联的同步配置Key', `v1_table` varchar(128) NOT NULL COMMENT '1期表名(冗余,方便排查)', `v2_table` varchar(128) NOT NULL COMMENT '2期表名(冗余,方便排查)', `pk_value` varchar(128) NOT NULL COMMENT '业务行主键值,复合主键用 | 分隔', `owner_side` varchar(4) NOT NULL COMMENT '归属方:V1=1期,V2=2期', `content_hash_v1` char(64) DEFAULT NULL COMMENT '上次同步后1 期侧内容 SHA-256', `content_hash_v2` char(64) DEFAULT NULL COMMENT '上次同步后 2 期侧内容 SHA-256', `snapshot_v1_json` longtext DEFAULT NULL COMMENT '1期完整字段快照JSON(本次同步成功后写入,用于变更追溯)', `snapshot_v2_json` longtext DEFAULT NULL COMMENT '2期完整字段快照JSON', `last_sync_time` datetime DEFAULT NULL COMMENT '最近一次成功同步的时间', `last_action` varchar(32) DEFAULT NULL COMMENT '最近一次动作:WRITE_V1/WRITE_V2/DELETE_V1/DELETE_V2/SKIP/CONFLICT_V1_WIN/CONFLICT_V2_WIN 等', `retry_count` int NOT NULL DEFAULT 0 COMMENT '连续失败次数,成功归零', `status` varchar(16) NOT NULL DEFAULT 'NORMAL' COMMENT '记录状态:NORMAL=正常,DEAD=死信(超过max_retry需人工介入)', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_cfg_pk` (`config_key`, `pk_value`), KEY `idx_status_retry` (`status`, `retry_count`), KEY `idx_last_sync_time` (`last_sync_time`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-行级影子表'; -- ---------------------------------------------------------------------------- -- 3. biz_sync_task —— 每次 Job 执行记录(任务级) -- ---------------------------------------------------------------------------- DROP TABLE IF EXISTS `biz_sync_task`; CREATE TABLE `biz_sync_task` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `task_id` varchar(64) NOT NULL COMMENT '任务ID(UUID)', `config_key` varchar(128) NOT NULL COMMENT '关联同步配置Key', `start_time` datetime NOT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', `last_scan_v1` datetime DEFAULT NULL COMMENT '本次扫描到的 1 期 update_time 上限,作为下次起点', `last_scan_v2` datetime DEFAULT NULL COMMENT '本次扫描到的 2 期 update_time 上限,作为下次起点', `total_candidates` int NOT NULL DEFAULT 0 COMMENT '参与本轮的候选行数', `success_count` int NOT NULL DEFAULT 0 COMMENT '成功行数', `conflict_count` int NOT NULL DEFAULT 0 COMMENT '冲突行数(仍会被处理,记录用于统计)', `fail_count` int NOT NULL DEFAULT 0 COMMENT '失败行数', `status` varchar(16) NOT NULL DEFAULT 'RUNNING' COMMENT '任务状态:RUNNING/SUCCESS/PARTIAL_FAIL/FAILED/ABORTED', `error_msg` text DEFAULT NULL COMMENT '整体错误信息', `trigger_type` varchar(16) NOT NULL DEFAULT 'QUARTZ' COMMENT '触发类型:QUARTZ=定时,MANUAL=手动触发,FORCE=强制全量', `trigger_by` varchar(64) DEFAULT NULL COMMENT '手动触发的操作人', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_task_id` (`task_id`), KEY `idx_cfg_start` (`config_key`, `start_time`), KEY `idx_status` (`status`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-任务执行表'; -- ---------------------------------------------------------------------------- -- 4. biz_sync_log —— 行级操作明细日志 -- 每一行同步动作(含失败)都会写入一条,建议 30 天定期归档 -- ---------------------------------------------------------------------------- DROP TABLE IF EXISTS `biz_sync_log`; CREATE TABLE `biz_sync_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `task_id` varchar(64) NOT NULL COMMENT '关联 biz_sync_task.task_id', `config_key` varchar(128) NOT NULL COMMENT '关联同步配置Key', `pk_value` varchar(128) NOT NULL COMMENT '业务行主键值', `action` varchar(32) NOT NULL COMMENT '动作:WRITE_V1/WRITE_V2/DELETE_V1/DELETE_V2/SKIP/CONFLICT_V1_WIN/CONFLICT_V2_WIN/CONFLICT_DELETE_LOSE_V1/CONFLICT_DELETE_LOSE_V2/CONFLICT_TYPE 等', `owner_side` varchar(4) DEFAULT NULL COMMENT '归属方:V1/V2', `before_v1_json` longtext DEFAULT NULL COMMENT '变更前 1 期数据JSON', `before_v2_json` longtext DEFAULT NULL COMMENT '变更前 2 期数据JSON', `after_v1_json` longtext DEFAULT NULL COMMENT '变更后 1 期数据JSON', `after_v2_json` longtext DEFAULT NULL COMMENT '变更后 2 期数据JSON', `success` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否成功:0=失败,1=成功', `error_msg` text DEFAULT NULL COMMENT '失败信息(含堆栈简要)', `cost_ms` int DEFAULT NULL COMMENT '本行耗时(毫秒)', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_task` (`task_id`), KEY `idx_cfg_create` (`config_key`, `create_time`), KEY `idx_pk_value` (`config_key`, `pk_value`), KEY `idx_success` (`success`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-行级操作日志'; -- 设置定时任务 INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark) VALUES ('业务数据增量同步', 'DEFAULT', 'businessDataSyncJob.execute()', '0 0/30 * * * ?', '3', '1', '0', 'admin', NOW(), '每30分钟执行一次业务数据增量同步,扫描v1和v2两侧update_time变更的数据进行双向同步'); -- ============================================================================ -- 验证脚本(可选,创建完执行,应返回 4) -- ============================================================================ -- SELECT COUNT(*) AS shadow_table_count -- FROM information_schema.tables -- WHERE table_schema = DATABASE() -- AND table_name IN ('biz_sync_config', 'biz_sync_record', 'biz_sync_task', 'biz_sync_log'); truncate table biz_sync_task; truncate table biz_sync_record; truncate table biz_sync_log;