OpenGauss MySQL兼容库迁移
OpenGauss 提供了从MySQL到OG的迁移工具,虽然安装在起来及其繁琐,也不怎么好用,不过我现在需要的是,从MySQL到OG的MySQL兼容库,可以理解成从MySQL到MySQL的迁移。
但是很不幸的是,OG的MySQL的兼容模式,与MySQL并不是100%兼容,所以准确的说,是从MySQL迁移到一个不伦不类的MySQL库。但是怎么办,工作还是要做。
我迁移的目标是OpenGauss 5.0.0,好像 6.0.0 的MySQL兼容性增强了一些,但是我试用了一下,还是不能做到mysqldump导出的文件直接导入。最终选择的方案不是用OG提供的迁移工具,因为安装配置起来及其繁琐,而且没有MySQL到OG兼容MySQL库的选项,其实OG的工具是用的开源软件confluent,也难怪没有MySQL到OG兼容MySQL库的选项。我的迁移方案是mysqldump导出DDL和INSERT,然后在OG的MySQL兼容模式中导入。
尝试过直接导入OG 5.0.0的MySQL兼容模式,有不少错误,这些也是迁移工作的重点。
1、mysqldump是按表名顺序导出表定义,但是如果表之间有外键依赖,这样建表时就会报错,在MySQL中可以设置参数 set foreign_key_check=0,这样在创建表以及导入数据时就不会检查依赖,但是OG 5.0.0的MySQL兼容模式不支持这个参数,OG 6.0.0支持这个参数但是只支持导入数据时不检查,不支持建表时不检查。也就是说,还是要自己想办法。
我的方案是,对mysqldump出的脚本进行处理,首先要明确,mysqldump导出的不是一个二进制文件,而是一个SQL脚本,而且可以通过命令行参数控制mysqldump只导出表定义,或者只导出插入数据的INSERT语句,首先只导出表定义,然后提取和删除表定义中的索引、UNIQUE约束的外键约束,表定义中只有列定义和主键定义,这些OG的MySQL兼容模式足以应对,建表时几乎不会出错,如果出错再具体问题具体分析。
然后用提取的索引信息构建CREATE INDEX语句,用提取的UNIQUE约束信息构建ALTER TABLE UNIQUE语句,用提取的外键信息构建ALTER TABLE FOREIGN KEY语句,写到另外的文件中,这些索引和外键的创建,考虑到导入性能,应该在导入数据之后执行。
2、mysqldump单独导出导入数据的INSERT语句,如果加入命令行选项 --skip-extended-insert 则会为每一条记录生成一个INSERT语句,否则一条INSERT语句中包含多行记录。在OG的MySQL兼容库执行INSERT时也遇到了一些问题:
1)字符串类型varchar、text中的转义字符OG的MySQL兼容库无法处理,实际上只能按照PG的方式处理,就是在字符串的引号前加E,即MySQL导出
INSERT INTO T1 VALUES (1, 'Hello \'World\'\n');
应该改为
INSERT INTO T1 VALUES (1, E'Hello \'World\'\n');
这样OG的MySQL兼容库才能处理,用sed实现这个修改。
2)可能会有blob、longblob等类型,在我测试的数据库中,这种类型用来存储日志,通常是大量的文本,默认也是导出为文本,然后放在 _binary ''的单引号内,这种文本内也包含了大量的转义字符,而OG的MySQL兼容模式也不能很好的处理。网上的解决方案是mysqldump时用--hex-blob,将lob类型数据全部转为十六进制表示的字节文本,即:
INSERT INTO T1 VALUES (1, _binary '{\"Hello\" \'World\'}\n');
转为
INSERT INTO T1 VALUES (1, 0x7B22726571756573744964223A31);
然后再用sed改为
INSERT INTO T1 VALUES (1, decode('7B22726571756573744964223A31', 'hex'));
3)在测试中发现,如果是空的 longblob 或 blob 类型,mysqldump 会生成 _binary '',这个OG的MySQL兼容库也不能处理,于是我转为了 '',即:
INSERT INTO T1 VALUES (1, _binary '');
改为
INSERT INTO T1 VALUES (1, '');
4)text 等字符串类型中可能包含 '\0' ,由于前面已经将这些字符串前面加上了E,'\0' 也应该被处理,然而OG的MySQL兼容模式不能将'\0'转为unicode字符,所以我的做法是删除字符串中的 '\0',这算是一种具体问题具体分析。
综合上面四点,对mysqldump导出的INSERT脚本进行处理的sed命令为:
sed -E "s/,'/,E'/g" ambari-insert.sql |sed "s/,0x\([0-9A-F]*\)/,decode('\1', 'hex')/g"|sed "s/_binary ''/''/g"|sed "s/\\\0//g" > 1.sql
导出DDL 和 INSERT 脚本的mysqldump命令:
mysqldump --host 172.32.153.186 -u root --port 3306 -p"Bigdata_123" ambari --no-data > ambari-ddl.sql
mysqldump --host 172.32.153.186 -u root --port 3306 -p"Bigdata_123" ambari --no-create-info --hex-blob --compact > ambari-insert.sql
mysqldump --host 172.32.153.186 -u root --port 3306 -p"Bigdata_123" ambari --no-create-info --hex-blob --compact --skip-extended-insert > ambari-insert.sql
注意 --skip-extended-insert 这种方式利于调试,哪一条记录导入出错了,在文件中很容易定位。
在MySQL兼容库ambari中执行脚本的命令:
gsql -p31001 -Upostgres -WPostgres@123 -c "drop database ambari;create database ambari DBCOMPATIBILITY 'B';"
gsql -p31001 -Upostgres -WPostgres@123 -dambari -f create_table.sql
gsql -p31001 -Upostgres -WPostgres@123 -dambari -f ambari-insert.sql
处理 mysqldump导出DDL脚本的Python代码,其中sqlparse模块可以提取DDL脚本中的一个一个CREATE TABLE 语句,但是再细的分析就无能为力了,还需要re:
import sqlparse
import repattern0 = r"CREATE TABLE\s+(`\w+`)\s+\("
pattern1 = r"\s\sCONSTRAINT\s+(`\w+`)\s+FOREIGN KEY\s+\((.*)\)\s+REFERENCES\s+(`\w+`)\s+\((.*)\).*"
pattern2 = r"\s\sUNIQUE KEY\s+(`\w+`)\s+\((.*)\).*"
pattern3 = r"\s\sKEY\s+(`\w+`)\s+\((.*)\).*"name_set = set()f_ct=open("/mnt/disk01/nl/hadb-opengauss/create_table.sql","w")
f_fk=open("/mnt/disk01/nl/hadb-opengauss/foreign_key.sql","w")
f_idx=open("/mnt/disk01/nl/hadb-opengauss/index.sql","w")
f_ddl=open("/mnt/disk01/nl/hadb-opengauss/ambari-ddl.sql", "r")def extract_index(create_table_stmt):match0=re.search(pattern0, create_table_stmt)match3=re.findall(pattern3, create_table_stmt)create_table_name = match0.group(1)statements="\n"for idx in match3:if not idx[0] in name_set:statements+="CREATE INDEX {} ON {} ({});\n"\.format(idx[0], create_table_name, idx[1])name_set.add(idx[0])else:new_name = '`' + idx[0].strip('`') + '_' + create_table_name.strip('`') + '`'statements+="CREATE INDEX {} ON {} ({});\n"\.format(new_name, create_table_name, idx[1])return statementsdef extract_unique(create_table_stmt):match0=re.search(pattern0, create_table_stmt)match2=re.findall(pattern2, create_table_stmt)create_table_name = match0.group(1)statements="\n"for uq in match2:if not uq[0] in name_set:statements+="ALTER TABLE {} ADD CONSTRAINT {} UNIQUE ({});\n"\.format(create_table_name, uq[0], uq[1])name_set.add(uq[0])else:new_name = '`' + uq[0].strip('`') + '_' + create_table_name.strip('`') + '`'statements+="ALTER TABLE {} ADD CONSTRAINT {} UNIQUE ({});\n"\.format(create_table_name, new_name, uq[1])return statementsdef extract_foreignkey(create_table_stmt):match0=re.search(pattern0, create_table_stmt)match1=re.findall(pattern1, create_table_stmt)create_table_name = match0.group(1)statements="\n"for fk in match1:statements+="ALTER TABLE {} ADD CONSTRAINT {} FOREIGN KEY ({}) REFERENCES {} ({});\n"\.format(create_table_name, fk[0], fk[1], fk[2], fk[3])return statementsdef remove_constraints(create_table_stmt):s1=re.sub(pattern1, '', create_table_stmt)s2=re.sub(pattern2, '', s1)s3=re.sub(pattern3, '', s2)res=re.sub(r',\n+\) ENGINE=', '\n) ENGINE=', s3)return resdef main():for stmt in sqlparse.parsestream(f_ddl):if stmt.get_type() == 'CREATE':f_idx.write(extract_index(stmt.__str__()))f_idx.write(extract_unique(stmt.__str__()))f_fk.write(extract_foreignkey(stmt.__str__()))f_ct.write(remove_constraints(stmt.__str__()))else:f_ct.write(stmt.__str__())main()
关于MySQL兼容库
在OG中创建MySQL兼容库的命令是:
CREATE DATABASE ambari DBCOMPATIBILITY 'B';
可以用postgres用户(超级用户)连入这个库,在这个库下执行的SQL可以和MySQL兼容。
在这个库下执行 show databases 返回的其实是schema,默认schema是public。
一个OG中可以创建多个这种兼容库。
MySQL兼容库还可以通过MySQL客户端和JDBC直接连接,但是OG 5.0.0 在返回isolation level时好像和MySQL的行为不一致。
同事问了我一个问题,OG中能否像MySQL一样在SQL中限制用户客户端的IP:
CREATE USER 'mysql_user'@'172.32.155.58' IDENTIFIED BY 'Postgres@123';
试了一下,MySQL兼容模式是可以的,但是要设置参数
b_compatibility_user_host_auth = on
OG模式下不支持只能修改 pg_hba.conf, 而且即使MySQL兼容模式下可以,也是在pg_hba.conf的基础上,例如 pg_hba.conf 中允许所有客户端IP,然后MySQL兼容库中创建用户:
CREATE USER 'mysql_user'@'172.32.155.58' IDENTIFIED BY 'Postgres@123';
那么 mysql_user可以从172.32.155.58登录,不能从其它机器登录,否则mysql_user也不能从172.32.155.58登录。
参考:
https://stackabuse.com/the-u-and-r-string-prefixes-and-raw-string-literals-in-python/
https://sqlparse.readthedocs.io/en/latest/analyzing.html
https://dba.stackexchange.com/questions/4211/how-to-migrate-large-blob-table-from-mysql-to-postgresql
https://www.w3resource.com/PostgreSQL/snippets/postgres-escape-single-quote.php
https://blog.csdn.net/ifengfan/article/details/88553819
https://www.postgresql.org/docs/current/sql-syntax-lexical.html
https://unix.stackexchange.com/questions/615977/invalid-reference-1-on-s-commands-rhs-error-for-sed-script
相关文章:
OpenGauss MySQL兼容库迁移
OpenGauss 提供了从MySQL到OG的迁移工具,虽然安装在起来及其繁琐,也不怎么好用,不过我现在需要的是,从MySQL到OG的MySQL兼容库,可以理解成从MySQL到MySQL的迁移。 但是很不幸的是,OG的MySQL的兼容模式&…...
SOME/IP--协议英文原文讲解10
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.2 Req…...
linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现: 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后,Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...
Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读
前言 在自然语言处理领域,随着大语言模型(LLMs)不断拓展其阅读、理解和生成文本的能力,如何高效处理长文本成为一项关键挑战。近日,Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...
vue2 和 vue3 中 computer 计算属性的用法
Vue 2 中的 computed 在 Vue 2 中,计算属性是响应式的,并且基于 getter 进行缓存,只有依赖的响应式数据发生变化时才会重新计算。 基本用法 <template><div><p>原始消息:{{ message }}</p><p>反…...
Python爬虫入门到精通:从零开始的数据采集之旅
一、网络世界的"小蜘蛛":什么是爬虫? 想象一下,你是一只勤劳的小蜘蛛,每天在互联网这张巨大的网上爬来爬去。你不需要自己织网,只需要顺着别人织好的网络路径,把有价值的信息收集到自己的小篮子里。这就是爬虫最形象的比喻——一个自动化的信息采集程序。 Py…...
Python+Selenium+Pytest+POM自动化测试框架封装
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高…...
【JMeter使用-2】JMeter中Java Request采样器的使用指南
Apache JMeter 是一款功能强大的性能测试工具,支持多种协议和测试场景。除了内置的采样器(如HTTP请求、FTP请求等),JMeter还允许通过 Java Request采样器 调用自定义的Java代码,从而实现更复杂的测试逻辑。本文将详细介…...
IntelliJ IDEA中Maven配置全指南
一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…...
自学Java-AI结合GUI开发一个石头迷阵的游戏
自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤,重启游戏6、拓展问题 准备环节 技术: 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…...
NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…...
UDP和TCP
UDP协议 报文中应该包含 源IP,源端口号目的IP,目的端口号UDP/TCP 一个进程是否可以绑定多个端口号? 可以。多个进程是否可以绑定一个端口号? 不可以,因为端口号的主要作用是唯一标识一台计算机上的一个特定服务或应…...
2025 年 1 月公链行业研报:比特币主导地位强化
2025 年 1 月公链行业研报 作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链研究页面 2025 年 1 月,加密市场总市值增长 7.2% 至 2.8 万亿美元,主要区块链平台表现分化。在新的监管政策与人工智能基…...
在低功耗MCU上实现人工智能和机器学习
作者:Silicon Labs 人工智能(AI)和机器学习(ML)技术不仅正在快速发展,还逐渐被创新性地应用于低功耗的微控制器(MCU)中,从而实现边缘AI/ML解决方案。这些MCU是许多嵌入式…...
新数据结构(11)——Java类的产生和反射
反射是获取类信息的一种能力 类信息包括属性、方法、构造器、父类、接口等 类信息的来源 来自类的加载器,这是从.class文件到内存中的java虚拟器(JVM)中间的一个阶段(如下图) 类的加载器里,用Field数组存…...
智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验
背景 中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为5G时代用户个人与家庭的数字资产管理中心,是中国移动继语音、短信、流量后的“第四项基础服务”。 照片、音视…...
MySQL查看视图
《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了的博客-CSDN博客 查看视图是查看数据库中已存在的视图的定义。查看视图必须要有SHOW VIE…...
量子计算的基本运算:Hadamard 门、CNOT 门、Pauli 门详解
量子计算是现代计算科学的前沿领域,它与经典计算机在处理信息的方式上有着本质的区别。量子计算机利用量子比特(qubit)的叠加态和量子纠缠等特性来进行计算,从而在某些特定任务上超越传统计算机。量子计算的核心运算单元是量子门,它们通过作用于量子比特来操控量子状态。本…...
java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)
我们再启动应用并获取api密钥后就可以对它发送请求了,但是官方文档对于如何进行多轮对话以及怎么自定义参数并没有说的很清楚,给的模板也没有java的,因此我们需要自己实现。 import org.json.JSONArray; import org.json.JSONObject;import j…...
Flask flash() 消息示例
目录 安装 Flask 入门:Flask flash() 基本示例 进阶:使用 Flask-WTF Flash 登录结果消息 详解:get_flashed_messages() 详解:flash() 消息的完整生命周期 Flask 提供 flash() 用于向 用户传递临时消息,通常用于: • 表单提交成功或失败 • 用户登录、注册、退出提…...
ubuntu环境编译ffmepg支持nvidia显卡加速
文章目录 1. 安装NVIDIA驱动2. 安装CUDA&NV-CODEC2.1 安装CUDA2.2 安装NV-CODEC 3. 编译ffmpeg3.1 安装依赖3.2 下载源码安装依赖3.3 验证 4. 使用 1. 安装NVIDIA驱动 安装依赖包 sudo apt install -y ubuntu-drivers-common编辑 /etc/modprobe.d/blacklist-nouveau.conf 文…...
C++类与对象深度解析(一):从引用、内联函数到构造析构的编程实践
目录 一.引用 引用的特征:1.引用必须初始化 2.本质是别名 3.函数参数传递 4.常引用 5.函数返回值 6.权限 放大 缩小 平移 引用 vs 指针 二.内联函数 关键点说明 三.宏函数 四.类 什么是类? 简单的类 五.构造函数与析构函数 1. 构造函数&…...
SpringCloud-使用FFmpeg对视频压缩处理
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视…...
Pytorch实现之粒子群优化算法在GAN中的应用
简介 简介:主要是采用了粒子群优化(PSO)算法来优化GAN的一个训练。PSO是一种是一种基于种群的随机优化技术。这种优化技术是通过粒子群进行的,粒子群在每次迭代中都会更新自己。对于给定的目标函数,这种方法利用一个搜索空间,在那里粒子群移动,找到所需的全局最小值。这…...
http+nginx
HTTP协议:超文本传输协议,Hyper Text transfer protocol(发明者:蒂姆.伯纳斯.李) 1.超文本 包含超链接(link)和各种多媒体元素的文本,这些超文本文件彼此相连,形成网状(web&…...
网络运维学习笔记 014网工初级(HCIA-Datacom与CCNA-EI)ACL访问控制列表
文章目录 ACL(Access Control List,访问控制列表)思科:实验1(标准ACL):实验2(扩展ACL):实验3(ACL在VTY的使用场景): 华为&…...
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
前文地址: 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…...
机器视觉检测中,2D面阵相机和线扫相机的区别
2D面阵相机和线扫相机是工业视觉系统中常用的两种相机类型,各有其特点和应用场景。 2D面阵相机 特点: 成像方式:通过二维传感器一次性捕捉整个场景的图像。 分辨率:分辨率由传感器的像素数决定,常见的有百万像素到几千…...
解锁观察者模式:Java编程中的高效事件管理之道
系列文章目录 后续补充~~~ 文章目录 一、引言:探索观察者模式的奥秘二、观察者模式的核心原理2.1 模式定义与概念2.2 关键角色剖析2.3 工作机制深度解析 三、观察者模式在 Java 中的实现3.1 手动实现观察者模式3.2 使用 JDK 内置的观察者模式3.3 代码示例解析与对比…...
Ubuntu编译ZLMediaKit
下载 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安装工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…...
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
目录 一、性能测试的指标 1、并发量 2、响应时间 3、错误率 4、吞吐量 5、资源使用率 二、压测全流程 三、其他注意点 1、并发和吞吐量的关系 2、并发和线程的关系 四、调优及分布式集群压测(待仔细学习) 1.线程数量超过单机承载能力时的解决…...
鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )
前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中…...
Grok 3.0 Beta 版大语言模型评测
2025年2月17日至18日,全球首富埃隆马斯克(Elon Musk)携手其人工智能公司xAI,在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI,不仅集成了先进的“DeepSearch”搜索功能࿰…...
IDEA中查询Maven项目的依赖树
在Maven项目中,查看项目的依赖树是一个常见的需求,特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端ÿ…...
学习aigc
DALLE2 论文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…...
springboot整合mybatis-plus【详细版】
目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...
【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?
前言: Hello大家好,我是Dream。不知不觉2024年已经过去,自己也马上迈入23岁,感慨时间飞快,从19岁刚入大学加入CSDN,到现在大学毕业已经整整四年了。CSDN陪伴我走过了最青涩的四年大学时光,在这里…...
在VS中通过vcpkg包管理器来安装使用qt5
常用指令 .\vcpkg install 库名 .\vcpkg install 库名版本号.\vcpkg install 库名 --trip x86-windows.\vcpkg list.\vcpkg search 库名 .\vcpkg x-all-installed --7zip PS G:\vcpkg> .\vcpkg help usage: vcpkg <command> [--switches] [--optionsvalues] [argume…...
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
文章目录 从结构到操作:手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义: 三、插入操作3.1 插入操作概述3.2 步骤1:按二叉查找树规则插入节点3.3 步骤2…...
CPU、SOC、MPU、MCU--详细分析四者的区别
一、CPU 与SOC的区别 1.CPU 对于电脑,我们经常提到,处理器,内存,显卡,硬盘四大部分可以组成一个基本的电脑。其中的处理器——Central Processing Unit(中央处理器)。CPU是一台计算机的运算核…...
nacos编写瀚高数据库插件
1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…...
使用excel中的VBA合并多个excel文件
需求是这样的: 在Windows下,用excel文件让多个小组填写了统计信息,现在我需要把收集的多个文件汇总到一个文件中,前三行为标题可以忽略,第四行为收集信息的列名,处理每一行数据的时候,发现某一行…...
linux 安装启动zookeeper全过程及遇到的坑
1、下载安装zookeeper 参考文章:https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法:参考…...
JAVA JUC 并发编程学习笔记(一)
文章目录 JUC进程概述对比 线程创建线程ThreadRunnableCallable 线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终止模式 daemon不推荐 线程原理运行机制线程调度未来优化 线程状态查看线程 同步临界区syn-ed使用锁同步块同步方法线程八锁 锁原理Monitor字节码…...
内容中台架构下智能推荐系统的算法优化与分发策略
内容概要 在数字化内容生态中,智能推荐系统作为内容中台的核心引擎,承担着用户需求与内容资源精准匹配的关键任务。其算法架构的优化路径围绕动态特征建模与多模态数据融合展开,通过深度强化学习技术实现用户行为特征的实时捕捉与动态更新&a…...
Java 内存区域详解
1 常见面试题 1.1 基本问题 介绍下Java内存区域(运行时数据区)Java对象的创建过程(五步,建议能够默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)…...
jEasyUI 创建学校课程表
jEasyUI 创建学校课程表 引言 随着信息技术的飞速发展,教育行业也迎来了数字化转型的浪潮。学校课程表的创建和管理作为教育信息化的重要组成部分,其效率和准确性直接影响到学校的教学秩序。jEasyUI,作为一款优秀的开源UI框架,凭借其易用性、灵活性和丰富的组件,成为了许…...
利用 OpenCV 进行棋盘检测与透视变换
利用 OpenCV 进行棋盘检测与透视变换 1. 引言 在计算机视觉领域,棋盘检测与透视变换是一个常见的任务,广泛应用于 摄像机标定、文档扫描、增强现实(AR) 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测,并…...
git-提交时间和作者时间的区别
1.介绍 定义介绍 提交时间(Committer Date):决定了提交在 Git 历史中的位置,通常影响 GitHub 上提交显示的顺序。 作者时间(Author Date):虽然不影响提交的排序,但在每个提交详情页…...
解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
找了好多教程都没有用,终于解决了!!我是因为ubuntu分区的时候出问题了 问题描述: 双系统装好,隔天开机找不到引导项,黑屏显示下列 因为我用的D盘划分出来的部分空闲空间,而不是全部,…...