最好的方案是用canal,但对方不提供mysql主从(技术上可行,但业务上对方不干)
-
从last表先拿对应的上次的id,作为同步起始点
-
失败 查询相应目的表max(id)值,以这个值,作为同步起始点
-
成功 从OT offset同步起始点拿page_sise数据
- 成功更新LT表中相应值
-
CREATE TABLE `last` (
`table_name` char(20) NOT NULL,
`id` bigint(20) DEFAULT NULL,
`pub_time` datetime DEFAULT NULL,
`spider_time` datetime DEFAULT NULL,
PRIMARY KEY (`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
1 创建目标表,表结构与源表相同
-
2 生成表对应实体及actor代码
-
3 src/main/tables/下创建scala类文件,前一步生成的代码写入
-
4 src/main/task/Sync.scala 添加表同步任务
##示例(代码生成脚本在tool下)
CREATE TABLE `pdf` (
`id` int(11) NOT NULL,
`engine` char(10) NOT NULL,
`source_id` char(13) NOT NULL,
`title` varchar(200) NOT NULL,
`url` varchar(200) NOT NULL,
`desc` varchar(500) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `source_id_UNIQUE` (`source_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
类:class Sync
方法:receive
添加
val pdfactor=context.actorOf(Props[PdfActor],"pdf")
pdfactor !BYOFFSET_TASK_START
-
1 编译打包(结果为SqlSync.jar):
sbt assembly
-
2 运行
java -jar SqlSync.jar