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
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;
|
|
|