0%

MySQL 权限管理详解:从系统表到用户授权

MySQL 的权限管理是保障数据库安全的核心机制,通过精细化控制用户对数据库的操作权限,可防止未授权访问和误操作。MySQL 的权限信息存储在 mysql 系统库的 5 个专用表中,权限控制粒度从全局到列级不等。本文详细解析权限存储机制、授权方法及生效规则。

权限存储的系统表

MySQL 的权限信息按粒度分层存储在以下 5 个系统表中,权限范围从大到小依次为:全局 → 数据库 → 表 → 列 → 存储过程 / 函数

1. user 表:全局级别权限

  • 作用:存储用户账户信息及全局权限(对所有数据库生效)。
  • 核心字段:
    • Host:允许访问的主机(支持 % 通配符,如 192.168.1.% 表示 192.168.1 网段)。
    • User:用户名(与 Host 共同构成唯一用户标识 User@Host)。
    • 权限字段:如 Select_priv(查询权限)、Insert_priv(插入权限)等,值为 Y 表示拥有该权限。
  • 特点:若用户在 user 表中有某权限,则对所有数据库默认拥有该权限(除非被更细粒度的权限限制)。

2. db 表:数据库级别权限

  • 作用:控制用户对特定数据库的操作权限(仅对指定数据库生效)。
  • 核心字段:
    • Db:数据库名(指定权限生效的数据库)。
    • HostUser:与 user 表一致,标识用户及来源主机。
    • 权限字段:与 user 表类似(如 Select_privCreate_priv 等),但仅作用于 Db 字段指定的数据库。
  • 特点:数据库级权限优先级高于全局权限(若用户对某数据库有更严格的权限限制,以 db 表为准)。

3. tables_priv 表:表级别权限

阅读全文 »

Java 应用 CPU 飙升问题排查全指南

CPU 飙升是 Java 应用常见的性能问题,可能导致应用响应缓慢、超时甚至崩溃。本文将详细介绍 CPU 飙升的常见原因及系统化的排查步骤,帮助开发者快速定位并解决问题。

CPU 飙升的常见原因

Java 应用 CPU 使用率过高通常与以下因素相关:

  1. 频繁的垃圾回收(GC)
    • 内存分配不合理(如堆内存过小)导致 GC 频繁触发;
    • 内存泄漏导致老年代占满,引发 Full GC 循环。
  2. 无限循环或低效循环
    • 代码中存在 while(true) 等未正确退出的循环;
    • 循环内执行耗时操作(如复杂计算、大量字符串拼接)。
  3. 线程竞争与阻塞
    • 大量线程争夺同一把锁,导致上下文切换频繁;
    • 死锁或活锁导致线程持续空转。
  4. 频繁的 IO 操作
    • 同步 IO 操作未设置超时,导致线程长期阻塞在 IO 等待;
    • 大量无效的网络请求或磁盘读写。
  5. 第三方库或框架问题
    • 某些组件在特定场景下存在性能缺陷(如低效的序列化 / 反序列化)。

CPU 飙升排查步骤

步骤 1:定位 CPU 占用最高的进程

使用 top 命令查看系统中 CPU 使用率最高的进程,记录其 PID(进程 ID):

阅读全文 »

Java Timer 定时任务调度详解

Timer 是 Java 原生提供的定时任务调度工具,虽然功能相对简单,但在简单场景下可以满足定时执行任务的需求。本文将详细解析 Timer 的核心组件、调度方式及使用细节。

Timer 核心组件

Timer 框架主要由两个核心类构成:TimerTimerTask

TimerTask:任务载体

TimerTask 是一个抽象类,实现了 Runnable 接口,代表一个可以被 Timer 调度的任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class TimerTask implements Runnable {
// 任务状态常量
static final int VIRGIN = 0; // 未调度
static final int SCHEDULED = 1; // 已调度(等待执行)
static final int EXECUTED = 2; // 已执行(非重复任务)
static final int CANCELLED = 3; // 已取消

int state = VIRGIN; // 初始状态为未调度

// 抽象方法,需用户实现具体任务逻辑
public abstract void run();

// 取消任务
public boolean cancel() { ... }

// 获取任务下次执行时间
public long scheduledExecutionTime() { ... }
}
阅读全文 »

Lombok 常用注解全解析:简化 Java 代码的利器

Lombok 是一款 Java 开发工具,通过注解自动生成模板代码(如 getter/setter、构造函数等),减少冗余代码,提高开发效率。本文将详细介绍 Lombok 的核心注解、使用场景及注意事项,帮助你快速掌握其用法。

Lombok 依赖配置

在 Maven 或 Gradle 项目中引入 Lombok 依赖,注意需配合 IDE 插件(如 IntelliJ IDEA 的 Lombok Plugin)使用,否则可能出现编译错误。

Maven 配置

1
2
3
4
5
6
<dependency>  
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version> <!-- 推荐使用最新稳定版 -->
<scope>provided</scope> <!-- 编译时生效,不打包到运行环境 -->
</dependency>

Gradle 配置

1
2
3
4
dependencies {  
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'
}

核心注解详解

简化 Getter/Setter:@Getter / @Setter

  • 作用:自动生成成员变量的 getXxx()setXxx() 方法。
  • 使用场景:POJO 类、DTO 类等需要频繁定义 getter/setter 的场景。
阅读全文 »

Linux 端口映射配置指南:使用 iptables 实现网络地址转换

在 Linux 系统中,端口映射(端口转发)是实现不同网络间通信的重要手段,通常用于将外部网络的请求转发到内部网络的特定服务。以下是基于 iptables 的端口映射配置详解,包括临时配置和永久生效方案。

基础配置:启用数据包转发

端口映射依赖内核的 IP 转发功能,需先开启:

临时启用 IP 转发(立即生效,重启失效)

1
2
3
4
5
# 允许 IPv4 数据包转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 验证配置(返回 1 表示已启用)
cat /proc/sys/net/ipv4/ip_forward

配置 iptables 转发规则

1
2
3
4
5
6
7
8
9
10
# 1. 允许 NAT 表的 POSTROUTING 链进行地址伪装(适用于动态 IP 环境)
iptables -t nat -A POSTROUTING -j MASQUERADE

# 2. 允许内网网卡的转发请求
# 替换 [内网网卡名称] 为实际网卡(如 ens33、eth0)
iptables -A FORWARD -i [内网网卡名称] -j ACCEPT

# 3. 针对特定内网网段的地址转换(适用于静态 IP 环境)
# 替换 [内网网段](如 192.168.50.0/24)和 [外网网卡名称](如 ens37)
iptables -t nat -A POSTROUTING -s [内网网段] -o [外网网卡名称] -j MASQUERADE

示例(假设内网网卡为 ens33,外网网卡为 ens37,内网网段为 192.168.50.0/24):

1
2
3
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i ens33 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens37 -j MASQUERADE

核心配置:设置端口映射规则

使用 iptablesDNAT(目的地址转换)实现端口映射,将外部请求转发到内部服务。

基本语法

阅读全文 »