shell案例系列2-MySQL相关的shell案例

一. mysql安装

这是一个大佬发的自动安装mysql8的脚本,收藏下

#!/bin/bash

echo "正在安装MySQL软件......."

useradd mysql
useradd nagios
useradd zabbix

sleep 2

######配置参数######
mysql8_version=mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz
mysql8_version_dir=mysql-8.0.18-linux-glibc2.12-x86_64

######同步复制用户######
repl_user=repl
repl_passwd=sysrepl
#######################

######root密码######
root_passwd=123456
#######################

######DBA管理用户######
dba_user=admin
dba_passwd=admin
#######################

######8.0克隆用户######
clone_user=clone_user
clone_passwd=123456
#######################


######修改hosts文件######
cat << EOF >> /etc/hosts

192.168.137.11      mgr1
192.168.137.12      mgr2
192.168.137.13      mgr3

EOF
#######################

######mgr配置######
mysql_port=3306
primary_ip=192.168.137.11
secondary1_ip=192.168.137.12
secondary2_ip=192.168.137.13

primary_port=33061
secondary1_port=33062
secondary2_port=33063

local_ip=192.168.137.11
local_port=33061

###############################################
if [ "$1" = "repl" ]
then
while true
do
    read -t 30 -p "输入你的主库IP:  " master_ip
    read -t 30 -p "输入你的主库端口号:  " master_port
    if [[ -z $master_ip || -z $master_port ]]
    then
        continue
    else
        echo ""
        echo "主库IP是: $master_ip"
        echo "主库端口号是: $master_port"
        break 
    fi
done

/usr/local/mysql/bin/mysql -h127.0.0.1 -u'$dba_user' -p'$dba_passwd' -P"$master_port" --connect-expired-password -e "CHANGE MASTER TO MASTER_HOST='$master_ip',MASTER_USER='repl',MASTER_PASSWORD='sysrepl',MASTER_PORT=$master_port,MASTER_AUTO_POSITION = 1,MASTER_CONNECT_RETRY=10; START SLAVE;"

    echo "MySQL主从复制同步已经初始化完毕。"
    exit 0
fi

################################################
if [ "$1" = "mgr" ]
then

while true
do
    read -t 30 -p "是Primary吗?是请输入yes,否输入no:  " is_primary
    if [[ -z $is_primary ]]
    then
        continue
    else
        if [ $is_primary == "yes" ] || [ $is_primary == "no" ]
        then
            break 
        else
             echo "你输入一个错误的字符$is_primary,请重新输入..."
             continue
        fi
    fi
done

if [ $is_primary == "yes" ]
then
    /usr/local/mysql/bin/mysql -h127.0.0.1 -u"$dba_user" -p"$dba_passwd" -P"$mysql_port" --connect-expired-password -e "INSTALL PLUGIN group_replication SONAME  'group_replication.so'; set persist group_replication_group_name = '3b12b5bd-f0c6-11e9-9778-000c2900afc6';set persist group_replication_local_address =  '${local_ip}:${local_port}'; set persist group_replication_group_seeds = '${primary_ip}:${primary_port},${secondary1_ip}:${secondary1_port},${secondary2_ip}:${secondary2_port}';SET GLOBAL group_replication_bootstrap_group=ON; CHANGE MASTER TO MASTER_USER='$repl_user',MASTER_PASSWORD='$repl_passwd' FOR CHANNEL 'group_replication_recovery';START GROUP_REPLICATION;select sleep(5);select * from performance_schema.replication_group_members;SET GLOBAL group_replication_bootstrap_group=OFF;"

else
    /usr/local/mysql/bin/mysql -h127.0.0.1 -u"$dba_user" -p"$dba_passwd" -P"$mysql_port" --connect-expired-password -e "INSTALL PLUGIN group_replication SONAME  'group_replication.so'; set persist group_replication_group_name = '3b12b5bd-f0c6-11e9-9778-000c2900afc6';set persist group_replication_local_address =  '${local_ip}:${local_port}'; set persist group_replication_group_seeds = '${primary_ip}:${primary_port},${secondary1_ip}:${secondary1_port},${secondary2_ip}:${secondary2_port}'; SET GLOBAL group_replication_bootstrap_group=OFF; CHANGE MASTER TO MASTER_USER='$repl_user',MASTER_PASSWORD='$repl_passwd' FOR CHANNEL 'group_replication_recovery';START GROUP_REPLICATION;select sleep(5);select * from performance_schema.replication_group_members;"

