【问题记录】ubuntu mysql8.0数据库数据表名称默认大小写敏感,导致数据表读取失败

mysql关于大小写敏感有两个参数,查询命令:

mysql > show global variables like '%lower_case%';

可以看到lower_case_file_system和lower_case_table_names两个参数。

lower_case_file_system:

描述数据所在的操作系统的文件目录是否区分大小写,只读参数,无法修改。

ON 大小写不敏感,OFF 大小写敏感。

lower_case_table_names:

库表名是否大小写敏感,可以修改,参数有0、1、2三种。

0 大小写敏感。(Unix,Linux默认) 创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm文件,SQL语句也会原样解析。

1 大小写不敏感。(Windows默认) 创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。 SQL语句同样会将库表名转换成小写。 如需要查询以前创建的Testtable(生成Testtable.frm文件),即便执行select * from Testtable,也会被转换成select * from testtable,致使报错表不存在。

2 大小写不敏感(OS X默认) 创建的库表将原样保存在磁盘上, 但SQL语句将库表名转换成小写。

目前项目在Windows开发,flowable库的数据库表名、字段名均为大写,但代码操作数据库时使用了小写,在Windows上没问题,部署到ubuntu上出错,查询不到数据表。

可以通过修改linux上mysql的lower_case_table_names参数为1来解决。

注意:

要将lower_case_table_names从0(敏感)修改为1(不敏感)时,必须先对旧数据表的表名进行处理,把所有数据库的表名先改为小写,最后再设置lower_case_table_names为1,否则依然会出现无法找到表名的问题。

或备份后先删除数据表,等修改完参数再恢复数据表。

若安装的mysql8.0版本,安装初始化之后是不能更改lower_case_table_names的

下面是官方文档的一段话:

In MySQL 8.0, the lower_case_table_names variable can only be configured when the MySQL server is initialized.

即,初始化的时候就要设置好这个变量的值。

具体步骤:

(1) 停止mysql

systemctl stop mysql

(2) 编辑配置文件

vim /etc/mysql/my.cnf

配置文件可能存在引用,如:

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

最终是使用的mysql.conf.d目录下的mysqld.cnf配置文件。

vim /etc/mysql/mysql.conf.d/mysqld.cnf

在配置文件的[mysqld]下增加或修改:

lower_case_table_names = 1

(3)删除并重建数据目录

配置文件中可查看数据目录位置,即使用#注释,也表示默认位置如:

# datadir = /var/lib/mysql

则:

rm -rf /var/lib/mysql

mkdir /var/lib/mysql

chown mysql:125 /var/lib/mysql

(4)执行初始化命令

/usr/sbin/mysqld --initialize --user=mysql --lower-case-table-names=1

可通过syttemctl status mysql查看到mysqld的具体位置:

比如有显示:ExecStart=/usr/sbin/mysqld

可以增加命令参数如:

--user=mysql --basedir=/usr/bin/mysql --datadir=/var/lib/mysql

其中user如果在配置文件中有设置,如user = mysql,则命令不需要指定此参数,若指定了不一样的用户名比如root,会被忽略:

[Warning] [MY-010143] [Server] Ignoring user change to 'root' because the user was set to 'mysql' earlier on the command line

根目录可不指定,使用默认位置。

可使用which mysql或whereis mysql查看mysql默认位置。

datadir可不指定,使用默认位置。

若执行出现错误:

[ERROR] [MY-010174] [Server] Can't change data directory owner to mysql

可再修改数据目录权限:

chown -R mysql:mysql /var/lib/mysql

(5)跳过授权表启动(尝试失败)

mysqld_safe  --defaults-file=/etc/my.cnf  --skip-grant-tables &

若出现错误:

mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists

则可以:

mkdir -p /var/run/mysqld

chown mysql:mysql /var/run/mysqld

如此说是可以用root免密登录,但我还是无法登录,依旧需要密码。

也可以尝试将参数skip-grant-tables添加到配置文件的[mysqld]之下,然后重启mysql服务。

(6)使用密码登录mysql

先重新启动mysql:

systemctl restart mysql

查看root初始临时密码:

grep "A temporary password" /var/log/mysql/error.log

此时用root登录mysql。或者再次使用mysql的安全脚本sudo mysql_secure_installation,会要求重新设置密码。

若直接使用root登录,登录后需要更改密码:

mysql > alter user 'root'@'localhost' identified with caching_sha2_password by '你的密码'; (修改密码。with caching_sha2_password也可以不加,其为默认值(可查看:show global variables like 'default_authentication_plugin';)。也可以使用with mysql_native_password)

mysql > FLUSH PRIVILEGES; (刷新信息

最后可确认一下大小写敏感参数是否修改成功为1:

mysql > show global variables like '%lower_case%';

(7)若之前root使用auth_socket插件验证方式,直接使用sudo mysql免密登录,仍想使用此方式可重新改回:

mysql > install plugin auth_socket soname 'auth_socket.so'; (加载auth_socket插件,否则修改后root无法登录,报错:Plugin 'auth_socket' is not loaded)

mysql > use mysql;

mysql > update user set plugin='auth_socket' where user='root';

mysql > FLUSH PRIVILEGES;

20231212 andaidou

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值