Skip to content

Commit 37cbc29

Browse files
committed
Site updated: 2019-07-29 14:17:05
1 parent 50e3f58 commit 37cbc29

File tree

4 files changed

+23
-79
lines changed

4 files changed

+23
-79
lines changed

2019/04/16/Mysql之七-锁的种类及加锁规则汇总/index.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
<meta property="og:site_name" content="hyhcoder的博客">
9292
<meta property="og:description" content="锁的种类1.行锁;(InnoDb引擎有) 2.表锁/元数据锁(MDL) 1lock tables ... read/write 3.全局锁; 全局锁的典型使用场景是,做全库逻辑备份 1Flush tables with read lock(FTWRL) 加锁规则(5.7版本以前, 8.0系列) 两个原则, 两个优化, 和一个bug; 原则1: 加锁的基本单位是next-key lock, (前">
9393
<meta property="og:locale" content="zh-Hans">
94-
<meta property="og:updated_time" content="2019-07-28T03:29:41.634Z">
94+
<meta property="og:updated_time" content="2019-07-29T05:15:17.720Z">
9595
<meta name="twitter:card" content="summary">
9696
<meta name="twitter:title" content="Mysql之七-锁的种类及加锁规则汇总">
9797
<meta name="twitter:description" content="锁的种类1.行锁;(InnoDb引擎有) 2.表锁/元数据锁(MDL) 1lock tables ... read/write 3.全局锁; 全局锁的典型使用场景是,做全库逻辑备份 1Flush tables with read lock(FTWRL) 加锁规则(5.7版本以前, 8.0系列) 两个原则, 两个优化, 和一个bug; 原则1: 加锁的基本单位是next-key lock, (前">
@@ -374,7 +374,9 @@ <h3 id="加锁规则-5-7版本以前-8-0系列"><a href="#加锁规则-5-7版本
374374
<li>优化2: 索引上的等值查询, 向右遍历时且最后一个值不满足等值条件的时候, next-key lock退化为间隙锁;</li>
375375
<li>bug1: 唯一索引上的范围查询会访问到不满足条件的第一个值为止;</li>
376376
</ul>
377-
<h3 id="具体分析看mysql实战45讲的21讲"><a href="#具体分析看mysql实战45讲的21讲" class="headerlink" title="具体分析看mysql实战45讲的21讲"></a>具体分析看mysql实战45讲的21讲</h3>
377+
<a id="more"></a>
378+
<h3 id="具体分析看mysql实战45讲的21讲"><a href="#具体分析看mysql实战45讲的21讲" class="headerlink" title="具体分析看mysql实战45讲的21讲"></a>具体分析看mysql实战45讲的21讲</h3><p>待补充</p>
379+
378380

379381
</div>
380382

2019/04/18/Mysql之八-超大表字段添加的要点/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
<meta property="og:site_name" content="hyhcoder的博客">
9292
<meta property="og:description" content="背景因为业务的需求, 公司的一张大表需要添加字段, 先看了下表的大小, 行数到是还行, 才几十万, 但是, 因为有大字段的原因, 这个表有几十个G, 因此, 考验的时候就来了, 找了个业务不繁忙的时候, 果断添加了字段, 可是这个过程中, ddl执行了快一个半小时, 然后磁盘的iops快要爆炸, 因为业务低锋期, 倒也还没造成什么大影响, 但难免对大表加字段产生了深深的恐惧;于是我们来探究下大表加">
9393
<meta property="og:locale" content="zh-Hans">
94-
<meta property="og:updated_time" content="2019-07-28T03:29:27.817Z">
94+
<meta property="og:updated_time" content="2019-07-29T05:14:50.393Z">
9595
<meta name="twitter:card" content="summary">
9696
<meta name="twitter:title" content="Mysql之八-超大表字段添加的要点">
9797
<meta name="twitter:description" content="背景因为业务的需求, 公司的一张大表需要添加字段, 先看了下表的大小, 行数到是还行, 才几十万, 但是, 因为有大字段的原因, 这个表有几十个G, 因此, 考验的时候就来了, 找了个业务不繁忙的时候, 果断添加了字段, 可是这个过程中, ddl执行了快一个半小时, 然后磁盘的iops快要爆炸, 因为业务低锋期, 倒也还没造成什么大影响, 但难免对大表加字段产生了深深的恐惧;于是我们来探究下大表加">
@@ -383,6 +383,7 @@ <h3 id="Online-DDL实现"><a href="#Online-DDL实现" class="headerlink" title="
383383
<li>等待打开当前表的所有只读事务提交;</li>
384384
<li>创建索引结束</li>
385385
</ul>
386+
<a id="more"></a>
386387
<p>Online DDL实现:<br>其实实质也是包含了copy和inplace的方式, 对于不支持online形式的, 也是直接采用了copy的方式;<br>online DDL主要包含了3个阶段;<br>1.Prepare阶段:</p>
387388
<ul>
388389
<li>创建新的临时frm文件;</li>