fi
    
echo "MySQL Mgr组复制已经初始化完毕。"
exit 0

fi

################################################

ps aux | grep 'mysql' | grep -v 'grep' | grep -v 'bash'
if [ $? -eq 0 ]
then
    echo "MySQL进程已经启动,无需二次安装。"
    exit 0
fi

if [ ! -d /usr/local/${mysql8_version_dir} ]
then
        yum install xz -y
    tar -Jxvf ${mysql8_version} -C /usr/local/
    ln -s /usr/local/${mysql8_version_dir} /usr/local/mysql
    chown -R mysql.mysql /usr/local/mysql/
    chown -R mysql.mysql /usr/local/mysql
else
    ln -s /usr/local/${mysql8_version_dir} /usr/local/mysql
    chown -R mysql.mysql /usr/local/mysql/
    chown -R mysql.mysql /usr/local/mysql
fi 

while true
do
    read -t 30 -p "输入你的数据库名:  " dbname
    read -t 30 -p "输入你的数据库端口号:  " dbport
    read -t 30 -p "输入MySQL serverId:  " serverId
    read -t 30 -p "输入innodb_buffer_pool_size大小,单位G:  " innodb_bp_size
    if [[ -z $dbname || -z $dbport || -z $serverId || -z $innodb_bp_size ]]
    then
        continue
    else
        echo "数据库名字是: $dbname"
        echo "数据库端口是: $dbport"
        echo "MySQL serverId: $serverId"
        echo "BP大小是: $innodb_bp_size GB"
        break 
    fi
done

sed "s/test/$dbname/g;s/3306/$dbport/;s/413306/$serverId/;/innodb_buffer_pool_size/s/1/$innodb_bp_size/" my_test.cnf > /etc/my_$dbname.cnf

DATA_DIR=/data/mysql/$dbname
[ ! -d $DATA_DIR ] && mkdir -p $DATA_DIR/{data,binlog,relaylog,tmp,slowlog,log}; touch $DATA_DIR/log/error.log; chown -R mysql.mysql /data/mysql/


if [ `ls -A $DATA_DIR/data/ | wc -w` -eq 0 ]
then
    cd /usr/local/mysql
    echo ""
    echo "初始化MySQL数据目录......"
    echo ""
    bin/mysqld --defaults-file=/etc/my_$dbname.cnf --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/$dbname/data
    sleep 2
    bin/mysqld_safe --defaults-file=/etc/my_$dbname.cnf --user=mysql &
fi

while true
do
     netstat -ntlp | grep $dbport
     if [ $? -eq 1 ]
     then
        echo "MySQL启动中,稍等......"
        sleep 5
        continue
     else
        break
     fi
done

ps aux | grep 'mysql' | grep -v 'grep' | grep -v 'bash'
if [ $? -eq 0 ]
then
        echo "MySQL安装完毕。"
else
    echo "MySQL安装失败。"
fi

###更改root账号随机密码
random_passwd=`grep 'temporary password' $DATA_DIR/log/error.log | awk -F 'root@localhost: ' '{print $2}'`
/usr/local/mysql/bin/mysql -S /tmp/mysql_$dbname.sock -p"$random_passwd" --connect-expired-password -e "set sql_log_bin=0;alter user root@'localhost' identified by '$root_passwd';" 

echo "root账号随机密码更改完毕。"

###创建同步账号和管理员账号
/usr/local/mysql/bin/mysql -S /tmp/mysql_$dbname.sock --connect-expired-password -p"$root_passwd" -e "set sql_log_bin=0;create user '$repl_user'@'%' IDENTIFIED BY '$repl_passwd'; GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '$repl_user'@'%'; create user '$dba_user'@'%' IDENTIFIED BY '$dba_passwd'; GRANT ALL on *.* to '$dba_user'@'%' WITH GRANT OPTION;"

sed -i -r "s/(PATH=)/\1\/usr\/local\/mysql\/bin:/" /root/.bash_profile
source /root/.bash_profile

echo "MySQL账号初始化完毕。"

###安装clone插件
/usr/local/mysql/bin/mysql -S /tmp/mysql_$dbname.sock --connect-expired-password -p"$root_passwd" -e "set sql_log_bin=0;INSTALL PLUGIN CLONE SONAME 'mysql_clone.so'; CREATE USER '$clone_user'@'%' IDENTIFIED BY '$clone_passwd';GRANT BACKUP_ADMIN,CLONE_ADMIN ON *.* TO '$clone_user'@'%';"

