mysql大表修改字段导致锁表(非阻塞)

2023-11-05

线上数据库难免会有修改表结构的需求,MySQL 在修改表结构时会锁表,这就会影响读写操作,小表还好,一会儿就修改完成了,但大表会比较麻烦,下面看一个解决方案

一,方式一

解决思路

(1)新建一个表,结构就是要修改后的结构

(2)在旧表上建立触发器,旧表更新数据时同步到新表

(3)把旧表数据复制到新表

(4)数据同步完成后,执行重命名操作,交换新旧表

(5)删除旧表及触发器

实现方式

这个解决思路已经有了很成熟的工具,数据库服务公司 Percona 提供了 MySQL Toolkit 工具集,其中的 pt-online-schema-change 就是用来进行线上的表结构修改,不会阻塞读写

  • 使用示例

pt-online-schema-change

--user=root --password=111111

--host=192.168.31.157

--alter "modify name CHAR(50)"

D=sakila,t=test

--execute

从结果信息中可以看出这个工具的执行过程

  • 参数说明

--user、--password、--host

数据库的连接信息

--alter

指定要执行的修改操作,例如修改表结构的语句为:

alter table test modify name varchar(60);

这个参数的值就是 “alter table test ”后面的部分

D=sakila,t=test

指定数据库和表名

--execute

确定执行修改操作,有个与其对应的参数 --dry-run,并不真正执行,可以看到生成的执行语句,用来了解其执行步骤与细节

  • 安装方法

下载地址

https://www.percona.com/downloads/percona-toolkit/

centos7 安装示例

下载 rpm 版本

安装依赖包

yum install epel-release-7-5.noarch

yum install perl-DBD-MySQL

yum install perl-Digest-MD5

yum install perl-Config-Tiny

yum install perl-Log-Dispatch

yum install perl-Parallel-ForkManager

yum install -y rrdtool perl-rrdtool rrdtool-devel perl-Params-Validate

安装 toolkit

rpm -ivh percona-toolkit.rpm

安装完成后就可以直接执行了

 方式二,

5.6 以后增加了ONLINE DDL,

实现不锁表增加字段和索引非常简单。

解决办法

ALTER TABLE `member` ADD `user_from` smallint(1) NOT NULL, ALGORITHM=INPLACE, LOCK=NONECOPY

ALGORITHM表示算法:default默认(根据具体操作类型自动选择),inplace(不影响DML),copy创建临时表(锁表),INSTANT只修改元数据(8.0新增,在修改名字等极少数情况可用)

LOCK表示是否锁表:default默认,none,shared共享锁,exclusive

参考:如何在修改Mysql表结构时不影响读写? - 腾讯云开发者社区-腾讯云

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql大表修改字段导致锁表(非阻塞) 的相关文章

  • MySQL 存储过程将值分配给 select 语句中的多个变量

    这是我的存储过程 我在为声明的变量赋值时遇到问题 当我执行它时 插入和更新命令工作正常 但声明变量的值保持为 0 但我在数据库中有一些价值 我怎样才能正确地做到这一点 BEGIN DECLARE PaidFee INT DEFAULT 0
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 如何在 Perl 中使用 use strict 一次一行处理多行字符串?

    我正在尝试找出 PBP 批准的正确方法来一次一行处理多行字符串 许多 Perl 编码人员建议将多行字符串视为文件句柄 除非您在脚本中使用 use strict 否则它可以正常工作 然后 您会收到编译器发出的警告 提示在使用严格引用时无法使用
  • Perl Tk 模块有哪些缺点?

    与在 Perl 中创建 GUI 的其他解决方案相比 Tk 模块有哪些缺点 我最近浏览了 Perl 的各种 gui 模块 这是我的总结 免责声明 最终我发现现有模块都不能满足我的需求 所以我开始编写自己的 gui 工具包 Tk 工作起来很不错
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • unix df 上的正则表达式帮助

    我需要一些帮助来调整我的代码以查找此 UNIX 中的另一个属性df output Ex Filesystem Size Used Avail Capacity Mounted on dev ad4s1e 61G 46G 9 7G 83 ho
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序?

    我正在尝试获取 Perl 和 GNU Linuxsort 1 程序就如何对 Unicode 字符串进行排序达成一致 我在跑sort with LANG en US UTF 8 在Perl程序中我尝试了以下方法 use Unicode Col
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • 即使使用“autoReconnect=true”,MySql JDBC 也会超时[重复]

    这个问题在这里已经有答案了 有时 我的 Java Tomcat6 Debian Squeeze 应用程序无法与 MySql 服务器通信 Tomcat 应用程序位于前端服务器上 而 MySql 位于单独的 仅限 MySql 的机器上 一个典型
  • Flask-login:无法理解它是如何工作的

    我试图理解如何Flask Login https flask login readthedocs org en latest works 我在他们的文档中看到他们使用预先填充的用户列表 我想使用数据库存储的用户列表 但是 我不明白其中的一些
  • PDO PHP 连接,致命错误

    我的连接类 firstcode php class DB functions public db function construct try db new PDO mysql localhost dbname xxx charset ut
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤

