启动seata-server遇到的问题及解决方案

本文介绍Seata Server的配置与启动过程中常见的数据库连接问题,并提供了解决方案,包括MySQL驱动配置和时区设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 自1.0版本后,seata-server解压后的conf文件夹下已经没有db_store.sql和db_undo_log.sql(sql文件可在网上或1.0之前的版本中获取)
  • 启动seata-server前准备:
    修改conf目录下的file.conf配置文件,(主要修改自定义事务组名称,事务日志存储模式为db及数据库连接信息);
    修改conf目录下的registry.conf配置文件,指明注册中心为nacos,及修改nacos连接信息即可
  • 先启动Nacos,再使用seata-server中/bin/seata-server.bat文件启动seata-server

问题1:

描述:file.conf配置文件中,数据库url、用户名和密码正确,报错如下:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.

在这里插入图片描述
解决方案:mysql8版本之后,driverClassName由"com.mysql.jdbc.Driver"改为"com.mysql.cj.jdbc.Driver"

问题2:

描述:

java.sql.SQLException: The server time zone value '锟叫癸拷锟斤拷准时锟斤拷' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1644)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710)
        at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:912)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1378)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1374)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:98)
        at io.seata.server.storage.db.store.LogStoreDataBaseDAO.queryTableStructure(LogStoreDataBaseDAO.java:461)
        at io.seata.server.storage.db.store.LogStoreDataBaseDAO.initTransactionNameSize(LogStoreDataBaseDAO.java:445)
        at io.seata.server.storage.db.store.LogStoreDataBaseDAO.<init>(LogStoreDataBaseDAO.java:106)
        at io.seata.server.storage.db.store.DataBaseTransactionStoreManager.<init>(DataBaseTransactionStoreManager.java:96)
        at io.seata.server.storage.db.store.DataBaseTransactionStoreManager.getInstance(DataBaseTransactionStoreManager.java:81)
        at io.seata.server.storage.db.session.DataBaseSessionManager.init(DataBaseSessionManager.java:77)
        at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.initInstance(EnhancedServiceLoader.java:564)
        at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.createNewExtension(EnhancedServiceLoader.java:395)
        at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.getExtensionInstance(EnhancedServiceLoader.java:388)
        at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.loadExtension(EnhancedServiceLoader.java:356)
        at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.load(EnhancedServiceLoader.java:245)
        at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.access$200(EnhancedServiceLoader.java:190)
        at io.seata.common.loader.EnhancedServiceLoader.load(EnhancedServiceLoader.java:82)
        at io.seata.server.session.SessionHolder.init(SessionHolder.java:90)
        at io.seata.server.Server.main(Server.java:84)
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '锟叫癸拷锟斤拷准时锟斤拷' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)
        at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132)
        at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2118)
        at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2142)
        at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310)
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
        ... 24 common frames omitted
<==

解决方案:file.conf配置文件中的数据库url后添加serverTimezone

总结

以上两个问题皆错在数据的配置上,修改后如下:
在这里插入图片描述

