用OMS进行 OceanBase 租户间数据迁移的测评

基本概念

OceanBase迁移服务(,简称OMS),可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互,支持数据的在线迁移,以及实时增量同步的复制功能。

OMS 提供了可视化的集中管控平台,通过简单的配置用户即可完成数据的实时迁移,且对源数据库和业务系统的影响开销可忽略不计。OMS 旨在帮助用户以最低的风险、极小的开销和最高的效率实现同构/异构数据库向 OceanBase 数据库进行实时数据迁移和数据同步。OMS 社区版支持数据迁移功能,您可以通过该功能实时进行 MySQL 数据库与 OceanBase 社区版之间的数据迁移,以及 OceanBase 社区版与 OceanBase 社区版之间的数据迁移。

同时,通过 OMS 用户可以在不停服的情况下无缝将数据迁移到 OceanBase 数据库上。在业务应用切换数据库到 OceanBase 数据库前,OMS 可以启用反向数据同步链路,再执行应用切换到 OceanBase 数据库,重新建立主备关系,此时所有在切换后发生在 OceanBase 数据库上的数据变更都将实时同步至切换前的源端数据库,以此来应对紧急回切的需求场景,最大程度的降低业务迁移风险,助力企业用户构建高可用和高可靠的数据体系架构。

测试目的

本节主要测试 OceanBase 数据库不同租户之间的数据同步。当迁移的源端数据库为 OceanBase 时,会通过 OCP 获取相关信息,所以需要关联 OCP。OMS 社区版会通过 JDBC 直连 OCP 的元信息库,来查询数据迁移流程中需要使用的信息,然后发送数据给目标端 OceanBase 租户。该方法同样也适用于 MySQL 与 OceanBase 以及 OceanBase 与 OceanBase 之间的数据同步。

前提条件

1、 已部署 OCP 社区版 3.3.0,详细操作请参见 OCP 部署指南。

2、 已部署 OMS 社区版 3.3.0,详细操作请参见 OMS 部署指南。

3、部署待迁移的 OceanBase 集群(含 OBProxy),必须使用 OCP 接管或创建。详细操作请参见 创建集群 和 使用 OCP 接管 OBD 部署的集群。

数据同步测试

环境准备

1、登录 OCP,使用 OCP 为待迁移的集群创建租户、数据库及迁移所用的用户。具体操作请参见:管理租户。

租户数据库用户备注
test1test_oms_1oms源端1
test2test_oms_2oms源端2
test3test_oms_3oms目标端

2、登录 OMS 社区版控制台。

3、关联 OCP。

当 OMS 社区版的运行涉及 OceanBase 数据源时,会通过 OCP 获取相关信息,所以需要关联 OCP。具体操作请参见 关联 OCP。添加完成后,可在关联 OCP 页面中看到已关联的 OCP。

1679474663

4、添加 OceanBase 社区版数据源(源端和目标端),具体操作请参见 添加 OceanBase-CE 数据源,添加完成后可在数据源管理中看到已添加的数据源列表。

1679474683

测试一:

测试目的:测试能否正常将租户 test1 表 t1 的数据和租户 test2 表 t2 的数据,分别迁移至租户 test3 的表 t1 和 表 t2 中。

测试步骤:

  • 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
  • 增量同步:在源端租户 test1 的表 t1 和租户 test2 的表 t2 中进行 insertdeleteupdate,查看目标端租户 test3 的表 t1 和 表 t2 数据的变化。
  • 反向增量同步:正常增量同步完成后,开启租户 test3 到 租户 test1 的反向增量同步。在目标端租户 test3 的表 t1 中进行 insertdeleteupdate,查看源端租户 test1 的表 t1 数据的变化。
租户数据库用户备注
test1test_oms_1omst1源端1
test2test_oms_2omst2源端2
test3test_oms_3omst1,t2目标端

1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t1 和 t2。

obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1

CREATE TABLE `t1` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;

MySQL [test_oms_1]> insert into t1(id,name,remark) values(10,'aa','test10');
MySQL [test_oms_1]> insert into t1(id,name,remark) values(11,'bb','test11');
MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2

CREATE TABLE `t2` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;

MySQL [test_oms_2]> insert into t2(id,name,remark) values(20,'aa','test20');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(21,'bb','test21');
Query OK, 1 row affected (0.002 sec)

