这里主要记录在日常使用 PostgreSQL 时,遇到的一些零碎问题。不易写成独立文章,所以统一记录于此。
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 数据库中显示的字段内容是问号(?
),而实际存储的是中文,这通常与字符集或编码设置不一致有关。可能是以下原因之一:数据库的字符集不支持中文 表或列的字符集未设置为 utf8
或 utf8mb4
;客户端字符集不一致: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;