记录一次数据库的神秘报错

报错信息

运行yimu-smart时报错:

PLAINTEXT

1
2
ERROR o.s.b.SpringApplication - [reportFailure,843] - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysJobController': Unsatisfied dependency expressed through field 'jobService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysJobServiceImpl': Invocation of init method failed; nested exception is org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Table 'yimu-smart.QRTZ_LOCKS' doesn't exist [See nested exception: java.sql.SQLSyntaxErrorException: Table 'yimu-smart.QRTZ_LOCKS' doesn't exist]


这个问题是说数据库中缺少QRTZ_LOCKS这个表,程序访问数据库时找不到这个表。

但是我在yml配置文件中配置本地数据库时却能正常运行起来

但是一换成上面的8.140.247.245服务器的数据库时就报那个错误,但是我查看了我本地和服务器上的数据库,结构和数据都是完全一样的,运行程序时却一个可以运行,一个报错。

追根求因

经过一番DEBUG,最终发现,我的数据库中有qrtz_locks表,即QRTZ_LOCKS的小写,这才发觉有没有可能是数据库大小写识别的问题,我们正常安装mysql时它默认是大小写不敏感的,也就是说程序在查询数据库时大小写都可以,但是在云服务器上使用docker pull mysql:5.7 拉取下来的mysql,它默认是大小写敏感的,所以才导致了查询QRTZ_LOCKS表找不到的情况。

解决

要关闭 MySQL 数据库的大小写敏感性,您可以按照以下步骤进行操作:

  1. 编辑 MySQL 服务器的配置文件。在 Linux 系统上,默认的配置文件路径通常是 /etc/my.cnf 或 /etc/mysql/my.cnf。在 Windows 系统上,默认的配置文件路径通常是 C:\Program Files\MySQL\MySQL Server X.X\my.ini。

  2. 打开配置文件,并在 [mysqld] 部分添加或修改以下行:

lower_case_table_names=1

将 lower_case_table_names 的值设置为 1。这个选项告诉 MySQL 将所有表名转换为小写。

  1. 保存配置文件并重新启动 MySQL 服务器,以使更改生效。


注意:如果mysql是使用docker拉取的,则使用以下方式编辑mysql的配置文件:

  1. 确定正在运行的 MySQL 容器的名称或 ID。可以使用以下命令列出运行中的容器:

docker ps
  1. 找到正在运行的 MySQL 容器,并复制其名称或 ID。

     使用以下命令进入 MySQL 容器的 shell:
    
docker exec -it <容器名称或ID> bash
  1. 进入容器shell后默认是没有编辑器的,所以无法使用vi命令来编辑配置文件,这里下载nano作为编辑器

yum install nano
  1. 然后进入编辑配置文件:

 nano /etc/mysql/my.cnf
  1. 在编辑器中找到 [mysqld] 部分,并在其中添加或修改以下行:

lower_case_table_names=1
  1. 保存文件并退出编辑器

    nano编辑器保存命令是:ctrl+O
    退出命令是:ctrl+X
    
  2. exit退出shell

  3. 重启 MySQL 容器,以使更改生效。可以使用以下命令重启容器:

docker restart <容器名称或ID>

这样再访问云服务器上docker的数据库时就不会出现找不到表的报错了。

这个错误还是挺难发现的,特此记录一下,以帮助到后来被此bug折磨的人......