MySQL kill使用案例

MySQL数据库版本 8.0.17

前言

业务有需求,将一张大表 1000w+数据,需要从Oracle数据库全量同步到MySQL
前DBA用python写的脚本,每天全量同步一次,先delete再insert
现在表的空间已经差不多2G了,需要进行清理

一.查询表大小

select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from information_schema.TABLES where table_schema='load_data' and table_name='tab_test';

查看表大小

mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from information_schema.TABLES where table_schema='load_data' and table_name='tab_test';
+-----------+
| data      |
+-----------+
| 2050.02MB |
+-----------+
1 row in set (0.04 sec)

查看表有多少数据量

mysql> select count(*) from tab_test;
+----------+
| count(*) |
+----------+
|  5177608 |
+----------+
1 row in set (16.78 sec)

500多w数据,居然占了2G的空间

二.碎片整理

alter table tab_test engine=innodb;

居然遇到表锁的问题了

-- 超过2个小时都没有响应
mysql> alter table tab_test engine=innodb;

-- 查看进程
mysql> show processlist; 
+--------+-----------------+----------------------+-----------+---------+-------+---------------------------------+------------------------------------------------------------------------------------------------------+
| Id     | User            | Host                 | db        | Command | Time  | State                           | Info                                                                                                 |
+--------+-----------------+----------------------+-----------+---------+-------+---------------------------------+------------------------------------------------------------------------------------------------------+
|      4 | event_scheduler | localhost            | NULL      | Daemon  |  5327 | Waiting for next activation     | NULL                                                                                                 |
| 174386 | recording_user  | 101.132.78.154:51368 | load_data | Query   | 55669 | executing                       | select count(*) from tab_test                                                     |
| 177066 | recording_user  | 101.132.78.154:37752 | load_data | Query   | 47438 | Waiting for table metadata lock | alter table tab_test engine=innodb                                                |
| 177364 | recording_user  | 101.132.78.154:41700 | load_data | Query   |  7310 | Waiting for table metadata lock | DELETE FROM load_data.tab_test                                                    |
| 177391 | recording_user  | 218.17.184.91:2686   | load_data | Query   |  1682 | Waiting for table metadata lock | SELECT * FROM `load_data`.`tab_test` LIMIT 0, 1000                                |
| 177411 | root            | 39.108.126.72:58836  | mysql     | Query   |  1121 | Waiting for table metadata lock | select 
I.dt as 日期,
II.HRCODE AS 员工工号,
II.NAME AS 姓名,
I.content_cnt AS 催记量,
II            |
| 177442 | recording_user  | 218.17.184.91:3793   | load_data | Query   |   774 | Waiting for table metadata lock | SELECT * FROM `load_data`.`tab_test` LIMIT 0, 1000                                |
| 177444 | recording_user  | 218.17.184.91:3794   | load_data | Sleep   |   778 |                                 | NULL                                                                                                 |
| 177467 | recording_user  | 101.132.78.154:46796 | NULL      | Sleep   |   602 |                                 | NULL                                                                                                 |
| 177490 | root            | localhost            | load_data | Query   |   383 | Waiting for table metadata lock | select count(*) from tab_test                                                     |
| 177538 | root            | localhost            | load_data | Query   |    56 | Waiting for table metadata lock | select * from tab_test limit 10                                                   |
| 177546 | root            | localhost            | NULL      | Query   |     0 | starting                        | show processlist                                                                                     |
+--------+-----------------+----------------------+-----------+---------+-------+---------------------------------+------------------------------------------------------------------------------------------------------+
12 rows in set (0.00 sec)
mysql> kill 4;
ERROR 1094 (HY000): Unknown thread id: 4
mysql> 
mysql> kill 174386;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 177066;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 177364;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 177391;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 177442;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 177444;
Query OK, 0 rows affected (0.04 sec)

mysql> kill 177467;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 177490;
Query OK, 0 rows affected (0.00 sec)

mysql> kill 177538;
Query OK, 0 rows affected (0.04 sec)

mysql> 
mysql> 
mysql> show processlist;
+--------+-----------------+----------------------+-----------+---------+-------+-----------------------------+------------------------------------------------------------------------------------------------------+
| Id     | User            | Host                 | db        | Command | Time  | State                       | Info                                                                                                 |
+--------+-----------------+----------------------+-----------+---------+-------+-----------------------------+------------------------------------------------------------------------------------------------------+
|      4 | event_scheduler | localhost            | NULL      | Daemon  |  5529 | Waiting for next activation | NULL                                                                                                 |
| 174386 | recording_user  | 101.132.78.154:51368 | load_data | Killed  | 55871 | executing                   | select count(*) from tab_test                                                     |
| 177411 | root            | 39.108.126.72:58836  | mysql     | Query   |  1323 | executing                   | select 
I.dt as 日期,
II.HRCODE AS 员工工号,
II.NAME AS 姓名,
I.content_cnt AS 催记量,
II            |
| 177546 | root            | localhost            | NULL      | Query   |     0 | starting                    | show processlist                                                                                     |
| 177571 | recording_user  | 218.17.184.91:4505   | load_data | Sleep   |    60 |                             | NULL                                                                                                 |
| 177572 | recording_user  | 218.17.184.91:4523   | load_data | Sleep   |    61 |                             | NULL                                                                                                 |
| 177575 | root            | localhost            | load_data | Sleep   |    53 |                             | NULL                                                                                                 |
+--------+-----------------+----------------------+-----------+---------+-------+-----------------------------+------------------------------------------------------------------------------------------------------+
7 rows in set (0.01 sec)

居然有一个进程被描述为killed 此时重新执行依旧卡住,显示在等元数据锁

mysql> SELECT * FROM information_schema.INNODB_TRX\G
*************************** 1. row ***************************
                    trx_id: 421158938794160
                 trx_state: RUNNING
               trx_started: 2020-08-19 09:30:23
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 0
       trx_mysql_thread_id: 177411
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 0
          trx_lock_structs: 0
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 0
         trx_rows_modified: 0
   trx_concurrency_tickets: 0
       trx_isolation_level: REPEATABLE READ
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
*************************** 2. row ***************************
                    trx_id: 421158938789840
                 trx_state: RUNNING
               trx_started: 2020-08-18 18:00:58
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 0
       trx_mysql_thread_id: 174386
                 trx_query: select count(*) from tab_test
       trx_operation_state: counting records
         trx_tables_in_use: 1
         trx_tables_locked: 0
          trx_lock_structs: 0
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 0
         trx_rows_modified: 0
   trx_concurrency_tickets: 0
       trx_isolation_level: REPEATABLE READ
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 1
trx_autocommit_non_locking: 1
2 rows in set (0.00 sec)
-- 也可以这样拼接select 语句
mysql> select concat('KILL ',id,';') from information_schema.processlist where user='recording_user' and db = 'load_data';
+------------------------+
| concat('KILL ',id,';') |
+------------------------+
| KILL 174386;           |
| KILL 177571;           |
| KILL 177572;           |
+------------------------+
3 rows in set (0.02 sec)

找了一圈也没有找到回滚的,只能申请晚上重启mysql实例了

难道mysql 8.0版本修复了这个问题,delete+insert的居然没用

mysql> alter table tab_test engine innodb;
Query OK, 0 rows affected (1 min 36.81 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from information_schema.TABLES where table_schema='load_data' and table_name='tab_test';
+-----------+
| data      |
+-----------+
| 2204.02MB |
+-----------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.17    |
+-----------+
1 row in set (0.00 sec)

参考文献:

1.https://blog.csdn.net/m0_37827567/article/details/82979767?utm_source=blogxgwz5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值