技术分享|OnlineDDL工具pt-osc

在线DDL工具:pt-osc

对于MySQL的在线DDL操作,目前市面上主要有三种工具:pt-online-schema-change、原版OnlineDDL、gh-ost。
本文将重点介绍如何使用pt-online-schema-change并对这三个工具进行比较。

####原理与限制

####1.1原理

更改pt-online-schema的过程分为以下步骤:

Do创建一个与原表结构相同的空表,表名后缀为_new。
修改步骤一中创建的空表的表结构,在原表中添加三个触发器:Delete、Update、Insert,用于在数据迁移过程中对新表中的原表进行操作。
将原表的数据分块(复制)到新表中。
将原表重命名为旧表,将新表重命名为原表的名称,然后删除旧表。
删除触发器。

####1.2限制

原始表必须具有唯一的主键或索引才能创建DELETE触发器来更新新表。
不能使用rename语句重命名表。
列不能通过删除+添加的方式重命名,否则新列不会复制原列的数据。
添加非空列时,必须指定默认值,否则执行会失败。
删除外键约束时,需要在约束名称前添加下划线“_”,即使用_name形式代替原来的名称。

###用法

####2.1语法

pt-online-schema-change使用DSN(DataSourceName)连接到数据库,密钥格式=价值。

DSN键包括但不限于以下内容:

####2.2参数字典

详细的参数字典请参见文档。

####3.1安装

####3.2使用示例

本示例模拟修改列类型,将列(20)字符更改为varchar(200)。
使用MySQL版本5.7.25和percona-tool3.2.0,数据量约200万条。

####3.2.1创建用户

####3.2.2编写ALTER语句

####3.2.3检查环境

确保要更改的表具有非空主键或唯一键,没有外键指向该表,并且表中没有触发器。
该工具在执行的时候也会进行检查,如果有问题就会报错。
建议先干燥。

####3.2.4执行dry-run

####3.2.5执行

将--dry-run更改为--execute。

输出包括每一步执行的SQL、数据复制进度、预计剩余时间、统计信息、ETC。

####3.2.6执行后检查

检查原表是否被正确修改、指向该表的外键、原表中的触发器。

###OnlineDDL工具比较

####4.1原理比较

简单介绍一下原来的OnlineDDL和gh-ost的原理。

####4.1.1MySQLDDL原版

####4.1.2gh-ost

####4.2如何选择

选择工具的要点包括MySQL版本、DDL类型、对依赖数据库的影响、交互等。
根据您的需求选择合适的工具。

pt-osc参数字典汇总

常用基本参数、模型输出控制模型参数、行为控制参数、负载相关参数、配置类参数、复制段类参数、从机相关参数,验证类参数

注意:在MySQL5.5及更高版本中,大多数操作仅受锁等待时间的影响,因为包含元数据锁。

关于MySQL5.7升级8.0时INT显示问题分析

当客户从MySQL5.7.36升级到8.0.35时,他们注意到表的字段数据类型从INT(10)更改为INT。
虽然表结构看起来发生了变化,但实际数据并没有受到影响。
这种现象源于MySQL中INT(num)数据类型的解释和使用规则。
INT(num)在MySQL中主要用来存储整数,但是num并不是用来限制数据范围的,而是用来表示显示宽度的。
当需要与zerofill一起使用时,会将不足的宽度用0填充,但单独使用时,INT(num)对插入数据的范围没有实际影响。
在MySQL8.0.35中,即使直接使用INT,在表结构中的显示也会有所不同。
例如,5.7.25版本默认为INT(11)或INT(10),而8.0.35默认为INT,带零填充。
显示为int(10)。
这种数据类型的调整在MySQL5.7到8.0的升级过程中是正常的。
只要数据本身不发生变化,就不需要太担心。
如果您正在使用SQLE这样的SQL质量管理平台,它可以帮助您更好地管理和审计SQL语句,以确保数据的准确性和效率。
有关SQLE的更多信息,您可以访问官网opensource.actionsky.com,或者通过GitHubgithub.com/actiontech/s获取源代码和文档...如需商业支持,请访问actionsky.com/sqle获取服务。

mysql的文件结构和默认数据库

MySQL默认文件和数据库结构介绍

安装MySQL后,会自动创建四个预设数据库,其中包括mysql基本数据库,存储用户账户、权限等基本信息,以及信息模式,用于存储。
其他数据库元素,例如表、视图等。
Performance_schema记录了MySQL运行时的状态,对于性能分析很有用。
sys库是前两条信息的显示整合。

关于目录结构,无论不同版本,innodb引擎数据库默认安装在/var/lib/mysql下。
创建test1数据库及其表后,可以看到两个版本中都多了一个test1文件夹。
5.7.28版本中,db.opt存储字符集和排序信息,.frm存储表结构,.ibd存储数据和索引;而在8.0.25版本中,每个数据库都有自己的表空间文件,并且可以通过ibd2sdi命令进行解析。
myisam引擎的表结构在5.7.28中仍然是.frm,但在8.0.25中是sdi文件,其中myd存储数据,myi存储索引。