MySQL线程处于Waiting for table flush的剖析

电商三创赛,全称全国大学生电子商务“创新、创意与创业”挑战赛,是出于教育部高等学校电子商务专业教学指导委员会,面向全国高校设立的大学生竞赛项目。

 

图片 1

不久前逢一个案例,很多询问被打断没有回去结果,使用show
processlist查看,发现多MySQL线程处于Waiting for table
flush状态,查询语句一直让卡住,只能通过Kill进程来缓解。那么我们事先来探望Waiting
for table
flush的合法解释:https://dev.mysql.com/doc/refman/5.6/en/general-thread-states.html

电商三创赛适合对商贸感兴趣之同班。一方面检验而的买卖文化,另一方面考验你的概括力量。尽管尚无实战可比,但针对了解创业、理解电商以有助益。

 

我由大一参加创业比赛暨大三,参加了少顶电商三创赛,从校赛三等奖及国赛一等奖。在经验两届竞赛后,我自从什么抉择项目、如何组装集团、如何准备比赛三单问题出发,分享给您更。

Waiting
for table flush

① 如何抉择种类?

一个到庭电商三创赛的档次,想要获奖,必然要抱大赛要求。电商三创赛,所谓“三开立”就是“创新、创意和创业”,符合“创新”、“创意”或“创业”的门类就是是一个足获奖的好路。

去年曾取得电商三开立赛特等奖励第一的大川乒乓,就是一个来创新、有创意、并且以创业的类。

图片 2

乒乓球是传统的球体育项目,但是加上互联网,做乒乓球爱好者的社区,这就是是创新;加上乒乓球教程视频,这即是发出新意;加上销售乒乓球周边,实在实在做起来,这便是创业。

理所当然如此一个门类尚未三言两语能说清,但通过此事例,你可了解什么的种才是足以拿奖的好项目。选择一个色屡次可操纵你走多远。

品类要负有可行性、有创新性、有前途。或你能够找到好项目,但是做不交也是白费。所以种而发生倾向,就是公如力所能及好,至少是理论及而能够形成。

路而起更新,没有创新性的想法非常为难获评委的确认,也不顶符合比赛评选标准。

最后你的档次必须要产生前途,哪怕很管用、非常创新,但不管前景还是钱景都焦虑的话,那这路也颇担忧。

实则,在本群众创新、万众创业的背景下,既实惠又生前景的花色,已经不乏人开。

为此,重点是若更新,尽管电商三创赛今年曾经是第七届,但往之参赛作品还放开现在,已经好为难语得达更新了。

那,我们如何找到创新的品类?

当您于物色创新路时,要铭记在心,不要尝试颠覆式创新,要举行微创新

自然,如果你就是要转世界,要做颠覆式创新,但就不抱比赛。所谓微创新,是您于现有的创业项目基础及,发现好改进之地方,进行翻新。

体贴入微36氪、创业邦、i黑马、IT桔子等传媒,通过她们去了解中国创业者在举行什么类型,中国投资人在投资什么项目。毫无疑问,这些品种在有人做,这说明项目是立竿见影的、有前景的。

图片 3

这些品种不容许还是宏观的,必然是有问题的,是发改善余地的,换句话说,是可由此创新变得更好之类型。而而若开的,就是找到这些适用你去开的花色,分析他们现存在的题材,提出你的创新解决方案

然你不怕获了一个得以据此来出席比赛之创新创业项目。

 

② 如何组装集团?

起矣路,你尽管好征兵买马大干一摆了。单枪匹马,是未抱到电商三创赛的,更非称去创业之。俗话说,一个烈士三独援,那么到电商三创赛,一个伙里待什么人呢?

起参赛要求上来说,一个团伙最为多5个人口,要来一致人数耶队长,以及指导老师。团队中首吗首要的凡队长,除了当把组织凝聚到一道,把项目谋划写好吧是责无旁贷。

图片 4

团其他人从分工来说,要有一个授课,负责教项目;要来一个技能,负责将种所关联到技术问题,能够说明明;要发生一个财务,负责写财务报表,把财务问题说理解。

团受到无应该有不负责任何事情的成员,这好影响团队团结同积极向上。每个人一旦出好明确的独立的当部分,不能够相互重叠,也无克留下有无人当部分。另外,在办好自身工作他乎要打听其他人负责之情节。

乃是队长,那么什么样错过摸索队友也?

首先根据专业,从连锁专业找到志趣相投的同学。比如财务,专门去财务管理专业找同学。

