2016-12-09 38 views
3

我不是很大的表挂在ALTER命令上。会是什么呢?MySQL挂在ALTER TABLE上

只有150k行,42个字段共142 MByte。 InnoDB存储引擎和服务器版本:5.5.44-MariaDB MariaDB服务器。 1字段'slotindex'是主键:bigint(20)和BTREE类型。

的命令:

MariaDB [mydb]> ALTER TABLE `runs` CHANGE `p_w_trans_x` `p_w_tran_x` FLOAT NOT NULL; 
    Stage: 1 of 2 'copy to tmp table' 65.7% of stage done 
    Stage: 2 of 2 'Enabling keys'  0% of stage done 

将完全在这一阶段永远挂2.

ProcessList中然后如下:

MariaDB [(none)]> show full processlist; 
+--------+------+-----------------+-----------+---------+-------+---------------------------------+---------------------------------------------------------------------+----------+ 
| Id  | User | Host   | db  | Command | Time | State       | Info                | Progress | 
+--------+------+-----------------+-----------+---------+-------+---------------------------------+---------------------------------------------------------------------+----------+ 
| 274226 | root | localhost:45423 | edc_proxy | Sleep | 16043 |         | NULL                | 0.000 | 
| 274319 | root | localhost  | myDB  | Query | 99 | Waiting for table metadata lock | ALTER TABLE `runs` CHANGE `p_w_trans_x` `p_w_tran_x` FLOAT NOT NULL | 0.000 | 
| 274416 | root | localhost  | NULL  | Query |  0 | NULL       | show full processlist            | 0.000 | 
+--------+------+-----------------+-----------+---------+-------+---------------------------------+---------------------------------------------------------------------+----------+ 

answer表明检查INFORMATION_SCHEMA表,而不是那里:

MariaDB [INFORMATION_SCHEMA]> SELECT * FROM INNODB_LOCK_WAITS; 
Empty set (0.00 sec) 

MariaDB [INFORMATION_SCHEMA]> SELECT * FROM INNODB_LOCKS ; 
Empty set (0.00 sec) 

MariaDB [INFORMATION_SCHEMA]> SELECT * FROM INNODB_TRX; 
+----------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+ 
| trx_id | trx_state | trx_started   | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | 
+----------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+ 
| 83A8B36E | RUNNING | 2016-12-08 11:13:02 | NULL     | NULL    |   0 |    274226 | NULL  | NULL    |     0 |     0 |    0 |     376 |    0 |     0 |      0 | REPEATABLE READ  |     1 |      1 | NULL      |       0 |      10000 | 
+----------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+ 
1 row in set (0.00 sec) 

而且从show engine innodb status;上交易的部分:

------------ 
TRANSACTIONS 
------------ 
Trx id counter 83A8F071 
Purge done for trx's n:o < 83A8CA86 undo n:o < 0 
History list length 1490 
LIST OF TRANSACTIONS FOR EACH SESSION: 
---TRANSACTION 0, not started 
MySQL thread id 274543, OS thread handle 0x7fbb863e6700, query id 85356480 localhost root 
show engine innodb status 
---TRANSACTION 83A8EB07, not started 
mysql tables in use 1, locked 2 
MySQL thread id 274542, OS thread handle 0x7fbb843f6700, query id 85354935 localhost root Waiting for table metadata lock 
ALTER TABLE `runs` CHANGE `p_w_trans_x` `p_w_tran_x` FLOAT NOT NULL 
---TRANSACTION 83A8B36E, ACTIVE 24627 sec 
MySQL thread id 274226, OS thread handle 0x7fbb845f5700, query id 85337236 localhost 127.0.0.1 root 
Trx read view will not see trx with id >= 83A8B36F, sees < 83A8B36D 
---------------------------- 
END OF INNODB MONITOR OUTPUT 
============================ 

任何指针作进一步调查,规避问题和解决的感谢!

+0

请参阅http://stackoverflow.com/a/13155778/166339 – Asaph

+0

我对MariaDB并不积极,但我知道当您执行大部分'ALTER'时,MySQL必须重新创建整个表;索引无关紧要。如果其他人正在访问该表,或者在其上持有锁,例如未提交的事务,则上面链接的Asaph应该可以帮助您找到它。 – Uueerdo

+0

@Asaph @Uueerdo感谢您的评论,我编辑了这个问题以包含这些建议。没有其他进程正在运行或锁定表,“显示进程列表;'也反映了这一点,或者它们可能被隐藏在别的地方? – Bastiaan

回答

0

元数据锁是一种隐式(从用户角度来看)锁,它可以防止DDL对该表造成影响,因为其他情况下需要该表保留其当前形式。在这种情况下,这是一个已经运行的事务。

任务1:您的ALTER如果你杀死线程274226.

mysql> KILL 274226; 

问题的连接在这里,通过information_schema.innodb_trx指示,一定会成功的,这个线程已经离开事务中运行几个小时我们可以推断该表已被该事务引用。在没有交易者仍然拥有MVCC视图或任何涉及该表的锁之前,表不能被修改。这项交易持有一个观点,我们可以再次推断可能影响此表,如在最后一行:

--TRANSACTION 83A8B36E, ACTIVE 24627 sec 
MySQL thread id 274226, OS thread handle 0x7fbb845f5700, query id 85337236 localhost 127.0.0.1 root 
Trx read view will not see trx with id >= 83A8B36F, sees < 83A8B36D 

注意Sleep是不是一个真正的命令,在这种情况下,它只是占位状态用于任何空闲连接。所有连接都在做某些事情,在这种情况下,“某事”正在休眠 - 换句话说,空闲并等待另一个查询。但是空闲连接仍然是一个连接,如果你的代码(或查询浏览器工具)让事务继续运行,它只会继续运行。

任务2:找出遗漏该事务运行的错误或错误。在实时应用程序中,让事务运行可能会造成更大的混乱。