`

转:解决mysql锁表终极方法

 
阅读更多

很多时候!一不小心就锁表!这里讲解决锁表终极方法!

案例一

mysql>show processlist;

参看sql语句

一般少的话

mysql>kill thread_id;

就可以解决了

kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.

#!/bin/bash
mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt

for line in `cat locked_log.txt | awk '{print $1}'`
do 
echo "kill $line;" >> kill_thread_id.sql
done

现在kill_thread_id.sql的内容像这个样子

kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
.....

好了, 我们在mysql的shell中执行, 就可以把所有锁表的进程杀死了.

mysql>source kill_thread_id.sql

当然了, 也可以一行搞定
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done 

案例二 如果大批量的操作能够通过一系列的select语句产生,那么理论上就能对这些结果批量处理。
但是mysql并没用提供eval这样的对结果集进行分析操作的功能。所以只能现将select结果保存到临时文件中,然后再执行临时文件中的指令。
具体过程如下:mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root';
+------------------------+
| concat('KILL ',id,';') 
+------------------------+
| KILL 3101;             
| KILL 2946;             
+------------------------+
2 rows IN SET (0.00 sec)mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';
Query OK, 2 rows affected (0.00 sec)mysql> source /tmp/a.txt;
Query OK, 0 rows affected (0.00 sec)  

案例三 MySQL + PHP的模式在大并发压力下经常会导致MySQL中存在大量僵死进程,导致服务挂死。为了自动干掉这些进程,弄了个脚本,放在服务器后台通过crontab自动执行。发现这样做了以后,的确很好的缓解了这个问题。把这个脚本发出来和大家Share. 根据自己的实际需要,做了一些修改:

SHELL脚本:mysqld_kill_sleep.sh

#!/bin/sh 
mysql_pwd="root的密码" 
mysqladmin_exec="/usr/local/bin/mysqladmin" 
mysql_exec="/usr/local/bin/mysql" 
mysql_timeout_dir="/tmp" 
mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log" 
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh" 
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log" 
$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v Time | grep -v '|' | sort -rn > $mysql_timeout_log 
awk '{if($1>30 && $3!="root") print "'""$mysql_exec""' -e " "\"" "kill",$2 "\"" " -uroot " "-p""\"""'""$mysql_pwd""'""\"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh 
echo "check start ...." >> $mysql_kill_timeout_log 
echo `date` >> $mysql_kill_timeout_log 
cat $mysql_kill_timeout_sh把这个写到mysqld_kill_sleep.sh。然后chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh,然后用root账户到cron里面运行即可,时间自己调整。 
执行之后显示: 

www# ./mysqld_kill_sleep.sh 
/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27750" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27888" -uroot -p"mysql root的密码"; 
/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

如果确认没有问题了,把最后的cat修改为sh即可。
本人改写了下上面的脚本:

#!/bin/bash 
mysql_pwd="密码" 
mysql_exec="/usr/local/mysql/bin/mysql" 
mysql_timeout_dir="/tmp" 
mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh" 
mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log" 
$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" >> $mysql_kill_timeout_log 
chmod 777 $mysql_kill_timeout_log 
for line in `$mysql_kill_timeout_log  | awk '{print $1}'` 
do 
echo "$mysql_exec -uroot -p$mysql_pwd -e \"kill $line\"" >> $mysql_kill_timeout_sh 
done 
chmod 777 $mysql_kill_timeout_sh 
cat $mysql_kill_timeout_sh 是不是很方便呢!

最后贴个我在用的脚本

 

1
2
3
4
5
#!/bin/bash
mysql -uroot -pxxxxx -e "show processlist" |grep -i "Lock" |awk '{print $1}' >sqlid.sql
sed -i 's/^/kill\ /g' sqlid.sql
sed -i 's/$/;/g' sqlid.sql
mysql -uroot -pxxxxx -e "source /home/hgz/sqlid.sql"

sqlid.sql文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
kill 2;
kill 1088;
kill 1265;
kill 1274;
kill 1287;
kill 1288;
kill 1289;
kill 1290;
kill 1291;
kill 1295;
kill 1296;
kill 1298;
kill 1299;
kill 1302;
kill 1304;
kill 1305;
kill 1309;

 

文章转自:http://hi.baidu.com/hunter6536/item/844223c05f0a9934449416ad

分享到:
评论

相关推荐

    MYSQL锁表问题的解决方法

    本文将介绍几种解决MySQL锁表问题的方法。 1. **查看并杀死锁定进程** 使用`SHOW PROCESSLIST`命令可以查看当前所有正在执行的SQL语句及其状态,包括是否被锁定。如果发现有锁定的进程,可以使用`KILL`命令来终止...

    MySQL锁类型以及子查询锁表问题、解锁1

    在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...

    MYSQL 解锁与锁表介绍

    MySQL锁概述   相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁...

    MySQL导入sql脚本错误:2006 解决方法

    MySQL导入sql脚本错误:2006 – MySQL server has gone away 到如一些小脚本很少报错,但最近导入一个10+M的SQL脚本,却重复报错: Error occured at:2014-03-24 11:42:24 Line no.:85 Error Code: 2006 - MySQL ...

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    标题提到的"‘Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql’"是一个处理这种转换的工具或过程。 首先,让我们理解这个过程的一般步骤: 1. **数据迁移需求分析**:在开始转换之前,了解源MySQL表的结构...

    php提示Warning:mysql_fetch_array() expects的解决方法

    本文实例讲述了php提示Warning mysql_fetch_array() expects的解决方法,分享给大家供大家参考。具体分析如下: 在mysql数据库连接时碰到Warning: mysql_fetch_array() expects …错误提示,根据我的经验这个是sql...

    Oracle的表结构转成Mysql的表结构

    ### Oracle的表结构转成MySQL的表结构 #### 功能概述 本文介绍了一种将Oracle数据库中的表结构转换为MySQL数据库表结构的方法。通过编写一个PL/SQL函数`fnc_table_to_mysql`来实现这一目标。该函数可以接受四个参数...

    mysql启动提示mysql.host 不存在,启动失败的解决方法

    error 日志当中的记录: [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist 从发了帖子,只有人看,没有人回复,看到这种情况只能自己解决问题了,自己动手...

    MySQL常见问题及解决方法

    MySQL常见问题及解决方法 MySQL 是一种关系型数据库管理系统,它广泛应用于 web 应用程序中。然而,在使用 MySQL 过程中,用户经常会遇到一些常见的问题,本文将对这些问题进行总结和解决。 一、 MySQL 登录问题 ...

    Mysql转oracle工具

    在转换过程中,可能需要将MySQL的数据分布策略转换为Oracle的表空间或分区策略。 5. **索引和约束**: MySQL与Oracle的索引类型和约束定义(如主键、外键)也有所不同,转换时需要注意。 6. **存储过程和函数**:...

    MYSQL锁机制全揭秘

    MySQL的表级锁分为表共享读锁(TableReadLock)和表独占写锁(TableWriteLock)。其中表共享读锁允许多个用户同时读,但不允许写;表独占写锁则完全阻止其他读写操作。一旦有线程获得写锁,只有该线程可以进行写操作...

    MySQL:锁机制.pdf

    MySQL的表锁分为表共享读锁(TableReadLock)和表独占写锁(TableWriteLock)。表锁的特点是实现简单,开销小,加锁速度快,但在高并发环境下容易发生锁竞争,导致并发性能下降。MyISAM存储引擎偏向于使用表锁,尤其...

    mysql锁表1

    在MySQL数据库管理系统中,"锁表"是一种重要的并发控制机制,用于确保在多用户环境中数据的一致性和完整性。锁能够防止多个用户同时修改同一数据,从而避免数据冲突和不一致。本篇文章将深入探讨MySQL中的锁表机制...

    基于Mysql的表转HBase小Demo

    本示例“基于Mysql的表转HBase小Demo”提供了一个简单的解决方案,将Mysql中的数据转换并存储到HBase这种分布式列式数据库中。这个过程对于那些希望从传统的关系型数据库迁移到NoSQL数据库,尤其是对大规模数据进行...

    PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法

    主要介绍了PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法,是在进行PHP数据库程序开发中常会遇到的错误,需要的朋友可以参考下

    Java高级试听课:MySQL锁和事务篇.txt

    ### Java高级试听课:MySQL锁和事务篇 在本篇试听课中,我们将深入探讨MySQL中的锁机制与事务处理这两个核心概念。对于任何希望深入了解数据库内部运作机制、提高应用程序性能和稳定性的Java开发者来说,这些都是必...

    MYSQL锁机制

    MySQL支持多种锁类型,包括表级锁、行级锁和页面锁等,每种锁都有其适用场景。 #### 二、锁的基本概念 在多用户环境中,锁的作用主要体现在以下几个方面: - **协调并发访问**:确保多个用户或进程在访问同一资源...

Global site tag (gtag.js) - Google Analytics