项目场景:
提示:昨晚跑了一个百万数据级别的大任务,第二天发现连前端也无法登录,经过排查发现是数据库访问异常。
问题描述`
第一次排查分析:以为是任务较大,一直在开着事务,没有释放锁,导致前端发请求登录时报连接超时
Caused by: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
原因分析:
这个错误信息表示在MySQL数据库中,一个事务在等待获取锁的过程中超时了,导致事务回滚。
这种情况通常发生在以下几种情况:
长时间运行的事务:一个事务可能需要很长时间才能完成,比如执行一个复杂的查询或更新操作。
并发事务:当多个事务同时尝试访问同一资源时,可能会出现锁等待的情况。
于是想到重启服务,重启数据库,释放资源并调整压测指标,重新跑任务。
数据库重启
先进入
mysql -u root - p
关机
shutdown
在linux界面重启
sudo service mysql rtart
或
sudo service mysqld start
重启失败
`提示:
× mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled)
Active: failed (Result: exit-code) since Fri 2023-12-22 12:39:46 CST; 1min 50s ago
Duration: 1w 2d 16h 51min 22.378s
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 42059 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Process: 42086 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE)
Main PID: 42086 (code=exited, status=1/FAILURE)
Status: "Server shutdown complete"
Error: 28 (No space left on device)
CPU: 1.141s
Dec 22 12:39:45 lx-mct-db-d1 systemd[1]: Starting MySQL Server...
Dec 22 12:39:46 lx-mct-db-d1 systemd[1]: mysqld.service: Main process exited, code=exited, status=1/FAILURE
Dec 22 12:39:46 lx-mct-db-d1 systemd[1]: mysqld.service: Failed with result 'exit-code'.
Dec 22 12:39:46 lx-mct-db-d1 systemd[1]: Failed to start MySQL Server.
Dec 22 12:39:46 lx-mct-db-d1 systemd[1]: mysqld.service: Consumed 1.141s CPU time.
可能是存储空间满了,df -h看了下存储空间确实100%,得清理。
想通过truncate命令清理数据,然后发现我已经把数据库停了,没办法通过sql清理空间,因此需要通过手动删除idb文件的方式(先备份临时移动的文件,清理完空间还要挪回来),先清理一些空间,先把服务器启动,再对大数据的表格进行清理
如果你不确定MySQL数据目录的具体位置,可以在MySQL的配置文件中查找。默认情况下,MySQL的配置文件位于/etc/my.cnf或/etc/mysql/my.cnf目录下。你可以使用文本编辑器打开该文件,并查找datadir参数的值,该值指定了数据目录的路径。
先进入数据文件存储路径,找到一个占用空间大概100M左右的idb文件
使用mv命令将该文件移动到备份目录
mv 表名.ibd /tmp
重启数据库
sudo service mysqld start
通过truncate或者drop的方式清理表,会释放表空间
最后,再将ibd文件重新移动到原来路径,就不会影响该表