mysql某张表一直卡死,排查原因和问题解决

本文介绍了如何诊断并解决MySQL中表卡死的问题。通过查询`information_schema.processlist`来查找占用资源的SQL命令,特别是那些长时间运行的进程。通过`information_schema.innodb_trx`找出具体的事务ID,并使用`kill`命令终止导致卡死的进程。这种方法有助于恢复正常的数据操作和维护数据库稳定性。

mysql某张表一直卡死

查看哪些运行的命令造成,如sql语句等

select id, db, user, host, command, time, state, info
from information_schema.processlist
where command != 'Sleep'
order by time desc ;

查看那个端口运行了命令和命令执行的开始时间,根据端口开始时间长的将它杀死
查看端口运行的命令和执行的时间,将端口运行时间长的杀死
select * from information_schema.innodb_trx;
然后删除某个trx_mysql_thread_id就可以了
trx_mysql_thread_id
kill 1111;

问题解决,能正常打开此表和相关sql操作

show processlist; 也可以查看卡死的sql,sql语句在info里面,没有则无

### 查看 MySQL 中特定的增删改操作日志 为了查看 MySQL 数据库中某个特定上的 `INSERT`、`UPDATE` `DELETE` 操作的历史记录,通常有几种方法可以实现这一需求: #### 方法一:启用二进制日志 (Binary Log) MySQL 的二进制日志会记录所有的数据更改事件,包括但不限于 `CREATE TABLE` 或者对数据库中的任何执行的数据修改语句。要开启此功能,在配置文件 my.cnf 或 my.ini 中设置如下参数并重启服务[^1]。 ```ini [mysqld] log-bin=mysql-bin server-id=1 ``` 一旦启用了 binlog 功能,则可以通过命令来读取这些日志文件的内容: ```bash mysqlbinlog /path/to/binlog/file | less ``` 这将展示所有被记录下来的 SQL 语句及其时间戳等元数据信息。不过需要注意的是,默认情况下二进制日志并不会区分具体哪个用户进行了哪些变更;如果想要追踪到更详细的层面,则还需要额外配置审计插件或其他第三方工具[^2]。 #### 方法二:创建触发器与专用的日志 另一种方式是在目标格上建立相应的触发器(Trigger),每当发生插入、更新或删除动作时自动向另一个专门用于存储此类活动信息的新建内写入一条新纪录。下面是一个简单的例子说明如何针对名为 `my_table` 的实施这样的机制[^3]: ```sql -- 创建日志 CREATE TABLE IF NOT EXISTS operation_log ( id INT AUTO_INCREMENT PRIMARY KEY, event_type ENUM('insert', 'update', 'delete') NOT NULL, table_name VARCHAR(64), row_id INT, changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 插入触发器 DELIMITER // CREATE TRIGGER trg_mytable_insert AFTER INSERT ON my_table FOR EACH ROW BEGIN INSERT INTO operation_log(event_type, table_name, row_id) VALUES ('insert', 'my_table', NEW.id); END// DELIMITER ; -- 更新触发器 DELIMITER // CREATE TRIGGER trg_mytable_update AFTER UPDATE ON my_table FOR EACH ROW BEGIN INSERT INTO operation_log(event_type, table_name, row_id) VALUES ('update', 'my_table', OLD.id); END// DELIMITER ; -- 删除触发器 DELIMITER // CREATE TRIGGER trg_mytable_delete AFTER DELETE ON my_table FOR EACH ROW BEGIN INSERT INTO operation_log(event_type, table_name, row_id) VALUES ('delete', 'my_table', OLD.id); END// DELIMITER ; ``` 这种方法的优点是可以精确控制所捕获的信息量以及格式化输出样式,缺点在于可能会给系统带来一定的性能开销,并且需要手动维护触发器逻辑以适应结构变化后的定义[^4]。 #### 方法三:利用通用查询日志 (General Query Log) 虽然不推荐作为常规手段使用,但在某些特殊场景下也可以考虑打开全局查询日志来进行临时性的监控工作。只需编辑 MySQL 配置文件并将 general-log 参数设为 on 即可让服务器把接收到的所有客户端请求都保存下来供后续分析之用。然而由于该选项会对整体性能造成较大影响,因此仅限于短期测试环境下的应用[^5]。 ```ini general-log = 1 general_log_file = "/var/log/mysql/query.log" ``` 以上就是关于如何在 MySQL 中跟踪特定的操作历史的一些常见做法。每种方案都有其适用范围局限性,请根据实际业务需求权衡选择最合适的解决方案。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值