首页 > 数据库 >MYSQL:无锁变更工具Pt-online-schema-change

MYSQL:无锁变更工具Pt-online-schema-change

时间:2023-06-03 11:23:02浏览次数:48  
标签:无锁 pt Pt -- employees online MYSQL change schema

一、MySQL常用的无锁变更工具

  1. Online Schema Change:Online Schema Change(OSC)工具是MySQL官方提供的一种无锁变更工具,它可以在不停止MySQL服务器的情况下对表结构进行修改。OSC利用了InnoDB存储引擎的特性,使用复制和重放日志的方式来实现无锁变更。

  2. pt-online-schema-change:pt-online-schema-change是Percona Toolkit中的一个工具,它可以在不停止MySQL服务器的情况下对表结构进行修改。pt-online-schema-change使用了InnoDB存储引擎的特性来实现无锁变更。与OSC不同的是,pt-online-schema-change使用了一个代理表来实现表结构变更,而不是直接在原表上进行修改。

  3. gh-ost:gh-ost是GitHub开源的一个工具,它可以在不停止MySQL服务器的情况下对表结构进行修改。gh-ost使用了InnoDB存储引擎的特性来实现无锁变更。与pt-online-schema-change不同的是,gh-ost使用了一个ghost表来实现表结构变更,而不是使用代理表。

  4. Facebook OSC:Facebook OSC是Facebook开源的一个工具,它可以在不停止MySQL服务器的情况下对表结构进行修改。Facebook OSC使用了自己开发的存储引擎MyRocks来实现无锁变更。与其他工具不同的是,Facebook OSC可以在进行表结构变更的同时进行数据的转换、清理和处理。

build

二、Pt-online-schema-change原理

pt-online-schema-change 是一个用于在线更改 MySQL 表结构的工具,它是 Percona Toolkit 的一部分。它的原理是通过在线复制表数据,同时在新表上应用修改,从而避免了直接修改原始表结构导致的锁表和性能下降问题。以下是pt-online-schema-change的基本工作原理:

  1. 创建一个与原表结构相同的新表,同时应用用户指定的表结构更改。

  2. 在新表上创建触发器,将对原表的写操作(如 INSERT、UPDATE 和 DELETE)同步到新表上。

  3. 逐步将原表的数据复制到新表,以便在新表上保持数据的一致性。

  4. 数据复制完成后,将原表和新表互换,然后删除原表以及相关的触发器。

三、使用场景

pt-online-schema-change 在以下场景中特别有用:

  1. 修改大型表的结构:对于包含数百万甚至数十亿行的大型表,直接修改表结构可能导致长时间的锁表和性能下降。pt-online-schema-change 通过在线方式避免了这些问题。

  2. 避免业务中断:在需要修改生产环境数据库表结构时,pt-online-schema-change 可以在不影响业务正常运行的情况下进行表结构更改。

  3. 兼容各种存储引擎:pt-online-schema-change 支持各种 MySQL 存储引擎,如 InnoDB 和 MyISAM。

四、使用示例

以下是一个使用 pt-online-schema-change 修改表结构的示例。

4.1 准备环境

首先,确保已经安装了 Percona Toolkit。如果没有安装,请参考 Percona Toolkit 官方文档 进行安装。

4.2 示例表结构

假设我们有一个名为 employees 的表,包含以下字段:

CREATE TABLE `employees` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `age` int(11) DEFAULT NULL,
 `address` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB;

现在,我们需要添加一个新的字段 emailemployees 表,并将其设置为唯一约束。

4.3 使用 pt-online-schema-change

添加新字段

运行以下命令以在线方式添加新字段:

pt-online-schema-change --alter "ADD COLUMN email VARCHAR(255) UNIQUE" D=my_database,t=employees --execute

上述命令中的参数:

  • --alter:指定要执行的表结构更改。

  • D=my_database:指定包含目标表的数据库名称。

  • t=employees:指定要更改的表名称。

  • --execute:执行表结构更改,而不仅仅是打印更改。

执行完成后,employees 表将包含新的 email 字段,并具有唯一约束。

修改字段

将表employees的comment字段的字符集修改为utf8mb4

 pt-online-schema-change h=192.168.58.3,P=3306,D=employees,t=employees --user=admin --ask-pass --alter "modify column comment varchar(50) character set utf8mb4" --alter-foreign-keys-method=auto --charset=utf8 --execute

删除字段

 pt-online-schema-change h=192.168.58.3,P=3306,D=employees,t=employees --user=admin --ask-pass --alter "drop column comment" --alter-foreign-keys-method=auto --charset=utf8 --execute

添加索引

 pt-online-schema-change h=192.168.58.3,P=3306,D=employees,t=dept_emp --user=admin --ask-pass --alter "add index idx_fr_to_date(from_date,to_date)" --alter-foreign-keys-method=auto --charset=utf8 --execute

删除索引

 pt-online-schema-change h=192.168.58.3,P=3306,D=employees,t=dept_emp --user=admin --ask-pass --alter "drop index idx_fr_to_date" --alter-foreign-keys-method=auto --charset=utf8 --execute

删除外键

需要为外键指定名称为_forigen_key,因为在创建新表时候默认为新表上的外键创建这样的名称,如果没这样指定则无法删除。

 pt-online-schema-change h=192.168.58.3,P=3306,D=employees,t=dept_emp --user=admin --ask-pass --alter "drop foreign key _dept_emp_ibfk_1" --alter-foreign-keys-method=auto --charset=utf8 --execute