随机推荐

  • QT界面工程导出成dll并在其他界面工程调用示例

    一 首先是生成dll 1 新建一个qt工程 2 在 pro文件做如下修改 TARGET qtdll TEMPLATE app DEFINES dllMainWindow LIBRARY TEMPLATE lib 其中qtdll 是自己dll
  • C#中Dictionary的用法总结

    可以实现通过键值查找 插入 删除一个键 值对的操作 这些如果用数组实现都非常麻烦 Key就是键 value就是值 我们在很多地方都会用到字典 他的特点就是查找很快 当然比List快 字典必须包含名空间System Collection Ge
  • pandas写入excel指定行_使用pandas操作excel

    pandas操作excel 最近由于要处理一些excel表格 发现pandas可以免去很多的繁琐的人工劳动 在这里记录一下我所用到的知识 导入文档 将excel中的工作表导入 filename xls data pd read excel
  • python中random.random()用法

    Python中的random模块用于生成随机数 下面介绍一下random模块中最常用的几个函数 random random random random 用于生成一个0到1的随机符点数 0 lt n lt 1 0 参考链接 https www
  • 拓扑布局和建立小型网络

    练习 2 6 1 拓扑布局和建立小型网络 地址表 本实验不包括地址表 拓扑图 学习目标 正确识别网络中使用的电缆 物理连接点对点交换网络 验证每个网络的基本连通性 简介 许多网络问题都可以在网络的物理层解决 因此 必须清楚了解网络连接使用哪
  • Android ffmpeg4.1 arm64位库裁剪

    ffmpeg4 1 Android arm64位库裁剪移植 目录 ffmpeg4 1 Android arm64位库裁剪移植 1 绪言 2 编译环境 3 源代码下载 4 编写编译脚本 4 1 编译脚本 4 2 常见问题 5 库裁剪 5 1
  • 使用vscode把代码或文件夹上传进gitee库里

    1 首先读者自行下载 git 2 在gitee中新建一个仓库 3 建完仓库后会出现以下界面 4 复制图中1 选择你个你想要的文件夹 右键选择 5 之后会跳出来一个小框框 把图中2和3分别复制进小框框里 ctrl v没用 右键选择Paste
  • CObject/CCmdTarget/CCmdTarget三个类的能力

    三个类的能力分别为 CObject 运行时类型识别 RTTI 动态创建 Dynamic Creation 文件读写 Serialization CCmdTarget 消息机制 拥有DECLARE MESSAGE MAP宏 从而可以接收WM
  • 二十二、SQL 数据分析实战(案例1~案例10)

    文章目录 案例1 用户信息表 stu table 案例2 员工绩效表 score table 案例3 销售冠军信息表 month table 案例4 月销售额记录表 sale table 案例5 每季度员工绩效得分表 score info
  • Kubernetes 入门 篇 Master 节点的安装与部署

    在安装K8s 的时候 遇到了很多问题 花了几天的时间排错 记录一下环境搭建的完整过程 希望对入门K8s 的朋友有所帮助 操作系统版本 CentOS Linux 8 Docker 版本 Docker version 23 0 1 运行 Kub
  • 迷茫

    读了两年的软件工程 迷茫始终伴随着自己的前行道路 我想吃计算机这碗饭 我又不想吃太久 这个问题我都感觉很吃屎 大一刚开始 学的是C语音 老师就是按着书本的知识给你讲 数据类型 函数 控制语句 数组 指针 文件 讲完之后 这些东西还是这些东西
  • 常见排序算法(下)

    目录 1 交换排序 1 1交换排序的基本思想 1 2冒泡排序 1 3快速排序 1 3 1Hoare 1 3 2挖坑法 1 3 3 针对性的优化 1 3 4前后指针法 1 3 5非递归实现快速排序 2 归并排序 2 1递归实现归并排序 2 2
  • 4.POD 的基本用法

    文章目录 POD 的基本用法 1 POD运行说明 2 POD封装容器的用法 3 POD 共享的处理 4 POD 配置 4 1 ConfigMap POD 的基本用法 1 POD运行说明 K8S 对容器运行的要求是主程序一直要在前台执行 如果
  • Qt基本数据类型

    有符号8比特数据 16位数据类型 32位有符号数据类型 64位有符号数据类型 Windows中定义为 int64 Windows中定义为 int64 除非配置了 qreal float选项 否则默认为double 无符号8比特数据类型 无符
  • Jenkins Pipeline 项目持续集成交互实践路径

    Jenkins Pipleline插件介绍 Jenkins 2 x的精髓是Pipeline as Code 是帮助Jenkins实现CI到CD转变的重要角色 什么是Pipeline 简单来说 就是一套运行于Jenkins上的工作流框架 将原
  • keil5 不进入中断_C51编程20中断篇(串行通讯3)

    MCS 51单片机提供了4种串口的方式 但是我们只有方式1最常用 可变的10位串行通讯方式 下面就方式1的使用进行讲解 在开始之前先明确一个概念 中断会产生中断标志位 而CPU检测到中断标志位后 如果没有其他更高的中断在执行 CPU会响应该
  • redis的缓存穿透 缓存并发 缓存失效

    学习网址 https www cnblogs com shuchen007 p 9656232 html 截选一个集体缓存失效解决办法 引起这个问题的主要原因还是高并发的时候 平时我们设定一个缓存的过期时间时 可能有一些会设置1分钟啊 5分
  • Java课题笔记~ JSP内置对象

    1 九个内置对象 jsp的内置对象 JSP内置对象是不需要声明和创建就可以在JSP页面脚本中使用的成员变量 九个内置对象 1 out对象 在JSP页面中 经常需要向客户端发送文本内容 这时 可以使用out对象来实现 out对象是javax
  • 帆软下拉复选框,层级树状选择

    treelayer函数 1 概述 语法 treelayer TreeObject Int Boolean String 定义 返回一个树对象 TreeObject 第 n 层的值 一般为树数据集 或下拉树 视图树等树对象 并且可以设置返回值
  • mysql大表修改字段导致锁表(非阻塞)

    线上数据库难免会有修改表结构的需求 MySQL 在修改表结构时会锁表 这就会影响读写操作 小表还好 一会儿就修改完成了 但大表会比较麻烦 下面看一个解决方案 一 方式一 解决思路 1 新建一个表 结构就是要修改后的结构 2 在旧表上建立触发