问题描述
今天周一,开发一早在测试库导库,复现BUG问题,导了几次发现maraidb(版本10.3.8)突然崩溃,使用命令启动,启动失败
查看err.log
提示硬盘空间满
使用df -h
,发现mysql的磁盘确实满了,使用空间为0,需要删除binlog文件
处理步骤
1. 手动删除binlog
找到binlog.index
,只删除日期最久的,保留最后几个时间近的,或者删除其他文件,腾出空间,使mysql能正常启动
全部删除
rm -f master1-bin.00000*
删除指定binlog
例如删除1-10的binlog文件
rm -f master1-bin{000001..000010}
再次启动,还是报错,提示
[ERROR] Found 1 prepared transactions! It means that mysqld was not shut down
properly last time and critical recovery information (last binlog or tc.log file)
was manually deleted after a crash.
You have to start mysqld with --tc-heuristic-recover switch to commit or
rollback pending transactions.
大意是:mariadb因为非法关闭,并且用于恢复错误信息的binlog或者tc.log被手动删除,必须使用参数 --TC-Heuristic-Recover 启动mySQLD,才能提交或回滚挂起的事务。
编辑my.cnf,增加配置文件:
tc-heuristic-recover=rollback
再次启动
systemctl start mariadb
然后在mysql.cnf里注释掉:**tc-heuristic-recover=rollback**
**,
同时删除掉mysql目录里的:**ib_logfile0,ib_logfile1,tc.log ( 如果mysql目录里没有可以忽略掉)
再次启动成功;如果提示:Can't init tc log
说明你没有开启binlog日志,一定要开启,不然启动不起来!
2023-05-22 9:47:02 0 [Note] Recovering after a crash using tc.log
2023-05-22 9:47:02 0 [ERROR] Can't init tc log
2023-05-22 9:47:02 0 [ERROR] Aborting
2. 关于tclog
tclog全称为:transaction coordinator log
,事务协调日志,多用于XA存储引擎
,事务协调器主要有如下两种:
- 基于
bin-log
的事务协调器日志 - 基于
Memory-mapped
(内存映射文件的事务)协调器日志
如果在服务器上启用了binlog,则服务器将使用基于binlog的事务协调器日志;
如果没有开启binglog,它将使用基于内存映射文件的事务协调器日志,即tclog
实际上有些情况下,比如mariadb突然崩溃,则强制使用tc事务协调器,虽然你的存储引擎是innodb,不得不说这个bug也确实挺坑人。
好在mariadb在10.4.3中去掉了对xa存储引擎的支持,不在使用tc事务协调器日志了。
详细tc介绍请参考官方文档:https://mariadb.com/kb/en/transaction-coordinator-log-overview/
3. 使用mysql删除binlog
如果要进一步释放磁盘空间,可以再次进行binlog的删除,则可以进行如下操作,如果在手动删除里进行了完全的binlog清理,这一步可以忽略掉
登录mysql,执行删除binlog命令
mysql> purge binary logs to 'mysql-bin.000010'; # 删除000010之前的所有binlog日志
mysql> purge binary logs before '2023-05-21 23:59:59'; # 删除2023-05-11 23:59:59之前的所有binlog日志
或者更改binlog保存天数,然后在刷新log,是修改的新天数生效
在my.cnf里添加,永久生效
expire_logs_days = 3 # 更改binlog保存天数
然后在mysql执行
flash logs;
临时修改,重启mariadb则恢复原由设置
# 查看当前保存天数
show variables like 'expire_logs_days';
# 配置保存天数为3天
SET expire_logs_days=3
# 生效参数
flash logs;