Mysql升级和日志审计开启

升级Mysql

由于等保等工作和各种漏洞困扰,使用开源版Mysql的用户需要规避掉部分风险,所以有时候需要对Mysql进行升级。下面介绍一下整个升级流程。

下载Mysql

这里以为Mysql8.4.4版本为例:首先是登录官网下载对应版本的文件,官网为:MySQL :: Download MySQL Community Server

image-20250307084328050

这里可以选择版本,注意要下载的是ZIP文件压缩包。

然后复制到服务器进行解压缩,解压缩之前可以先删除老版本的mysql,因为我这个配置过程后续是直接改了压缩文件目录名为原本老版本文件目录名的,这样可以减少一步关于环境变量的配置。

下载后解压缩包,且更改目录名为老版本mysql目录名即可。

然后在bin目录同层级新建data文件夹,用于保存数据库数据,且在同一目录下新建my.ini配置文件,修改为如下:

[mysqld]
#数据库端口号
port=3306
#数据库根目录
basedir=C:\\mysql
#数据库数据保存路径
datadir=C:\\mysql\\data
 
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
 
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
 
#是否开启慢查询,ON是开启
slow_query_log = ON
#慢查询阈值(秒)
long_query_time = 0.5
 
# 临时表大小
tmp_table_size = 128M
# 用户可以创建的内存表的最大大小
max_heap_table_size = 128M
# 缓冲池的大小
innodb_buffer_pool_size = 3G
# InnoDB 日志刷新策略
innodb_flush_log_at_trx_commit = 0
# 用于控制group_concat返回最大长度,默认1024
group_concat_max_len = 10240
# 控制InnoDB表空间自动扩展的参数
innodb_autoextend_increment = 256
# InnoDB 日志缓冲区大小
innodb_log_file_size = 64M
# 用于指定连接缓冲区大小的参数
join_buffer_size = 128M
# 用于置顶排序的缓冲区大小的参数
sort_buffer_size = 64M
# 这个参数用在sort查询之后 ,以保证获取以顺序的方式获取到查询的数据。是上面参数的补充
read_rnd_buffer_size = 64M
 
# 语法校验规则
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
 
[mysql]
default-character-set=utf8mb4
 
[client]
port=3306
default-character-set=utf8mb4

上述路径自己调整为对应的mysql路径,我是直接安装在C盘的,各位如果有不同自己更改。

由于环境变量不需要配置了,我们可以直接进入下一步,如果是第一次安装请查找网上其他文档配置一下环境变量,这个和JAVA安装配置环境变量是一样的,这里不加赘述。

启动Mysql

以管理员模式打开cmd命令行,并且输入:

mysqld --initialize-insecure --user=mysql

安装完成后无任何提示信息,如果是第一次安装则需要再输入:

mysqld --install mysql

如果不是第一次安装则可以省略上面一步,直接进行启动:

net start mysql    

这样子进去是空密码的,所以可以直接登录mysql:

mysql -u root -p

修改密码和开启远程访问

登录mysql之后可以进行这一步的操作:

## ① 连接 MySQL Server 服务,并输入临时密码
mysql -uroot -p
## ② 修改密码,7MsZzRwe)N 可改成你想要的密码
alter user 'root'@'localhost' identified by '7MsZzRwe)N';
## ③ 设置允许远程连接
use mysql;
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;

于是结束该操作,当然不建议使用root,同时需要在my.ini中开启监听地址:

bind-address = 0.0.0.0

这个表示监听所有的请求,如果需要做一些限制的话可以如下处理:

不建议通过my.ini中添加地址来设置多IP白名单,因为这个方法只适合于单个IP的限制访问:

[mysqld]
bind-address = 192.168.1.100  # 仅允许该 IP 连接

但是可以通过Mysql内部权限控制配置来实现,例如:

-- 创建仅允许 IP 为 192.168.1.100 的用户
CREATE USER 'your_user'@'192.168.1.100' IDENTIFIED BY 'your_password';

-- 授予该用户特定权限(例如所有权限)
GRANT ALL PRIVILEGES ON *.* TO 'your_user'@'192.168.1.100' WITH GRANT OPTION;

-- 刷新权限
FLUSH PRIVILEGES;

扩展:支持 IP 段(如 @'192.168.1.%')或子网掩码(如 @'192.168.1.0/255.255.255.0'

可以验证查看用户权限:

-- 查看用户权限
SELECT user, host FROM mysql.user WHERE user = 'your_user';

输出应显示允许的 IP 地址或范围。

建议禁止默认root用户远程访问以做好安全控制:

-- 删除默认的远程 root 用户
DROP USER 'root'@'%';

开启日志审计

通用日志查询:在my.ini文件中追加下述代码

#通用查询日志
general_log = ON
general_log_file = C:\mysql_log\general.log
log_output = FILE

配置如上,开启后可以生成日志,通过执行命令:SHOW VARIABLES LIKE 'general_log%'可以查询是否开启日志且确认日志目录。

但是由于这样配置只能做静态日志追加,所以需要用动态脚本来实现自动更改,创建脚本:

@echo off
setlocal enabledelayedexpansion

:: 获取当前日期(格式:YYYYMMDD)
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set datetime=%%a
set current_date=%datetime:~0,8%

:: 修改 MySQL 配置文件中的日志路径
set "config_file=C:\ProgramData\MySQL\MySQL Server 8.4\my.ini"
set "new_log_path=C:\mysql_log\general_%current_date%.log"

:: 备份原配置文件(可选)
copy "%config_file%" "%config_file%.bak"

:: 替换日志路径
powershell -Command "(Get-Content '%config_file%') -replace 'general_log_file = .*', 'general_log_file = %new_log_path%' | Set-Content '%config_file%'"

:: 重启 MySQL 服务使配置生效
net stop mysql
net start mysql

:: 验证日志文件是否生成
if exist "%new_log_path%" (
    echo 日志文件已生成:%new_log_path%
) else (
    echo 错误:日志文件创建失败!
)

命名为:rotate_log.bat,然后对系统任务计划程序进行设置,开启每天触发一次该脚本,就可以更改my.ini文件中日志路径为general_xxxxx.log,其中xxxx为系统当前日期,从而实现脚本自动更新日志切割。

Last modification:March 7th, 2025 at 09:23 am