MySQL [test_oms_2]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
+----+------+--------+
2 rows in set (0.002 sec)

2、创建数据迁移项目,具体操作请参见 数据迁移

2.1、选择源节点和目标节点,这里选择源端1和目标端,即源端租户 test1 和目标端租户 test3。

1679474699

2.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。

1679474705

2.3、启动任务之后,可以看到任务的基本信息及迁移步骤详情。

1679474717

2.4、同理继续创建第二迁移项目(源端租户 test2 和目标端租户 test3),创建完成后,可在迁移项目列表中,查看添加的项目。

1679474726

3、验证迁移结果

3.1、全量迁移验证

登录目标端租户 test3 ,查看全量迁移的结果。可以看到 test1 租户的表 t1,和 test2 租户表 t2 已经迁移成功。 

[admin@126 ~]$obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test3#testoms -pXXX -A test_oms_3

MySQL [test_oms_3]> show tables;
+----------------------+
| Tables_in_test_oms_3 |
+----------------------+
| t1                   |
| t2                   |
+----------------------+
2 rows in set (0.001 sec)

MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
+----+------+--------+
2 rows in set (0.001 sec)

MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
+----+------+--------+
2 rows in set (0.001 sec)

3.2、增量同步验证

  • 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t1(id,name,remark) values(12,'cc','test12');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(22,'cc','test22');

MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | cc   | test12 |
+----+------+--------+
3 rows in set (0.000 sec)

MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
| 22 | cc   | test22 |
+----+------+--------+
3 rows in set (0.001 sec)

MySQL [test_oms_3]>

  • 在源端租户 test1 的表 t1 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。

MySQL [test_oms_1]> update t1 set name = 'dd' where id = 12;

MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
+----+------+--------+
3 rows in set (0.000 sec)

  • 在源端租户 test2 的表 t2 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到 id =20的数据被删除。

MySQL [test_oms_2]> delete from t2 where id = 20;

MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 21 | bb   | test21 |
| 22 | cc   | test22 |
+----+------+--------+
2 rows in set (0.000 sec)

3.3、反向增量验证

以租户 test3 反向增量迁移至租户 test1 为例,进行反向增量同步前,请确认正向增量同步已完成,

全量校验完成后,单击【进入下一阶段】,进行正向切换。

注意:启动正向切换前,请确保源端数据源为即将停写或者已经停写状态。

1679474742

1679474753

反向增量任务启动成功后,在目标端租户 test3 的表 t3 中插入一条数据,在源端租户 test1 中,查看数据反向同步的结果。可以看到新插入的数据已被反向同步过来。

MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
+----+------+--------+
3 rows in set (0.003 sec)

MySQL [test_oms_3]> insert into t1(id,name,remark) values(14,'ee','test14');

MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
| 14 | ee   | test14 |
+----+------+--------+
4 rows in set (0.000 sec)

在目标端租户 test3 的表 t1 中修改一条数据,在源端租户 test1 中,查看数据同步的结果。可以看到id = 10数据已被删除。

MySQL [test_oms_3]> delete from t1 where id = 10;

MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 11 | bb   | test11 |
| 12 | dd   | test12 |
| 14 | ee   | test14 |
+----+------+--------+
3 rows in set (0.000 sec)

测试二:

测试目的:测试能否正常将租户 test1 和租户 test2 中两张结构相同的表,迁移至租户 test3 的一张表中。

测试步骤:

  • 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
  • 增量同步:在源端租户 test1 的表 t3 和租户 test2 的表 t3 中进行 insertdeleteupdate,查看目标端租户 test3 的表 t3 数据的变化。

测试结果:

同时将两个相同结构的表往另一张表汇总时,在进行全量迁移的过程中,若存在 id 相同的数据,后迁移的数据不会被同步过来,会导致后迁移的数据丢失。但是在增量同步的过程中,若插入的 id 相同,则后表插入的数据会覆盖前表插入的数据,导致前表插入的数据丢失。

租户数据库用户备注
test1test_oms_1omst3源端1
test2test_oms_2omst3源端2
test3test_oms_3omst3目标端

1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t3。

obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1

CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;

MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'aa','r1');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(011,'bb','r2');

MySQL [test_oms_1]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2

CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;


MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'zz','r3');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(012,'yy','r4');

