GPG 检查失败的问题,原因是 RPM 软件包的签名无法验证。可能是由于以下原因之一:

  1. GPG 密钥未正确导入。
  2. 下载的软件包签名不匹配。

以下是解决问题的步骤:


1. 手动导入 MySQL GPG 公钥

确保系统已导入正确的 GPG 公钥:

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

如果提示成功,则再次尝试安装软件包。


2. 验证 GPG 密钥

检查导入的 GPG 密钥是否正确:

sudo rpm -qa gpg-pubkey*

输出中应该包含类似 5072E1F5 的 GPG 密钥。如果不存在,则说明导入失败。再次尝试导入 GPG 公钥。


3. 清理缓存

清理 DNF 缓存,以确保没有缓存损坏的问题:

sudo dnf clean all

4. 再次尝试安装

重新运行安装命令:

sudo dnf install mysql-community-server

5. 禁用 GPG 检查(临时解决方法)

如果仍然遇到问题,并且您确信软件源和包是可信的,可以临时禁用 GPG 检查:

sudo dnf install --nogpgcheck mysql-community-server

不过,这种方法建议仅用于内部测试或非生产环境。


6. 验证安装

安装成功后,验证 MySQL 是否安装:

mysql --version

在 AlmaLinux 上配置和管理 MySQL 数据库,可以通过以下步骤完成。本文以 MySQL 社区版为例,同时适用于 MariaDB。


1. 安装 MySQL

步骤 1: 更新系统
sudo dnf update -y
步骤 2: 添加 MySQL Yum 仓库

MySQL 官方下载页面 获取最新的仓库 RPM 包地址。例如:

wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
sudo rpm -Uvh mysql80-community-release-el8-1.noarch.rpm
步骤 3: 安装 MySQL
sudo dnf install mysql-server -y
步骤 4: 启动和设置 MySQL 服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

2. 初始配置

步骤 1: 获取临时密码

安装后 MySQL 会生成一个临时密码,存储在日志中:

sudo grep 'temporary password' /var/log/mysqld.log
步骤 2: 运行安全安装向导
sudo mysql_secure_installation

配置选项:

  1. 输入临时密码。
  2. 设置新密码。
  3. 删除匿名用户、禁用远程 root 登录、删除测试数据库、重新加载权限表(推荐选择 Y)。
步骤 3: 登录 MySQL
mysql -u root -p

3. 基本配置

1. 创建用户和分配权限

创建新用户并赋予权限:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
2. 创建数据库
CREATE DATABASE db_name;
USE db_name;
3. 优化配置文件

编辑 MySQL 配置文件 /etc/my.cnf

sudo nano /etc/my.cnf

建议调整以下参数:

[mysqld]
bind-address = 0.0.0.0   # 允许远程连接(如需要)
max_connections = 200    # 最大连接数
innodb_buffer_pool_size = 1G  # 缓存大小(根据内存设置)
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 2      # 记录执行时间超过 2 秒的查询

重启服务以应用更改:

sudo systemctl restart mysqld

4. 管理 MySQL

1. 启动/停止/重启服务
sudo systemctl start mysqld
sudo systemctl stop mysqld
sudo systemctl restart mysqld
2. 查看服务状态
sudo systemctl status mysqld
3. 检查 MySQL 运行状况

登录 MySQL 后运行:

SHOW STATUS LIKE 'Threads_connected';  # 查看当前连接数
SHOW VARIABLES LIKE 'max_connections';  # 查看最大连接数
SHOW DATABASES;  # 查看所有数据库

5. 数据库备份与恢复

1. 备份数据库

使用 mysqldump 工具:

mysqldump -u username -p db_name > backup.sql
2. 恢复数据库
mysql -u username -p db_name < backup.sql

6. 监控与日志

1. 查看错误日志

MySQL 默认的错误日志路径:

sudo tail -f /var/log/mysqld.log
2. 慢查询日志

启用慢查询日志后,检查日志:

sudo tail -f /var/log/mysql-slow.log

7. 安全加固

1. 限制远程访问

修改 /etc/my.cnf,将 bind-address 配置为 127.0.0.1

bind-address = 127.0.0.1
2. 使用防火墙

仅开放 MySQL 必要端口(默认 3306):

sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload
3. 启用 SSL

配置 SSL 证书后,在 MySQL 中启用加密连接:

SHOW VARIABLES LIKE 'have_ssl';

