[关闭]
@liruiyi962464 2025-11-17T09:55:50.000000Z 字数 2577 阅读 9

处理安装mysql后没有设置区分大小写

mysql


一、核心目标

  1. 实现 MySQL 表名不区分大小写lower_case_table_names=1,需首次初始化时设置);
  2. 解决因配置冲突导致的 MySQL 启动失败(表空间 ID 重复、数据目录无效);
  3. 重置 MySQL root 密码(初始化后临时密码 → 自定义密码);
  4. 移除 ONLY_FULL_GROUP_BY 解决 XXL-JOB SQL 报错。

二、完整操作过程(分阶段)

阶段1:初始问题排查(MySQL 启动失败+表空间冲突)

1. 发现问题

执行 sudo systemctl restart mysql 时,服务启动失败,错误日志(/var/log/mysql/error.log)显示:

  1. Multiple files found for the same tablespace ID: Tablespace ID: 1 = ['mysql_bak/sys/sys_config.ibd', 'sys/sys_config.ibd']

→ 原因:mysql_bak 备份目录与当前数据目录文件冲突,InnoDB 表空间 ID 重复。

2. 临时处理冲突

  1. # 1. 停止 MySQL 服务
  2. sudo systemctl stop mysql
  3. # 2. 移动冲突的备份目录(避免 InnoDB 扫描)
  4. sudo mv /var/lib/mysql_bak /tmp/mysql_bak_saved
  5. # 3. 清空当前无效数据目录
  6. sudo rm -rf /var/lib/mysql/*

阶段2:重新初始化数据目录(实现不区分大小写)

1. 准备新数据目录(权限必须正确)

  1. # 1. 确保数据目录存在(默认 /var/lib/mysql)
  2. sudo mkdir -p /var/lib/mysql
  3. # 2. 赋予 mysql 用户所有权(否则初始化失败)
  4. sudo chown -R mysql:mysql /var/lib/mysql
  5. sudo chmod 700 /var/lib/mysql # 限制仅 mysql 可访问

2. 首次初始化(指定 lower_case_table_names=1,核心步骤)

  1. # 初始化数据目录,强制设置不区分大小写(仅首次初始化有效)
  2. sudo mysqld --initialize --user=mysql --lower_case_table_names=1

3. 获取初始化生成的临时 root 密码

  1. # 从错误日志中提取临时密码(用于首次登录)
  2. sudo grep 'temporary password' /var/log/mysql/error.log

阶段3:配置 MySQL 并重置 root 密码

1. 编辑配置文件(永久生效参数)

  1. # 打开 MySQL 服务配置文件(mysqld.cnf)
  2. sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 节点下添加以下配置(同时解决 XXL-JOB 报错):

  1. [mysqld]
  2. pid-file = /var/run/mysqld/mysqld.pid
  3. socket = /var/run/mysqld/mysqld.sock
  4. datadir = /var/lib/mysql
  5. log-error = /var/log/mysql/error.log
  6. lower_case_table_names=1 # 永久不区分大小写
  7. sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 移除 ONLY_FULL_GROUP_BY

保存退出:Esc → 输入 :wq → 回车。

2. 启动 MySQL 服务

  1. sudo systemctl start mysql
  2. # 验证启动状态(显示 active (running) 为正常)
  3. sudo systemctl status mysql

3. 重置 root 密码(临时密码 → 自定义密码)

  1. # 1. 用临时密码登录 MySQL
  2. sudo mysql -u root -p
  3. # 输入步骤2获取的临时密码
  4. # 2. 重置为自定义密码(示例:Root@123456,需包含大小写+数字+符号)
  5. ALTER USER 'root'@'localhost' IDENTIFIED BY 'Sxxt@0825';
  6. FLUSH PRIVILEGES; # 刷新权限,立即生效
  7. # 3.开放外部连接8
  8. // 按照顺序执行
  9. // 切换数据库
  10. USE mysql;
  11. // 执行更新权限语句
  12. UPDATE user SET host = '%' WHERE user = 'root';
  13. // 查看权限
  14. SHOW GRANTS FOR 'root'@'%';
  15. // 刷新服务器配置
  16. FLUSH PRIVILEGES;
  17. # 4. 退出 MySQL
  18. exit;

阶段4:恢复业务数据(从备份导入)

1. 导入之前导出的全量备份(逻辑备份 SQL 文件)

2. 验证配置与数据

  1. # 1. 登录 MySQL 验证参数
  2. sudo mysql -u root -p
  3. SELECT @@lower_case_table_names; # 输出 1,不区分大小写生效
  4. SELECT @@sql_mode; # 无 ONLY_FULL_GROUP_BY,XXL-JOB 报错解决
  5. # 2. 验证业务数据(如 internshipv2、xxl_job 库)
  6. SHOW DATABASES; # 显示所有恢复的数据库
  7. USE internshipv2;
  8. SHOW TABLES; # 表名已自动转为小写(不区分大小写生效)
  9. SELECT * FROM dj_base_class_info LIMIT 10; # 数据正常查询

三、关键操作总结(含重置密码)

操作目的 核心命令/步骤
不区分大小写初始化 sudo mysqld --initialize --user=mysql --lower_case_table_names=1
获取临时密码 sudo grep 'temporary password' /var/log/mysql/error.log
重置 root 密码 登录后执行 ALTER USER 'root'@'localhost' IDENTIFIED BY '自定义密码'; FLUSH PRIVILEGES;
永久配置不区分大小写 编辑 mysqld.cnf,添加 lower_case_table_names=1
移除 ONLY_FULL_GROUP_BY 配置文件中 sql_mode 移除该字段,重启服务
解决表空间冲突 移动/删除 mysql_bak 目录:sudo mv /var/lib/mysql_bak /tmp/
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注