仲根据兴趣,对斯参赛项目只要有趣味之同室。那么对之类别如出一个充分的牵线,从君的意中人围,或者发表二度人脉的优势,从朋友之恋人去寻找,或者为教师引荐。

其三基于能力,你找到的队友只要有相互匹配的能力。这个或许是死挫伤感情的求,但是若您是将奖励要非是组队打,那么不论是他标准如何对口,他本着是项目如何感谢兴趣,能力不够充分遗憾。

图片 5

最终是教员,一般是校分配,但管企业导师要学校教员,能够面对面交流之时机还不多。

于是面对面交流前要开足准备,在没有道面对面时,比方学会通过邮件交流,QQ、微信可为此来讨论,但关系项目策划修改等问题,用邮件又有益联系,降低沟通成本。

The
thread is executing FLUSH TABLES and is
waiting for all threads to close their tables, or the thread got a
notification that the underlying structure for a table has changed and
it needs to reopen the table to get the new structure. However, to
reopen the table, it must wait until all other threads have closed the
table in question.

③ 如何准备比赛?

预备比赛,需要来三只面的备,一凡种谋划书,二是路幻灯片,三凡是出台答辩。比赛答辩是项目陈诉同评委提问,这非常重大,但首先来没起描绘好路策划,才是你能否进入比答辩环节的必要条件。

色策划书怎么起来勾画?

列策划书要依照比要求的格式来描写,可以参照网上的档次策划书模板。但是倘若记住,没有错别字,以及本论文般严格的排版格式,是太中心的渴求

种谋划书而写多少吧?

列谋划有微微写多少,不要也充字数而写废话,但为毫不写得过分少。登省赛之后便无见了项目谋划书低于30页的,国赛只多不少。

君说写那基本上,评委会看了也?

明确地游说,不见面扣押了。评委不是您的指导老师,他们要评的免单单是若一个军,所以全无会见来工夫看罢。那为什么而描绘那基本上?因为公写得极度少,人家看都未看

色策划书里要生充分说明还不够,要起多少图,有示意图,有流程图,有结构图。评委在短暂时间外,是看不结而几十居多页的项目谋划的,如何强化印象、提升好感呢?

平等图胜千开腔

除此以外待小心的是,品种谋划不要写得极度过头口语化。电商三创赛的型,从饮食及互联网产品,从农产品及智能硬件,虽然评委特别规范,但也未见得能够了解整个的创业里领域。

这就是说她们见面怎么去打听你的项目也?

而外商业理论知识以及更,就是看君色谋划书的叙述是否规范,充满口水话的种谋划书不见面让
人觉得这事靠谱。

形容好了档次策划书,是免是不怕可以开幻灯片了吗?

优先变更着急,好好再把您的类型谋划看看,吃透理解通彻,寻找个团之外的、可信赖的同室,把项目与外说亮。如果他能懂,·说明你和评委讲解,也非会见现出极端特别错误。接下来就是管你往外诉说项目以来,写成讲稿。

图片 6

讲稿是必须使有的,也得要记得下马的,但永不死记硬背,记住框架、逻辑、重点语句和定义即可。如果死记讲稿,在比进程遭到,出现有句子记不住,就特别容易卡顿、紧张,影响比。所以讲稿记住要,其他随意应变。

讲稿苟来逻辑,要崛起优点、重点、亮点和特点。讲稿里要无苟介绍项目之瑕疵、风险以及你们的缓解方案、应针对方案吧?

决不,你都说得了了,让裁判问什么吗?这些东西而而出备,但倘若等裁判问下,如果未问以什么而提呢。

讲稿开头可以据此一个粗故事,或者说一个评委熟悉的场景、可能会见碰到的问题,吸引评委。其一故事、场景或者问题正是你们项目只要缓解之。

这么可以唤起评委的共鸣,引出你们的成品,引导评委的笔触,让人口发:噢,原来解决这样一个题目。

比如,我们获奖项目共享车位,在陈的发端就是深受评委讲述了一个停车难之题材。引出其中一个原因,是资源相当不充分,而我们的成品可以化解这题目。

那讲稿写好了,按照讲稿的逻辑,开始做幻灯片吧。演示幻灯片一般用微软的PPT,我们立刻参加国赛用的是PPT2013本子,但无自然是,所以准备好于各种版本及,包括WPS上之通畅运行。

咱们参赛的PPT,是自家负责的,做得还算好。PPT做不好,可以设想去选购模板,但模板并不一定好用。

