mysql打不开表问题解决方案

做开发时候某一表怎么也打不开,数据也不多,网上查了按下面这篇文章完美解决,但是要记得用root登录mysql:

记一次MySQL中Waiting for table metadata lock的解决方法

原创 2017年03月29日 12:06:32

  • 5860

最近项目中的数据库查询经常挂起,应用程序启动后也报操作超时。测试人员就说数据库又挂了(貌似他们眼中的连接失败,查询无果都是挂了),通过 show processlist 一看,满屏都是 Waiting for table metadata lock 状态的连接。第一反应就是kill掉这些连接,奈何连接实在太多,实在kill不过来,于是重启服务,貌似重启果真能解决90%的问题,但如果不找到问题原因,问题也肯定会再次出现。

在网上查询得知MySQL在进行一些alter table等DDL操作时,如果该表上有未提交的事务则会出现 Waiting for table metadata lock ,而一旦出现metadata lock,该表上的后续操作都会被阻塞(详见 )。所以这个问题需从两方面解决:

1. 查看未提交事务

从 information_schema.innodb_trx 表中查看当前未提交的事务

select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx\G
  • 1

(\G作为结束符时,MySQL Client会把结果以列模式展示,对于列比较长的表,展示更直观)

字段意义:

  • trx_state: 事务状态,一般为RUNNING
  • trx_started: 事务执行的起始时间,若时间较长,则要分析该事务是否合理
  • trx_mysql_thread_id: MySQL的线程ID,用于kill
  • trx_query: 事务中的sql

一般只要kill掉这些线程,DDL操作就不会Waiting for table metadata lock。

2. 调整锁超时阈值

lock_wait_timeout 表示获取metadata lock的超时(单位为秒),允许的值范围为1到31536000(1年)。 默认值为31536000。详见 https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_lock_wait_timeout 。默认值为一年!!!已哭瞎!将其调整为30分钟

set session lock_wait_timeout = 1800;
set global lock_wait_timeout = 1800;
  • 1
  • 2

好让出现该问题时快速故障(failfast)

原文地址:https://www.cnblogs.com/cyl048/p/8352225.html

时间: 2024-10-28 06:05:34

mysql打不开表问题解决方案的相关文章

【优化】MySQL千万级大表优化解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

mysql大数据分库和分表 php解决方案!

当Mysql数据量过大时,就会面临压力分解,这时分库分表是一个不错的解决方案,现在我们就来谈谈Mysql如何分库分表比较理想,然后再用php如何调用. 1,主从复制,读写分离 对主库修改数据,查询使用从库.一主多从,来降低数据库读取压力. 2,分库分表 根据实体业务来分库,分表.如,根据数据的活跃性,根据用户uid等. 3,MySQL 不同存储引擎区别 InnoDB 用于数据完整性/写性能要求比较高的应用. MyISAM 适合查询应用. 分表是分散数据库压力的好方法. 分表,最直白的意思,就是将

mysql实时同步到mssql的解决方案

数据库在应用程序中是必不可少的部分,mysql是开源的,所以很多人它,mssql是微软的,用在windows平台上是非常方便的,所以也有很多人用它.现在问题来了,如何将这两个数据库同步,即数据内容保持完全一致. MySQL Migration Toolkit是MySQL提供的开源GUI软件工具,可以针对Microsoft Access.Microsoft SQL Server.Oracle.MySQL.Sybase Server.MaxDB Database Server数据库向MySQL数据库

mariadb10.x启用gtid复制时提示mysql.gtid_slave_pos找不到的解决方案

mariadb10.x安装方式为yum时,当启用gtid复制方式后,一直提示mysql.gtid_slave_pos找不到的解决方案 造成的原因不详 解决方案:/usr/share/mysql/mysql_system_tables.sql是创建系统表的脚本 找到innodb_table_stats,innodb_index_stats,gtid_slave_pos表的创建方式 innodb_table_stats表的创建语句: SET FOREIGN_KEY_CHECKS=0; DROP TA

【转载】mysql 远程连接速度慢的解决方案

原文地址:http://blog.163.com/[email protected]/blog/static/16674283420110224207826/ PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是,默认安装的 MYSQL开启了DNS的反向解析,在MY.INI(WINDOWS系统下)或MY.CNF(UNIX或LINUX系统下)文件的[mysqld]下加入 skip-name-resolve这一句.连接mysql

mysql支持emoji表情存取的解决方案

让mysql支持emoji表情存取的解决方案 APP移动端无需做任何修改,服务端修改即可. 第一步:修改jdbcUrl: conn.url=jdbc:mysql://127.0.0.1:3306/eyes?zeroDateTimeBehavior=convertToNull&autoReconnect=true 第二步:mysql驱动包: mysql-connector-java-5.1.24.jar 第三步:数据库版本检查: select version() #查看mysql版本 5.6.23

mysql 清空或删除表数据后,控制表自增列值的方法

http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增的字段 方法2: delete from 你的表名 dbcc checkident(你的表名,reseed,0) //重新定位自增的字段,让它从1开始 方法3: 如果你要保存你的数据,介绍你第三种方法,by QINYI 用phpmyadmin导出数据库,你在里面会有发现哦 编辑sql文件,将其中的自

mysql A库a表 B库b表 将a表导入b表中

今天接到开发妹子的需求,导入指定月份的数据到测试服mysql指定的表中(表名称不一样) 首先看了下线上的表的整体大小 mysql> SELECT sum(DATA_LENGTH)+sum(INDEX_LENGTH)  FROM information_schema.TABLES where TABLE_SCHEMA='库名' AND TABLE_NAME='表名'; +------------------------------------+ | sum(DATA_LENGTH)+sum(IND

【Mysql】将Mysql的一张表导出至Excel

把Mysql的一张表导出至Excel不像<[Mysql]将Excel表导入至Mysql的其中一张表>(点击打开链接)那样困难, 直接输入如下的T-SQL语句即可: select * from 某个表 into outfile '文件路径' 比如,我要把如下的test数据库的一张i_student表导出至d盘根目录下的1.xls: use test 之后,输入: select * from i_student into outfile 'd:/1.xls' 如下图: 然后你就会发现在D盘静静躺着