2021年4月,我写了一篇文章在线DDL和组复制。当时我们正在处理MySQL 8.0.23也开了一家错误报告这没有正确的答案。
总之,在这篇文章中,我展示了如何在线DDL是事实上的锁定整个集群在很长一段时间内即使使用一致性级别设置为最终。
这篇文章是给正义所做的功MySQL /甲骨文工程师正确,恼人的不便。
在继续之前,让我们记得在线DDL在一组集群复制,传播和识别的差异与现在发生了什么,所有最终的一致性水平集(看到)。
在MySQL 8.0.23我们有:
![]() |
![]() |
![]() |
在MySQL 8.0.27我们有:
![]() |
![]() |
![]() |
正如你所看到的图片我们有三个不同的阶段。第一阶段是相同的版本之间8.0.23 8.0.27和版本。
阶段2和3,相反,有很大的不同。在MySQL 8.0.23 DDL应用于主后,传播到其他节点,但metalock也获得控制并没有回来。结果是,不仅执行DDL的会话保持不变,而且其他会话执行修改。
只有当操作在所有中学,DDL被Binlog异步复制和传播,锁和操作可以重新启动。
相反,在MySQL 8.0.27,操作结束后在主推向binlog DDL,传播到返回的辅助和控制。结果是写操作在主没有任何中断和DDL分布中等和异步复制在同一时间。
这是一个了不起的进步,最终只能与一致性水平,但是,太棒了。
让我们看看一些数字
测试操作,我用同样的方法用于本文上面提到的以前的测试。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
连接
1
:
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
,
锁
=
没有一个
;
改变
表
windmills_test
下降
指数
idx_1
,
算法
=
原地
;
连接
2
:
而
(
1
=
1
]
;
做
达
=
美元
(
日期
+
“% s % 3 n”
)
;
/
选择
/
mysql_templates
/
mysql
- - - - - -
8页
/
本
/
mysql
- - -
违约
- - - - - -
文件
=
。
/
我的
.cnf
- - - - - -
uroot
- - - - - -
D
windmills_large
- - - - - -
e
“插入windmills_test选择零、uuid millid, kwatts_s,日期,地点,活跃,时间,从windmill7 strrecordtype限制1;”
- - - - - -
e
“select count(*)从windmills_large.windmills_test;“
>
/
dev
/
零
;
db
=
美元
(
日期
+
“% s % 3 n”
)
;
回声
“$(回声”
(
$ db
- - - - - -
美元哒
)
“| bc)”
;
睡眠
1
;
完成
连接
3
:
而
(
1
=
1
]
;
做
达
=
美元
(
日期
+
“% s % 3 n”
)
;
/
选择
/
mysql_templates
/
mysql
- - - - - -
8页
/
本
/
mysql
- - -
违约
- - - - - -
文件
=
。
/
我的
.cnf
- - - - - -
uroot
- - - - - -
D
windmills_large
- - - - - -
e
“插入windmill8选择零、uuid millid, kwatts_s,日期,地点,活跃,时间,从windmill7 strrecordtype限制1;”
- - - - - -
e
“select count(*)从windmills_large.windmills_test;“
>
/
dev
/
零
;
db
=
美元
(
日期
+
“% s % 3 n”
)
;
回声
“$(回声”
(
$ db
- - - - - -
美元哒
)
“| bc)”
;
睡眠
1
;
完成
连接
4
- - - - - -
5
:
而
(
1
=
1
]
;
做
回声
“$(日期+ % t . % 3 n)”
;
/
选择
/
mysql_templates
/
mysql
- - - - - -
8页
/
本
/
mysql
- - -
违约
- - - - - -
文件
=
。
/
我的
.cnf
- - - - - -
uroot
- - - - - -
D
windmills_large
- - - - - -
e
“显示全部processlist;”
|
egrep
- - - - - -
我
- - - - - -
e
”(windmills_test | windmills_large)”
|
grep
- - - - - -
我
- - - - - -
v
本地主机
;
睡眠
1
;
完成
|
修改一个表~ 500万行:
|
1
2
3
4
5
6
|
+ - - - - - - - - - - - +
|
数(*)|
+ - - - - - - - - - - - +
|5002909|
+ - - - - - - - - - - - +
|
下面的数字代表了时间第二/毫秒采取的操作来完成。而我也抓在其他节点上的状态改变我不报告给不相关。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
|
最终
(
在
的
主
只有
)
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
节点
1
相同
表
:
。
184年
。
186年
<
- - -
- - - - - -
没有
锁定
在
改变
在
的
相同
节点
。
184年
<
剪断
>
。
184年
。
217年
<
- - -
- - - - - -
时刻
的
提交
。
186年
。
186年
。
186年
。
185年
节点
1
另一个
表
:
。
189年
。
198年
<
- - -
- - - - - -
没有
锁定
在
改变
在
的
相同
节点
。
188年
<
剪断
>
。
191年
。
211年
<
- - -
- - - - - -
时刻
的
提交
。
194年
|
正如你所看到的只有一个很小的延迟提交的时候,但是其他的影响。
如果我们比较这最近测试我做了Percona XtraDB集群(PXC)(见非阻塞操作雷竞技下载官网一个看着Percona 雷竞技下载官网XtraDB集群非阻塞操作在线模式升级)具有相同的行数和相同的表/数据:
| 行动 | 组复制 | PXC (NBO) |
|---|---|---|
| 时间保持为改变表插入 | ~ 0.217秒 | ~ 120秒 |
| 时间保持插入另一个表 | ~ 0.211秒 | ~ 25秒 |
然而是的,有然而,PXC DDL执行期间保持不同节点之间的一致性,在MySQL 8.0.27组复制推迟在次要的一致性,因此中小学没有同步到DDL终结的辅助。
结论
MySQL 8.0.27有这个很好的修复,大大降低的影响在线DDL操作在一个繁忙的服务器上。但是我们仍然可以观察到节点之间的数据的一个重要偏差DDL时执行。
另一方面,PXC NBO有点更“昂贵”,但节点保持一致。
最后,对你来说是更重要的是选择一个或另一个解决方案,一致性和操作的影响。
伟大的MySQL。











听起来太棒了!马可,如果:
——我跑
添加列我INT……N1 -迁移完成,回报
——与此同时异步运往N2, N3
——我跑
更新my_table组i = 27声明排队在N2和N3直到DDL完成吗?