Use pt-osc to ALTER MySQL table

1. 怎么了(问题)

之前有一个张MySQL表用一个使用了utf8编码的text类型的content字段来保存文章。最近发现当文章中有emoji表情时,保存会失败:

Incorrect string value: '\\xF0\\x9F\\x91\\x87\\xF0\\x9F...' for column 'content' at row 1

原来是utf8编码不支持emoji,需要使用utf8mb4编码。

2. 怎么办(方法)

找到问题之后,那么解决办法就有了:

  1. 修改content字段的编码为utf8mb4
  2. 程序连接数据库的字符集也改成utf8mb4

当然可以直接使用下面的语句进行修改:

alter table tbl_xxx modify content text character set utf8mb4;

但是对于大表,这个语句会锁表很长时间。对于线上服务来说,不能接受长时间的锁表。

3. Then What?

然后发现有一个工具pt-osc可以直接进行修改而减少锁表时间。pt-osc是percona的一个工具。

下载:

wget percona.com/get/percona-toolkit.tar.gz

直接使用wget下载就可以了。然后解压进入bin目录,就会发现一系列工具:

我们需要使用的,就是pt-online-schema-change。

行吧直接上:

pt-online-schema-change \\
-hxxx \\
-Pxxx \\
-uxxx \\
-pxxx \\
--alter "modify title char(128) character set utf8mb4,modify content text character set utf8mb4" \\
D=xxx,t=xxx \\
--execute \\
--print \\
--statistics \\
--no-check-alter

其中-h -P -u -p就是连接数据库的IP、端口、账号和密码。

接下来在--alter中就是修改表结构的语句了,主体还是和MySQL的ALTER语句类似的,只不过这里不需要添加ALTER TABLE xxx了。

对于多个ALTER语句,中间可以使用,分割。

D=xxx,t=xxx表示对应的数据库和表名。

--execute指定程序进行修改,为了安全,默认是不进行修改的,需要添加--execute才能真正执行修改操作。

尝试了一下,果然很方便。


 Previous
csapp ch02 (part 3): Integer Arithmetic csapp ch02 (part 3): Integer Arithmetic
这篇文章是csapp第二章第三节的阅读笔记。 整数的运算包括加减乘除,对于每一种运算都涉及到有符号整数和无符号整数。 这里涉及到的符号: Symbol Type Meaning $+_w^t$ Operation 补码加法
2020-05-09
Next 
csapp ch02 (part 2): Integer Representations csapp ch02 (part 2): Integer Representations
这篇文章是csapp第二章第二节的阅读笔记。 既然知道了信息是如何存储的,那么接下来看看,整数是如何存储的。整数包括两种:有符号整数和无符号整数,分别对应可为负和不可为负。 这里会涉及到如下的一些符号(其中下标的w表示数据的位数):
2020-05-07
  You Will See...