<think>好的,我现在要解决用户遇到的在Ubuntu上运行seata-server.sh时出现“Bad substitution”错误的问题。首先,我需要了解这个错误的具体原因。根据用户提供的引用信息,引用[2]提到Ubuntu默认使用dash作为shell,而脚本可能需要bash来执行,特别是在脚本中使用了bash特定的语法,比如字符串截取操作。 首先,用户可能直接在终端运行了类似`sh seata-server.sh`的命令,而sh指向了dash。这时候,如果脚本中使用了bash特有的功能(比如`${variable:0:5}`这样的子字符串截取),dash无法识别,就会报“Bad substitution”错误。 接下来,我需要验证这个原因。用户可能尝试在脚本开头添加了`#!/bin/bash`,但运行方式仍然是使用sh命令,导致忽略了她bang指定的解释器。例如,用`sh script.sh`会强制使用sh(即dash)来执行,而不是bash。因此,正确的做法应该是给脚本添加可执行权限,然后直接通过`./seata-server.sh`来运行,或者显式使用`bash seata-server.sh`。 另外,检查脚本中是否有bash特有的语法。例如,字符串替换、数组操作等。例如,`${arr[@]}`在dash中可能不被支持。用户需要修改脚本中的这些部分,或者确保脚本在bash下运行。 解决方法有几个步骤:首先,确认脚本的解释器是否为bash,并确保执行时使用bash。其次,修改脚本中的语法以兼容dash,但这可能较为复杂。更好的方法是直接使用bash来运行脚本。 用户可能还需要检查系统的默认shell,可以通过`ls -l /bin/sh`查看是否链接到dash。如果是,可以临时使用bash命令执行脚本,或者将默认shell更改为bash,但这可能影响系统其他脚本,不建议这样做。 总结解决方案:确保seata-server.sh使用bash执行,可以通过命令`bash seata-server.sh -p 8091 -h 172.16.10.121`,或者修改脚本的执行方式,添加正确的shebang,并赋予执行权限后直接运行。 此外,用户提到的引用[1]中的命令可能存在问题,因为它使用sh来执行脚本,导致解释器错误。应该改为使用bash命令。同时,引用[3]提到Java未安装,但当前问题可能不相关,除非启动seata需要Java环境,但错误提示不同,所以暂时排除。 最后,需要验证这些步骤是否有效,可能需要用户测试运行,并检查是否有其他bash特有语法在脚本中。</think>在Ubuntu上运行$seata-server.sh$出现**Bad substitution**错误,主要原因是Ubuntu默认使用$dash$作为shell解释器,而脚本中使用了$bash$特有的语法(如字符串截取操作)。以下是具体解决方案--- ### **错误原因分析** 1. **Shell解释器不兼容** Ubuntu系统默认将$sh$命令链接到$dash$(而非$bash$),而$dash$不支持某些bash特有的语法(例如:`${variable:start:length}`格式的字符串截取)[^2]。 2. **脚本执行方式错误** 即使脚本开头声明了`#!/bin/bash`,若通过`sh seata-server.sh`执行,系统仍会强制使用$dash$解释器,导致语法不兼容。 --- ### **解决方法** #### 方法一:显式使用bash命令执行脚本 直接通过$bash$命令运行脚本,绕过默认的$sh$解释器: ```bash bash /root/work/ziyun56.seata/seata-server-0.9.0bin/seata-server.sh -p 8091 -h 172.16.10.121 ``` #### 方法二:修改脚本为可执行文件 1. 添加执行权限: ```bash chmod +x /root/work/ziyun56.seata/seata-server-0.9.0bin/seata-server.sh ``` 2. 直接运行脚本(依赖脚本内的shebang): ```bash /root/work/ziyun56.seata/seata-server-0.9.0bin/seata-server.sh -p 8091 -h 172.16.10.121 ``` #### 方法三:临时切换默认shell(谨慎操作) 将系统默认$sh$临时指向$bash$(仅限当前会话): ```bash sudo ln -sf /bin/bash /bin/sh ``` > ⚠️ 注意:此操作可能影响其他系统脚本,建议仅在测试时使用。 --- ### **验证步骤** 1. 检查默认shell解释器: ```bash ls -l /bin/sh # 若输出指向dash,则需按方法一或二操作 ``` 2. 检查脚本中是否存在$bash$特有语法: ```bash grep -nE '\$\{.*:.*:.*\}' seata-server.sh # 查找字符串截取语法 ``` --- ### **关联问题** 1. **如何永久修改Ubuntu的默认shell为bash?** 可通过`sudo dpkg-reconfigure dash`选择“No”,但需谨慎操作。 2. **如何避免脚本兼容性问题?** 编写脚本时遵循POSIX标准,避免使用shell特有的语法扩展。 3. **Seata启动时提示Java未安装怎么办?** 需先安装JDK,通过`apt install openjdk-11-jdk`并配置环境变量[^3]。 --- 通过上述方法,可解决因$dash$与$bash$语法差异导致的**Bad substitution**错误。若问题仍存在,需进一步检查脚本中的语法兼容性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久违の欢喜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值