重复好用都方便的主意是,花钱定制PPT。在淘宝上10第一一页幻灯片起步,这里推荐演界网、瑞普PPT论坛等网站的模版、定制服务。

图片 7

PPT多用图形,正确采取动画片效果演示,但为绝不为动画片而做动画。PPT颜色跟着LOGO颜色走,一般不超越三种颜色。哎?没有LOGO,要么自己做,要么花钱定做一个,总之一定要是生。

出场讲解项目,要拓展反复排练,来必不可少录下你们陈诉答辩的视频,有题目如果改变,没有问题状态异常好,也如切记那个是的状态,争取比赛时抢进入状态。

只有最后一会交锋,否则排练一直还是发出必不可少之。即便有一个主讲人,也要有另外可以顶上的队友,以防万一。

This
notification takes place if another thread has used FLUSH
TABLES or one of the following statements on the table in
question: FLUSH TABLES tbl_name, ALTER TABLE, RENAME
TABLE, REPAIR TABLE, ANALYZE
TABLE, or OPTIMIZE
TABLE.

④ 从校赛到国赛

万事就不寒而栗认真二配,参加电商三开立赛远没有你想像着艰难。选好项目,组好团队,备好比赛,那么你打校赛脱颖而出的几乎引领就坏死了。

只是若想做的重好,更进一步入省赛、挺进全国总决赛,那么还有几个援助您增强优势的提议:

采取大背书。无论工作合同,还是专利证书,凡是可以边证明你开项目靠谱的证明都好来得。

差不多用数据云。任市场调查,还是销售数目,凡是足以为此数据形容你的色之数码而还好显示。

播音演示视频。不论产品认证,还是用户采访,凡是足以共适用视频播放的地方都可以播放出来。

来得产品实物。管实体产品,还是产品大,凡是可以印证您的种之东西而还可以带来齐出示。

 

以上,是自己与两到电商三创赛,从校赛三等奖及国赛一等奖,分享给您的经历。这些经历可以通用到其它商业创业类比赛,比如创青春、互联网+大赛等。

理所当然,比赛的涉请不要套用在实践创业上。

尽管就比赛以过奖,但离真正创业,就如西天取经,十万八千里,不过正将了个合格文牒。

由此几浅参赛,也了解很多创业知识,这为不一定无就此处。何况,通过竞赛为认识多冤家,有矣部分闯与经验,能够更这些再享受给您,这并或得到广大。

君也可留言告知我,你想掌握的。

期您能闹获取。

 

那么我们接下去模拟一下线程处于Waiting
for table flush状态的状,如所示:

 

当第一只会话连接(connection
id=13)中,我们利用lock table 锁定表test。 

 

mysql> use MyDB;

Database changed

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|              13 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> lock table test read;

Query OK, 0 rows affected (0.00 sec)

 

mysql> 

 

 

 

当次只会话连接(connection
id=17)中,我们执行flush table 或 flush table test
皆可。此时公见面发觉flush table处于阻塞状态。

 

mysql> use MyDB;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|              17 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> flush table test;

 

 

图片 8

 

 

当第三独会话/连接着,当您切换到MyDB时,就见面唤起“You
can turn off this feature to get a quicker startup with -A”
,此时处在阻塞状态。此时您离会话,使用参数-A登录数据库后,你只要查询test表,就见面处于阻塞状态(当查询任何表不见面让堵塞)。如下所示:

 

mysql>
use MyDB;

Reading
table information for completion of table and column names

You
can turn off this feature to get a quicker startup with -A

 

 

mysql>
use MyDB;

Database
changed

mysql>
select * from test;

 

图片 9

 

 

当第四只会话/连接,我们所以show
processlist查看到眼前数据库有连接线程状态,你晤面视17、18且处Waiting
for table flush的状态。如下截图所示:

 

mysql> show processlist;

+----+------+-----------+------+---------+------+-------------------------+--------------------+

| Id | User | Host      | db   | Command | Time | State                   | Info               |

+----+------+-----------+------+---------+------+-------------------------+--------------------+

| 13 | root | localhost | MyDB | Sleep   |   90 |                         | NULL               |

| 14 | root | localhost | NULL | Query   |    0 | init                    | show processlist   |

| 17 | root | localhost | MyDB | Query   |   52 | Waiting for table flush | flush table test   |

| 18 | root | localhost | MyDB | Query   |    9 | Waiting for table flush | select * from test |

+----+------+-----------+------+---------+------+-------------------------+--------------------+