MySQL [test_oms_2]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | zz   | r3     |
| 12 | yy   | r4     |
+----+------+--------+
2 rows in set (0.002 sec)

2、创建租户 test1 至 租户test3 的数据迁移项目,具体操作请参见 数据迁移。

3、创建租户 test2 至 租户test3 的数据迁移项目。

3.1、选择源节点和目标节点,这里选择源端2和目标端,即源端租户 test2 和目标端租户 test3。

1679474776

3.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。

1679474788

3.3、配置迁移选项,这里注意在高级配置中,允许全量迁移目标表非空,因为前面已经创建了租户 test1 表1 至 test3 表 t3 的迁移项目,项目启动后,目标表非空。

1679474810

3.4、租户 test1 表1 至 test3 表 t3 的迁移项目,已经在租户 test3 中创建了表 t3,此时不需要再创建表,因此可直接跳过结构迁移,再单击右上角的“恢复”,继续进行下一步。

1679474818

创建完成后可在迁移项目列表中,查看到已创建的迁移项目。

1679474824

4、验证迁移结果

4.1、全量迁移验证

登录目标端租户 test3 ,查看全量迁移的结果。可以看到租户 test2 中 id = 10 因为和 租户 test1 中的 id 相同,导致数据未被迁移过来。在项目详情的全量校验中也可以看到数据不一致的提示。

1679474830

MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
+----+------+--------+
3 rows in set (0.001 sec)

3.2、增量同步验证

  • 分别在源端租户 test1 的表 t3 和租户 test2 的表 t3 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(013,'cc','r5');
MySQL [test_oms_2]> insert into t3(id,name,remark) values(014,'xx','r6');

MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
+----+------+--------+
5 rows in set (0.001 sec)
  • 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条 id 相同的数据,在目标端租户 test3 中,查看数据同步的结果。可以看到当 id 相同时后插入的数据会覆盖前插入的数据。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(015,'dd','r7');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | dd   | r7     |
+----+------+--------+
6 rows in set (0.001 sec)

MySQL [test_oms_2]> insert into t3(id,name,remark) values(015,'ww','r8');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
6 rows in set (0.000 sec)
  • 在源端租户 test1 的表 t3 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。
MySQL [test_oms_1]> update t3 set remark='test1' where id = 10;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test1  |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
6 rows in set (0.001 sec)
  • 在源端租户 test2 的表 t3 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到 id = 12 的数据已被删除。