echo ""
echo "clone克隆插件安装完毕。"

二. MySQL 备份

2.1 逻辑备份

逻辑备份所有库

#!/bin/bash
# -------------------------------------------------------------------------------
# FileName:    mysql_logical_backup.sh 
# Describe:    Used for database backup
# Version:    1.0
# Author:      只是甲
# Date:        2021/04/22


# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="abc123"
mysql_host="localhost"
mysql_port="3306"
backup_dir=/backup/mysqlbackup

dt=`date +'%Y%m%d_%H%M'`
echo "Backup Begin Date:" $(date +"%Y-%m-%d %H:%M:%S")

# 备份全部数据库
/u01/my3306/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -R -E --all-databases --single-transaction > $backup_dir/mysql_backup_$dt.sql

# 清理超过7天的备份
find $backup_dir -mtime +7 -type f -name '*.sql' -exec rm -rf {} \;
echo "Backup Succeed Date:" $(date +"%Y-%m-%d %H:%M:%S")

2.2 物理备份

通过xtrabackup全备mysql
参考: https://blog.csdn.net/db_murphy/article/details/96428613

#!/bin/bash
#######################################################
# $Name: mysql_physical_fullback.sh
# $Version: v1.0
# $Create Date: 2019-07-16
# $Description: MySQL full_backup all-databases
#######################################################
 
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
PATH=/usr/local/mysql/bin:$PATH:$HOME/bin
export PATH
 
###################   Declare environment variables  #########
record_log=/mysqldata/backup/
log_name=physical_fullback_record.log
 
backup_dir=/mysqldata/backup/back_images
metadata_dir=/mysqldata/backup/back_metadata
 
echo "--------------------Full Backup Starting------------------"  >> $record_log/$log_name
date >> $record_log/$log_name
 
mysqlbackup --user=root --password=XXXXXX --socket=/mysqldata/tmp/mysql.sock --host=localhost \
--backup-image=$backup_dir/physical_fullback_`date '+%m-%d-%Y'`.mbi \
--backup-dir=$metadata_dir/fullback_info_`date '+%m-%d-%Y'` backup-to-image
 
date >> $record_log/$log_name
echo "--------------------Full Backup Ended------------------"  >> $record_log/$log_name
 
##########  delete the physical_images and metadata_infor from 7 days ago  #############
 
images_dir=/mysqldata/backup/back_images
find $images_dir -type f -name "physical_fullback_*.mbi" -mtime +7 -exec rm -rf {} \;
 
metadata_dir=/mysqldata/backup/back_metadata
find $metadata_dir -type d -name "fullback_info_*" -mtime +7 -exec rm -rf {} \;

2.3 从MySQL逻辑备份中找到单表的备份

有时候我们需要从mysql的逻辑全备中,找到单表的备份

sed -n -e '/CREATE TABLE.*`my_table`/,/UNLOCK TABLES/p' mydump.sql >/tmp/my_table.sql

有点慢,9GB左右文件 5分钟左右,结果文件500M左右

需要特别注意,如果多个库都有表名,可能会有多个表的备份

grep 'CREATE TABLE' mydump.sql 

三. MySQL 监控

3.1 监控qps

参考: https://www.orczhou.com/index.php/2014/03/some-tricky-about-mysqladmin-extended-status/

mysqladmin -P3306 -uroot -p -h127.0.0.1 -r -i 1 ext |\
awk -F"|" \
"BEGIN{ count=0; }"\
'{ if($2 ~ /Variable_name/ && ((++count)%20 == 1)){\
    print "----------|---------|--- MySQL Command Status --|----- Innodb row operation ----|-- Buffer Pool Read --";\
    print "---Time---|---QPS---|select insert update delete|  read inserted updated deleted|   logical    physical";\
}\
else if ($2 ~ /Queries/){queries=$3;}\
else if ($2 ~ /Com_select /){com_select=$3;}\
else if ($2 ~ /Com_insert /){com_insert=$3;}\
else if ($2 ~ /Com_update /){com_update=$3;}\
else if ($2 ~ /Com_delete /){com_delete=$3;}\
else if ($2 ~ /Innodb_rows_read/){innodb_rows_read=$3;}\
else if ($2 ~ /Innodb_rows_deleted/){innodb_rows_deleted=$3;}\
else if ($2 ~ /Innodb_rows_inserted/){innodb_rows_inserted=$3;}\
else if ($2 ~ /Innodb_rows_updated/){innodb_rows_updated=$3;}\
else if ($2 ~ /Innodb_buffer_pool_read_requests/){innodb_lor=$3;}\
else if ($2 ~ /Innodb_buffer_pool_reads/){innodb_phr=$3;}\
else if ($2 ~ /Uptime / && count >= 2){\
  printf(" %s |%9d",strftime("%H:%M:%S"),queries);\
  printf("|%6d %6d %6d %6d",com_select,com_insert,com_update,com_delete);\
  printf("|%6d %8d %7d %7d",innodb_rows_read,innodb_rows_inserted,innodb_rows_updated,innodb_rows_deleted);\
  printf("|%10d %11d\n",innodb_lor,innodb_phr);\
}}'

