当前位置: 首页 > article >正文

如何通过 Seatunnel 实现 MySQL 到 OceanBase的数据迁移同步

1. 准备传输工具

本方案采用 Apache Seatunnel(简称seatunnel)进行MySQL 到 OceanBase 的数据迁移和同步,出于对方案轻量性的考量,我们采用其内置的Zeta引擎来实现,包括全量同步、离线增量同步,以及CDC方案。

1.1 运行环境准备

自行安装运行环境JAVA,推荐版本为8,但理论上高于8的版本也能正常工作。安装后,请确保已正确配置JAVA_HOME

root:~# java -version
openjdk version "17.0.12" 2024-07-16
OpenJDK Runtime Environment (build 17.0.12+7-Debian-2deb11u1)
OpenJDK 64-Bit Server VM (build 17.0.12+7-Debian-2deb11u1, mixed mode, sharing)java

1.2 下载并安装seatunnel

进入官网下载页面,下载适合版本seatunnel : Apache SeaTunnel

我这里选择最新版本2.3.7

下载
wget https://dlcdn.apache.org/seatunnel/2.3.7/apache-seatunnel-2.3.7-bin.tar.gz
解压
tar -zxvf apache-seatunnel-2.3.7-bin.tar.gz 

1.3 连接器插件的下载与安装

seatunnel安装包只包含 主体文件与Zeta引擎,连接不同数据源的插件需要手动下载并配置

1.3.1 自动下载方案

通过配置config/plugin_config 文件来指定 你需要的连接器 默认文件里是全方案的 可以根据你的需要增删一些 我们这里只包含这次演示 需要使用的连接库

connector-cdc-mysql
connector-jdbc
connector-fake
connector-console

然后输入命令

sh bin/install-plugin.sh 2.3.7

则开始自动下载连接器

1.3.2  手动下载方案

进入网站Central Repository: org/apache/seatunnel

找寻自己需要的插件例如:

connector-cdc-mysql-2.3.7.jar
connector-console-2.3.7.jar
connector-fake-2.3.7.jar
connector-jdbc-2.3.7.jar
seatunnel-transforms-v2-2.3.7.jar

将文件手动下载之后 放入connectors

1.3.3  验证连接器安装情况
./bin/seatunnel-connector.sh -lSource
FakeSource MySQL-CDC JdbcSink
Jdbc ConsoleTransform
Copy DynamicCompile FieldMapper Filter FilterRowKind JsonPath LLM Replace Split Sql

由于我们是使用JDBC 使用MySQL的连接方式去操作oceanbase 所以还需要下载一个jdbc-mysql

前往MySQL官网下载jdbc

MySQL :: Download MySQL Connector/J (Archived Versions)

将下载的mysql-connector-j-9.0.0.jar 放到 {seatunnel/lib}中

1.4 seatunnel验证

使用config官方自带的v2批操作验证seatunnel是否正常

./bin/seatunnel.sh --config ./config/v2.batch.config.template -m local参数解释:
seatunnel.sh #seatunnel标准启动脚本
config #选择配置脚本
m #运行方式 这里选择本地运行

当您运行该命令时,您可以在控制台中看到它的输出

2022-12-19 11:01:45,417 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - output rowType: name<STRING>, age<INT>
2022-12-19 11:01:46,489 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=1:  SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: CpiOd, 8520946
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=2: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: eQqTs, 1256802974
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=3: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: UsRgO, 2053193072
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=4: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: jDQJj, 1993016602
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=5: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: rqdKp, 1392682764
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=6: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: wCoWN, 986999925
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=7: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: qomTU, 72775247
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=8: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: jcqXR, 1074529204
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=9: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: AkWIO, 1961723427
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=10: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: hBoib, 929089763
2022-12-19 11:01:46,490 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=11: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: GSvzm, 827085798
2022-12-19 11:01:46,491 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=12: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: NNAYI, 94307133
2022-12-19 11:01:46,491 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=13: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: EexFl, 1823689599
2022-12-19 11:01:46,491 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=14: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: CBXUb, 869582787
2022-12-19 11:01:46,491 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=15: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: Wbxtm, 1469371353
2022-12-19 11:01:46,491 INFO  org.apache.seatunnel.connectors.seatunnel.console.sink.ConsoleSinkWriter - subtaskIndex=0 rowIndex=16: SeaTunnelRow#tableId=-1 SeaTunnelRow#kind=INSERT: mIJDt, 995616438

并且结尾有一个 job总结日志

