简介:面向使用Oracle数据库的Nacos开发与运维人员,这份改造版将Nacos 2.4.0默认的MySQL存储适配为Oracle,可直接替换原版部署。使用时只需修改startup.cmd或startup.sh启动脚本,并按实际环境调整application.properties中的数据库连接配置,即可完成数据源切换,免去从源码自行改造的繁琐过程。
压缩包共18个文件,大小约148.36MB,其中包含3个sql建表脚本、3个conf配置模板、2个sh和2个cmd启动脚本、2个jar包以及xml、properties等辅助文件,覆盖初始化、配置、启动各个环节。另有example示例文件帮助理解改造后的目录结构。
目前已吸引1824人学习下载,适合需要快速将Nacos迁移至Oracle环境的开发者,按说明调整启动参数即可投入测试或生产使用。
1. 为什么要把Nacos 2.4.0源码改成Oracle版:从MySQL到Oracle的迁移硬需求
Nacos 2.4.0默认只把MySQL当外部存储,官方文档通篇都是MySQL的建表脚本和驱动配置,但很多企业内部的数据库资产早就被Oracle占据。我遇到的实际场景是:客户的核心系统全部跑在Oracle RAC上,DBA团队明确不允许额外引入MySQL实例,于是只能对Nacos 2.4.0源码做Oracle改造,把配置中心和注册中心的持久层整个迁移到Oracle。这份资源就是把改造过程完整整理成可复现的源码包,适合那些被数据库选型卡住、需要在Oracle环境落地Nacos的Java后端工程师。
2. 改造前的准备:源码结构、依赖替换与Oracle驱动接入
2.1 先摸清Nacos 2.4.0的存储抽象层
拿到Nacos 2.4.0源码后别急着全局搜索"mysql"字符串,先看清楚它的数据源是怎么管理的。Nacos在2.x版本里把存储逻辑收敛到了统一的DataSource层,主要由ExternalDataSourceService和EmbeddedStorageService两套实现组成。默认standalone模式用的是内嵌Derby,部署模式(cluster)才会用到外部MySQL。我们改造Oracle,锚点就在ExternalDataSourceService这个类上,它是外部数据源初始化的唯一入口。
// 改造前的ExternalDataSourceService核心逻辑(伪代码) public class ExternalDataSourceService implements DataSourceService { private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; private static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/nacos"; public void init() { // 读取application.properties中的db.url.0、db.user.0等配置 // 用HikariCP创建连接池 } }这段代码的关键是JDBC_DRIVER和JDBC_URL这两个常量,它们直接决定了连接池创建的是什么数据库的连接。改造时要把驱动类替换成oracle.jdbc.OracleDriver,URL改成jdbc:oracle:thin:@//host:1521/serviceName的格式,同时在pom.xml里把mysql-connector-java换成ojdbc8或ojdbc11。
光改driver类名还不够,Nacos的DataSourceService在初始化时还会读取spring.datasource.platform这个配置项,用它来决定执行哪一套metadata脚本。这个值默认是mysql,改造版要改成oracle,否则Nacos启动时会继续尝试执行mysql-schema.sql,在Oracle上直接报ORA-00933。我一般建议把db.num、db.url.0、db.user.0、db.password.0这组配置原样保留,只换前缀和驱动,这样对Nacos内部的配置解析逻辑改动最小。
2.2 依赖替换:ojdbc8怎么进到Maven构建链路里
Nacos的pom结构是多模块的,nacos-config、nacos-naming、nacos-console各自依赖了nacos-datasource模块。如果只改根pom的依赖版本,很可能会被子模块的依赖管理覆盖。常见做法是在nacos-datasource模块的pom.xml里显式排除MySQL驱动,再引入Oracle驱动,同时把mysql-connector-java的scope标记为runtime,防止它在编译期干扰classpath。
<!-- nacos-datasource/pom.xml 中需要调整的依赖片段 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency>这里有几个注意点:第一,ojdbc8的groupId在Oracle官方的Maven仓库里是com.oracle.database.jdbc,不是以前民间流传的com.oracle,如果你在pom配置了这个新坐标却拉不下来,多半是公司的私服代理没有同步Oracle官仓,手动把ojdbc8.jar安装到本地仓库更稳妥。第二,Nacos里还有一处用到了Derby的依赖,那是内嵌存储模式用的,不影响外部数据源改造,但编译时别把它从pom里删掉,否则module-info会报错。第三,Oracle的JDBC驱动和Nacos自带的HikariCP版本之间偶尔有兼容性告警,如果日志里出现ClassNotFound或者NoClassDefFoundError,先检查HikariCP版本,2.4.0依赖的HikariCP版本在4.0.3以上基本没问题。
2.3 初始化数据表结构的Oracle方言转换
Nacos源码里自带一份mysql-schema.sql,在distribution模块的conf目录下。Oracle改造版的核心工作之一就是把这份脚本翻译成Oracle方言。翻译的时候不能只改字段类型,还要注意表空间、索引命名长度、注释语法这些细节。Nacos的配置相关表有config_info、config_info_beta、config_info_tag、config_his_info、config_tags_relation,命名相关的表有tenant_info、users、roles、permissions,以及2.4.0新增的config_export_history等。Oracle里表名和列名默认是大小写不敏感的,但Nacos的SQL里大量用了大写表名,建议在Oracle里也统一用大写建表,避免查询时出现ORA-00942。
-- MySQL写法 CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL, `gmt_modified` datetime NOT NULL, PRIMARY KEY (`id`) ); -- Oracle改写 CREATE TABLE config_info ( id NUMBER(20) NOT NULL, data_id VARCHAR2(255) NOT NULL, group_id VARCHAR2(255), content CLOB NOT NULL, md5 VARCHAR2(32), gmt_create TIMESTAMP NOT NULL, gmt_modified TIMESTAMP NOT NULL, CONSTRAINT pk_config_info PRIMARY KEY (id) );这段SQL里真正容易出问题的不是bigint到NUMBER的映射,而是VARCHAR2的字节语义。Oracle的VARCHAR2(255)默认按字节存储,如果数据库字符集是ZHS16GBK,一个汉字占2字节,255字节只能存127个汉字。Nacos的data_id在上层业务里经常拼上环境、应用名、集群名,很容易超长。我建议所有字符串字段统一建VARCHAR2(255 CHAR)或者干脆用NVARCHAR2,省得后面因为配置项名称过长报ORA-12899。content字段必须用CLOB,MyBatis读写CLOB时配上jdbcType="CLOB"才不会出现流转换错误。
除了表结构,索引也要同步翻译。MySQL里常见的KEY idx_data_id后缀写法,在Oracle里要明确写CREATE INDEX,并且索引名不能超过30个字符。Nacos的索引命名还算克制,但config_his_info上有一个组合索引名偏长,Oracle会报ORA-00972,改短即可。
3. 核心改造点:SQL方言适配与分页查询的Oracle化
3.1 从LIMIT到ROWNUM:分页查询改造
Nacos里分页查询主要集中在配置列表、配置历史、用户列表、角色列表这几个功能上。MySQL的写法是LIMIT offset, pageSize,Oracle 12c之前不支持这个语法,12c之后虽然有了FETCH FIRST语法,但Nacos源码用的是mybatis-plus的分页插件,底层SQL还是按MySQL方言拼接的。Oracle改造版必须把分页逻辑全量替换。
-- MySQL原始分页(Nacos内置) SELECT id, data_id, group_id, content, md5, gmt_create, gmt_modified FROM config_info WHERE data_id LIKE '%xxx%' ORDER BY gmt_modified DESC LIMIT 0, 10; -- Oracle改写(基于ROWNUM) SELECT * FROM ( SELECT t.*, ROWNUM rn FROM ( SELECT id, data_id, group_id, content, md5, gmt_create, gmt_modified FROM config_info WHERE data_id LIKE '%xxx%' ORDER BY gmt_modified DESC ) t WHERE ROWNUM <= 10 ) WHERE rn > 0;这里有个容易翻车的细节:ROWNUM是在排序之前赋值的,所以内层一定要先ORDER BY再包一层ROWNUM,顺序反了会导致分页结果乱序。另外如果数据量超过几百万行,这种三层嵌套分页在Oracle里会有排序带来的性能开销,但Nacos配置文件表通常也就是几十万条记录,实际压测结果还算能接受。
Nacos源码里分页查询不是简单地在mapper XML里写SQL,而是通过PageHelper或者mybatis-plus的分页拦截器动态拼接LIMIT语句。改造时有两种路线:一种是把分页插件换成支持Oracle方言的版本,另一种是关闭分页插件,在service层手动构造ROWNUM分页SQL。我走的是第二种,因为改动范围更可控,参数传递更明确,而且能让分页逻辑集中在一个工具类里,后续要支持PostgreSQL时也好扩展。
3.2 数据类型映射:datetime、text与自增主键的处理
除了第2章提到的CLOB替换,还有几个容易被忽略的数据类型映射点。MySQL的timestamp类型在Oracle里对应TIMESTAMP(3)或TIMESTAMP(6),Nacos的gmt_create和gmt_modified字段存的是微秒时间戳。如果直接用DATE类型,毫秒部分会被截断,虽然表面上功能不受影响,但配置发布的先后顺序判断会出问题。Nacos在判断配置是否变更时,会对比gmt_modified的时间戳,精度丢失可能导致并发场景下配置更新丢失。
MySQL的tinyint对应Oracle的NUMBER(1),int对应NUMBER(10),bigint对应NUMBER(20)。text类型要区分场景:如果是存配置内容的,用CLOB;如果只是存一段JSON片段,用VARCHAR2(4000)就够,CLOB在排序和比较上有限制,能不用就不用。
-- MySQL的users表结构 CREATE TABLE `users` ( `username` varchar(50) NOT NULL, `password` varchar(500) NOT NULL, `enabled` tinyint(1) NOT NULL, PRIMARY KEY (`username`) ); -- Oracle改写 CREATE TABLE users ( username VARCHAR2(50) NOT NULL, password VARCHAR2(500) NOT NULL, enabled NUMBER(1) NOT NULL, CONSTRAINT pk_users PRIMARY KEY (username) );这段SQL对应的是Nacos控制台登录功能的用户表。password字段存的是BCrypt加密后的密文,长度固定为60字符,但Nacos源码里预留了varchar(500)的宽度,Oracle这边就照搬VARCHAR2(500)。enabled字段在Java实体类里是Boolean类型,mybatis在Oracle下读写NUMBER(1)时要注意jdbcType设置,推荐在mapper里显式指定jdbcType=NUMERIC,否则有些版本的JDBC驱动会把0和1映射成Boolean之外的值,导致登录校验逻辑判反。
3.3 序列与触发器:替代MySQL的AUTO_INCREMENT
MySQL里自增主键写得爽,到了Oracle全要重来。Oracle 12c以前没有identity列,主键自增只能靠序列加触发器。Nacos的配置表不多,但每张表的主键都要单独处理,尤其是config_his_info这种高频写入的表,序列设计的科学性直接影响写入吞吐。
-- 为config_info表创建序列与触发器 CREATE SEQUENCE seq_config_info START WITH 1 INCREMENT BY 1 NOCACHE; CREATE OR REPLACE TRIGGER trg_config_info_id BEFORE INSERT ON config_info FOR EACH ROW WHEN (NEW.id IS NULL) BEGIN SELECT seq_config_info.NEXTVAL INTO :NEW.id FROM DUAL; END;这段SQL的作用是:在插入config_info表前,如果主键id为空,就从序列里取下一个值。NOCACHE选项是刻意的,因为Nacos的写入频率不算极端峰值,NOCACHE能避免序列断号导致的主键冲突排查困扰。当然如果生产环境的配置发布频率很高,可以把NOCACHE改成CACHE 100,代价是重启后会有序列空洞,但主键单调性不受影响。
我在改造时发现Nacos并不是所有表都依赖数据库自增主键。config_info的insert逻辑默认由Java端的IdWorker生成主键,只有config_his_info在写入历史时依赖数据库自增。所以偷懒的做法是全部表都建序列和触发器,虽然冗余但能保证无论哪条插入路径都不会因为主键为空报ORA-01400。
4. 改造后的配置与启动:从编译到跑通的完整流程
4.1 Maven多模块编译的注意事项
Nacos 2.4.0源码是标准的多模块Maven工程,根目录下有nacos-all、nacos-config、nacos-naming、nacos-console、nacos-datasource、nacos-distribution等模块。编译Oracle改造版之前,先确认JDK版本。Nacos 2.4.0要求JDK 8及以上,官方推荐JDK 8,但如果用了Oracle 19c的ojdbc8,建议直接上JDK 11,因为ojdbc8在JDK 8下连接19c数据库时会有TLS相关的兼容警告,虽然不影响功能,但日志里的告警信息容易误导排查方向。
# 编译命令(跳过测试) mvn clean package -DskipTests -Prelease-nacos这条命令的-Prelease-nacos参数很关键,它会激活distribution模块的打包逻辑,生成标准Nacos发布目录。如果只编译不打包,可以用mvn clean install -DskipTests,但调试时建议直接用release-nacos,因为Nacos的启动脚本和配置文件都依赖distribution模块的复制逻辑,跳过它你还要手动拷贝目录,浪费一次折腾。
编译过程中最常见的报错是Oracle驱动依赖找不到,这对应第2.2节说的私服问题。还有一个坑是编译单元测试引用了一些MySQL特有的测试数据源类,虽然-DskipTests能跳过测试执行,但Maven还是会先做test-compile,如果测试代码里import了MySQL相关类,照样编译不过。这种情况直接加-Dmaven.test.skip=true跳过测试编译。
4.2 Oracle数据源配置与连接验证
改造完成后,配置文件里的数据源要整体切换。Nacos 2.4.0的application.properties在distribution/target/nacos-server-2.4.0/conf目录下。
### 数据源配置(Oracle改造版) spring.datasource.platform=oracle db.num=1 db.url.0=jdbc:oracle:thin:@//192.168.10.20:1521/NACOSDB db.user.0=nacos_admin db.password.0=你的密码这里有个细节:spring.datasource.platform要改成oracle,这个属性会被DataSourceService用来判断初始化脚本的类型。如果保留mysql,Nacos会尝试去执行mysql-schema.sql,在Oracle上一执行就报ORA-00933,导致启动直接失败。
连接验证推荐用SQL*Plus或者DBeaver先测一遍,确认网络通、账号权限够。重点检查两件事:第一,nacos_admin账号有没有CREATE SEQUENCE和CREATE TRIGGER的权限,因为建表和触发器都是靠这个账号执行的,如果权限不足,Nacos启动时控制台会看到一串ORA-01031;第二,数据库字符集是不是AL32UTF8,如果是ZHS16GBK,CLOB字段存中文没问题,但索引字段的超长检索会受影响。我习惯在验证阶段用一个简单的Python脚本,连接Oracle后把schema里所有Nacos相关表列出来,权限够不够一眼就看清楚了。
# 验证数据库连接(使用sqlplus) sqlplus nacos_admin/your_password@192.168.10.20:1521/NACOSDB SQL> SELECT COUNT(*) FROM user_tables WHERE table_name LIKE 'CONFIG%';这条SQL的作用是确认当前账号下能看到Nacos的几张核心表。返回值如果和脚本里建的表数量对不上,说明schema建串了或者建到了别的用户下。出现这种情况时,最有用的处理方式是在JDBC URL后面追加?currentSchema=NACOS_ADMIN,或者给db.user.0账号授予对目标schema的访问权限。
4.3 启动Nacos并验证服务注册与配置发布
启动方式和官方一致,Linux下执行startup.sh -m standalone即可。如果之前跑过MySQL版,建议把data目录和logs目录清空再启动,否则Derby或者旧数据文件可能导致端口冲突或缓存不一致。
启动日志是第一个排查重点。打开logs/nacos.log,搜索"ExternalDataSourceService"关键字,能看到数据源初始化的日志。正常情况会打印类似"init datasource success"的信息,如果看到Oracle驱动加载失败或连接超时的异常堆栈,优先检查classpath里有没有ojdbc8.jar,以及db.url.0里serviceName的大小写。Oracle的serviceName是大小写敏感的,NACOSDB和nacosdb可能是两个完全不同的服务名。
# 验证配置发布功能(使用Nacos OpenAPI) curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs" \ -d "dataId=oracle-test.yaml&group=DEFAULT_GROUP&content=server.port: 8080"这条命令向Nacos发布一份配置到Oracle存储。参数说明:dataId是配置的唯一标识,group是分组,content是配置内容。发布成功后,可以在控制台的配置列表里看到这条数据,也可以直接查Oracle的config_info表验证数据是否落库,执行SELECT data_id, md5, gmt_created FROM config_info WHERE data_id='oracle-test.yaml'就能确认。
服务注册验证更简单,跑一个Spring Boot应用,把服务注册到Nacos上,然后在控制台服务列表里能看到健康检查通过的实例。这一步能验证naming模块的表(service_info、instance_info)是否正常读写。如果注册服务时报ORA-01400(不能插入NULL),多半是instance_info表的某个非空字段没有默认值,回到第3.3节检查序列和触发器是否都补齐了。启动参数里我还会额外加一条-Dnacos.naming.clean.expired-service.enabled=false,避免测试环境里频繁上下线导致过期实例清理任务干扰排查。
5. 避坑指南:Oracle版Nacos最常见的五个坑
5.1 分页查询报ORA-00933:SQL命令未正确结束
现象:配置列表页打开就报ORA-00933,后台日志里能看到select语句带LIMIT关键字。
原因:pagehelper或mybatis-plus的分页插件仍然按MySQL方言生成LIMIT语句,代码里的分页拦截器没改。Nacos 2.4.0的config模块里,ConfigController的分页查询走的是PageHelper,如果只改了Mapper XML,拦截器生成的物理分页SQL还是LIMIT,Oracle根本不认。
解决:在pom.xml里排除pagehelper依赖,或者把分页拦截器的dialect参数改成oracle。如果用的是mybatis-plus,把DbType从MYSQL改成ORACLE。最彻底的做法是像我第3.1节说的那样,手动写ROWNUM分页。从长远维护角度看,手动分页虽然多写几行代码,但至少不会因为框架版本升级又踩一遍方言坑。
5.2 插入配置时ORA-01438:值大于列允许的精度
现象:向config_info插入一条较长的配置内容时,报ORA-01438,错误信息提示value larger than specified precision。
原因:content字段的定义沿用了MySQL的longtext映射成了VARCHAR2(4000),但配置内容超过4000字节。Nacos的配置中心经常用来存一些长度可变的JSON、YAML,写个几百行的配置很容易就超了。
解决:把content字段改成CLOB。注意ALTER TABLE CONFIG_INFO MODIFY (CONTENT CLOB)这条语句在表有数据时也能执行,但会锁表,建议在低峰期执行。另外CLOB字段在MyBatis里要设置jdbcType=CLOB,否则JDBC驱动可能把它当成LongVarChar处理,导致Oracle返回ORA-01461错误。
5.3 启动时报ORA-00942:表或视图不存在
现象:Nacos启动正常,但首次访问控制台登录页时,后台报ORA-00942,错误信息提示table or view does not exist。
原因:users表没有建,Nacos在启动时不会自动建Oracle表。MySQL版的Nacos因为内置了自动初始化脚本,所以很多人习惯了启动即建表,到了Oracle环境完全没意识到要手动执行schema脚本。
解决:在启动前手动执行oracle-schema.sql,并且确认执行账号和启动时db.user.0配置的账号是同一个,否则查询时用的schema可能不同。如果表已经建在别的schema下,要在URL里指定currentSchema参数,或者给db.user.0账号授予对目标schema的select、insert、update、delete权限。这个坑也是最容易伪装成别的故障的,因为启动日志里没有报错,往往等到有人登录控制台才会暴露。
5.4 服务注册正常但配置推送到客户端延迟
现象:发布配置后,客户端长轮询没有立即感知,延迟超过30秒,甚至要重启客户端才能拉到最新配置。
原因:Oracle改造版里没有正确处理Nacos的数据库时间戳同步逻辑。Nacos判断配置变更依赖gmt_modified的时间戳,如果Nacos服务器和Oracle数据库不在同一时区,或者TIMESTAMP精度截断到秒,会导致比对失败。
解决:在连接URL里加上oracle.jdbc.timezoneAsRegion=false参数,同时确保gmt_create和gmt_modified使用TIMESTAMP(6)类型。服务器和数据库的时间用NTP同步一下,虽然Nacos对这种偏差有一定容忍度,但偏差超过秒级就会在长轮询场景暴露问题。我遇到过最隐蔽的情况是跨时区部署,Nacos服务器在UTC+8,Oracle在UTC,时间戳差了8小时,客户端永远觉得配置没变。
5.5 集群模式下节点间数据不一致
现象:Nacos集群模式下,一个节点发布配置,另一个节点查不到,服务注册列表也不一致。
原因:Nacos集群的配置同步依赖数据库的共享读写,改造Oracle时如果用了RAC的负载均衡,但连接串没有配置为failover模式,某些连接会落到只读节点上,写入失败但应用层没感知,每个节点看到的是不同节点上的数据快照。
解决:JDBC URL使用jdbc:oracle:thin:@//host1:1521/serviceName,jdbc:oracle:thin:@//host2:1521/serviceName的形式,并确认这两个服务名对应的是同一个RAC服务。同时把HikariCP的read-only设为false,避免驱动自动推断成只读连接。另外Nacos集群节点之间配置同步有自查机制,如果日志里反复出现"config data not found"相关的告警,先排查数据库连接串,别急着看网络组播配置。
6. 进阶验证:从功能测试到性能对比的收尾技巧
改造完成的Oracle版Nacos,光看功能跑通还不够,我给自己的验收清单里固定有三件事:配置发布并发压测、注册中心心跳测试、数据迁移演练。配置发布压测可以用JMeter模拟100个并发发布请求,重点观察Oracle的锁等待时间和CLOB字段的写入性能。心跳测试是让一个Spring Boot应用注册后反复发送心跳,验证instance_info表的更新频率和连接池的回收情况。
数据迁移演练是很多人忽略的一步。假设你之前有MySQL版的Nacos历史数据,改造到Oracle后要能把配置和注册实例平滑迁移过来。MySQL到Oracle的表结构映射在前几章里已经覆盖了大半,但config_his_info表的数据量往往是最大的,迁移时要分批插入,避免一次性导入导致Oracle的undo表空间暴涨。常见的做法是写一个Python脚本,按data_id分组读取MySQL数据,每500条提交一次事务,插入前先查Oracle目标表的最大id,设置好序列的起始值。
# 简易迁移脚本(Oracle目标表同步) import pymysql import oracledb # 读取MySQL源数据,分批写入Oracle def migrate_config_his(mysql_conn, oracle_conn, batch_size=500): cur = mysql_conn.cursor() cur.execute("SELECT data_id, group_id, content, md5, gmt_modified FROM config_his_info") oracle_cur = oracle_conn.cursor() # 先查询Oracle侧当前最大id,用于同步序列 oracle_cur.execute("SELECT NVL(MAX(id), 0) FROM config_his_info") max_id = oracle_cur.fetchone()[0] rows = cur.fetchmany(batch_size) while rows: for row in rows: max_id += 1 sql = """INSERT INTO config_his_info (id, data_id, group_id, content, md5, gmt_create, gmt_modified) VALUES (:1, :2, :3, :4, :5, SYSTIMESTAMP, :6)""" oracle_cur.execute(sql, (max_id, row[0], row[1], row[2], row[3], row[4])) oracle_conn.commit() rows = cur.fetchmany(batch_size)这段脚本的思路是分段读取MySQL历史配置表,然后在Oracle侧用NUMBER类型的主键逐一插入。参数说明:batch_size控制每批事务的记录数,500是一个不容易触发undo表空间问题的值;SYSTIMESTAMP是Oracle的当前时间函数,用来填充gmt_create,避免从MySQL直接拷贝datetime时出现格式转换错误。迁移完成后,记得把对应序列的起始值设置成max_id+1,否则会出现主键冲突。
回看整个Oracle改造工程,技术难点其实不在SQL翻译本身,而在Nacos对数据库方言的隐式依赖上——分页插件、自增策略、时间精度、schema自动初始化,每一个都是看不见的坑。从那以后,我每次拿到一个只适配MySQL的开源中间件,第一件事就是全局搜一下LIMIT和AUTO_INCREMENT关键字,把所有方言敏感点列成一张清单再动手改,省得中途翻车。改造后的源码包附带完整的oracle-schema.sql和替换后的pom文件,照着第4章的启动流程走一遍就能跑通,希望这份记录能帮你在Oracle环境下顺利落地Nacos 2.4.0。
本文还有配套的精品资源,点击获取