一、为什么企业系统必须设计日志表在真实企业系统中用户的一切重要操作都需要记录。例如管理员张三 2026-07-13 10:30 删除用户系统需要知道谁操作的什么时间操作操作了什么操作结果如何修改前是什么修改后是什么这就是系统日志Log System二、企业日志主要分几类通常分为日志系统 ├── 登录日志 login_log │ ├── 操作日志 operation_log │ ├── 错误日志 error_log │ ├── 访问日志 access_log │ └── 数据变更日志 data_change_log实际后台管理系统最常见两个登录日志操作日志三、登录日志设计 login_log业务场景记录用户登录行为。例如管理员登录后台用户admin 时间 2026-07-13 10:00 IP 192.168.1.10 结果 成功表设计CREATE TABLE login_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT, username VARCHAR(50), login_ip VARCHAR(50), login_location VARCHAR(100), browser VARCHAR(100), os VARCHAR(100), status TINYINT, message VARCHAR(255), create_time DATETIME );四、为什么 login_log 需要保存 user_id例如user_id1001表示谁登录。方便查询SELECT * FROM login_log WHERE user_id1001;用途查询某用户登录记录安全审计异常检测五、为什么 login_log 还需要保存 username问题不是已经有user_id了吗为什么还存username原因1. 保留历史快照例如今天用户usernametom登录。第二天用户修改名字usernamejerry如果只保存user_id查询历史显示jerry登录错误。日志需要记录当时真实状态tom登录2. 避免关联查询查询日志如果login_log JOIN user需要额外关联。日志系统追求快速查询。所以日志表通常保存user_id username快照六、登录日志字段解释字段作用id日志编号user_id用户IDusername用户名快照login_ip登录IPbrowser浏览器os操作系统status登录状态message描述create_time时间七、操作日志 operation_log什么是操作日志记录用户对系统进行了什么业务操作。例如管理员删除用户记录用户admin 操作 删除用户 目标 user id100 时间 2026-07-13表CREATE TABLE operation_log( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT, username VARCHAR(50), module VARCHAR(50), operation VARCHAR(100), method VARCHAR(200), request_url VARCHAR(255), request_method VARCHAR(20), request_param TEXT, response_result TEXT, ip VARCHAR(50), status TINYINT, create_time DATETIME );八、为什么 operation_log 需要记录“谁、什么时候、做了什么、影响了什么数据”这是日志系统核心。1. 谁字段user_id username回答谁操作。例如admin删除用户2. 什么时候字段create_time回答什么时候发生。3. 做了什么字段operation例如新增用户 修改角色 删除订单4. 影响了什么数据字段例如{ id:100, name:Tom }或者request_param保存请求参数。目的出现问题时可以追溯。九、为什么日志表通常不使用软删除普通业务表例如user可以删除。但是日志不应该删除。原因1. 日志就是证据例如安全审计需要知道过去发生了什么。2. 删除日志会破坏完整性例如管理员删除自己的操作记录。那么审计失效。3. 日志生命周期不同通常不是删除。而是归档。例如一年以前移动到login_log_history十、为什么大型系统需要日志分表或者归档因为日志增长非常快。例如大型系统每天100万登录记录。一年3.6亿。如果全部放login_log问题查询越来越慢索引越来越大备份困难解决方案方案1按时间分表例如login_log_2026_01 login_log_2026_02 login_log_2026_03方案2归档近期login_log保存3个月。历史login_log_archive方案3日志系统独立大型企业不会全部放 MySQL。会使用ElasticsearchLokiClickHouse十一、日志表和业务表的区别业务表日志表保存当前状态保存历史行为允许修改尽量只新增允许删除通常不删除关注业务关注追踪数量稳定快速增长十二、本章总结企业日志设计核心登录日志 记录谁登录系统 操作日志 记录谁修改系统核心字段user_id username operation request_param ip create_time设计原则日志保存历史快照日志尽量只新增不直接删除日志大数据量需要归档日志查询优先考虑性能本章思考题为什么 login_log 中已经保存 user_id还需要保存 username保存历史快照为什么日志表通常不采用软删除日志是审计证据为什么 operation_log 需要记录“谁、什么时候、做了什么、影响了什么数据”方便追责和恢复为什么大型系统通常需要对日志表进行分表或归档解决数据高速增长如果管理员修改用户角色operation_log 应该保存哪些信息保存操作者、目标、前后变化为什么日志系统通常采用追加写而不是更新已有记录保证历史真实性
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第五章:日志系统设计
发布时间:2026/7/15 4:21:36
一、为什么企业系统必须设计日志表在真实企业系统中用户的一切重要操作都需要记录。例如管理员张三 2026-07-13 10:30 删除用户系统需要知道谁操作的什么时间操作操作了什么操作结果如何修改前是什么修改后是什么这就是系统日志Log System二、企业日志主要分几类通常分为日志系统 ├── 登录日志 login_log │ ├── 操作日志 operation_log │ ├── 错误日志 error_log │ ├── 访问日志 access_log │ └── 数据变更日志 data_change_log实际后台管理系统最常见两个登录日志操作日志三、登录日志设计 login_log业务场景记录用户登录行为。例如管理员登录后台用户admin 时间 2026-07-13 10:00 IP 192.168.1.10 结果 成功表设计CREATE TABLE login_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT, username VARCHAR(50), login_ip VARCHAR(50), login_location VARCHAR(100), browser VARCHAR(100), os VARCHAR(100), status TINYINT, message VARCHAR(255), create_time DATETIME );四、为什么 login_log 需要保存 user_id例如user_id1001表示谁登录。方便查询SELECT * FROM login_log WHERE user_id1001;用途查询某用户登录记录安全审计异常检测五、为什么 login_log 还需要保存 username问题不是已经有user_id了吗为什么还存username原因1. 保留历史快照例如今天用户usernametom登录。第二天用户修改名字usernamejerry如果只保存user_id查询历史显示jerry登录错误。日志需要记录当时真实状态tom登录2. 避免关联查询查询日志如果login_log JOIN user需要额外关联。日志系统追求快速查询。所以日志表通常保存user_id username快照六、登录日志字段解释字段作用id日志编号user_id用户IDusername用户名快照login_ip登录IPbrowser浏览器os操作系统status登录状态message描述create_time时间七、操作日志 operation_log什么是操作日志记录用户对系统进行了什么业务操作。例如管理员删除用户记录用户admin 操作 删除用户 目标 user id100 时间 2026-07-13表CREATE TABLE operation_log( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT, username VARCHAR(50), module VARCHAR(50), operation VARCHAR(100), method VARCHAR(200), request_url VARCHAR(255), request_method VARCHAR(20), request_param TEXT, response_result TEXT, ip VARCHAR(50), status TINYINT, create_time DATETIME );八、为什么 operation_log 需要记录“谁、什么时候、做了什么、影响了什么数据”这是日志系统核心。1. 谁字段user_id username回答谁操作。例如admin删除用户2. 什么时候字段create_time回答什么时候发生。3. 做了什么字段operation例如新增用户 修改角色 删除订单4. 影响了什么数据字段例如{ id:100, name:Tom }或者request_param保存请求参数。目的出现问题时可以追溯。九、为什么日志表通常不使用软删除普通业务表例如user可以删除。但是日志不应该删除。原因1. 日志就是证据例如安全审计需要知道过去发生了什么。2. 删除日志会破坏完整性例如管理员删除自己的操作记录。那么审计失效。3. 日志生命周期不同通常不是删除。而是归档。例如一年以前移动到login_log_history十、为什么大型系统需要日志分表或者归档因为日志增长非常快。例如大型系统每天100万登录记录。一年3.6亿。如果全部放login_log问题查询越来越慢索引越来越大备份困难解决方案方案1按时间分表例如login_log_2026_01 login_log_2026_02 login_log_2026_03方案2归档近期login_log保存3个月。历史login_log_archive方案3日志系统独立大型企业不会全部放 MySQL。会使用ElasticsearchLokiClickHouse十一、日志表和业务表的区别业务表日志表保存当前状态保存历史行为允许修改尽量只新增允许删除通常不删除关注业务关注追踪数量稳定快速增长十二、本章总结企业日志设计核心登录日志 记录谁登录系统 操作日志 记录谁修改系统核心字段user_id username operation request_param ip create_time设计原则日志保存历史快照日志尽量只新增不直接删除日志大数据量需要归档日志查询优先考虑性能本章思考题为什么 login_log 中已经保存 user_id还需要保存 username保存历史快照为什么日志表通常不采用软删除日志是审计证据为什么 operation_log 需要记录“谁、什么时候、做了什么、影响了什么数据”方便追责和恢复为什么大型系统通常需要对日志表进行分表或归档解决数据高速增长如果管理员修改用户角色operation_log 应该保存哪些信息保存操作者、目标、前后变化为什么日志系统通常采用追加写而不是更新已有记录保证历史真实性