***********************************************Job Statistic Information
***********************************************
Start Time                : 2024-08-29 22:45:29
End Time                  : 2024-08-29 22:45:33
Total Time(s)             :                   4
Total Read Count          :                  32
Total Write Count         :                  32
Total Failed Count        :                   0
***********************************************

2. 全量同步

2.1 测试表创建

创建两张一模一样的表 表结构如下:
CREATE TABLE `table1` (`id` INT NOT NULL AUTO_INCREMENT,`value1` VARCHAR(255) NOT NULL,`value2` VARCHAR(255) ,`value3` VARCHAR(255) ,`value4` VARCHAR(255) ,`value5` VARCHAR(255) ,`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),UNIQUE INDEX `idx_value1` (`value1`),INDEX `idx_value2_value3` (`value2`, `value3`),INDEX `idx_value3_value4_value5` (`value3`, `value4`, `value5`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `table2` (`id` INT NOT NULL AUTO_INCREMENT,`value1` VARCHAR(255) NOT NULL,`value2` VARCHAR(255) ,`value3` VARCHAR(255) ,`value4` VARCHAR(255) ,`value5` VARCHAR(255) ,`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),UNIQUE INDEX `idx_value1` (`value1`),INDEX `idx_value2_value3` (`value2`, `value3`),INDEX `idx_value3_value4_value5` (`value3`, `value4`, `value5`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我们这边使用navicat创建了各100000条数据

2.2 全量同步配置文件编写

表结构建议手动迁移,自动迁移的表结构会有一些问题,并且不会附加索引

2.2.1 单表全量
env {parallelism = 5job.mode = "BATCH"
}
source {Jdbc {url = "jdbc:mysql://127.0.0.1:3306/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"connection_check_timeout_sec = 100user = "xxx"password = "xxx"query = "select * from seatunnel.table1"}
}
sink {jdbc {url = "jdbc:mysql://127.0.0.1:2883/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"user = "xxx@xxx"password = "xxx"# 自动判断sql语句generate_sink_sql = truedatabase = seatunneltable = table1}
}

结果

  ***********************************************Job Statistic Information***********************************************Start Time                : 2024-08-30 15:05:39End Time                  : 2024-08-30 15:05:47Total Time(s)             :                   8Total Read Count          :              100000Total Write Count         :              100000Total Failed Count        :                   0***********************************************
2.2.2 多表全量抽取
env {parallelism = 5job.mode = "BATCH"
}
source {Jdbc {url = "jdbc:mysql://127.0.0.1:3306/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"connection_check_timeout_sec = 100user = "xxx"password = "xxx"table_list = [{table_path = "seatunnel.table1"},{table_path = "seatunnel.table2"query = "select * from seatunnel.table2 where id > 100"}]}
}
sink {jdbc {url = "jdbc:mysql://127.0.0.1:2883/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"user = "xxx@xxx"password = "xxx"# 自动判断sql语句generate_sink_sql = truedatabase = seatunneltable_list = ["seatunnel.table1","seatunnel.table2"]}
}

结果

  ***********************************************Job Statistic Information***********************************************Start Time                : 2024-08-30 15:10:09End Time                  : 2024-08-30 15:10:20Total Time(s)             :                  10Total Read Count          :              200000Total Write Count         :              200000Total Failed Count        :                   0***********************************************

2.3 增量同步配置文件编写

对于增量同步 简单的方法是在文件编写时 通过query 编写 id或updatetime做增量

env {parallelism = 1job.mode = "BATCH"
}
source {Jdbc {url = "jdbc:mysql://127.0.0.1:3306/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"connection_check_timeout_sec = 100user = "xxx"password = "xxx"query = "SELECT * FROM seatunnel.table1 WHERE updatetime > '2024-01-01' "}
}
sink {jdbc {url = "jdbc:mysql://127.0.0.1:2883/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"user = "xxx@xxx"password = "xxx"generate_sink_sql = truedatabase = seatunneltable = table1 }
}

在输出端的时候会根据主键进行 插入与更新操作 但是这种需要从每次配置配置文件的方案比较繁琐 我更加推荐使用dolphinscheduler配合seatunnel进行操作创建一个工作流

1725004844

从输出端获取最大时间或者id 通过 dolphinscheduler的工作流变量进行传输

env {parallelism = 1job.mode = "BATCH"
}
source {Jdbc {url = "jdbc:mysql://127.0.0.1:3306/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"connection_check_timeout_sec = 100user = "xxx"password = "xxx"query = "SELECT * FROM seatunnel.table1 WHERE updatetime > ${max_id} "}
}
sink {jdbc {url = "jdbc:mysql://127.0.0.1:2883/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"user = "xxx@xxx"password = "xxx"generate_sink_sql = truedatabase = seatunneltable = table1 }
}

多表方案同上

2.4 CDC同步配置文件编写

2.4.1 手动同步表结构

由于seatunnel的oceanbase组件还是有所问题 表结构同步 遇到报错比较麻烦 这一步还是手动同步

2.4.2 检查MySQL  binlog状态

赋予用户所需权限

mysql> GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user' IDENTIFIED BY 'password';mysql> FLUSH PRIVILEGES;

检查binlog日志是否开启

mysql> show variables where variable_name in ('log_bin', 'binlog_format', 'binlog_row_image', 'gtid_mode', 'enforce_gtid_consistency');
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| binlog_format            | ROW            |
| binlog_row_image         | FULL           |
| enforce_gtid_consistency | ON             |
| gtid_mode                | ON             |
| log_bin                  | ON             |
+--------------------------+----------------+
5 rows in set (0.00 sec)

如果不一致 请自行更改mysql.cnf文件

在大型数据库创建一致性快照时 可能会存在读超时 请合理配置

interactive_timeoutwait_timeout

在处理完准备工作之后编写配置文件

env {parallelism = 1job.mode = "STREAMING"checkpoint.interval = 10000
}source {MySQL-CDC {base-url = "jdbc:mysql://127.0.0.1:3306/mysql"username = "xxx"password = "xxx@xxx"table-names = ["seatunnel.table1", "seatunnel.table2"]startup.mode = "initial"}
}sink {jdbc {url = "jdbc:mysql://127.0.0.1:2883/mysql?&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"driver = "com.mysql.cj.jdbc.Driver"user = "xxx@xxx"password = "xxx"database = "seatunnel"  # 目标数据库table-names = ["seatunnel.table1", "seatunnel.table2"]generate_sink_sql = true     # 自动生成 SQL}
}

正常启动之后 会进行历史数据迁移 再进行cdc变更

注意:

启动之后会根据配置的表和startup.mode选择的模式 进行不同的操作

startup.mode操作如下:initial 启动时同步历史数据,然后同步增量数据earliest 从最早的偏移量启动latest 从最新偏移量启动specific 从用户提供的特定偏移量启动

如果使用specific 需要添加startup.specific-offset.file binlog文件名startup.specific-offset.pos binlog偏转量

相关文章:

如何通过 Seatunnel 实现 MySQL 到 OceanBase的数据迁移同步

1. 准备传输工具 本方案采用 Apache Seatunnel&#xff08;简称seatunnel&#xff09;进行MySQL 到 OceanBase 的数据迁移和同步&#xff0c;出于对方案轻量性的考量&#xff0c;我们采用其内置的Zeta引擎来实现&#xff0c;包括全量同步、离线增量同步&#xff0c;以及CDC方案…...

C++20 新特性总结

简要总结 C20 引入了四项非常大的更新, 分别是: 概念(Concepts). 用来简化模板编程, 强化表达能力. 并且使得出错原因更容易查找.模块(Modules). 这是代码组织方面非常大的更新. 提供了新的方式来组织代码, 并且可以减少编译时间.范围库(Ranges and Views). 轻量级的, 非拥有…...

软件设计模式之简单工厂模式

目录 一.类图&#xff08;手机生产&#xff09; 二.代码实现 Iphone类&#xff1a; Vivo类&#xff1a; Mobile类&#xff1a; MobileFactory类&#xff1a; Client类&#xff1a; 一.类图&#xff08;手机生产&#xff09; 补充&#xff1a;MobileFactory也可以直接指向…...

内网激活JRebel插件(无网络环境)

1.官网下载安装包,JRebel and XRebel JRebel and XRebel - IntelliJ IDEs Plugin | Marketplace 2.以IInstall Plugin from Disk的方式读取 3.运行JrebelServer.jar 终端输入&#xff1a; java -jar JrebelServer.jar -p 8080 (默认8080端口)服务会自动打开浏览器至 http:/…...

LiveGBS流媒体平台GB/T28181常见问题-视频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验

LiveGBS流媒体平台GB/T28181常见问题频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.…...

Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

接口自动化入门 —— Http的请求头,请求体,响应码解析!

在接口自动化测试中&#xff0c;HTTP请求头、请求体和响应码是核心组成部分。理解它们的作用、格式和解析方法对于进行有效的接口测试至关重要。以下是详细解析&#xff1a; 1. HTTP 请求头&#xff08;Request Header&#xff09; 1.1 作用 请求头是客户端向服务器发送的附加…...

upload-labs(1-20)详解(专业版)

目录 第1关 第2关 第3关 第4题 第5题 第6题 第7题 第8题 第9题 第10题 第11题 第12题 第13题 第1关 查看源码 在第一关是一个前端js的一个后缀识别&#xff1a;当不为jpg、png、gif时候出现弹窗 检查源码 将return checkFile() 改为 return ture 就可以将php顺利…...

Linux 生成静态库

文章目录 前提小知识生成和使用.a库操作步骤 在应用程序中&#xff0c;有一些公共的代码需要反复使用的&#xff0c;可以把这些代码制作成“库文件”&#xff1b;在链接的步骤中&#xff0c;可以让链接器在“库文件”提取到我们需要使用到的代码&#xff0c;复制到生成的可执行…...

ARMV8的64位指令

一、介绍 ARMv8 体系结构最大的改变是增加了一个新的 64 位的指令集&#xff0c;这是早前 ARM 指令集 的有益补充和增强。它可以处理 64 位宽的寄存器和数据并且使用 64 位的指针来访问内存。这 个新的指令集称为 A64 指令集&#xff0c;运行在 AArch64 状态。 ARMv8 兼容旧的…...

【git】 贮藏 stash

贮藏是我在sourcetree上看到的名词。之前只是浅浅的用来收藏一下修改的文件&#xff0c;没有完整的使用过。今天有幸使用了一次就来展开说说。 使用原因就不赘述了&#xff0c;错误的操作少提为好&#xff0c;操作步骤如下&#xff1a; 查看贮藏列表git stash list #输出&…...

ctf-web: php原生类利用 -- GHCTF Popppppp

源代码 <?php error_reporting(0); class CherryBlossom { public $fruit1; public $fruit2; public function __construct($a) {$this->fruit1 $a; } function __destruct() { echo $this->fruit1; } public function __toString() { $newFunc …...

PawSQL for TDSQL:腾讯云TDSQL数据库性能优化全攻略

TDSQL 作为腾讯云推出的分布式数据库&#xff0c;凭借其高扩展性、高可用性和高性能等优势&#xff0c;广泛应用于金融、互联网、政务等领域。随着业务的不断增长和数据量的爆炸式增长&#xff0c;如何优化 TDSQL 数据库的性能&#xff0c;成为众多企业和开发者面临的挑战。本文…...

202250311-WINDOWS本地4G显存Docker运行vLLM

前置&#xff1a; 需要去huggingface注册账号获取token&#xff1a;HUGGING_FACE_HUB_TOKEN 运行vLLM docker run --name LocalvLLM_qwen1.5B_Int4 --runtime nvidia --gpus all -v D:/vLLM/.cache/huggingface:/root/.cache/huggingface --env "HUGGING_FAC…...

Scala 中生成一个RDD的方法

在 Scala 中&#xff0c;生成 RDD&#xff08;弹性分布式数据集&#xff09;的主要方法是通过 SparkContext&#xff08;或 SparkSession&#xff09;提供的 API。以下是生成 RDD 的常见方法&#xff1a; 1. 从本地集合创建 RDD 使用 parallelize 方法将本地集合&#xff08;如…...

T-SQL 语言基础:表运算符与联接

目录 介绍表运算符概述交叉联接内联接外联接联接实例总结引用 1. 介绍 在这篇博客中&#xff0c;主要涉及 T-SQL 中的表运算符与联接。联接操作是 SQL 查询中最常用的操作之一&#xff0c;它允许我们在多个表之间进行数据关联。通过了解不同类型的联接及其应用场景&#xff…...

Electron打包工具对比

在 Electron 生态中&#xff0c;打包工具的选择直接影响开发效率、配置复杂度和最终应用的性能。以下是主流的 Electron 打包工具及其优劣分析&#xff0c;结合你的 Vue 项目需求&#xff0c;我会在最后给出推荐方案&#xff1a; 一、主流 Electron 打包工具对比 1. Electron …...

jumpserver 网络安全 网络安全 authenticity

1.1 计算机安全的概念 1.1.1 计算机安全最核心的三个关键目标(CIA)&#xff1a; 保密性(Confidentiality)--①数据保密性&#xff08;确保隐私或秘密不向非授权者泄密或使用&#xff09;&#xff1b; ②隐私性&#xff08;确保个人能够控制或确定其自身相关的信息&#xff09…...

Spring Cloud之远程调用OpenFeign参数传递

目录 OpenFeign参数传递 传递单个参数 传递多个参数 传递对象 传递JSON OpenFeign参数传递 传递单个参数 服务提供方product-service RequestMapping("/product") RestController public class ProductController {Autowiredprivate ProductService productSe…...

详解SQL权限与授予与收回对数据操作权限的操作

授予与收回对数据操作权限 一、GRANT 操作用法示例 二、REVOKE 操作用法示例 三、权限1. 数据库级别权限常见权限&#xff1a; 2. 对象级别权限作用对象&#xff1a;常见权限&#xff1a;对表或视图&#xff1a;对序列&#xff08;Sequence&#xff09;&#xff1a;对存储过程和…...

网络安全之文件上传漏洞

一&#xff0c;文件上传漏洞的原因&#xff1a; 文件上传漏洞的存在主要是因为开发者未对用户上传的文件进行充分的安全验证&#xff0c;导致攻击者可以上传恶意文件&#xff08;如 WebShell、恶意脚本等&#xff09;到服务器&#xff0c;进而控制服务器或实施进一步攻击。 常…...

Fast DDS Security--仿问控制

Fast DDS中提供了两种级别的仿问控制&#xff1a; 1 Domain Governance: 定义域级别的安全策略&#xff08;全局规则&#xff09;. 2 DomainParticipant Permissions &#xff1a; 定义参与者的具体权限&#xff08;个体规则&#xff09; 先说一下Domain Governance&#xf…...

【13】单片机编程核心技巧:乘法运算

【13】单片机编程核心技巧&#xff1a;乘法运算 七律 乘法 乘法运算寄存间&#xff0c;溢出玄机隐字边。 连乘自增简写妙&#xff0c;移位替代速如仙。 中间变量扩疆土&#xff0c;长整型存避险关。 单片机中精算术&#xff0c;毫厘不爽展奇观。 摘要 乘法运算是单片机编程…...

为什么大模型网站使用 SSE 而不是 WebSocket?

在大模型网站&#xff08;如 ChatGPT、Claude、Gemini 等&#xff09;中&#xff0c;前端通常使用 EventSource&#xff08;Server-Sent Events, SSE&#xff09; 来与后端对接&#xff0c;而不是 WebSocket。这是因为 SSE 更适合类似流式文本生成的场景。下面我们详细对比 SSE…...

PostgreSQL的备份方式

PostgreSQL 提供多种方式进行备份&#xff0c;适用于不同需求的场景。常用的备份方法如下&#xff1a; 1. 逻辑备份&#xff08;pg_dump 和 pg_dumpall&#xff09; 1.1 使用 pg_dump 备份单个数据库 pg_dump 是 PostgreSQL 内置的逻辑备份工具&#xff0c;可以将数据库导出为…...

iTextSharp-PDF批量导出

HTML转PDF批量导出速度太慢且使用Spire.pdf.dll限制页签10后需要开通会员才能使用-做出优化 环境&#xff1a;U9 - UI插件 需求&#xff1a;选择需要导出的客户查询对应对账数据批量导出PDF并弹出下载框保存到默认位置 using System; using System.Collections.Generic; us…...

基于Matlab设计GUI图像处理交互界面

Image-Processing-GUI 项目说明 本博文提供了完整的代码和使用教程&#xff0c;适合新入门的朋友参考&#xff0c;完整代码资源文件请转至文末的下载链接。 本项目是《Matlab实践》中图像处理软件题目&#xff0c;本项目实现的具体内容如下 基于Matlab设计GUI交互界面图像的…...

osg安装编译第三方,完整详细过程。 libtiff/tif config.vc.hdoes not exist

第三方安装包下载地址 GitHub - bjornblissing/osg-3rdparty-cmake: CMake scripts for building OpenSceneGraph third party libraries. 在计算机中的布局 D:\CPlus\osg\src\osg-3rdparty\osg-3rdparty-cmake三层布局&#xff0c;src 放置源码 执行里面的批处理文件&#…...

红队OPSEC(安全运营)个人总结

OPSEC又称&#xff1a;运营安全&#xff0c;是指在红队的视角下&#xff0c;蓝队对我方的威胁。 OPSEC漏洞的五个流程&#xff1a; 关键信息识别&#xff1a;指红队的关键信息不泄露&#xff0c;包括但不限于红队的攻击意图&#xff0c;能力&#xff0c;人员&#xff0c;活动及…...

RSA算法:开启现代密码学的数学之钥

一、RSA算法简介 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是当今应用最广泛的非对称加密算法&#xff0c;由三位科学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出。它的核心思想是利用数论中的难题&#xff0c;构建一对数学上关联的密钥——公钥用于加密…...