8. 高级功能

  • 复制与高可用性:配置主从复制或 MySQL Group Replication。
  • 性能调优:使用工具如 MySQLTuner 自动分析和优化配置。
  • 定期自动备份:结合 cronmysqldump 实现。

你的命令 GRANT SELECT, INSERT, UPDATE, DELETE ON IT.* TO 'admin'@'localhost'; 只授予了基本的 DML(数据操作语言)权限,而 mysqldump 工具需要额外的权限来正确完成备份操作。


mysqldump 所需的权限

在使用 mysqldump 备份时,通常需要以下权限:

  1. SELECT
    用于读取数据库数据。
  2. LOCK TABLES
    用于在导出数据时锁定表,确保一致性。
  3. SHOW VIEW
    如果数据库中有视图,则需要该权限来导出视图定义。
  4. EVENT
    如果数据库中有事件调度器(Event Scheduler),需要该权限。
  5. TRIGGER
    如果数据库中有触发器,则需要该权限。
  6. PROCESS
    mysqldump 默认会尝试导出表空间信息(特别是在 MySQL 8.0+ 中),需要 PROCESS 权限。

解决方法

1. 更新权限

执行以下命令为 admin 用户添加必要的权限:

GRANT SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, PROCESS ON IT.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
2. 跳过表空间导出(可选)

如果不需要导出表空间信息,可以使用 --no-tablespaces 参数来避免 PROCESS 权限问题:

mysqldump --no-tablespaces -u admin -p IT > backup.sql

重新测试

完成权限配置或添加 --no-tablespaces 参数后,重新运行你的 mysqldump 命令。如果还有其他错误,请提供完整的错误信息进一步分析。


注意

  • 权限范围: 上述 GRANT 命令仅对数据库 IT 生效。如果需要全局权限,请将 IT.* 改为 *.*
  • MySQL 版本: 如果你使用的是 MySQL 8.0+,权限验证和策略可能更加严格,确保客户端工具和服务器版本匹配。

错误信息 ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES 表明,某些权限(例如 PROCESS)是全局权限,不能直接对单个数据库(如 IT.*)授予。这是因为 PROCESS 和类似的权限属于 MySQL 的全局作用域,而不是数据库作用域。

此外,mysqldump 报错的根本原因是 admin 用户缺少 PROCESS 权限。


正确解决方法

  1. 修复权限授予命令
    对于 PROCESS 这类全局权限,需要在全局范围授予,而其他权限可以继续在数据库范围授予。可以分两步完成:

    全局权限(例如 PROCESS
    GRANT PROCESS, LOCK TABLES, SHOW VIEW ON *.* TO 'admin'@'localhost';
    
    数据库范围权限
    GRANT SELECT, INSERT, UPDATE, DELETE, EVENT, TRIGGER ON IT.* TO 'admin'@'localhost';
    

    然后刷新权限:

    FLUSH PRIVILEGES;
    
  2. 使用 --no-tablespaces 参数跳过表空间信息
    如果表空间信息并不重要(一般对大多数常规数据库备份来说不必要),可以通过以下命令跳过表空间部分:

    mysqldump --no-tablespaces -u admin -p IT > backup.sql
    

验证解决方法

验证权限

执行以下命令检查是否正确授予了所需权限:

SHOW GRANTS FOR 'admin'@'localhost';

确保输出中包含以下关键权限:

  • PROCESS
  • LOCK TABLES
  • SHOW VIEW
  • 数据库 IT 上的 SELECT 等权限。
验证备份命令

在修复权限或添加 --no-tablespaces 参数后,重新运行以下命令:

mysqldump -u admin -p IT > backup.sql

注意事项

  1. 敏感权限分配:
    • 全局权限如 PROCESS 应仅授予可信用户,避免安全风险。
  2. 备份的影响:
    • 使用 --no-tablespaces 参数可能对恢复操作影响较小,但如果涉及表空间管理,建议在需要时补充完整权限进行备份。

mysql操作命令

#查询用户的权限授权
show  grants for 'admin'@'localhost';
#给用户全局授权
GRANT PROCESS, LOCK TABLES, SHOW VIEW ON *.* TO 'admin'@'localhost';
#数据库范围授权
GRANT SELECT, INSERT, UPDATE, DELETE, EVENT, TRIGGER ON IT.* TO 'admin'@'localhost';
#刷新授权
FLUSH PRIVILEGES;
#备份mysql
mysqldump -u admin -p IT > backup.sql
#恢复数据库
mysql -u username -p db_name < backup.sql

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