测试记录:

[root@hp8 tmp]# mysqladmin -P3306 -uroot -p -h127.0.0.1 -r -i 1 ext |\
> awk -F"|" \
> "BEGIN{ count=0; }"\
> '{ if($2 ~ /Variable_name/ && ((++count)%20 == 1)){\
>     print "----------|---------|--- MySQL Command Status --|----- Innodb row operation ----|-- Buffer Pool Read --";\
>     print "---Time---|---QPS---|select insert update delete|  read inserted updated deleted|   logical    physical";\
> }\
> else if ($2 ~ /Queries/){queries=$3;}\
> else if ($2 ~ /Com_select /){com_select=$3;}\
> else if ($2 ~ /Com_insert /){com_insert=$3;}\
> else if ($2 ~ /Com_update /){com_update=$3;}\
> else if ($2 ~ /Com_delete /){com_delete=$3;}\
> else if ($2 ~ /Innodb_rows_read/){innodb_rows_read=$3;}\
> else if ($2 ~ /Innodb_rows_deleted/){innodb_rows_deleted=$3;}\
> else if ($2 ~ /Innodb_rows_inserted/){innodb_rows_inserted=$3;}\
> else if ($2 ~ /Innodb_rows_updated/){innodb_rows_updated=$3;}\
> else if ($2 ~ /Innodb_buffer_pool_read_requests/){innodb_lor=$3;}\
> else if ($2 ~ /Innodb_buffer_pool_reads/){innodb_phr=$3;}\
> else if ($2 ~ /Uptime / && count >= 2){\
>   printf(" %s |%9d",strftime("%H:%M:%S"),queries);\
>   printf("|%6d %6d %6d %6d",com_select,com_insert,com_update,com_delete);\
>   printf("|%6d %8d %7d %7d",innodb_rows_read,innodb_rows_inserted,innodb_rows_updated,innodb_rows_deleted);\
>   printf("|%10d %11d\n",innodb_lor,innodb_phr);\
> }}'
Enter password: 
----------|---------|--- MySQL Command Status --|----- Innodb row operation ----|-- Buffer Pool Read --
---Time---|---QPS---|select insert update delete|  read inserted updated deleted|   logical    physical
 10:37:35 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:36 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:38 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:38 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:39 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:40 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:42 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:42 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:43 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:44 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:46 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:46 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:47 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:49 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:50 |        1|     0      0      0      0|     0        0       0       0|         0           0
 10:37:50 |        1|     0      0      0      0|     0        0       0       0|         0           0
^C
[root@hp8 tmp]# 

3.2 监控连接数

参考: http://f.dataguru.cn/thread-353575-1-1.html

function usrinfo(){
    mysqladmin -uroot -pabc123 processlist 2>/dev/null | sed '1,3d' | sed '$d' | grep -v "system user" | awk -F"|" '{printf("%s %s %s\n",match($4,":")?substr($4,0,match($4,":")-1):$4, $3, index($5,"  ")?"mysql":$5)}' | sort | uniq -c | sort -n -k 1 -r | awk '{ printf("%s    %s      %s     %s       %s\n",strftime("%Y-%m-%d %H:%M:%S",systime()),$1,$2,$3,$4) }'

}

function headerinfo(){
    echo "      DateTime       Con(s)      Host       User       Database     " 
    echo "+++++++++++++++++++ |++++++| +++++++++++ | +++++++ | ++++++++++++++|"         
}


# ***********************************************
# Main 

INTERVAL=2

while [ 1 ]
do
    headerinfo
    usrinfo
    #echo "+++++++++++++++++++ |++++++| +++++++++++ | +++++++ | ++++++++++++++|"     
        sleep $INTERVAL
done

测试记录:

[root@hp7 tmp]# sh 1.sh 
      DateTime       Con(s)      Host       User       Database     