4 rows in set (0.00 sec)

 

mysql> 

 

图片 10

 

mysql> show processlist;

+----+------+-----------+------+---------+------+-------------------------+--------------------+

| Id | User | Host      | db   | Command | Time | State                   | Info               |

+----+------+-----------+------+---------+------+-------------------------+--------------------+

| 13 | root | localhost | MyDB | Sleep   |   90 |                         | NULL               |

| 14 | root | localhost | NULL | Query   |    0 | init                    | show processlist   |

| 17 | root | localhost | MyDB | Query   |   52 | Waiting for table flush | flush table test   |

| 18 | root | localhost | MyDB | Query   |    9 | Waiting for table flush | select * from test |

+----+------+-----------+------+---------+------+-------------------------+--------------------+

4 rows in set (0.00 sec)

 

mysql> 

mysql> 

mysql> 

mysql> 

mysql> show open tables where in_use >=1;

+----------+-------+--------+-------------+

| Database | Table | In_use | Name_locked |

+----------+-------+--------+-------------+

| MyDB     | test  |      1 |           0 |

+----------+-------+--------+-------------+

1 row in set (0.00 sec)

 

mysql> kill 17;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show processlist;

+----+------+-----------+------+---------+------+-------------------------+--------------------+

| Id | User | Host      | db   | Command | Time | State                   | Info               |

+----+------+-----------+------+---------+------+-------------------------+--------------------+

| 13 | root | localhost | MyDB | Sleep   |  442 |                         | NULL               |

| 14 | root | localhost | NULL | Query   |    0 | init                    | show processlist   |

| 18 | root | localhost | MyDB | Query   |  361 | Waiting for table flush | select * from test |

+----+------+-----------+------+---------+------+-------------------------+--------------------+

3 rows in set (0.00 sec)

 

mysql> kill 13;

Query OK, 0 rows affected (0.00 sec)

 

mysql> show processlist;

+----+------+-----------+------+---------+------+-------+------------------+

| Id | User | Host      | db   | Command | Time | State | Info             |

+----+------+-----------+------+---------+------+-------+------------------+

| 14 | root | localhost | NULL | Query   |    0 | init  | show processlist |

| 18 | root | localhost | MyDB | Sleep   |  427 |       | NULL             |

+----+------+-----------+------+---------+------+-------+------------------+

2 rows in set (0.00 sec)

 

mysql> 

 

|
图片 11

 

顾:我们用Kill线程13,
Kill掉线程17是解决不了问题之。

 

 

 

生条件中,很多时候恐怕无是lock
table read引起的隔阂,而是由迟迟查询,导致flush
table一直无法关闭该表而直接处于等候状态,例如下面测试案例被,我动用同一张大表做笛卡尔积模拟一个缓查询,其它操作相同,如下所示,你晤面相同一产生了Waiting
for table flush

 

mysql>
SELECT T.* FROM TEST1 T, TEST1 L;

 

图片 12

 

 

此外,网上有只案例,mysqldump备份时,如果没运用参数—single-transaction
或是因为同时使了flush-logs与—single-transaction两只参数为可能勾这么的待场景,这个简单个参数放在同,会以开dump数据之前先实行一个FLUSH
TABLES操作。

 

 

 

釜底抽薪方案:

** 

 

起Waiting
for table flush时,我们一般需找到那些表被lock住或那些慢查询导致flush
table一直以等候而望洋兴叹关闭该表。然后Kill掉对应之线程即可,但是怎么精准定位是一个挑战,尤其是养条件,你采取show
processlist会看到大量底线程。让你乱的,怎么一转眼定位问题呢?

 

于迟迟查询引起的旁线程处于Waiting
for table flush状态的情:

 

好查show
processlist中Time值很挺的线程。然后甄别确认后Kill掉,如达到截图所示,会话连接14即是引起短路的源头SQL。有种植规律就是是是线程的Time列值必定比给打断的线程要高。这个就算能够过滤很多笔录。

 

于lock
table read引起的其他线程处于Waiting for table flush状态的情况:

 

对于实验中采用lock
table read这种情形,这种对话或处于Sleep状态,而且其也未会见起于show
engine innodb status \G命令的输出信息遭。 即使show open tables where
in_use
>=1;能找到是那么张表被lock住了,但是力不从心稳定到具体的线程(连接),其实这个是一个嫌的题目。但是inntop这款利器就可稳定及,如下所示,线程17沿住了表test,在innotop里面纵使可知稳定及是线程17。所谓工欲善其事必先利其器!

 

