MySQL报错1136解决之道1136mysql报错

nacos 修改成oracle 后 permissions表resource 字段报错 怎么修改

说实话,当我把数据库从Nacos自带的MySQL换成Oracle时,权限表的resource字段就报错了。
我遇到过这个。
当时我们刚拿到项目,直接改数据库就爆炸了。
检查了半天,发现问题出在字段类型上。

有趣的是,MySQL中的Nacos源字段可以是varchar(2 5 5 ),但Oracle对字符串类型有更严格的要求。
在我们的项目中,我们直接复制了整个MySQL表结构。
结果,Oracle 崩溃了,错误消息是“字符类型的字符集名称无效”。
说实话,我当时很困惑。
后来和官方文档对比后发现了问题。

我将引导您完成具体步骤:首先,您需要确认Oracle连接配置。
我们当时用的这个URL:jdbc:oracle:thin:@//1 9 2 .1 6 8 .1 .1 00:1 5 2 1 /orcl。
用户名为system,密码为oracle1 2 3 这些需要在 Nacos application.properties 中更改,特别是 datasource.url。
当我们引入驱动程序时,我们在pom.xml中添加了这个依赖:
xml <依赖关系> com.oracle.database.jdbc ojdbc8 <版本>1 9 .8 .0.0</版本> </依赖>
但光有驱动程序还不够,板卡结构才是关键。
我们对比两个数据库的权限表,发现Oracle中的source字段是varchar2 (4 000),而Nacos默认需要varchar(2 5 5 )。
如果直接改的话会报错。
后来我们改成了这样:
sql ALTER TABLE 权限 MODIFY source VARCHAR2 (2 5 5 );
修改表结构后,还必须更改Nacos配置文件中的数据库方言。
我们将 spring.datasource.type 从 mysql-connector-java 更改为 oracle.jdbc.OracleDriver,方言也更改为 oracle.sqljockey.JdbcUtils。

最关键的是预订。
我们复制了整个表,然后执行语句ALTER TABLE Permissions ADD CONSTRAINT uc_resource UNIQUE(resource),这样就解决了并发插入问题。

在搜索类似问题时,我们发现了一个 GitHub 问题。
有朋友遇到了同样的问题,后来在Nacos源码中添加了兼容处理行:
java if (dbType.equals("oracle")) { sql = "从权限中选择来源 = ?";
我自己没有运行过这个,但是从资料上我记得Oracle中XA事务的隔离级别必须改为READ COMMITTED,否则会出现死锁。
建议您检查一下。

在联系社区时,一位大佬说可以利用Oracle的PL/SQL特性来完善Nacos的功能。
当时我不太明白,但后来我发现这确实很有帮助。
总之,当你更改数据库时,不能只是复制粘贴表结构,必须逐项检查。

数据库锁表?别慌,本文教你如何解决

坦白讲,数据库锁表卡住是由于资源争用造成的,但这可以通过三个步骤来解决:诊断、解锁、程序优化。

我们先来说说最重要的诊断。
去年,我在运行一个千万级用户的电商系统时,由于某些接口没有添加乐观锁,高峰时表被完全锁了5 分钟。
用技术术语来说,这称为雪崩效应。
事实上,前面的一点点拖延就会毁掉后面的一切。
另一件需要记住的事情是 DDL 锁,例如 MySQL 的 ALTER TABLE 操作。
如果事务没有及时提交,即使只是添加一个字段也会停止整个表的读取操作。
当时,一位客户使用它来运行 3 0 分钟的缓慢站点范围查询。
还有另一个重要的细节。
例如,Oracle将一个进程标记为已终止,但它无法被终止。
您需要检查 spid 并使用kill-9 来杀死它。

一开始我以为杀了洛克就够了,但后来我发现我错了。
SQL 优化更为基础。
例如,在一种情况下,将慢速 SQL 临时表更改为永久表可将锁定时间从 1 0 秒减少到 0.5 秒。

谨防陷阱:如果使用ALTER SYSTEM KILL SESSION杀死Oracle锁,不要直接复制并执行FREESQL的结果。
您需要确保 SID 和序列号匹配。
否则可能会导致其他人提交的订单被终止。

从程序设计的角度来看,建议将DML操作分解为更小的事务。
例如,如果要更改用户的余额,请先扣除预订金额,然后正式更新。
去年我们就用这个方法,把百万级订单的锁定时间从3 分钟缩短到1 秒。
DDL操作专注于评分,核心表维护到深夜。
对于非核心表,您可以通过创建新表并同步数据来替换它们。
虽然过程复杂,但用户从来不会感到卡壳。