金仓(KingbaseES)数据库操作日志配置与维护
1. 登录 KingbaseES 终端
切换到 KingbaseES 数据库用户:
|
1 |
su - kingbase |
使用 ksql 登录:
|
1 |
ksql -U system -d test |
如果需要指定端口:
|
1 |
ksql -U system -d test -p 54321 |
2. 查看日志目录
进入 ksql 后执行:
|
1 2 3 |
SHOW data_directory; SHOW log_directory; SHOW log_filename; |
例如:
|
1 2 3 4 5 6 7 8 |
data_directory /home/data/Kingbase/.../data log_directory sys_log log_filename kingbase-%d.log |
实际日志目录 = data_directory + log_directory。
也可以直接查询:
|
1 |
SHOW log_directory; |
然后在 Linux 中进入对应目录查看:
|
1 2 |
cd <日志目录> ls -lh |
查看实时日志:
|
1 |
tail -f kingbase-*.log |
3. 查看当前日志配置
|
1 2 3 4 5 6 |
SHOW logging_collector; SHOW log_destination; SHOW log_filename; SHOW log_statement; SHOW log_duration; SHOW log_min_duration_statement; |
重点关注:
|
1 2 3 4 |
logging_collector = on log_destination = stderr log_statement = mod log_filename = kingbase-%d.log |
| 参数 | 作用 |
| logging_collector | 是否写入日志文件 |
| log_destination | 日志输出到哪里 |
| log_filename | 日志文件命名规则 |
| log_statement | 记录哪些 SQL |
| log_duration | 是否记录 SQL 执行耗时 |
| log_min_duration_statement | 记录超过指定时间的 SQL |
log_statement 返回值说明
| 返回值 | 含义 | 记录内容 | 简单记忆 |
| none | 不记录 SQL | 不记录普通 SQL | 什么都不记录 |
| ddl | 记录数据库结构操作 | CREATE、ALTER、DROP 等 | 只记录结构变化 |
| mod | 记录数据修改操作 | INSERT、UPDATE、DELETE,以及 DDL | 记录增删改 + 结构变化 |
| all | 记录所有 SQL | 包括 SELECT、INSERT、UPDATE、DELETE、DDL 等 | 所有 SQL |
4. 开启 INSERT / UPDATE / DELETE 操作日志
推荐:
|
1 2 |
ALTER SYSTEM SET log_statement = 'mod'; SELECT sys_reload_conf(); |
验证:
|
1 |
SHOW log_statement; |
应该显示:
|
1 |
mod |
注意
以上操作不会重启 KingbaseES 服务,只是重新加载数据库配置。
正常情况下:
|
1 |
SELECT sys_reload_conf(); |
返回:
|
1 |
t |
即可。
5. 验证操作日志是否正常
执行一条测试修改,例如:
|
1 |
UPDATE users SET lastlogout = now() WHERE id = 1; |
然后在 Linux 终端查看:
|
1 |
tail -f kingbase-*.log |
应该能够看到类似:
|
1 |
LOG: execute pdo_stmt_xxxxx: UPDATE ... |
或者:
|
1 |
LOG: statement: UPDATE ... |
关于 SELECT
log_statement = ‘mod’ 不会记录普通 SELECT。
如果需要记录 SELECT:
|
1 2 |
ALTER SYSTEM SET log_statement = 'all'; SELECT sys_reload_conf(); |
但生产环境一般不建议长期使用 all,因为日志量会非常大。
6. 修改日志文件命名规则
查看当前:
|
1 |
SHOW log_filename; |
例如当前:
|
1 2 3 4 |
# 一月中的第几天 kingbase-%d.log # 一年中的第几天 kingbase-%j.log |
如果需要修改:
|
1 2 |
ALTER SYSTEM SET log_filename = 'kingbase-%Y-%m-%d.log'; SELECT sys_reload_conf(); |
验证:
|
1 |
SHOW log_filename; |
然后观察日志目录:
|
1 |
ls -lh |
7. 设置日志保留 99 天
如果希望保留 99 天,建议不要单纯依赖:
|
1 |
log_filename = 'kingbase-%d.log' |
而是采用:
KingbaseES 负责生成日志 + Linux 定时任务负责清理超过 99 天的日志。
例如每天凌晨清理:
|
1 |
find <日志目录> -type f -name "kingbase-*.log" -mtime +99 -delete |
添加定时任务
编辑:
|
1 2 3 |
vim /etc/crontab # 或者 crontab -e |
每天凌晨 03:00 执行:
|
1 |
0 3 * * * find <日志目录> -type f -name "kingbase-*.log" -mtime +99 -delete |
这样:
- KingbaseES 正常持续生成日志
- 日志文件按照日期保存
- 超过 99 天的日志自动删除
- 不需要重启数据库
8. 常用日志查询
查看 INSERT:
|
1 |
grep -Ri "INSERT" <日志目录>/kingbase-*.log |
查看 UPDATE:
|
1 |
grep -Ri "UPDATE" <日志目录>/kingbase-*.log |
查看 DELETE:
|
1 |
grep -Ri "DELETE" <日志目录>/kingbase-*.log |
排除数据库备份产生的 sys_dump:
|
1 |
grep -RiE "INSERT|UPDATE|DELETE" <日志目录>/kingbase-*.log | grep -v "app=sys_dump" |
实时查看:
|
1 |
tail -f <日志目录>/kingbase-*.log |
9. 最终建议配置
生产环境建议至少确认:
|
1 2 3 4 |
SHOW logging_collector; SHOW log_filename; SHOW log_statement; SHOW log_directory; |
推荐:
|
1 2 3 |
logging_collector = on log_statement = mod log_filename = kingbase-%Y-%m-%d.log |
再通过 Linux cron:
|
1 |
0 3 * * * find <日志目录> -type f -name "kingbase-*.log" -mtime +99 -delete |
实现操作日志记录 + 99天保留。