You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

160 lines
10 KiB

-- ============================================================================
-- 数据双向同步 —— 影子表建表脚本
-- 运行库: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;