添加主键

使用选项--no-check-unique-key-change再次执行添加主键操作

pt-online-schema-change h=192.168.58.3,P=3306,D=employees,t=employees_ptosc --user=admin --ask-pass --alter "add primary key(emp_no)" --charset=utf8 --no-check-unique-key-change --charset=utf8 --execute

 

五、注意事项

在使用 pt-online-schema-change 时,需要注意以下几点:

  1. 在执行过程中,避免对原表进行更改,否则可能导致数据不一致。

  2. 确保在执行前进行充分的测试,以确保修改后的表结构符合预期。

  3. 在执行过程中,可能会对数据库性能产生一定影响,因此最好在业务低峰期进行操作。

总之,pt-online-schema-change 是一个强大且灵活的工具,可以帮助您在不影响业务正常运行的情况下在线更改 MySQL 表结构。使用它时,请确保充分了解其工作原理和注意事项,以确保顺利完成表结构更改。

 

 

 

标签:无锁,pt,Pt,--,employees,online,MYSQL,change,schema
From: https://www.cnblogs.com/lkj371/p/17453679.html

相关文章

  • MySQL同一字段取反处理
    在改BUG中遇到了这个问题一张表的字段比如是否可用标志取值取反了本来是0的写成了1 1写成了0可使用下面的语句 UPDATE(表名)SET字段名= CASE字段名WHEN (值) THEN(值)WHEN (值) THEN(值)WHEN (值) THEN(值)ENDWHERE(条件)举个例子:UPDA......
  • SAP Spartacus UI 中的 CmsTicketInterceptor
    在SpartacusUI发起的OCCAPI请求的URL中,您可能会注意到一个名为cmsTicketId的字段。这个字段的含义与用途如下:cmsTicketId是一个标识符,用于关联SpartacusUI与SAPCommerceCloud后端CMS(ContentManagementSystem)的会话。CMS是一个用于管理网站内容的系统,如......
  • 零代码编程:用ChatGPT将PDF文件的表格批量转为Excel表格
    电脑中有几百个PDF文件,文件内容格式一致,每个PDF文件第一页是一个表格。想把这几百个PDF文件里面的表格都提取出来,转为excel表,该怎么办?打开ChatGPT(一定要用GPT4,编程能力很强。相比之下,gpt3.5弱太多了),输入提示词如下:d盘有一个文件夹:guanlianjiaoyi,里面有很多pdf文件;你的任务是写一个......
  • 首次进入Mysql修改密码报“The MySQL server is running with the --skip-grant-table
    第一次安装完mysql,修改默认密码的时候,报“TheMySQLserverisrunningwiththe--skip-grant-tablesoptionsoitcannotexecutethisstatement”。先刷新mysql然后再重新修改密码即可。mysql>ALTERUSER'root'@'localhost'IDENTIFIEDBY'123456';ERROR1290(H......
  • 关于MySQL数据库的外键作用及如何创建?
    一、外键的作用:外键的主要作用是保证数据的一致性和完整性,并且减少数据冗余。主要体现在以下两个方面:1、阻止执行从表插入新行,其外键值不是主表的主键值便阻止插入。从表修改外键值,新值不是主表的主键值便阻止修改。主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除......
  • 使用ChatGPT、Dall-E和GPT-4构建AI应用程序
    您可以利用AI的力量来提升您的Web开发技能。我们发布了一门课程,教您如何使用ChatGPT、Dall-E和GPT-4构建AI应用程序。本课程旨在让您掌握创建尖端人工智能应用程序的知识和技能。在本课程中,您将利用OpenAIAPI构建三个项目,并探索ChatGPT、Dall-E和革命性的GPT-4......
  • chatgpt-3.5-turbo Chat Ai对话
    chatgpt-3.5-turboChatAi网页版:https://chatgptmirror.com?share=YMV9R1  ......
  • linux卸载MySQL
    linux卸载MySQL一查找以前是否装有mysqlrpm-qa|grep-imysql显示之前安装了:MySQL-server-5.6.22-1.el6.i686MySQL-client-5.6.22-1.el6.i686二停止mysql服务、删除之前安装的mysql删除命令:rpm-e–nodeps包名rpm-evMySQL-server-5.6.22-1.el6.i686rpm-evMySQL-cli......
  • 使用du查/mysql/bak目录使用1013g,但使用df查却显示使用2.8t
    问题描述:使用du查/mysql/bak目录使用1013g,但使用df查却显示使用2.8t,如下所示:系统:rhel7.3异常原因:删除文件后,du命令便不会在文件系统目录中统计被删除的文件,若此时存在运行中的进程持有已经被删除的文件句柄,那该类文件就不会真正在磁盘中被删除,分区超级块中的信息也不会更改,df命......
  • 【花雕学AI】ChatGPT的50种神奇用法:让你的聊天更有趣,更有用,更有创意
      【花雕学AI】是一个普通人学习AI的专栏(于2023年3月29日开始),由驴友花雕撰写,主要介绍了人工智能领域的多维度学习和广泛尝试,目前已包含七十多篇文章,分别介绍了ChatGPT、NewBing和LeonardoAI等人工智能应用和技术的过程和成果。本专栏通过实际案例和故事,分享了花雕在人工......