图片 13

 

图片 14

 

 

 

另外,在官文档中ALTER
TABLE, RENAME
TABLE, REPAIR
TABLE, ANALYZE
TABLE, or OPTIMIZE
TABLE都能逗这类等,下面为举行了有的简约测试,如下所示:

 

 

 

Waiting
for table flush的另外一个光景

 

对话连接(connection
id=18)执行下SQL语句,模拟一个放缓查询SQL

 

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|              18 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> select name, sleep(64) from test;

 

对话连接(connection
id=6)执行下SQL语句,分析表test

 

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|               6 |

+-----------------+

1 row in set (0.00 sec)

mysql> analyze table test;

+-----------+---------+----------+----------+

| Table     | Op      | Msg_type | Msg_text |

+-----------+---------+----------+----------+

| MyDB.test | analyze | status   | OK       |

+-----------+---------+----------+----------+

1 row in set (0.04 sec)

 

mysql> 

 

对话连接(connection
id=8)执行下SQL语句

 

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|               8 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> select * from test;

 

翻线程的状态,你晤面发现为封堵的对话处于
Waiting for table flush状态。 因为当对发明开了ANALYZE
TABLE后,后台针对该表的询问需要拭目以待,因为MySQL已经检测到该表内部变化,需要利用FLUSH
TABLE关闭然后还打开该表,所以当你询问该表时,就会处在 Waiting for
table flush

 

mysql> show processlist;

+----+------+-----------+------+---------+------+-------------------------+----------------------------------+

| Id | User | Host      | db   | Command | Time | State                   | Info                             |

+----+------+-----------+------+---------+------+-------------------------+----------------------------------+

|  6 | root | localhost | MyDB | Sleep   |   22 |                         | NULL                             |

|  8 | root | localhost | MyDB | Query   |   14 | Waiting for table flush | select * from test               |

| 15 | root | localhost | NULL | Sleep   |    3 |                         | NULL                             |

| 16 | root | localhost | NULL | Query   |    0 | init                    | show processlist                 |

| 18 | root | localhost | MyDB | Query   |   46 | User sleep              | select name, sleep(64) from test |

+----+------+-----------+------+---------+------+-------------------------+----------------------------------+

5 rows in set (0.00 sec)

 

mysql> 

 

图片 15

 

 

 

Waiting
for table metadata lock

 

 

对话连接(connection
id=17)执行下SQL语句,模拟一个迟迟查询SQL

 

 

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|              17 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> select name, sleep(100) from test;

 

 

对话连接(connection
id=6)执行下SQL语句, 修改表结构操作

 

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|               6 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> alter table test add tname varchar(10); // rename table test to kkk 同样会引起Waiting for table metadata lock

 

 

对话连接(connection
id=8)执行下SQL语句,查询表test

 

mysql> select connection_id();

+-----------------+

| connection_id() |

+-----------------+

|               8 |

+-----------------+

1 row in set (0.00 sec)

 

mysql> select * from test;

 

 

查看线程的状态,你会意识给堵塞的对话处于
Waiting for table metadata lock状态。

 

 

mysql> show processlist;

+----+------+-----------+------+---------+------+---------------------------------+----------------------------------------+

| Id | User | Host      | db   | Command | Time | State                           | Info                                   |

+----+------+-----------+------+---------+------+---------------------------------+----------------------------------------+

|  6 | root | localhost | MyDB | Query   |   19 | Waiting for table metadata lock | alter table test add tname varchar(10) |

|  8 | root | localhost | MyDB | Query   |    6 | Waiting for table metadata lock | select * from test                     |

| 15 | root | localhost | NULL | Sleep   |    8 |                                 | NULL                                   |

| 16 | root | localhost | NULL | Query   |    0 | init                            | show processlist                       |

| 17 | root | localhost | MyDB | Query   |   55 | User sleep                      | select name, sleep(100) from test      |

+----+------+-----------+------+---------+------+---------------------------------+----------------------------------------+

5 rows in set (0.00 sec)

 

mysql> 

 

图片 16

 

 

 

 

参考资料:

 

https://www.percona.com/blog/2013/02/27/mysql-optimizer-analyze-table-and-waiting-for-table-flush/

http://www.cnblogs.com/jackhub/p/3841004.html

http://myrock.github.io/2014/11/20/mysql-waiting-for-table-flush/

http://mysql.taobao.org/monthly/2016/03/10/