赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。