解决MySQL 8.x初始化后设置忽略表和字段大小写敏感的问题

发布于:2025-03-16 ⋅ 阅读:(23) ⋅ 点赞:(0)

问题背景:

        当在Linux (如:centos)安装并初始化好了MySQL 8.x版本后,发现该数据库存在表和字段启动了大小写敏感的设置,导致之前已写好的应用系统报了大量的表或字段不存在问题。

解决方案:

        在低版本下,我们只需要在linux的my.cnf配置文件的 [mysqld] 段下添加lower_case_table_names=1后重启mysql即可。

        但是,在MySQL 8.x时,采用低版本的方案添加了该配置后,MySQL根本就无法启动了。原因是MySQL 8.x后要求在安装数据库过程中,初始化数据过时就需要指定是否要忽略表和字段大小写敏感,否则,在初始化之后就无法通过低版本的方案来解决了,设置了也会无法正常启动。你可以这样理解,由于初始化数据库时没有启用忽略表和字段大小写敏感参数,在初始化数据库时已按大小写敏感的规则创建了mysql等数据库和表以及数据,所以,你再要求启用忽略表和字段大小写敏感当然是不可以的。为了解决这个问题,我们可以采用以下步骤解决:

1.停止MySQL 8.x:

/mysql/mysql/bin/mysqladmin -u root -p shutdown

输入密码后完成停止。

2.备份MySQL数据库文件目录,如果没啥用就直接删除吧,我这里采用的是数据库目录改名的方式:

mv /mysql/data /mysql/data1

3.重新初始化mysql数据库:

使用 mysql 用户登录 linux 后,重新执行以下命令进行初始化。特别注意,这次一定要指定启动大小写敏感 --lower-case-table-names=1 参数了。

0:表名存储为给定的大小写,比较也是区分大小写的(在大多数Unix/Linux系统上默认);
1:表名存储为小写,比较时不区分大小写(在Windows系统上默认);
2:表名存储为给定的大小写,但比较时不区分大小写(在Mac OS X上默认);

/mysql/mysql/bin/mysqld --initialize --lower-case-table-names=1 --user=mysql --basedir=/mysql/mysql --datadir=/mysql/data

完成以上命令后,可以在/mysql/mysql/mysql.log中看到随机生成的root用户密码,如下所示的 ./e0=d:5u1aR 就是root用户的密码了:

[mysql@centos144 mysql]$ tail mysql.log
2025-03-13T12:39:56.072822Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /tmp/mysqlx.sock
2025-03-13T12:44:20.496597Z 11 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
2025-03-14T00:55:41.645892Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2025-03-14T00:55:41.646612Z 0 [Warning] [MY-010918] [Server] 'default_authentication_plugin' is deprecated and will be removed in a future release. Please use authentication_policy instead.
2025-03-14T00:55:41.646648Z 0 [System] [MY-013169] [Server] /mysql/mysql/bin/mysqld (mysqld 8.0.41) initializing of server in progress as process 44544
2025-03-14T00:55:41.655125Z 0 [Warning] [MY-013907] [InnoDB] Deprecated configuration parameters innodb_log_file_size and/or innodb_log_files_in_group have been used to compute innodb_redo_log_capacity=1073741824. Please use innodb_redo_log_capacity instead.
2025-03-14T00:55:41.657180Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-03-14T00:55:42.566133Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-03-14T00:55:45.466762Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ./e0=d:5u1aR
2025-03-14T00:55:45.868971Z 6 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
[mysql@centos144 mysql]$

4.修改/etc/my.cnf文件,在 [mysqld] 段下,添加 lower_case_table_names=1 配置项。

[mysqld]
basedir=/mysql/mysql
datadir=/mysql/data
socket=/mysql/mysql/mysql.sock
pid-file=/mysql/mysql/mysql.pid
log-error=/mysql/mysql/mysql.log


# 设置默认字符集为 utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

# 认证和安全
default_authentication_plugin=mysql_native_password
skip-name-resolve

# 连接参数
port=3306
bind-address=0.0.0.0

# 资源管理
max_connections=500
innodb_buffer_pool_size=1G
innodb_log_file_size=512M
innodb_flush_log_at_trx_commit=1

# 其他优化参数
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
symbolic-links=0

lower_case_table_names=1

# 设置客户端字符集
[client]
default-character-set = utf8mb4

[mysqld_safe]
log-error=/mysql/mysql/mysql.log
pid-file=/mysql/mysql/mysql.pid

5.使用linux的mysql用户启动MySQL(用于修改root密码和创建自己需要的新登录用户)

nohup /mysql/mysql/bin/mysqld > /dev/null 2>&1 &

5.使用root用户登录mysql数据库,并修改root密码,创建自己需要的新登录用户:

/mysql/mysql/bin/mysql -u root -p

输入数据库的root用户的密码 ./e0=d:5u1aR 登录到数据库,在数据库命令行中修改root的密码。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

6.添加root用户可以远程登录mysql数据库,并分配权限

mysql> create user 'root'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.02 sec)

mysql> grant all privileges on *.* to 'root'@'%' with grant option;
Query OK, 0 rows affected (0.01 sec)

至此,问题已解决。可以用mysql客户端远程登录到数据库测试验证问题是否已解决。

启动MySQL:

/mysql/mysql/bin/mysqld_safe --user=mysql &

停止MySQL:

/mysql/mysql/bin/mysqladmin -u root -p shutdown