首页 > 数据库 >MySQL之使用pt-online-schema-change在线修改大表结构

MySQL之使用pt-online-schema-change在线修改大表结构

时间:2022-12-21 18:33:43浏览次数:54  
标签:pt mysql online perl 修改 percona MySQL release --

原因: 最近公司上一个功能, 需要为其中某个表中新增字段,但是考虑到线上数据已经达到300w+的级别,同时使用的mysql的版本是5.7而非8.0,这会导致新增字段的时候,对全表进行加锁,直到添加完毕这个过程中可能会消耗至少几十秒钟的时间,极大的影响线上业务

 

解决方案:

1.升级MySQL版本到8.0版本,支持行级锁

2.使用pt-online-schema-change工具

 

这里使用pt-online-schema-change, 由于MySQL的升级会导致不稳定的情况

 

大表执行DDL可能导致的问题:

在线修改大表的表结构执行时间往往不可预估,一般时间较长
由于修改表结构是表级锁,因此在修改表结构时,影响表写入操作
如果长时间的修改表结构,中途修改失败,由于修改表结构是一个事务,因此失败后会还原表结构,在这个过程中表都是锁着不可写入
修改大表结构容易导致数据库CPU、IO等性能消耗,使MySQL服务器性能降低
在线修改大表结构容易导致主从延时,从而影响业务读取

[介绍]

pt-online-schema-change是percona公司开发的一个工具,在percona-toolkit包里面可以找到这个功能,它可以在线修改表结构

原理

首先它会新建一张一模一样的表,表名一般是_new后缀
然后在这个新表执行更改字段操作
然后在原表上加三个触发器,DELETE/UPDATE/INSERT,将原表中要执行的语句也在新表中执行
最后将原表的数据拷贝到新表中,然后替换掉原表

 

[安装]

ubuntu)

1.下载percona存储库文件

sudo apt update
sudo apt -y install gnupg2 wget
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb

2.安装percona存储库包

sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

输出如下:

Selecting previously unselected package percona-release.
(Reading database ... 194365 files and directories currently installed.)
Preparing to unpack percona-release_latest.focal_all.deb ...
Unpacking percona-release (1.0-17.generic) ...
Setting up percona-release (1.0-17.generic) ...
* Enabling the Percona Original repository
<*> All done!
==> Please run "apt-get update" to apply changes
The percona-release package now contains a percona-release script that can enable additional repositories for our newer products.
For example, to enable the Percona Server 8.0 repository use:
  percona-release setup ps80
Note: To avoid conflicts with older product versions, the percona-release setup command Jan disable our original repository for some products.
For more information, please visit:
  https://www.percona.com/doc/percona-repo-config/percona-release.html

3.安装Percona Toolkit

sudo apt update
sudo apt install percona-toolkit

同意软件安装:

Reading package lists... Done
Building dependency tree      
Reading state information... Done
The following packages were automatically installed and are no longer required:
  geoip-database gsfonts libapt-pkg5.90 libbind9-161 libcroco3
  libdns-export1107 libdns1107 libdns1109 libgeoip1 libicu65 libirs161
  libisc-export1104 libisc1104 libisc1105 libisccc161 libisccfg163 liblwres161
  libmozjs-60-0 liboauth0 libpoppler95 linux-modules-extra-5.4.0-14-generic
  ubuntu-system-service
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libdbd-mysql-perl libdbi-perl libterm-readkey-perl
Suggested packages:
  libclone-perl libmldbm-perl libnet-daemon-perl libsql-statement-perl
The following NEW packages will be installed:
  libdbd-mysql-perl libdbi-perl libterm-readkey-perl percona-toolkit
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,732 kB of archives.
After this operation, 10.3 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

  

[使用]

1.查看MySQL性能摘要

pt-mysql-summary --host localhost --user root --ask-pass

 

2.修改表结构

pt-online-schema-change  --alter "add column t8 int(11) not null default 0" D=test,t=log,h=192.168.16.48,P=3306,u=root,p=123456 --print --execute --charset=utf8

注意:

 --charset=utf8,有的时候修改后的表注释出现乱码,或者如下报错,就必须要加上这个参数

 

参数 说明
–user/u 连接mysql的用户名
–password/p 连接mysql的密码
–host/h 连接mysql的地址
P=3306 连接mysql的端口号
D= 连接mysql的库名
t= 连接mysql的表名
–alter 修改表结构的语句
–execute 执行修改表结构
–charset=uft8 使用utf8编码,避免中文乱码
–no-version-check 不检查版本,在阿里云服务器中一般加入此参数,否则会报错

 

标签:pt,mysql,online,perl,修改,percona,MySQL,release,--
From: https://www.cnblogs.com/xingxia/p/percona.html

相关文章

  • ChatGpt OpenAI注册步骤(超详细!!)
    最近,很火的OpenAI ChatGPT,大伙都跃跃欲试。  由于注册过程比较麻烦,我整理了一下注册步骤。一、前期准备:1、梯子(需要国外代理)2、国外接码平台,推荐sms-a......
  • webstorm typescript .d.ts文件 使用问题
    问题描述 webstorm中global.d.ts文件当全局变量用,不行。直接上干货,能对上你的问题就恭喜了。global.d.ts内容  tsconfig.json   直接使用,不用导入  ......
  • mysql 数据同步到ES
    mysql数据同步到ES#mysql同步数据到ES的开源工具go编写https://www.github.com/siddontang/go-mysql-elasticsearch#需求:如何实现m......
  • mysql分组后限制条数和排序
    废话少数直接上需求和解决方案需求:分组查询指定条数 这是我的表表名news,查询class_id为1和2的数据各三条这是sql:selectn1.*fromnewsn1wheren1.`class_id`in......
  • openpyxl.utils.exceptions.IllegalCharacterError报错原因及解决办法
    openpyxl.utils.exceptions.IllegalCharacterError原因Excel表中有非法字符,这些字符都是八进制的,需要进行清洗解决办法一:(自己亲测有效)importredefdata_cl......
  • 分布式数据库库数据表导入mysql之后数据量增加问题
    1、背景:新疆分布式数据库crm数据导入,表做分片,导入之后表数据量比原表数据量多。导入方式:load2、排查过程以表tf_bhb_ocs_batdeal_2016测试排查:1)表结构:CREATETABLE`......
  • 151-docker 安装mysql 区分大小写
    拉镜像:dockerpullmysql:latest启动容器:dockerrun-p3306:3306--namemysql-case\-v/mydata/mysql/log:/var/log/mysql\-v/mydata/mysql/data:/var/lib/mysql......
  • mysql federated引擎构建MySQL分布式数据库
    使用mysql federated 引擎构建 MySQL 分布式数据库访问层前言:随着应用复杂度的增加,数据库不断细化切分,导致应用程序中数据库应用就得复杂,凌乱。绝大部分程序人员可能......
  • PPT 光效果
    点状、线状、面状、光影“光”=PPT高大上的秘密......
  • KingbaseES 实现 MYSQL 的 delete limit 写法
    使用MySQL的用户可能会比较熟悉这样的用法,更新或删除时可以指定限制更新或删除多少条记录。updatetlsetxxx=xxxwherexxxlimit10;deletefromtlwherexxxlimit......