+++++++++++++++++++ |++++++| +++++++++++ | +++++++ | ++++++++++++++|
2022-03-24 16:59:30    1      localhost     root       mysql
      DateTime       Con(s)      Host       User       Database     
+++++++++++++++++++ |++++++| +++++++++++ | +++++++ | ++++++++++++++|
2022-03-24 16:59:32    1      localhost     root       mysql
      DateTime       Con(s)      Host       User       Database     
+++++++++++++++++++ |++++++| +++++++++++ | +++++++ | ++++++++++++++|
2022-03-24 16:59:34    1      localhost     root       mysql

四. 锁相关

4.1 查询阻塞

参考:http://f.dataguru.cn/thread-367134-1-1.html

mysql_lock.sql

SELECT
    NOW()                                               AS "采集时间", 
    b.trx_mysql_thread_id                               AS "阻塞源",
    SUBSTRING(p.HOST, 1, INSTR(p.HOST, ':') - 1)            AS "源主机",
    SUBSTRING(p.HOST, INSTR(p.HOST, ':') + 1)               AS "源端口",
    -- p.USER                                               AS "连接用户", 
    -- p.DB                                             AS "数据库",     
    IF(p.COMMAND='Sleep', p.TIME, 0)                        AS "空闲(秒)",
    r.trx_mysql_thread_id                               AS "被阻塞",
    TIMESTAMPDIFF(SECOND,r.trx_wait_started,CURRENT_TIMESTAMP)  AS "阻塞时长(秒)",
    l.lock_table                                        AS "锁表",     
    b.trx_query                                         AS "阻塞SQL",   
    r.trx_query                                         AS "请求SQL"
FROM information_schema.INNODB_LOCK_WAITS w 
     INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id 
     INNER JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id 
     INNER JOIN information_schema.INNODB_LOCKS l ON w.requested_lock_id = l.lock_id 
     LEFT  JOIN information_schema.PROCESSLIST p ON p.ID = b.trx_mysql_thread_id 
ORDER BY b.trx_mysql_thread_id, r.trx_wait_started ; 


SELECT  NOW()                                           AS "采集时间",
     tb.trx_mysql_thread_id                             AS "阻塞源",
     tb.trx_state                                       AS "源状态",
     TIMESTAMPDIFF(SECOND,tb.trx_started,CURRENT_TIMESTAMP)         AS "事务时长(秒)",
     CONCAT(lb.lock_type, ":" ,lb.lock_mode)                AS "锁信息",
     CONCAT(lb.lock_index, "@",lb.lock_table )              AS "锁对象",
     tr.trx_mysql_thread_id                             AS "请求者",
     tr.trx_state                                       AS "请求状态",
     TIMESTAMPDIFF(SECOND,tr.trx_wait_started,CURRENT_TIMESTAMP)    AS "阻塞时长(秒)",
     CONCAT(lr.lock_type, ":" ,lr.lock_mode)                AS "锁信息",
     CONCAT(lr.lock_index, "@",lr.lock_table )              AS "锁对象",
     tb.trx_query                                       AS "阻塞SQL",
     tr.trx_query                                       AS "请求SQL"
FROM information_schema.innodb_lock_waits t
     INNER JOIN information_schema.innodb_trx tb ON tb.trx_id=t.blocking_trx_id
     INNER JOIN information_schema.innodb_trx tr ON tr.trx_id=t.requesting_trx_id
     INNER JOIN information_schema.innodb_locks lb ON lb.lock_trx_id=tb.trx_id AND t.blocking_lock_id=lb.lock_id
     INNER JOIN information_schema.innodb_locks lr ON lr.lock_trx_id=tr.trx_id AND t.requested_lock_id=lr.lock_id    
ORDER BY tb.trx_mysql_thread_id, tr.trx_started;  

blocking_detect.sh

function usage(){
    cat <<-EOF
        Usage:
            `basename $0` ip:port 
    EOF
}

function load_default_settings(){
    MYSQL_HOST=127.0.0.1
    MYSQL_HOST=192.168.137.130
    MYSQL_PORT=3306
    MYSQL_USER=root
    MYSQL_PASSWD="zhudonhua"
    blocking_threshold=1
}