css/main.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1837,7 +1837,7 @@ pre .javascript .function {
18371837
width: 4px;
18381838
height: 4px;
18391839
border-radius: 50%;
1840-
background: #20cb4f;
1840+
background: #53ffaf;
18411841
}
18421842
.links-of-blogroll {
18431843
font-size: 13px;

index.html

Lines changed: 16 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -755,8 +755,7 @@ <h1 class="post-title" itemprop="name headline">
755755

756756

757757

758-
759-
<h3 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h3><p>因为业务的需求, 公司的一张大表需要添加字段, 先看了下表的大小, 行数到是还行, 才几十万, 但是, 因为有大字段的原因, 这个表有几十个G, 因此, 考验的时候就来了, 找了个业务不繁忙的时候, 果断添加了字段, 可是这个过程中, ddl执行了快一个半小时, 然后磁盘的iops快要爆炸, 因为业务低锋期, 倒也还没造成什么大影响, 但难免对大表加字段产生了深深的恐惧;<br>于是我们来探究下大表加字段究竟做了什么动作;</p>
758+
<h3 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h3><p>因为业务的需求, 公司的一张大表需要添加字段, 先看了下表的大小, 行数到是还行, 才几十万, 但是, 因为有大字段的原因, 这个表有几十个G, 因此, 考验的时候就来了, 找了个业务不繁忙的时候, 果断添加了字段, 可是这个过程中, ddl执行了快一个半小时, 然后磁盘的iops快要爆炸, 因为业务低锋期, 倒也还没造成什么大影响, 但难免对大表加字段产生了深深的恐惧;<br>于是我们来探究下大表加字段究竟做了什么动作;</p>
760759
<h3 id="版本影响"><a href="#版本影响" class="headerlink" title="版本影响"></a>版本影响</h3><p>1.Mysql5.6之前, 直接修改表结构会导致整个数据库锁表, 具体内部步骤如下:(copy方式)</p>
761760
<ul>
762761
<li>首先创建新的临时表, 表结构通过命令alter table新定义的结构;</li>
@@ -781,75 +780,13 @@ <h3 id="Online-DDL实现"><a href="#Online-DDL实现" class="headerlink" title="
781780
<li>等待打开当前表的所有只读事务提交;</li>
782781
<li>创建索引结束</li>
783782
</ul>
784-
<p>Online DDL实现:<br>其实实质也是包含了copy和inplace的方式, 对于不支持online形式的, 也是直接采用了copy的方式;<br>online DDL主要包含了3个阶段;<br>1.Prepare阶段:</p>
785-
<ul>
786-
<li>创建新的临时frm文件;</li>
787-
<li>持有EXCLUSIVE-MDL锁, 禁止读写;</li>
788-
<li>根据alter方式, 确定执行方式:(copy, online-rebuild, online-norebuild)</li>
789-
<li>更新数据字段内存对象;</li>
790-
<li>分配row_log对象记录增量;</li>
791-
<li>生成新的临时ibd文件;</li>
792-
</ul>
793-
<p>2.ddl执行阶段:</p>
794-
<ul>
795-
<li>降级EXCLUSIVE-MDL锁, 允许读写;</li>
796-
<li>扫描old_table的聚集索引每一条记录rec;</li>
797-
<li>遍历新表的聚簇索引和二级索引, 逐一处理;</li>
798-
<li>根据rec构造对于的索引项;</li>
799-
<li>将构造索引项插入sort_buffer块;</li>
800-
<li>将sort_buffer块插入新的索引;</li>
801-
<li>处理ddl执行过程中产生的增量(仅rebuild类型需要)</li>
802-
</ul>
803-
<p>3.commit阶段:</p>
804-
<ul>
805-
<li>升级到EXCLUSIVE-MDL锁, 禁止读写;</li>
806-
<li>重做最后row_log中最后一部分增量;</li>
807-
<li>更新innodb的数据字典表;</li>
808-
<li>提交事务(刷事务的redo日志)</li>
809-
<li>修改统计信息</li>
810-
<li>rename临时idb文件, frm文件;</li>
811-
<li>变更完成;</li>
812-
</ul>
813-
<h3 id="常用的ddl操作表"><a href="#常用的ddl操作表" class="headerlink" title="常用的ddl操作表"></a>常用的ddl操作表</h3><table>
814-
<thead>
815-
<tr>
816-
<th>操作</th>
817-
<th>并发DML</th>
818-
<th>算法</th>
819-
<th>备注</th>
820-
</tr>
821-
</thead>
822-
<tbody>
823-
<tr>
824-
<td>添加/删除索引</td>
825-
<td>YES</td>
826-
<td>online(no-rebuild)</td>
827-
<td>全文索引不支持(聚簇)</td>
828-
</tr>
829-
<tr>
830-
<td>修改default值 修改列名 修改自增列值 添加/删除外键约束</td>
831-
<td>YES</td>
832-
<td>Noting</td>
833-
<td>仅需要修改元数据</td>
834-
</tr>
835-
<tr>
836-
<td>添加/删除列 交换列顺序 修改NULL/NOT NULL 修改ROW-FORMAT 添加/修改PK Optimize table</td>
837-
<td>YES</td>
838-
<td>online(rebuild)</td>
839-
<td>由于记录格式改变, 需要重建表</td>
840-
</tr>
841-
<tr>
842-
<td>修改列类型 删除PK 转换字符集 添加全文索引</td>
843-
<td>NO</td>
844-
<td>Copy</td>
845-
<td>需要锁表, 不支持online</td>
846-
</tr>
847-
</tbody>
848-
</table>
849-
<h3 id="online-ddl总结"><a href="#online-ddl总结" class="headerlink" title="online ddl总结"></a>online ddl总结</h3><p>1.实际上的优化就是对dml锁的细化, 只在某些关键部位进行全锁, 而不是整个阶段;<br>2.然后运行并发读写后, 后面就需要留有一部分时间做增量的合并操作;<br>3.若ddl异常, 可能会导致无法再次添加ddl的动作, 那是因为整个过程并不是一个原子操作, 而是复合式的, 所有ddl异常时, 需要清除残留的数据;</p>
850-
<h3 id="最终加表字段的注意事项"><a href="#最终加表字段的注意事项" class="headerlink" title="最终加表字段的注意事项"></a>最终加表字段的注意事项</h3><p>1.尽量选择流量小的业务时间段;<br>2.如果可以的话, 进行主从切换来加字段最好;<br>3.执行时,先看一下有无未提交的事务, 注意查看事务information_schema.innodb_trx表;<br>4.加了之后, 随时关注下服务器日志情况;<br>出现问题的, 可能会出现这样的sql会话;<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">waiting for table metadata lock</span><br></pre></td></tr></table></figure></p>
851-
852-
783+
<!--noindex-->
784+
<div class="post-button text-center">
785+
<a class="btn" href="/2019/04/18/Mysql之八-超大表字段添加的要点/#more" rel="contents">
786+
阅读全文 &raquo;
787+
</a>
788+
</div>
789+
<!--/noindex-->
853790

854791

855792
</div>
@@ -966,8 +903,7 @@ <h1 class="post-title" itemprop="name headline">
966903

967904

968905

969-
970-
<h3 id="锁的种类"><a href="#锁的种类" class="headerlink" title="锁的种类"></a>锁的种类</h3><p>1.行锁;(InnoDb引擎有)</p>
906+
<h3 id="锁的种类"><a href="#锁的种类" class="headerlink" title="锁的种类"></a>锁的种类</h3><p>1.行锁;(InnoDb引擎有)</p>
971907
<p>2.表锁/元数据锁(MDL)</p>
972908
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lock tables ... read/write</span><br></pre></td></tr></table></figure>
973909
<p>3.全局锁;</p>
@@ -983,8 +919,13 @@ <h3 id="加锁规则-5-7版本以前-8-0系列"><a href="#加锁规则-5-7版本
983919
<li>优化2: 索引上的等值查询, 向右遍历时且最后一个值不满足等值条件的时候, next-key lock退化为间隙锁;</li>
984920
<li>bug1: 唯一索引上的范围查询会访问到不满足条件的第一个值为止;</li>
985921
</ul>
986-
<h3 id="具体分析看mysql实战45讲的21讲"><a href="#具体分析看mysql实战45讲的21讲" class="headerlink" title="具体分析看mysql实战45讲的21讲"></a>具体分析看mysql实战45讲的21讲</h3>
987-
922+
<!--noindex-->
923+
<div class="post-button text-center">
924+
<a class="btn" href="/2019/04/16/Mysql之七-锁的种类及加锁规则汇总/#more" rel="contents">
925+
阅读全文 &raquo;
926+
</a>
927+
</div>
928+
<!--/noindex-->
988929

989930

990931
</div>

0 commit comments

Comments
 (0)