MySQL [test_oms_2]> delete from t3 where id = 12;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test1  |
| 11 | bb   | r2     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
5 rows in set (0.000 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一个 Flutter 项目(1)共46节

前端开发工具vs code,安装Flutter sdk,如果你的下载速度比较慢,可以选择这个😄 flutter sdk 解压码:stwq 配置可以看这Flutter 新建工程一直等待 解决办法-CSDN博客 如果你是新的 Flutter 开发者,我们建…

POI实现根据PPTX模板渲染PPT

目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…

高级数据结构——hash表与布隆过滤器

文章目录 hash表与布隆过滤器1. hash函数2. 选择hash函数3. 散列冲突3.1 负载因子3.2 冲突解决3. STL中的散列表 4. 布隆过滤器4.1 背景1. 应用场景2. 常见的处理场景: 4.2 布隆过滤器构成4.3 原理4.4 应用分析4.5 要点 5. 分布式一致性hash5.1 缓存失效问题 6. 大数…

小程序19-微信小程序的样式和组件介绍

在小程序中不能使用 HTML 标签,也就没有 DOM 和 BOM,CSS 也仅支持部分选择器 小程序提供了 WXML 进行页面结构的编写,WXSS 进行页面的样式编写 WXML 提供了 view、text、image、navigator等标签构建页面结构,小程序中标签称为组件…

[Linux]多线程详解

多线程 1.线程的概念和理解1.1线程的优点1.2线程的缺点1.3线程的设计1.4线程 VS 进程 2.线程控制2.1线程等待2.2 线程终止2.3 线程分离 3.线程互斥3.1背景3.2抢票代码演示3.3保护公共资源(加锁)3.3.1创建锁/销毁锁3.3.2申请锁/尝试申请锁/解锁 3.4解决抢…

CSP-J 2024题解

省流&#xff1a;300->260 乐。 Poker: 我考场上寻思着会不会有人写成了 joker.in joker.out&#xff0c;结果真的有 joker Sol EZ problem&#xff0c;拿 set 搞一下就行了&#xff08;虽然我赛事没想到&#xff0c;用了 map&#xff09; Code #include <bits/std…

【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

python机器人Agent编程——多Agent框架的底层逻辑(上)

目录 一、前言二、两个核心概念2.1 Routines&#xff08;1&#xff09;清晰的Prompt&#xff08;2&#xff09;工具调用json schema自动生成&#xff08;3&#xff09;解析模型的toolcall指令&#xff08;4&#xff09;单Agent的循环决策与输出 PS.扩展阅读ps1.六自由度机器人相…

达梦 DG

监视器 switchover 关于达梦DG switchover的细节&#xff0c;以下是一些关键步骤和注意事项&#xff1a; • 切换前检查确认&#xff1a; • 确认数据库版本和DG架构&#xff0c;包括IP信息及切换角色前后的情况。 • 检查DG切换方式&#xff0c;是switch over还是fail ove…

blind-watermark - 水印绑定

文章目录 一、关于 blind-watermark安装 二、bash 中使用三、Python 调用1、基本使用2、attacks on Watermarked Image3、embed images4、embed array of bits 四、并发五、相关 Project 一、关于 blind-watermark Blind watermark 基于 DWT-DCT-SVD. github : https://githu…

从零开始的c++之旅——二叉搜索树

1、二叉搜索树概念 1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结…

类与对象;

目录 一、认识类&#xff1b; 1、类的引入&#xff1b; 2、类的定义&#xff1b; 类的两种定义方式&#xff1a; 3、类的访问限定符及封装&#xff1b; 4、类的作用域&#xff1b; 5、类的实例化&#xff1b; 6、类对象模型&#xff1b; 计算类对象的大小&#xff1b; …

ceph的集群管理

0 环境说明 ip地址主机名额外硬盘是否加入ceph集群10.0.0.141ceph141sdb 300G&#xff0c;sdc 500G是10.0.0.142ceph142sdb 300G&#xff0c;sdc 500G, sdd 1000G否10.0.0.143ceph143sdb 300G&#xff0c;sdc 500G否 在上一篇文章中&#xff0c;已经成功地初始化了一个ceph管…

企业无线解决方案

前言 无线广域网 无线广域网WWAN&#xff08;Wireless Wide Area Network&#xff09;目前已经成为了全球通信系统的核心组成部分&#xff0c;我们所熟悉的2G网络、3G网络和4G网络&#xff08;LTE&#xff09;等等都是WWAN的典型代表。通过WWAN&#xff0c;用户几乎可以在任何…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

前后端请求响应

引入 在之前的例子中&#xff0c;我们编写了一个简单的web类&#xff0c;我们运行启动类&#xff0c;启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类&#xff0c;其并未实现某个接口或继承某个类&…

VS2022编译32位OpenCV

使用环境 Visual Studio 2022 OpenCV: 4.7.0 cmake: 3.30.2一、使用CMake工具生成vs2022的openCV工程解决方案 打开cmake&#xff0c;选择opencv的源代码目录&#xff0c;创建一个文件夹&#xff0c;作为VS工程文件的生成目录 点击configure构建项目&#xff0c;弹出构建设置…

电子应用设计方案-12:智能窗帘系统方案设计

一、系统概述 本设计方案旨在打造便捷、高效的全自动智能窗帘系统。 二、硬件选择 1. 电机&#xff1a;选用低噪音、扭矩合适的智能电机&#xff0c;根据窗帘尺寸和重量确定电机功率&#xff0c;确保能平稳拉动窗帘。 2. 轨道&#xff1a;选择坚固、顺滑的铝合金轨道&…

MySQL系统优化

文章目录 MySQL系统优化第一章&#xff1a;引言第二章&#xff1a;MySQL服务架构优化1. 读写分离2. 水平分区与垂直分区3. 缓存策略 第三章&#xff1a;MySQL配置优化1. 内存分配优化Buffer Pool 的优化查询缓存与表缓存Key Buffer 2. 连接优化最大连接数会话超时连接池 3. 日志…

LLM - 计算 多模态大语言模型 的参数量(Qwen2-VL、Llama-3.1) 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143749468 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 影响 (…