function parse_options(){
    [ $# -lt 1 ] && {
        action "[*ERROR*] You must specify one instance at least." /bin/false
        usage
        exit 1
    }

    ip1=`echo $1 | cut -d ":" -f 1`
    port1=`echo $1 | cut -d ":" -f 2`
    FORMAT_ERROR=0
    REGEX_IP="^(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])(\.(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])){3}$"
    [ `echo $ip1 | grep -E $REGEX_IP | wc -l` -eq 0 ] && FORMAT_ERROR=1
    [ `echo $port1 | grep -E '[^0-9]+' | wc -l` -eq 1 ] && FORMAT_ERROR=1
    [ "$FORMAT_ERROR" = "1" ] && {
        action "[*ERROR*] IP:Port should be numeric format." /bin/false
        exit 1
    }

    MYSQL_HOST=$ip1
    MYSQL_PORT=$port1
}

function blocking(){
    log=/opt/mysql/blocking_`date +"%F_%H-%M-%S"`.log
    tmpsql=/tmp/mysql_block_$RANDOM.sql 

    cat <<-EOF > ${tmpsql}
        SELECT  NOW()                                                       AS "采集时间",
            tb.trx_mysql_thread_id                                          AS "阻塞源",
            tb.trx_state                                                    AS "源状态",
            TIMESTAMPDIFF(SECOND,tb.trx_started,CURRENT_TIMESTAMP)          AS "事务时长(秒)",
            CONCAT(lb.lock_type, ":" ,lb.lock_mode)                         AS "锁信息",
            CONCAT(lb.lock_index, "@",lb.lock_table )                       AS "锁对象",
            tr.trx_mysql_thread_id                                          AS "请求者",
            tr.trx_state                                                    AS "请求状态",
            TIMESTAMPDIFF(SECOND,tr.trx_wait_started,CURRENT_TIMESTAMP)     AS "阻塞时长(秒)",
            CONCAT(lr.lock_type, ":" ,lr.lock_mode)                         AS "锁信息",
            CONCAT(lr.lock_index, "@",lr.lock_table )                       AS "锁对象",
            tb.trx_query                                                    AS "阻塞SQL",
            tr.trx_query                                                    AS "请求SQL"
        FROM information_schema.innodb_lock_waits t
            INNER JOIN information_schema.innodb_trx tb ON tb.trx_id=t.blocking_trx_id
            INNER JOIN information_schema.innodb_trx tr ON tr.trx_id=t.requesting_trx_id
            INNER JOIN information_schema.innodb_locks lb ON lb.lock_trx_id=tb.trx_id AND t.blocking_lock_id=lb.lock_id
            INNER JOIN information_schema.innodb_locks lr ON lr.lock_trx_id=tr.trx_id AND t.requested_lock_id=lr.lock_id    
        ORDER BY tb.trx_mysql_thread_id, tr.trx_started; 
    EOF

    mysql -u$MYSQL_USER -p$MYSQL_PASSWD -h$MYSQL_HOST -P$MYSQL_PORT -e"source ${tmpsql}" > ${log} 2>/dev/null   
    # cat ${log}  # used for debug
    [ `cat ${log} | wc -l` -ge ${blocking_threshold} ] && {
        # kill spid
        # cat ${log} | sed '1d' | awk '{print $3}' | uniq | awk '{printf("kill %s;\n",$1)}'
        cat ${log} | sed '1d' | awk '{print $3}' | uniq | awk '{printf("kill %s;\n",$1)}' | mysql -u$MYSQL_USER -p$MYSQL_PASSWD -h$MYSQL_HOST -P$MYSQL_PORT 
    } || {
        :
        [ -r $log ] && rm -rf $log
    }

    [ -r $tmpsql ] && rm -rf $tmpsql
} 

# **************************************
# Main
#
source /etc/init.d/functions
load_default_settings
parse_options $*
blocking

五.其它

5.1 查找正在使用的my.cnf

有时候我们不知道mysql服务器使用的是那个配置文件,可以使用如下方法:

代码:

strace -f mysql -h 127.0.0.1 --port=3306 |& grep my.cnf

测试记录:

[root@hp8 ~]# strace -f mysql -h 127.0.0.1 --port=3306 |& grep my.cnf
stat("/etc/my.cnf", {st_mode=S_IFREG|0644, st_size=1102, ...}) = 0
open("/etc/my.cnf", O_RDONLY)           = 3
stat("/etc/mysql/my.cnf", 0x7ffdee5829b0) = -1 ENOENT (没有那个文件或目录)
stat("/usr/etc/my.cnf", 0x7ffdee5829b0) = -1 ENOENT (没有那个文件或目录)
stat("/root/.my.cnf", 0x7ffdee5829b0)   = -1 ENOENT (没有那个文件或目录)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容