MySQL常见零碎问题汇总


这里主要记录在日常使用 PostgreSQL 时,遇到的一些零碎问题。不易写成独立文章,所以统一记录于此。

Postgres常见零碎问题汇总


1. 记录数据库启动问题

记录 MySQL 启动时候提示的错误信息以及对应的解决方法。

  • 问题描述:错误信息表明,数据字典(data dictionary)中的表标志(table flags)与 ibdata1 文件中的标志不匹配。这种错误,可能的原因有:MySQL 版本升级或降级后没有正确处理 InnoDB 表空间;数据文件损坏或者硬件故障导致的数据损坏;不正确的 MySQL 服务器关闭过程导致的。
# MySQL服务启动报错
[ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!
  • 问题描述:MySQL 服务器和数据字典(data dictionary)对于 lower_case_table_names 参数的设置不一致,即该字段控制数据库和表名的大小写敏感性。这种不匹配会导致 MySQL 在启动时无法正确识别或处理表名,从而阻止服务正常启动。0:表名以指定的大小写存储,并且区分大小写;1:表名以小写形式存储,并且不区分大小写;2:表名按照指定的大小写存储,但在引用时转换为小写进行查找。
# MySQL服务启动报错
[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').

# 解决方法
$ cat /etc/mysql/conf.d/my.cnf
[mysqld]
lower_case_table_names=1
  • 问题描述:使用 root 用户登录数据库报错。这意味着 MySQL 正在尝试使用 mysql_native_password 插件进行身份验证,但该插件当前未加载或不可用。在 MySQL(8+) 版本中,默认的认证插件是 caching_sha2_password,而不是之前的 mysql_native_password。当尝试使用旧版本时,就会出现对应报错信息。
# 使用root用户登录数据库报错
Plugin 'mysql_native_password' is not loaded
-- 修改用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'xxxxxx';
FLUSH PRIVILEGES;

2.设置数据库连接数量限制

设置 MySQL 数据库连接数量限制

MySQL 的默认最大连接数 max_connections 不是固定的,它会因 MySQL 版本、操作系统和配置而异。一般来说,默认值在 151 左右,但这个值并不适用于所有情况。

# 查看当前连接数
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;
# 修改配置文件
# /etc/my.cnf
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
symbolic-links=0
pid-file=/var/run/mysqld/mysqld.pid
max_connections = 2000 # 设置最大连接数

[client]
socket=/var/run/mysqld/mysqld.sock

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

3. 解决终端显示源码问题

解决 MySQL 终端连接后执行命令,显示源码问题。

如果 MySQL 数据库中显示的字段内容是问号(?),而实际存储的是中文,这通常与字符集或编码设置不一致有关。可能是以下原因之一:数据库的字符集不支持中文 表或列的字符集未设置为 utf8utf8mb4客户端字符集不一致:MySQL 客户端连接时使用了错误的字符集;数据导入时的编码问题:数据存储到数据库时被错误编码。

  • 1. 检查数据库和表的字符集
-- 查看数据库字符集
SHOW VARIABLES LIKE 'character_set_database';

-- 查看表字符集
SHOW TABLE STATUS LIKE 'user_info'\G;

-- 查看具体列的字符集
SHOW FULL COLUMNS FROM 'user_info';
-- 修改表的字符集
ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4;

-- 修改列的字符集
ALTER TABLE user_info CHANGE manufacturer_name VARCHAR(255) CHARACTER SET utf8mb4;
  • 2. 检查客户端连接字符集
-- MySQL客户端在连接时需要指定正确的字符集
SHOW VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_results';
SHOW VARIABLES LIKE 'character_set_connection';

-- 解决方法: 在连接数据库时指定字符集
mysql -u root -h mysql -p --default-character-set=utf8mb4
-- 确保在连接MySQL时使用一致的字符集
SET NAMES utf8mb4;
  • 3. 检查数据的实际存储
-- 确认数据库中是否正确存储了中文数据
-- 如果结果显示的十六进制值是3F说明中文数据在存储时已经丢失或被错误编码成问号
SELECT HEX(column_name) FROM user_info;

4. 配置文件名大小写敏感

配置 MySQL 文件名大小写敏感

重要提示lower_case_table_names 参数只能在初始化数据目录时设置,不能在已有数据库的情况下修改。如果你已经有一个正在运行的 MySQL 实例,并且其中包含表,那么改变此参数可能会导致问题。对于现有实例,建议在迁移之前备份所有数据,并考虑在一个新的 MySQL 安装中设置此参数。

文件权限:确保配置文件具有适当的权限,以便只有授权用户可以读取和修改它们。一般情况下,配置文件应该只对 root 用户可写:sudo chmod 644 /etc/mysql/conf.d/my-leqi.cnf。

# 设置mysql配置
[mysqld]
lower_case_table_names=1

# 检查配置文件语法顺序
mysql --help --verbose | grep -A 1 "Default options" | tail -n 1

# 验证是否成功
SHOW VARIABLES LIKE 'lower_case_table_names';

5. 忘记密码如何进入数据库

忘记 MySQL8+ 数据库密码如何进入数据库

  • 方法一:以跳过权限验证的方式启动 MySQL 服务。
# 启动时跳过权限验证
$ sudo mysqld --console --skip-grant-tables
  • 方法二:以跳过权限验证的方式启动 MySQL 服务。
# 修改配置文件来跳过权限验证
$ cat /etc/mysql/conf.d/my.cnf
[mysqld]
skip-grant-tables

$ cat /etc/mysql/conf.d/my.cnf
[mysqld]
skip-grant-tables

# 启动数据库
$ sudo mysqld --defaults-file=/var/lib/mysql/my.cnf

# 重置密码
ALTER USER 'root'@'%' IDENTIFIED BY 'senke@17';
FLUSH PRIVILEGES;

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录