• [知识分享] MySQL日志顺序读写及数据文件随机读写原理
    【摘要】 MySQL在实际工作时候的两种数据读写机制:对redo log、binlog这种日志进行的磁盘顺序读写对表空间的磁盘文件里的数据页进行的磁盘随机读写 1 磁盘随机读MySQL执行增删改操作时,先从表空间的磁盘文件里读数据页出来, 这就是磁盘随机读。如下图有个磁盘文件,里面有很多数据页,可能需要在一个随机位置读取一个数据页到缓存,这就是磁盘随机读因你要读取的这个数据页,可能在磁盘的任一位置,所...本文分享自华为云社区《MySQL日志顺序读写及数据文件随机读写原理》,作者:JavaEdge 。MySQL在实际工作时候的两种数据读写机制:对redo log、binlog这种日志进行的磁盘顺序读写对表空间的磁盘文件里的数据页进行的磁盘随机读写1 磁盘随机读MySQL执行增删改操作时,先从表空间的磁盘文件里读数据页出来, 这就是磁盘随机读。如下图有个磁盘文件,里面有很多数据页,可能需要在一个随机位置读取一个数据页到缓存,这就是磁盘随机读因你要读取的这个数据页,可能在磁盘的任一位置,所以你在读取磁盘里的数据页时,只能用随机读。磁盘随机读性能极差,所以不可能每次更新数据都磁盘随机读,而是读取一个数据页之后,放到BP的缓存,下次要更新时,直接更新BP里的缓存页。磁盘随机读的性能指标IOPS底层的存储系统可执行多少次磁盘读写操作/s。压测时可以观察一下。对数据库的crud操作的QPS影响非常大,某种程度上几乎决定了你每秒能执行多少个SQL语句,底层存储的IOPS越高,你的数据库的并发能力就越高。磁盘随机读写操作的响应延迟也是对数据库的性能有很大的影响。假设你的底层磁盘支持你执行200个随机读写操作/s,但每个操作是耗费10ms,还是耗费1ms,也有很大影响, 决定你对数据库执行的单个crud SQL语句的性能。包括你磁盘日志文件的顺序读写的响应延迟,也决定DB性能,因为你写redo log日志文件越快,那你的SQL性能越高。比如你一个SQL语句发过去,磁盘要执行随机读操作加载多个数据页,此时每个磁盘随机读响应时间50ms,可能SQL语句要执行几百ms,但若每个磁盘随机读仅耗10ms,可能你的SQL就执行100ms即可。所以核心业务的数据库的生产环境机器推荐SSD,其随机读写并发能力和响应延迟要比机械硬盘好太多,可大幅提升数据库的QPS和性能。2 磁盘顺序读写当你在BP的缓存页里更新数据后,必须要写条redo log日志,它就是顺序写:在一个磁盘日志文件里,一直在末尾追加日志写redo log时,不停的在一个日志文件末尾追加日志的,这就是磁盘顺序写。磁盘顺序写的性能很高,几乎和内存随机读写的性能差不多,尤其是在DB里也用了os cache机制,就是redo log顺序写入磁盘之前,先是进入os cache,即os管理的内存缓存。对写磁盘日志文件,最关注磁盘每s读写数据量的吞吐量指标即每s可写入多少redo log日志,整体决定DB的并发能力和性能。每s可写入磁盘100M数据和每s可写入磁盘200M数据,对数据库的并发能力影响也大。因为数据库的每次更新SQL,都涉及:多个 磁盘随机读取数据页操作一条redo log日志文件顺序写操作
  • [产品介绍] 【DRS云小课】如何通过DRS实现他云MySQL到GaussDB(for MySQL)的数据迁移
    数据复制服务(DRS)是一种易用、稳定、高效、用于数据同步的云服务,本节小课为您介绍,如何通过DRS将其他云 MySQL实例的数据迁移到华为云GaussDB(for MySQL)。使用场景DRS实时迁移可自动化迁存量数据并持续同步增量数据,保证源和目标数据近实时一致,可自由选择业务割接窗口实现平滑无感搬家,可迁表、视图、存储过程、触发器、用户权限、参数等特性。本实践中的选择均为测试简化基本操作,仅做参考,实际情况请用户按业务场景选择,更多关于DRS的使用场景请单击这里了解。部署架构本示例中,DRS源数据库为其他云MySQL,目标端为华为云云数据库GaussDB(for MySQL),通过公网网络,将源数据库迁移到目标端。创建GaussDB(for MySQL)实例1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 GaussDB”。4. 选择GaussDB(for MySQL),单击“购买数据库实例”。5. 配置实例名称和实例基本信息。6. 选择实例规格。7. 选择实例所属的VPC和安全组、配置数据库端口。VPC和安全组已在创建VPC和安全组中准备好。8. 配置实例密码。9. 单击“立即购买”。10. 返回云数据库GaussDB实例列表。当GaussDB(for MySQL)实例运行状态为“正常”时,表示实例创建完成。其他云MySQL实例准备前提条件已购买其他云数据库MySQL实例。帐号权限符合要求,具体见帐号权限要求。帐号权限要求当使用DRS将其他云MySQL数据库的数据迁移到华为云云数据库GaussDB(for MySQL)实例时,在不同迁移类型的情况下,对源数据库的帐号权限要求如下:迁移类型全量迁移全量+增量迁移源数据库(MySQL)SELECT、SHOW VIEW、EVENT。SELECT、SHOW VIEW、EVENT、LOCK TABLES、REPLICATION SLAVE、REPLICATION CLIENT。MySQL的相关授权操作可参考操作指导。网络设置源数据库MySQL实例需要开放外网域名的访问。各厂商云数据库对应方法不同,请参考各厂商云数据库官方文档进行操作。以阿里云RDS MySQL为例,需要通过申请外网地址来允许外部的应用对接,具体的操作及注意事项可以参考其官方文档进行操作他云提供的相关指导。创建DRS迁移任务本章节介绍如何创建DRS实例,将其他云MySQL上的数据库迁移到华为云GaussDB(for MySQL)。迁移前检查在创建任务前,需要针对迁移条件进行手工自检,以确保您的同步任务更加顺畅。本示例为MySQL到GaussDB(for MySQL)入云迁移,您可以参考入云迁移使用须知获取相关信息。创建迁移任务1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域,本示例中为“华北-北京四”。3. 单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4. 单击“创建迁移任务”。5. 填写迁移任务参数:配置迁移任务名称。填写迁移数据并选择模板库。这里的目标库选择创建GaussDB(for MySQL)实例所创建的GaussDB(for MySQL)实例。6. 单击“下一步”。迁移实例创建中,大约需要5-10分钟。7. 配置源库网络白名单。源数据库MySQL实例需要将DRS迁移实例的弹性公网IP添加到其网络白名单中,确保源数据库可以与DRS实例互通。各厂商云数据库添加白名单的方法不同,请参考各厂商云数据库官方文档进行操作。以阿里云RDS MySQL为例,具体设置网络白名单的操作及注意事项可以参考相关指导。8. 配置源库信息和目标库数据库密码。配置源库信息,单击“测试连接”。当界面显示“测试成功”时表示连接成功。配置源库信息,单击“测试连接”。当界面显示“测试成功”时表示连接成功。9. 单击“下一步”。10. 在“迁移设置”页面,设置迁移用户和迁移对象。迁移用户:否迁移对象:全部迁移11. 单击“下一步”,在“预检查”页面,进行迁移任务预校验,校验是否可进行任务迁移。查看检查结果,如有不通过的检查项,需要修复不通过项后,单击“重新校验”按钮重新进行迁移任务预校验。预检查完成后,且所有检查项结果均成功时,单击“下一步”。12. 单击“提交任务”。返回DRS实时迁移管理,查看迁移任务状态。启动中状态一般需要几分钟,请耐心等待。当状态变更为“已结束”,表示迁移任务完成。说明:目前MySQL到GaussDB(for MySQL)迁移支持全量、全量+增量两种模式。如果创建的任务为全量迁移,任务启动后先进行全量数据迁移,数据迁移完成后任务自动结束。如果创建的任务为全量+增量迁移,任务启动后先进入全量迁移,全量数据迁移完成后进入增量迁移状态。增量迁移会持续性迁移增量数据,不会自动结束。确认迁移结果确认迁移结果可参考如下两种方式:DRS会针对迁移对象、用户、数据等维度进行对比,从而给出迁移结果,详情参见在DRS管理控制台查看迁移结果。直接登录数据库查看库、表、数据是否迁移完成。手工确认数据迁移情况,详情参见在GaussDB管理控制台查看迁移结果。在DRS管理控制台查看迁移结果1. 登录华为云控制台。2. 单击管理控制台左上角的,选择目标区域。3. 单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4. 单击DRS实例名称。5. 单击“迁移对比”,选择“对象级对比”,查看数据库对象是否缺失。6. 选择“数据级对比”,查看迁移对象行数是否一致。7. 选择“用户对比”,查看迁移的源库和目标库的账号和权限是否一致。在GaussDB管理控制台查看迁移结果1. 登录华为云控制台。2. 单击管理控制台左上角的,选择目标区域。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 GaussDB”。4. 选择GaussDB(for MySQL),单击迁移的目标实例的操作列的“登录”。5. 在弹出的对话框中输入密码,单击“测试连接”检查。6. 连接成功后单击“登录”。7. 查看并确认目标库名和表名等。确认相关数据是否迁移完成。
  • [产品介绍] 【DRS云小课】如何通过DRS实现RDS for MySQL到Kafka的数据同步
    数据复制服务(DRS)是一种易用、稳定、高效、用于数据同步的云服务,本节小课为您介绍,如何通过DRS将RDS for MySQL实例的增量数据同步到分布式消息服务Kafka。使用场景DRS实时同步功能一般用于建立数据同步通道,解决数据共享问题,也可以用于数据流式集成,具有数据转换能力,如库表映射,行列过滤等。本实践中的选择均为测试简化基本操作,仅做参考,实际情况请用户按业务场景选择,更多关于DRS的使用场景请单击这里了解。部署架构本示例中,DRS源数据库为华为云RDS for MySQL,目标端为华为云同Region下的分布式消息服务Kafka,通过VPC网络,将源数据库的增量数据同步到目标端。更多关于DRS的使用场景请单击这里了解。源端RDS for MySQL准备创建RDS for MySQL实例如何创建RDS for MySQL实例,请点击这里查看详细步骤。构造数据1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS”。4. 选择RDS实例,单击实例后的“更多 > 登录”。5. 在弹出的对话框中单击“测试连接”检查。6. 连接成功后单击“登录”。7. 输入实例密码,登录RDS实例。8. 单击“新建数据库”,创建db_test测试库。9. 在db_test库中执行如下语句,创建对应的测试表table3_。CREATE TABLE `db_test`.`table3_` ( `Column1` INT(11) UNSIGNED NOT NULL, `Column2` TIME NULL, `Column3` CHAR NULL, PRIMARY KEY (`Column1`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;目标端Kafka准备创建Kafka实例1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“应用中间件 > 分布式消息服务Kafka版”。4. 单击“购买Kafka实例”。5. 选择实例区域和可用区。6. 配置实例名称和实例规格等信息。7. 选择存储空间和容量阈值策略。8. 选择实例所属的VPC和安全组。VPC和安全组已在创建VPC和安全组中准备好。9. 配置实例密码。10. 单击“立即购买”。11. 返回实例列表。当Kafka实例运行状态为“运行中”时,表示实例创建完成。创建Topic1. 在“Kafka专享版”页面,单击Kafka实例的名称。2. 选择“Topic管理”页签,单击“创建Topic”。3. 在弹出的“创建Topic”的对话框中,填写Topic名称和配置信息,单击“确定”,完成创建Topic。创建DRS同步任务本章节介绍创建DRS实例,将RDS for MySQL上的数据库增量同步到Kafka。同步前检查在创建任务前,需要针对同步条件进行手工自检,以确保您的同步任务更加顺畅。本示例中,为RDS for MySQL到Kafka的出云同步,您可以参考出云同步使用须知获取相关信息。操作步骤介绍RDS for MySQL到Kafka增量同步任务的详细操作过程。1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4. 选择左侧“实时同步管理”,单击“创建同步任务”。5. 填写同步任务参数:配置同步任务名称。选择需要同步任务的源库、目标数据库以及网络信息。这里的目标库选择源端RDS for MySQL准备创建的RDS实例。企业项目选择“default”。   6. 单击“下一步”。同步实例创建中,大约需要5-10分钟。7. 配置源库信息和目标库数据库密码。配置源库信息。单击“测试连接”。当界面显示“测试成功”时表示连接成功。      选择目标库所在VPC和子网,填写Kafka的IP地址和端口。单击“测试连接”。当界面显示“测试成功”时表示连接成功。      8. 单击“下一步”。9. 选择同步信息、策略、消息格式和对象等,投递到Kafka的消息格式。本次选择如下。表1 同步设置类别设置同步Topic策略集中投递到一个Topic,Topic名称“testTopic”。同步到Kafka partition策略按表名+库名的hash值投递到不同Partition。投递到Kafka的数据格式可选择JSON格式,可参考Kafka消息格式。同步对象同步对象选择db_test下的table3_表。10.单击“下一步”。11. 选择数据加工方式。RDS for MySQL到Kafka数据同步目前只支持列加工,列加工提供列级的查询和过滤能力。12. 单击“下一步”,等待预检查结果。13. 当所有检查都是“通过”时,单击"下一步”。14. 确认同步任务信息正确后,单击“启动任务”。返回DRS实时同步管理,查看同步任务状态。启动中状态一般需要几分钟,请耐心等待。当状态变更为“增量同步”,表示同步任务已启动。说明:目前RDS for MySQL到Kafka仅支持增量同步,任务启动后为增量同步状态。如果创建的任务为全量同步,任务启动后进行全量数据同步,数据同步完成后任务自动结束。如果创建的任务为全量+增量同步,任务启动后先进入全量同步,全量数据同步完成后进入增量同步状态。增量同步会持续性同步增量数据,不会自动结束。确认同步任务执行结果由于本次实践为增量同步模式,DRS任务会将源库的产生的增量数据持续同步至目标库中,直到手动任务结束。下面我们通过在源库RDS for MySQL中插入数据,查看Kafka的接收到的数据来验证同步结果。操作步骤1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS””。4. 单击RDS实例后的“更多 > 登录”。5. 在弹出的对话框中单击“测试连接”检查。6. 连接成功后单击“登录”。7. 输入实例密码,登录RDS实例。8. 在DRS同步对象的db_test.table3_表中,执行如下语句,插入数据。INSERT INTO `db_test`.`table3_` (`Column1`,`Column2`,`Column3`) VALUES(4,'00:00:44','ddd');9. 单击左侧的服务列表图标,选择“应用中间件 > 分布式消息服务Kafka版”。10. 在“Kafka专享版”页面,单击Kafka实例的名称。11. 选择“消息查询”页签,在Kafka对应的Topic中,查看接收到相应的JSON格式数据。12. 结束同步任务。根据业务情况,确认数据已全部同步至目标库,可以结束当前任务。单击“操作”列的“结束”。仔细阅读提示后,单击“是”,结束任务。     
  • [产品介绍] 【DRS云小课】如何在DRS上搭建MySQL异地单主灾备
    当某一地区故障而导致业务不可用,可以使用数据复制服务DRS推出的灾备场景,为业务连续性提供数据库的同步保障。本节小课为您介绍RDS for MySQL实例通过DRS服务搭建异地单主灾备的过程。实现原理RDS跨Region容灾实现原理说明:在两个数据中心独立部署RDS for MySQL实例,通过DRS服务将生产中心MySQL库中的数据同步到灾备中心MySQL库中,实现RDS for MySQL主实例和跨Region灾备实例之间的实时同步。更多关于MySQL实例灾备须知请单击这里了解。一、生产中心RDS for MySQL实例准备创建MySQL业务实例,选择已规划的业务实例所属VPC,并为实例绑定EIP。1.   登录华为云控制台。2.   单击管理控制台左上角的,选择区域“华北-北京一”。3.   单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS”。4.   单击“购买数据库实例”。5.   填选实例信息后,单击“立即购买”。 选择引擎版本信息。选择规格信息。选择已规划的网络信息。设置管理员密码。6.   为创建的RDS实例绑定弹性公网IP。二、灾备中心RDS for MySQL实例准备创建MySQL灾备实例,选择已规划的灾备实例所属VPC。1.   单击管理控制台左上角的,选择区域“华北-北京四”。2.   单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS”。3.   单击“购买数据库实例”。4.   填选实例信息后,单击“立即购买”。选择灾备实例引擎版本信息选择灾备实例规格信息选择灾备实例已规划的网络信息设置灾备实例管理员密码三、搭建容灾关系创建DRS灾备实例,创建时选择灾备中心创建的RDS for MySQL实例。1.   在“华北-北京四”区域,单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。2.   选择左侧“实时灾备管理”,单击右上角“创建灾备任务”。3.   灾备类型选择“单主灾备”,灾备关系选择“本云为备”,灾备数据库实例选择在“华北-北京四”新创建的MySQL灾备实例,单击“下一步”,开始创建灾备实例。设置基本信息设置灾备实例信息4.   返回“实时灾备管理”页面,可以看到新创建的灾备实例。创建完成5.   在灾备实例上,单击“编辑”。6.   根据界面提示,将灾备实例的弹性公网IP加入生产中心MySQL实例所属安全组的入方向规则,选择TCP协议,端口为生产中心MySQL实例的端口号。添加安全组规则      源库信息中的“IP地址或域名”填写生产中心MySQL实例绑定的EIP,“端口”填写生产中心MySQL实例的端口号。测试通过后,单击“下一步”,直到任务启动,任务状态为“灾备中”。编辑灾备任务灾备中四、容灾切换生产中心数据库故障时,需要手动将灾备数据库实例切换为可读写状态。切换后,将通过灾备实例写入数据,并同步到源库。1.   生产中心源库发生故障,例如:源库无法连接、源库执行缓慢、CPU占比高。2.   收到SMN邮件通知。邮件通知3.   查看灾备任务时延异常。时延异常4.   用户自行判断业务已经停止。具体请参考如何确保业务数据库的全部业务已经停止。5.   选择“批量操作 > 主备倒换”,将灾备实例由只读状态更改为读写状态。主备倒换倒换完成6.   在应用端修改数据库连接地址后,可正常连接数据库,进行数据读写。
  • [产品介绍] 【DRS云小课】其他云MySQL迁移到RDS for MySQL实例
    数据复制服务(Data Replication Service,简称DRS)支持将其他云MySQL数据库的数据迁移到本云云数据库MySQL。通过DRS提供的实时迁移任务,实现在数据库迁移过程中业务和数据库不停机,业务中断时间最小化。本节小课为您介绍将其他云MySQL迁移到RDS for MySQL实例。部署架构更多关于MySQL数据迁移须知请单击这里了解。一.  创建RDS for MySQL实例创建MySQL业务实例,选择已规划的业务实例所属VPC和安全组。1.   登录华为云控制台。2.   单击管理控制台左上角的,选择区域“华南-广州”。3.   单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS”。4.   单击“购买数据库实例”。5.   配置实例名称和实例基本信息。      6.   选择实例规格。      7.   选择实例所属的VPC和安全组、配置数据库端口。      8.   配置实例密码。      9.   单击“立即购买”。10.   返回云数据库实例列表。当RDS实例运行状态为“正常”时,表示实例创建完成。二、其他云MySQL实例准备帐号权限要求当使用DRS将其他云MySQL数据库的数据迁移到本云云数据库MySQL实例时,帐号权限要求如下表所示,授权的具体操作请参考授权操作。迁移帐号权限迁移类型全量迁移全量+增量迁移源数据库(MySQL)SELECT、SHOW VIEW、EVENT。SELECT、SHOW VIEW、EVENT、LOCK TABLES、REPLICATION SLAVE、REPLICATION CLIENT。网络设置源数据库MySQL实例需要开放外网域名的访问。白名单设置其他云MySQL实例需要将目标端DRS迁移实例的弹性公网IP添加到其网络白名单中,目标端DRS迁移实例的弹性公网IP在创建完DRS迁移实例后可以获取到,确保源数据库可以与DRS实例互通,各厂商云数据库添加白名单的方法不同,请参考各厂商云数据库官方文档进行操作。三、创建DRS迁移任务1.   登录华为云控制台。2.   单击管理控制台左上角的,选择区域,即为目标实例所在的区域。3.   单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4.   单击“创建迁移任务”。5.   填写迁移任务参数。      配置迁移任务名称。            填写迁移数据并选择模板库。这里的目标库选择创建的RDS实例。      6.   单击“下一步”。      迁移实例创建中,大约需要5-10分钟。迁移实例创建完成后可获取弹性公网IP信息。      7.   配置源库信息和目标库数据库密码。      8.   单击“下一步”。9.   在“迁移设置”页面,设置流速模式、迁移用户和迁移对象。流速模式:不限速迁移对象:全部迁移10.   单击“下一步”,在“预检查”页面,进行迁移任务预校验,校验是否可进行任务迁移。查看检查结果,如有不通过的检查项,需要修复不通过项后,单击“重新校验”按钮重新进行迁移任务预校验。预检查完成后,且所有检查项结果均成功时,单击“下一步”。11.   参数对比。若您选择不进行参数对比,可跳过该步骤,单击页面右下角“下一步”按钮,继续执行后续操作。若您选择进行参数对比,对于常规参数,如果源库和目标库存在不一致的情况,建议将目标数据库的参数值通过“一键修改”按钮修改为和源库对应参数相同的值。12.   单击“提交任务”。      返回DRS实时迁移管理,查看迁移任务状态。      启动中状态一般需要几分钟,请耐心等待。            当状态变更为“已结束”,表示迁移任务完成。四、确认迁移结果确认迁移结果可参考如下两种方式:DRS会针对迁移对象、用户、数据等维度进行对比,从而给出迁移结果,详情参见在DRS管理控制台查看迁移结果。直接登录数据库查看库、表、数据是否迁移完成。手工确认数据迁移情况,详情参见在RDS管理控制台查看迁移结果。在DRS管理控制台查看迁移结果1.   登录华为云控制台。2.   单击管理控制台左上角的,选择目标区域。3.   单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4.   单击DRS实例名称。5.   单击“迁移对比”,选择“对象级对比”,单击“开始对比”,校验数据库对象是否缺失。6.   选择“数据级对比”,单击“创建对比任务”,查看迁移的数据库和表内容是否一致。7.   选择“用户对比”,查看迁移的源库和目标库的账号和权限是否一致。在RDS管理控制台查看迁移结果1.    登录华为云控制台。2.   单击管理控制台左上角的,选择目标区域。3.   单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS”。4.   单击迁移的目标实例的操作列的“更多 > 登录”。      5.   在弹出的对话框中输入密码单击“测试连接”检查。6.   连接成功后单击“登录”。7.   输入实例密码,登录RDS实例。8.   查看并确认目标库名和表名等。确认相关数据是否迁移完成。
  • [产品介绍] 【DRS云小课】如何将自建MySQL迁移到RDS for MySQL
    数据复制服务DRS支持将本地MySQL数据库的数据迁移至RDS for MySQL。通过DRS提供的实时迁移任务,实现在数据库迁移过程中业务和数据库不停机,业务中断时间最小化。本节小课为您介绍将自建MySQL迁移到RDS for MySQL的过程。部署架构本示例中,数据库源端为ECS自建MySQL,目的端为RDS实例,同时假设ECS和RDS实例在同一个VPC中。更多关于MySQL数据迁移须知请单击这里了解。一.  创建ECS(MySQL服务器)并安装MySQL社区版购买并登录弹性云服务器,用于安装MySQL社区版。1.   登录华为云控制台。2.   单击管理控制台左上角的,选择区域“华东-上海一”。3.   单击左侧的服务列表图标,选择“计算 > 弹性云服务器 ECS”。4.   单击“购买云服务器”。5.   配置弹性云服务器参数,填选信息后,单击“立即购买”。            选择镜像和磁盘规格。      6.   在创建的ECS上单击“远程登录”。选择“CloudShell登录”。7.   输入root用户密码,完成登录。8.   执行如下命令,创建mysql文件夹。      mkdir /mysql9.   执行如下命令,查看数据盘信息。      fdisk -l10.   执行如下命令,初始化数据盘。      mkfs.ext4 /dev/vdb11.   执行如下命令,挂载磁盘。      mount /dev/vdb /mysql12.   执行如下命令,查看磁盘是否挂在成功。      df -h      当回显出现 /dev/vdb的数据时,表示挂载成功。13.   依次执行如下命令,创建文件夹并切换至install文件夹。      mkdir -p /mysql/install/data      mkdir -p /mysql/install/tmp      mkdir -p /mysql/install/file      mkdir -p /mysql/install/log      cd /mysql/install14.   下载依赖包并上传到/mysql/install/file命令。15.   下载并安装社区版MySQL。二. 创建ECS并安装MySQL客户端1.   创建MySQL客户端的弹性云服务器。确保和MySQL服务器所在ECS配置成相同Region、相同可用区、相同VPC、相同安全组。不用购买数据盘。云服务器名配置为:ecs-client。其他参数同MySQL服务器的ECS配置。2.   下载并安装MySQL客户,请参考安装MySQL客户端。三.  创建RDS实例本章节介绍创建RDS实例,该实例选择和自建MySQL服务器相同的VPC和安全组。1.   登录华为云控制台。2.   单击管理控制台左上角的,选择区域“华东-上海一”。3.   单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS”。4.   填选信息后,单击“购买数据库实例”。            选择实例规格。            选择实例所属的VPC和安全组、配置数据库端口。            配置实例密码。      四. 创建DRS迁移任务介绍自建MySQL服务器上的loadtest数据库迁移到RDS MySQL实例的详细操作过程。1.   登录华为云控制台。2.   单击管理控制台左上角的,选择区域“华东-上海一”。3.   单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4.   单击“创建迁移任务”。5.   填写迁移任务参数,直到任务创建完成。      配置迁移任务名称。            填写迁移数据并选择模板库。这里的目标库选择创建的RDS实例。      6.   配置源库信息和目标库数据库密码。      7.   单击“下一步”,直到迁移任务提交成功,数据迁移完成。
  • [知识分享] 【数据库系列】想了解Xtrabackup备份原理和常见问题分析,看这篇就够了
    >摘要:本文来自华为云MySQL研发团队,主要分享了MySQL备份工具Xtrabackup的备份过程、华为云数据库团队对其做的优化改进,以及在使用中可能遇到的问题与解决方法。本文分享自华为云社区[《华为云带你探秘Xtrabackup备份原理和常见问题分析》](https://bbs.huaweicloud.com/blogs/302682?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=database&utm_content=content),作者:GaussDB 数据库 。 本文来自华为云MySQL研发团队,主要分享了MySQL备份工具Xtrabackup的备份过程、华为云数据库团队对其做的优化改进,以及在使用中可能遇到的问题与解决方法。文章讨论的内容主要是针对华为云RDS for MySQL, 以及用户自建的社区版MySQL数据库,希望有助于大家理解和使用Xtrabackup,以后面对Xtrabackup问题也更加从容。 # 一、Xtrabackup简介 Xtrabackup是Percona团队开发的用于MySQL数据库物理热备份的开源备份工具,具有**备份速度快、支持备份数据压缩、自动校验备份数据、支持流式输出、备份过程中几乎不影响业务**等特点,是目前各个云厂商普遍使用的MySQL备份工具。 当前Xtrabackup存在两个版本:Xtrabackup 2.4.x与8.0.x,分别用于备份MySQL 5.x与MySQL 8.0.x 版本。下面我们分别介绍 Xtrabackup如何备份MySQL社区版以及华为云上的Xtrabackup的备份原理 # 二、社区版MySQL的Xtrabackup备份 Xtrabackup是为Percona MySQL设计的,同时也支持对官方社区版本MySQL进行备份,过程如下图所示: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/21/145437voog7r93mbj3psoh.png) 图1:Xtrabackup备份官方MySQL流程示意 1. **兼容性检查**:Xtrabackup社区版本只支持 MyISAM , InnoDB , CSV , MRG_MYISAM 四种存储引擎的表,其他存储引擎的表不会备份;在这一步中,通过查询tables,若发现存在表的存储引擎不是上述四种引擎之一,会打印warning, 表明Xtrabackup不会备份该表。 2. **启动redo后台备份线程**:启动redo后台备份线程,从备份实例的最近一次checkpoint LSN的位置开始备份所有增量的redo log,一直持续到备份任务结束。 3. **加载所有的innodb表空间**:打开并扫描所有innodb表的数据文件,检查所有表空间的第一个页面,初始化所有表的内存结构。 4. **备份innodb表**:遍历步骤3所构建的表的内存结构,备份每一个innodb表的数据文件,备份的过程中会检查每个页面的数据是否正确。 5. **加备份锁 FLUSH TABLES WITH READ LOCK (FTWRL)**:FTWRL锁是MySQL实例级的读锁,加锁过程复杂,且加锁之后,所有表的所有更新操作以及DDL都会堵塞。 6. **备份非innodb表**:因为在步骤5我们已经对实例加了读锁,因此,此时备份非innodb表是安全的,此时一定没有写业务。 7. **记录binlog当前的GTID信息**:请注意,此时我们仍持有全局读锁。这一步主要是方便我们使用该备份集快速地创建出备机。 8. **停止redo备份线程**。 9. **释放锁资源,备份结束**。 需要注意的是,Xtrabackup 2.4.x与8.0.x在第7、8这两个步骤存在差异,这个差异有MySQL 8.0.x的原因,详情我们在下文介绍。 # 三、华为云RDS for MySQL备份 在备份社区版MySQL实例时,Xtrabackup会对实例加全局读锁(FTWRL),该锁对数据库的业务影响很大,严重时甚至会导致数据库“挂起”,这对客户来说是不可接受的。因此华为云MySQL团队对这个过程进行了优化,主要有两点: 1. 对MySQL 5.x以及0.x增加了备份锁:LOCK TABLES FOR BACKUP 2. 对MySQL 5.x新增了binlog锁:LOCK BINLOG FOR BACKUP 优化之后,华为云Xtrabackup对MySQL的备份过程如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/21/145559lqvrqw2zjlwmaiyi.png) 图2 Xtrabackup备份华为云MySQL流程示意 与FTWRL锁相比,**备份锁 LOCK TABLES FOR BACKUP对客户实例影响很小,其加锁过程简单,加锁期间innodb表的DML操作不受影响**,但是非innodb表的所有的更新操作以及DDL操作仍然是不允许的。 备份完所有的表文件后,Xtrabackup需要获取binlog GTID信息。 - 对于MySQL 5.x版本,Xtrabackup 2.4.x会执行 LOCK BINLOG FOR BACKUP 操作,对binlog加锁,然后获取GTID信息。 - 对于MySQL 8.0.x版本,华为云Xtrabackup 8.0.x沿用官方的一致性备份点查询方法。Xtrabackup查询log_status 时,MySQL服务器会分别对redo log, binlog等加轻量级锁,获取一致性备份点,这个过程是非常短暂的,对实例的运行几乎没有影响。MySQL 8.0.x的备份一致性点,会告诉我们一致性的redo log LSN以及binlog的GTID;查询完备份一致点后,Xtrabackup会备份最后一个binlog文件,用于恢复时仲裁事务是否需要回滚;最后,redo log备份线程任务会在其读取到的redo log的LSN大于查询到的备份一致性点的redo log LSN处停止。 由于Xtrabackup 2.4.x与8.0.x在处理binlog时存在差异,恢复过程也存在差异,我们会在后续文章中详细阐述。 # 四、常见问题与解决方法 华为云已经使用Xtrabackup为公司几乎所有的MySQL实例提供备份服务,在使用过程中,我们积极与社区保持联系,向Percona社区报告使用过程中的一些问题,帮助Xtrabackup向更好的方向演进。此外,对于发现的一些致命问题,若社区未能及时修复,华为云数据库团队会进行及时修复以保证备份数据的正确性。 下面是我们总结在使用Xtrabackup备份过程各个阶段可能遇到的问题,分析其原因以及对应的解决方法, ## 1. 兼容性检查阶段 - **问题现象**:Xtrabackup启动后,立即长时间“挂起”,查看日志发现redo log备份线程也没有启动。 **原因**:Xtrabackup兼容性检查时无法获取MDL锁。Xtrabackup兼容性检查是通过查询 imformation_schema.tables这个插件表实现: “SELECT CONCAT(table_schema, '/', table_name), engine FROM information_schema.tables WHERE engine NOT IN ('MyISAM', 'InnoDB', 'CSV', 'MRG_MYISAM') AND table_schema NOT IN ('performance_schema', 'information_schema', 'mysql')” 在查询每张表时,需要获取对应表的MDL锁,如果此时MySQL实例中存在长时间的DML或者DDL 语句,或者更严重者出现了MDL死锁,上面的查询会一直堵塞在等待MDL锁阶段,此时 Xtrabackup会长时间“挂起”。 **解决办法**:若等待锁的原因只是因为其他SQL语句的堵塞,等待其他SQL执行完成即可;若是发生了死锁,此时需要分析出死锁原因,将死锁解除;华为云RDS for MySQL提供了MDL锁视图功能,可以很好地帮助用户分析业务的MDL死锁。 ## 2.redo log备份阶段 - **问题现象1**:redo log回卷,备份失败,Xtrabackup报如下错误信息: “xtrabackup: error:it looks like InnoDB log has wrapped around before xtrabackup could process all records due to either log copying being too slow, or log files being too small.\n");” **原因**:在备份的过程中,如果主机业务负载很高,导致redo log写入的速度很快,会发生Xtrabackup的redo log备份线程的备份速度小于redo log的写入速度,因为MySQL redo log文件写入使用了 round-robin的方式,使得新写入的日志覆盖了之前写入却还未备份的日志,因此备份失败。 **解决办法**:推荐在业务低峰期进行备份,或者增大redo log的文件大小。 - **问题现象2**:备份因DDL操作失败,错误信息如下: “An optimized (without redo logging) DDLoperation has been performed. All modified pages may not have been flushed to the disk yet. PXB will not be able take a consistent backup. Retry the backup operation” **原因**: 备份过程中MySQL实例发生了创建索引的DDL操作,因为创建索引不会写redo,若继续备份会引起数据不一致问题,所以Xtrabackup在这种场景中备份失败是预期行为。 **解决办法**:不要在备份过程中创建索引,如果确实需要,建议在建表语句中直接带上索引,或者使用 lock-ddl 参数进行备份(阻塞实例上新的DDL操作)。 - **问题现象3**:undo truncate导致备份失败,Xtrabackup错误信息如下: “An undo ddl truncation (could be automatic) operation has been performed.” **原因**:在Xtrabackup备份期间,如果MySQL实例发生undo truncate时,有可能会出现写入新 undo文件(space id不同)的undo日志丢失导致恢复出来的数据存在问题。官方在Xtrabackup 8.0.14版本(基于MySQL 8.0.21)对该问题进行了修复,修复方法是redo备份线程,解析redo log时若发现该操作是undo log的truncate操作,则会备份失败。遗憾的是,该修复并没有完全解决问题,在以下两种场景中,社区版本的Xtrabackup仍可能会发生恢复出来的数据存在不一致的现象: 1. MySQL版本低于MySQL 8.0.21; 2. 用户在备份过程中,自己创建了新的undo tablespace。 **解决办法**:在备份期间关闭undo tablespace的truncate操作,并禁止用户创建undo tablespace, 能够有效地防止备份数据恢复出来不一致的问题;另外华为云Xtrabackup对这个问题进行了进一步的修复,可以有效地防止此类现象发生。 ## 3.加载表空间阶段 - **问题现象1**:Xtrabackup报错:Too many open files **原因**:操作系统允许同时打开的文件数量是有限的,Xtrabackup在load tablespace阶段会同时打开所有的表文件,如果Xtrabackup打开的表的个数超过了该限制,则会备份失败。 **解决办法**:调大操作系统,允许同时打开最大文件数的配置,或者使用 lock-ddl 参数(阻塞实例上新的DDL操作)。 - **问题现象2**:rename table导致备份失败,错误信息如下: “Trying to add tablespace 'xxxx' with id xxx to the tablespace memory cache, but tablespace xxxx already exists in the cache!;” **原因**:在Xtrabackup打开表空间的全过程是没有加锁的,如果发生了rename table有概率会发生重复加载相同的表空间,此时Xtrabackup会检测到重复的tablespace id,因此备份失败。 **解决办法**:一般来说,加载表空间是一个很快的操作,rename table并不是一个很频繁的操作,这种情况重试即可(Percona Xtrabackup 2.4.x仅支持单线程加载表空间,华为云Xtrabackup支持多线程加载表空间)。 ## 4.备份innodb表阶段 - **问题现象**:innodb表数据文件损坏,备份失败,错误信息如下: “xtrabackup: Database page corruption detected at page xxxx, retrying.” **原因**:Xtrabackup在备份innodb表数据文件时,会检查每个页面的checksum,如果发现checksum不对,则备份失败,这时说明MySQL实例的数据已经发生了损坏(例如磁盘静默错误)。 **解决办法**:需要通过恢复前一次的备份数据或者其他的办法将数据进行修复之后,备份才能成功,在后续的文章中,我们也会详细介绍数据修复办法。 # 五、结语 本文主要对比介绍了Xtrabackup备份原理,备份社区版MySQL以及华为云对其的改进,并分享了Xtrabackup常见问题的排查与解决,后续我们也会为大家带来更深入的分析,更实用的使用技巧,希望对大家理解和使用Xtrabackup有帮助。我们也将持续为客户提供更好的数据库服务,并时刻守护客户的数据安全。
  • [技术干货] 使用BenchmarkSQL v5.0 测试数据库mysql和mysql调优
     MySQL安装指南:https://support.huaweicloud.com/instg-kunpengdbs/kunpengdbs_03_0001.htmlBenchmarkSQL测试指导:https://support.huaweicloud.com/tstg-kunpengdbs/kunpengdbs_06_0001.html问题:运行./runBenchmark.sh my_mysql.properties报错如下:14:41:41,017 [Thread-24] ERROR  jTPCCTData : Unexpected SQLException in DELIVERY_BG                                                     14:41:41,017 [Thread-44] ERROR  jTPCCTData : Unexpected SQLException in DELIVERY_BGUsage: 481MB / 4256MB14:41:41,019 [Thread-44] ERROR  jTPCCTData : Lock wait timeout exceeded; try restarting transaction解决方法:设置mysql的隔离级别为:READ-COMMITTED查看隔离级别:mysql> select @@global.tx_isolation,@@tx_isolation;设置隔离级别:mysql> set global transaction isolation level read committed; //全局的mysql> set session transaction isolation level read committed; //当前会话 附:mysql的性能调优:配置/etc/my.cnf配置文件innodb_spin_wait_delay=180 #设置spin_wait_delay参数,防止进入系统自旋innodb_sync_spin_loops=25 #设置spin_loops循环次数,防止进入系统自旋innodb_buffer_pool_size=230G #设置buffer pool size,一般为服务器内存60%innodb_buffer_pool_instances=16 #设置buffer pool instance个数,提高并发能力innodb_log_buffer_size=64M #设置log buffer size大小innodb_use_native_aio=1 #开启异步IOinnodb_flush_log_at_trx_commit=0 #每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去 注意:innodb_flush_log_at_trx_commit=0 #每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去提交事务的时候将 redo 日志写入磁盘中,所谓的 redo 日志,就是记录下来你对数据做了什么修改值为0 : 提交事务的时候,不立即把 redo log buffer 里的数据刷入磁盘文件的,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。此时可能你提交事务了,结果 mysql 宕机了,然后此时内存里的数据全部丢失。值为1 : 提交事务的时候,就必须把 redo log 从内存刷入到磁盘文件里去,只要事务提交成功,那么 redo log 就必然在磁盘里了。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。值为2 : 提交事务的时候,把 redo 日志写入磁盘文件对应的 os cache 缓存里去,而不是直接进入磁盘文件, 直到完成后才返回,我们知道写磁盘的速度是很慢的,因此 MySQL 的性能会明显地下降。如果不在乎事务丢失,0和2能获得更高的性能。但是不在乎事务是不安全的。故商用的话设置为1问题:安装mysql数据库过程中,切换su - mysql用户的时候报错,切换不成功解决方法:1、查看cat /etc/passwd 发现它的shell是"/sbin/nologin",需要将其修改为“/bin/bash”2、修改完毕后保存退出,可以正常切换了  
  • [问题求助] 【鲲鹏云】安装【mysql5.6】CMake Error: The source directory (急,求大佬们帮忙)
    【功能模块】数据库安装【操作步骤&问题现象】1、https://support.huaweicloud.com/prtg-kunpengdb/mysql_01_0001.html2、我按照官方步骤走到cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -他就一直找不到目录[root@ecs-1c65-0001 mysql-5.6.44]# time cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -CMake Error: The source directory "/usr/local/src/mysql/mysql-5.6.44/-" does not exist.Specify --help for usage, or press the help button on the CMake GUI.【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [知识分享] 【数据库系列】一图解析MySQL执行查询全流程
    >摘要:当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。本文分享自华为云社区[《mysql执行查询全流程解析》](https://bbs.huaweicloud.com/blogs/314468?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content),作者:breakDraw。 # mysql执行查询的过程 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/165028cfuib5fbq62vk3sj.png) 1. 客户端先发送查询语句给服务器 2. 服务器检查缓存,如果存在则返回 3. 进行sql解析,生成解析树,再预处理,生成第二个解析树,最后再经过优化器,生成真正的执行计划 4. 根据执行计划,调用存储引擎的API来执行查询 5. 将结果返回给客户端。 # 一、客户端到服务端之间的原理 - 客户端和服务端之间是半双工的, 即一个通道内只能一个在发一个接收, 不能同时互相发互相接收 - 客户端只会发送一个数据包给服务端,并不会在应用层拆成2个数据包去发(max_allowed_packet可以设置数据包最大长), 这关系到sql语句不能太长。 - 服务端返回给客户端可以有多个数据包, 但是客户端必须完整接收,不能接到一半停掉连接或用连接去做其他事(UI界面可以操作,不同的线程) - 例如java,如果没设置fetchSize,那么都是一次性把结果读进内存。当你使用resultSet的时候,其实已经全部进来了,而不是一条条从服务端获取。————使用fetch Size边读边处理的坏处: 服务端占用的资源时间变久了。 ### 查询mysql服务此时的状态 使用 ***show full processlist*** 命令可以查看mysql服务端某些线程的状态 - Sleep 正在等待客户端发送新的请求 - Query 正在执行查询, 或者发结果发给客户端 - Locked 正在等待表锁(注意表锁是服务器层的, 而行锁是存储引擎层的,行锁时状态为query) - Analyzing and statistics 正在生成查询的计划或者收集统计信息 - copying to tmp table 临时表操作,一般是正在做group by等操作 - sorting result 正在对结果集做排序 - sending data 正在服务器线程之间传数据 # 二、查询缓存 - 缓存的查询在sql解析之前进行。 - 缓存的查找通过一个 对大小写敏感的哈希表实现,即直接比对sql字符串。 - 因此只要有一个字节不同,都不会匹配中。(毕竟还没开始解析,大小写什么的他也不知道要不要区分) - 第7章中有更详细的查询缓存。 # 三、查询优化处理 ### 1.语法解析器和预处理 - 这里就是把sql做解析, 变成一个解析树。解析时会做mysql语法规则验证。 - 语法解析器: 检查关键字错误、关键字顺序、引号匹配 - 预处理:和元数据关联校验, 检查数据表和列是否存在,解析名字和别名。 - 权限校验 ### 2.查询优化器(重点) - mysql可能会生成多种计划, 他会分别计算一个预测成本值,然后选一个成本最小的计划 - 计算信息来自于 表的页面个数、索引分布、长度、个数、数据行长度 - 因为多种原因,可能不会选择到最优的计划,有偏差 - 静态优化和动态优化的区别: 静态优化类似“编译期优化”,只和语句结构有关,和具体值无关 动态优化是在运行中去优化的,需要依赖索引行数、where取值,执行次数可能比静态优化要多。 ### mysql的优化类型 - 关联表(join)的顺序可能会变 - outer join可能会变成内连接 - 优化条件表达式, 例如 5=5 AND a>5被简化成a>5 - 优化MAX\MIN, 如果是MAX(索引),那么直接拿B+树的第一条或者最后一条即可。 - 当发现某个查询或者表达式的结果是可以提前计算出来的时候,就会优化成常数 - 索引覆盖,如果只要返回索引列,就不会走到最底层去。 - 子查询优化 - 提前终止查询(例如LIMIT) - 等值传播: join中可能把左表的where 拿给右表一起用 - IN(1,2,3,4,5,6)这个条件, 并不是简单遍历判断, 会先排序,然后用二分去判断是否存在。 ### 3.数据和索引的统计信息 - 统计信息是存储引擎去计算的,不同的存储引擎有不同的统计信息 - 服务器层生成查询计划时,会向存储引擎获取这些信息。 ### 4.MYSQL对关联查询的执行 - join查询的本质其实是读取临时表做关联 - 例如a inner join b on a.id=b.id where a.xx=y 1. 遍历a的每一行(此时a表本质上是 select * from a where a.xx=y) 2. 在那行中a的id被定下来, 那么就会去获取一个临时表,临时表为(select * from b where a.id = id) 3. 接着用这个临时表和a那一行拼接,输出多行。 4. 然后再用这里的结果作为临时表,给更上层的关联去用(嵌套查询的含义)。 - 如果是left join,则就是临时表如果为空,则给a那一行拼接一个null。 ### 5. 执行计划中的join树 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/1654519srrdlcxt2wlsnva.png) ### 6. 关联查询优化器 - join实际执行的顺序会关系到性能 - 例如a\b\c三个表关联, 可能先让a和b关联得到的临时表里的记录只有10条, 而如果让a和c先关联,会有10000条, 那么后面的效率就会截然不同 - EXPLAIN EXTENDED可以展示关联的顺序 - STRAIGHT_JOIN可以手动指定关联顺序 - mysql自己会评估搜索一个最优的顺序, 但如果join表太多,则无法搜完所有结果(O(n!)), 那时候就会采用贪心。 是否使用贪心算法的边界值可以根据optimizer_seartch_depth去指定。 ### 7.排序优化 - 如果排序的量小,就用内存快速排序;如果排序的量大,就用文件排序 - mysql有2种取排序数据的方式: 1. 两次传输排序: 先取要排序的字段加行序号,按照字段排序好之后,再根据行索引一条条取读 优点: 排序时占用内存小。 缺点: 排序之后读的过程会很慢,根据行序号取读不是很方便 2. 单次传输排序: 直接把行读出来(行里只有需要用的列,不一定是整行) ,然后排序 优点: 把全部行读出来相当于顺序IO,读取速度快 缺点: 可能会很大导致需要文件排序 - 关联查询order by的注意事项 如果order by的列 都 来自关联的 第一张 表,则直接第一张表join的时候就排序了。 除此之外!! 都是全部join完,再排序! 就算用了limit,也是全部join+排序后, 再limit的! # 四、查询执行计划 - 执行计划是一个数据结构 # 五、返回结果给客户端 - 用tcp封包并逐步传送,而不是全部准备好再发送。
  • [技术行业前沿] 【数据库系列】当MySQL执行XA事务时遭遇崩溃,且看华为云如何保障数据一致性
    >摘要:当前MySQL所有版本不支持分布式事务的崩溃恢复安全,这严重影响了分布式事务的高可用保障。本文分享自华为云社区[《当MySQL执行XA事务时遭遇崩溃,且看华为云如何保障数据一致性》](https://huaweicloud.blog.csdn.net/article/details/122256746),作者: 华为助力企业上云。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/162707fa80xqljcpmltvt4.png) 华为云数据库内核高级技术专家,拥有十多年MySQL内核研发经验,目前在华为云数据库团队研发华为云数据库(RDS for MySQL和GaussDB(for MySQL))内核特性和服务化特性,修复华为云数据库现网问题;曾在官方MySQL团队研发MySQL内核特性和修复MySQL内核问题九年多,尤其擅长MySQL Replication。 注:本文如没有特殊说明,MySQL指社区版MySQL;binlog指MySQL server日志;redo Log指MySQL InnoDB日志 MySQL replication实时同步主库上执行的事务到备库,并且支持一般事务的崩溃恢复安全,这为一般事务的高可用提供了坚实的保障。如果没有此高可用保障,主库崩溃(不能正常恢复场景)后,数据库服务轻则中断几十分钟甚至几小时,重则丢失用户数据。 但是当前MySQL所有版本不支持分布式事务的崩溃恢复安全,这严重影响了分布式事务的高可用保障。华为云数据库(包括RDS (for MySQL) 和GaussDB (for MySQL))解决了这一痛点,支持分布式事务的崩溃恢复安全,极大地提升华为云数据库的可靠性和可用性。 接下来我们将逐个讨论MySQL在分布式事务崩溃恢复安全方面的几个常见问题,以及华为云数据库采取了什么解决方案来保证数据的一致性。 (如需了解分布式事务,请参考这里:https://dev.mysql.com/doc/refman/8.0/en/xa.html) # 问题一: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/163539znzwiylpc85ubysr.png) 如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后,binlog中保存有准备阶段执行的事务,但是InnoDB回滚了准备阶段执行的事务。**从而导致MySQL server和InnoDB数据不一致**。准备阶段执行的事务会被回放到备库,它获得的所有事务处理过程中使用的锁永远不能被释放。**最终导致备库回放需要获得相关锁的其它事务时锁超时失败,复制中断**。 ## 华为云数据库解决方案 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/163617ud0ph9ioaxqigz6k.png) 如上图流程所示: 1. 如果崩溃发生在阶段一,主库重启后,这个分布式事务准备阶段**既不在MySQL server中,也不在InnoDB中**; 2. 如果崩溃发生在阶段二,主库重启恢复过程中这个分布式事务准备阶段会被InnoDB回滚掉,最终这个分布式事务准备阶段**既不在MySQL server中,也不在 InnoDB**; 3. 如果崩溃发生在阶段三,主库重启后,这个分布式事务准备阶段**既存在MySQL server中,也存在InnoDB中**; **所以,无论崩溃发生在上图中的哪一点,主库重启后,华为云数据库都能保证MySQL server和InnoDB数据的一致性。** # 问题二: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/163723jemh7w2fiv5ei41p.png) 如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后,binlog保存有XA COMMIT xid, 但是MySQL InnoDB没有提交这个分布式事务。 - 如果不重新提交,那么在准备阶段获得的所有事务处理过程中使用的锁永远不能被释放,**最终导致主库执行需要获得相关锁的其它事务时锁超时失败;** - 如果重新提交,XA COMMIT xid再次被持久化到binlog,**备库在回放第二个XA COMMIT xid时抛出“Unknown XID”错误,导致复制中断。** ## 华为云数据库解决方案 主库在重启的过程中**以binlog作为仲裁**提交了这个分布式事务准备阶段执行的事务,**保证了华为云数据库MySQL server和MySQL InnoDB数据的一致性**。 # 问题三: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/163858adh4iqhu4aekleul.png) 如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后, binlog保存有XA ROLLBACK xid,但是MySQL InnoDB没有回滚这个分布式事务。 - 如果不重新回滚,这个分布式事务准备阶段获得的所有事务处理过程中使用的锁永远不能被释放,**最终导致主库执行需要获得相关锁的其它事务时锁超时失败**; - 如果重新回滚,XA ROLLBACK xid再次被持久化到binlog,**备库在回放第二个XA ROLLBACK xid时抛出“Unknown XID”错误,导致复制中断**。 ## 华为云数据库解决方案 主库在重启的过程中以**binlog作为仲裁**回滚了这个分布式事务准备阶段执行的事务,**保证了华为云数据库MySQL server和MySQL InnoDB数据的一致性**。 # 问题四: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/164239imvwzp026o9xsfij.png) 如上图所示:如果崩溃发生在危险区间段内的任意一点,主库重启后,binlog中保存有一阶段提交分布式事务,但是MySQL InnoDB回滚了这个一阶段提交分布式事务。从而导致MySQL server和MySQL InnoDB数据不一致。一阶段提交的分布式事务会被回放到备库,**最终导致备库数据和主库数据的不一致**。 ## 华为云数据库解决方案 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/07/164301rajtrk1bditvqtlb.png) 如上图所示: 1. 如果崩溃发生在阶段一,主库重启后,这个一阶段提交分布式事务**既不在MySQL server中,也不在MySQL InnoDB中**; 2. 如果崩溃发生在阶段二,主库重启恢复过程中这个一阶段提交分布式事务会被MySQL InnoDB回滚掉,最终这个分布式事务**既不在MySQL server中,也不在MySQL InnoDB中**; 3. 如果崩溃发生在阶段三,主库重启后,这个一阶段提交分布式事务**既存在MySQL server中,也存在MySQL InnoDB中**; **无论崩溃发生在上图中的哪一点,主库重启后,华为云数据库都能保证MySQL server和MySQL InnoDB数据的一致性。** 华为云数据库很好地解决了分布式事务崩溃恢复安全的相关问题,极大地提升数据库的可靠性和可用性,提升了用户使用华为云数据库的体验。后续我们会持续在分布式事务方面做更多的优化和解决MySQL可能遇到的问题,也欢迎大家使用华为云数据库分布式事务,体验华为云数据库卓越的可靠性和可用性,期待您的反馈!
  • [基础组件] 【MRS3.1.2产品】【CDL组件功能】CDL监控MySQL数据生产到Kafka
    【功能模块】创建CDL作业-MySQL--kafka,任务可以成功运行,且能够监控MySQL新增的数据,生产到Kafka中【操作步骤&问题现象】问题一、①MySQL中insert的时间类型的数据是2021-01-01 00:00:00②生产到Kafak的对应字段的数据变成了2020-12-31T16:00:00Z,时间出现了晚一天现象问题二、①在创建CDL作业的时候,Mysql的配置信息,Schema Auto Create我选择了否②然后消费kafka的数据发现还有大量的Schema信息被生产到Kafka中,希望的是不需要额外大量没有用处的信息
  • [知识分享] CCE proxysql+mysql 实现MySQL主从读写分离
    >**摘要:本文基于华为云CCE部署 Proxysql + Mysql,实现数据库主从读写分离,部署过程涉及到数据库的持久化存储、数据库配置文件的Configmap挂载、CCE环境变量设置、CCE的服务(ClusterIP,负载均衡)设置。详细内容可阅读文章了解** # 目录 > 1.部署架构图 > 2.组件简介 > 3.部署前提 > 4.部署MySQL主从 >> 4.1 通过配置项configmap创建MySQL master的配置文件 >> 4.2 通过配置项configmap创建MySQL slave的配置文件 >> 4.3 创建MySQL master工作负载 >> 4.4 创建MySQL slave工作负载 >> 4.5 MySQL master配置 > 5.部署proxySQL >> 5.1 通过配置项configmap创建proxysql的配置文件 >> 5.2 创建proxySQL 工作负载 >> 5.3 proxySQL配置数据库读写分离 >> 5.4 proxySQL另一实例配置 > 6.验证 >> 6.1 验证MySQL读写分离 >> 6.2 验证proxysql 负载均衡 > 7.FAQ >> 7.1 通过负载均衡数据库后,SQL语句执行报错 >> 7.2 数据库连接报 1251 错误 >> 7.3 ELB 负载均衡后连接失败 ## 1.部署架构图 ![部署架构图.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/27/094936myiwnsv6dtwcffmp.png) ## 2.组件简介 **MySQL**:关系型数据库,按照数据结构来组织、存储和管理数据的仓库 **proxySQL**:proxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配置、故障切换和一些 SQL的过滤功能。默认管理连接端口6032,数据库连接端口 3306。 ## 3. 部署前提 - 具备可使用的CCE集群以及CCE节点 - CCE购买参考:https://support.huaweicloud.com/usermanual-cce/cce_01_0028.html ## 4. 部署MySQL主从 ### 4.1 通过配置项configmap创建MySQL master的配置文件 - MySQL主my.cnf文件 - CCE控制台,进入配置中心下的配置项ConfigMap,点击创建配置项,如下图所示 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/190127w1kmrgxzdo5a2t9s.png) - my.cnf mysql-master配置内容如下: ```shell [mysqld] pid-file=/var/run/mysqld/mysqld.pid socket=/var/run/mysqld/mysqld.sock datadir=/var/lib/mysql secure-file-priv= NULL server-id=101 ##用于高可用区分服务的ID,MySQL主从ID不一致即可 log-bin=master-binlog ``` ### 4.2 通过配置项configmap创建MySQL slave的配置文件 - MySQL主my.cnf文件 - CCE控制台,进入配置中心下的配置项ConfigMap,点击创建配置项,如下图所示 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/191149iadp7anvbyfcly6i.png) - my.cnf mysql-slave配置内容如下: ```shell [mysqld] pid-file=/var/run/mysqld/mysqld.pid socket=/var/run/mysqld/mysqld.sock datadir=/var/lib/mysql secure-file-priv= NULL server-id=102 ##用于高可用区分服务的ID,MySQL主从ID不一致即可 log-bin=master-binlog ``` - 说明:配置文件内的其他参数可自行设置,当前仅为演示,未进行其他配置。 ### 4.3 创建MySQL master工作负载 - 进入华为云CCE控制台,工作负载下的有状态工作负载界面,点击创建有状态工作负载 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/1915430noeucaifvpvqqb1.png) - 创建MySQL master负载-工作负载基本信息 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/19180224eqsuvpspq4jsgm.png) - 创建MySQL master负载-容器设置-step1-开源镜像中心:MySQL 8.0 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/192057jgzuivr73ain1a6r.png) - 创建MySQL master负载-容器设置-step2-环境变量:设置MySQL密码 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/192243vlex7wfvmfidjgvr.png) - 创建MySQL master负载-容器设置-step3-数据存储:mysql-master-cnf挂载 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/17/1455134djzm8gdhtvvmpgh.png) - 创建MySQL master负载-容器设置-step4-数据存储:挂载SFS存储MySQL数据 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/193230fgpzuvtf39txk0vs.png) - 创建MySQL master负载-工作负载访问设置-实例间发现服务:访问端口3306 - 创建MySQL master负载-工作负载访问设置-服务:节点访问,节点模式,访问端口3306,访问端口自动生成 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/19373203snpsxkzedahrrd.png) - 创建MySQL master负载-高级设置保持默认即可,点击创建 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/1941349jgmk1ucgzbfl3id.png) ### 4.4 创建MySQL slave工作负载 - 进入华为云CCE控制台,工作负载下的有状态工作负载界面,点击创建有状态工作负载 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/1915430noeucaifvpvqqb1.png) - 创建MySQL slave负载-工作负载基本信息 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/194841zp1ulzuw0nb4gafg.png) - 创建MySQL slave负载-容器设置-step1-开源镜像中心:MySQL 8.0 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/192057jgzuivr73ain1a6r.png) - 创建MySQL slave负载-容器设置-step2-环境变量:设置MySQL密码 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/192243vlex7wfvmfidjgvr.png) - 创建MySQL slave负载-容器设置-step3-数据存储:mysql-slave-cnf挂载 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/17/145606msiofmx76xxwu6pi.png) - 创建MySQL slave负载-容器设置-step4-数据存储:挂载SFS存储MySQL数据 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/193230fgpzuvtf39txk0vs.png) - 创建MySQL slave负载-工作负载访问设置-实例间发现服务:访问端口3306 - 创建MySQL slave负载-工作负载访问设置-服务:节点访问,节点模式,访问端口3306,访问端口自动生成 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/30/1116283eob8kvwl9napvdg.png) - 创建MySQL slave负载-高级设置:设置与MySQL master负载的反亲和性 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/195501mmk3v2xjxbi2aszc.png) - 创建负载 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/195631qvj4a54jsrp5rcjn.png) ### 4.5 MySQL master配置 - 登录MySQL master数据库,查看配置项是否生效 ```sql show variables like '%server%'; show variables like '%log_bin%'; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/200750aiejouy4e64sv0y8.png) - 新建主库的复制账号并授权 ```sql CREATE USER 'backup'@'%' IDENTIFIED BY 'backupmima'; ## 8.0数据库请使用 CREATE USER 'backup'@'%' IDENTIFIED WITH mysql_native_password BY 'backupmima'; GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%'; SHOW GRANTS FOR 'backup'@'%'; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/201919ufpqbjr775flckt9.png) - 主数据库 master status ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/2035376k9rmw3nbhq8kmnt.png) - 登录MySQL slave数据库,查看配置项是否生效 ```sql show variables like '%server%'; show variables like '%log_bin%'; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/090248wqtzsilezjguoa4y.png) - MySQL slave增加MySQL master连接配置信息。 ```sql CHANGE master to master_host='mysql-master.default.svc.cluster.local', master_user='backup', master_password='backupmima', master_port=3306, master_log_file='master-binlog.0000003', master_log_pos=1186, master_connect_retry=30; ``` **说明** master_host='mysql-master.default.svc.cluster.local' 为MySQL master服务集群内网IP ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/102643lwxxpzejdcc6ugxh.png) master_user='backup',master_password='backupmima' 为复制数据库的账号和密码 master_log_file='master-binlog.0000003', 为MySQL master的binlog文件 master_log_pos=1186, 为MySQL master的Posistion值 master_connect_retry=30 主节点宕机,从服务器的尝试连接时间 - MySQL slave开启设置复制 ```sql start slave; show slave status \G; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/103436jzzbg5ppgzics0gn.png) - 测试数据复制 登录MySQL master执行以下命令: ```sql CREATE databases test; USE test; CREATE table test(name char(10),age int(3)); ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/104901ayenkaf4wtykwrdp.png) 登录MySQL slave执行以下命令: ```sql SHOW databases; USE test; SHOW tables; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/105145rwro4ess0zvrstws.png) ## 5. 部署proxySQL ### 5.1 通过配置项configmap创建proxysql的配置文件 - proxysql proxysql.cnf文件 - CCE控制台,进入配置中心下的配置项ConfigMap,点击创建配置项,如下图所示 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/26/162238wylb99u9y6gkmhrz.png) - proxysql.cnf 配置内容如下: ```shell datadir="/var/lib/proxysql" admin_variables = { admin_credentials="admin:admin" mysql_ifaces="0.0.0.0:6032" refresh_interval=2000 cluster_username="admin" cluster_password="admin" cluster_check_interval_ms=200 cluster_check_status_frequency=100 cluster_mysql_query_rules_save_to_disk=true cluster_mysql_servers_save_to_disk=true cluster_mysql_users_save_to_disk=true cluster_proxysql_servers_save_to_disk=true cluster_mysql_query_rules_diffs_before_sync=1 cluster_mysql_servers_diffs_before_sync=1 cluster_mysql_users_diffs_before_sync=1 cluster_proxysql_servers_diffs_before_sync=1 } mysql_variables= { monitor_password="monitor" monitor_galera_healthcheck_interval=1000 threads=2 max_connections=2048 default_query_delay=0 default_query_timeout=10000 poll_timeout=2000 interfaces="0.0.0.0:3306;0.0.0.0:33062" default_schema="information_schema" stacksize=1048576 connect_timeout_server=10000 monitor_history=60000 monitor_connect_interval=20000 monitor_ping_interval=10000 ping_timeout_server=200 commands_stats=true sessions_sort=true have_ssl=false ssl_p2s_ca="" ssl_p2s_cert="" ssl_p2s_key="" ssl_p2s_cipher="ECDHE-RSA-AES128-GCM-SHA256" } ``` ### 5.2 创建proxySQL 工作负载 - 进入华为云CCE控制台,工作负载下的有状态工作负载界面,点击创建有状态工作负载 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/23/1915430noeucaifvpvqqb1.png) - 创建proxysql负载-工作负载基本信息 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/11080086amfqno5mercjpu.png) - 创建proxysql负载-容器设置-step1-我的镜像:proxysql:V2.0 **说明** 镜像来源 https://registry.hub.docker.com/r/percona/proxysql 推送到华为云镜像仓库 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/1129168qee04mcz6rhn5na.png) - 创建proxysql负载-容器设置-step2-数据存储:挂载Configmap 配置文件 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202201/17/150217dfjxdclbkeqgw6lx.png) - 创建proxysql负载-容器设置-step2-数据存储:挂载SFS存储proxysql数据 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/111917qosglhsbfjqdne9t.png) - 创建proxysql负载-工作负载访问设置-实例间发现服务:访问端口3306 - 创建proxysql负载-工作负载访问设置-服务:负载均衡,节点级别,容器端口3306、访问端口3306 **说明**:负载均衡配置完成后,服务器安全组需要开放 100.125.0.0/16 网段的安全组入方向规则 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/0925089keqqfz7gylxqsah.png) - 创建proxysql负载-高级设置保持默认即可,点击创建 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/113148zcohbogbgbxriiwe.png) ### 5.3 proxySQL配置数据库读写分离 - 5.3.1 MySQL master创建用于proxysql连接的用户(用户数据会同步到从库) ```sql CREATE USER 'proxysql'@'%' IDENTIFIED with mysql_native_password BY 'proxysqlmima'; GRANT ALL ON *.* TO 'proxysql'@'%'; flush privilrges; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/143605jaemctvoc5opepwt.png) - 5.3.2 MySQL master创建用于proxysql健康监测的用户(用户数据会同步到从库) ```sql CREATE USER 'monitor'@'%' IDENTIFIED with mysql_native_password BY 'monitormima'; GRANT SELECT ON *.* TO 'monitor'@'%'; flush privilrges; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/1446328z3xdhx1r70jhwzw.png) ------------ - 5.3.3 登录proxysql 配置mysql_server 信息 **说明**:分别插入mysql的节点信息,10表示master(写),20表示slave(读) ```sql mysql -h 127.0.0.1 -P 6032 -u admin -p insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(10,'mysql-master.default.svc.cluster.local',3306,1,'master'); insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(20,'mysql-slave.default.svc.cluster.local',3306,1,'slave'); ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/154516tvzmtgyx7fcwrhqp.png) **字段说明**: hostgroup_id:一个组ID,组内可包含多个MySQL地址 hostname:MySQL访问地址 port:访问端口 weight:访问权重 comment:文本,用于备注节点信息 **生效配置并把配置保存到磁盘** ```sql load mysql servers to runtime; save mysql servers to disk; ``` ------------ - 5.3.4 登录proxysql 配置mysql_users 信息 **说明**:proxysql 通过6032链接管理接口,默认账号密码为 admin/admin ```sql mysql -h 127.0.0.1 -P 6032 -u admin -p insert into mysql_users(username,password,default_hostgroup,transaction_persistent)values('proxysql','proxysqlmima',10,1); ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/160043cikqzw5ajpzhcosl.png) **字段说明** sername、password:proxysql连接MySQL的用户和密码 default_hostgroup:没有匹配到规则的SQL直接访问这个ID内的数据库 transaction_persistent:一个事务内的多条 SQL,只会路由到一个主机组中 **生效配置并把配置保存到磁盘** ```sql load mysql users to runtime; save mysql users to disk; ``` ------------ - 5.3.5 登录proxysql 配置MySQL路由规则 ```sql insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) values(1,1,'^SELECT.*FOR UPDATE$',10,1); insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) values(2,1,'^SELECT',20,1); insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) values(3,1,'^SHOW',20,1); ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/164403ynkzyf7ovzeavsdo.png)![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/164432qj4je5xxqw7lkd7z.png) **字段说明** rule_id:规则ID active:设置为1时,为启用规则 match_digest:SQL匹配的规则 destination_hostgroup:将匹配的规则路由到这个主机组 apply:设置为1时,在匹配和处理此规则后,将不再评估进一步的查询 ```sql load mysql query rules to runtime; save mysql query rules to disk; ``` -------- - 5.3.6 配置数据库健康监测账号 ```sql set mysql-monitor_username='monitor'; set mysql-monitor_password='monitormima'; ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/1721094xqmf6aiwh6imub8.png) **生效配置并把配置保存到磁盘**. ```sql load mysql variables to runtime; save mysql variables to disk; ``` ### 5.4 proxySQL另一实例配置 **按照同样的方法进行另一实例proxysql的配置** **说明**:也可通过proxySQL集群的方式进行部署。实现各个proxysql之间的数据同步 ## 6. 验证 ### 6.1 验证MySQL读写分离 - proxysql连接数据并执行以下命令 ```sql mysql -h 127.0.0.1 -P 3306 -u proxysql -p ##使用proxysql 连接数据库 show databases; use test; show tables; DESC test; insert into test(name,age) values('caichunfu',10); ``` ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/173602du1lbphz5iuucl8e.png) - proxysql 连接管理接口,查看路由记录; stats_mysql_query_digest:通过ProxySQL路由出去的各类查询相关统计数据 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/174711em4itjujdgssvo9e.png) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/24/175845kyrwxg0udnh8rblq.png) ### 6.2 验证proxysql 负载均衡 - 查看Proxysql的访问方式 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/1714581oly4iuhjevemgmq.png) 访问方式为 124.71.75.74:3306 - 使用navicat 连接查看数据库 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/171723nfwggjsbe11z53wo.png) - 验证负载均衡能力-step1 连接进入数据 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/172028ljypx3incnc3ijcz.png) - 验证负载均衡能力-step2 轮流删除实例,验证Proxysql负载均衡能力 **删除一个实例** ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/175251wavx7qbia0ephehi.png) **验证** ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/1756085fjlbo2ytbrmppus.png) **删除另一个实例** ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/175717qdfwdhlh9aaggqfe.png) **验证** ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/25/1756085fjlbo2ytbrmppus.png) ## 7 FAQ ### 7.1 通过负载均衡数据库后,SQL语句执行报错。 [Error] 9006 - ProxySQL Error: connection is locked to ...... 解决办法:登录proxysql管理端,执行以下命令 ```sql set mysql-set_query_lock_on_hostgroup=0; load mysql variables to runtime; save mysql variables to disk; ``` ### 7.2 数据库连接报 1251 错误 [Error] 1251 Client does not.... 解决办法:MySQL8.0的密码加密规则修改为mysql_native_password ```sql ALTER USER 'proxysql'@'%' IDENTIFIED WITH mysql_native_password BY 'proxysqlmima'; #修改加密规则 ALTER USER 'proxysql'@'%' IDENTIFIED BY 'proxysqlmima' PASSWORD EXPIRE NEVER; #更新一下用户的密码 FLUSH PRIVILEGES; ``` ### 7.3 ELB 负载均衡后连接失败 解决办法:安全组入方向放通 100.125.0.0/16 网段的安全组
  • [技术干货] 五篇关于opengauss的文章链接
    本人参加第三届openGauss技术文章征集活动,已经有5篇参加评选,希望大家能到CSDN和墨天轮论坛上多多帮忙点赞,多谢。CSDN:【参赛作品8】mysql迁移openGauss遇到的问题和解决办法:https://blog.csdn.net/GaussDB/article/details/121928578?spm=1001.2014.3001.5501【参赛作品9】flask+echarts+openGauss和mysql的区别:https://blog.csdn.net/GaussDB/article/details/121945085?spm=1001.2014.3001.5501【参赛作品69】参加《每日一练:openGauss数据库在线实训课程》活动的感想:https://blog.csdn.net/GaussDB/article/details/122123496?spm=1001.2014.3001.5501【参赛作品95】DLI Flink SQL+kafka+(opengauss和mysql)进行电商实时业务数据分析:https://blog.csdn.net/GaussDB/article/details/122143186?spm=1001.2014.3001.5501【参赛作品96】使用node.js测试连接opengauss:https://blog.csdn.net/GaussDB/article/details/122143241?spm=1001.2014.3001.5501墨天轮:mysql迁移openGauss遇到的问题和解决办法:https://www.modb.pro/db/174196flask+echarts+openGauss和mysql的区别:https://www.modb.pro/db/174198参加《每日一练:openGauss数据库在线实训课程》活动的感想:https://www.modb.pro/db/218685使用node.js测试连接opengauss:https://www.modb.pro/db/222635DLI Flink SQL+kafka+(opengauss和mysql)进行电商实时业务数据分析:https://www.modb.pro/db/222656
  • [知识分享] 【数据库系列】GaussDB(for MySQL)如何快速创建索引?华为云数据库资深架构师为您揭秘
    >摘要:云服务环境下,如何解决客户基于大量数据创建索引的性能问题,成为云服务厂商的一个挑战。华为云GaussDB(for MySQL)通过引入并行创建索引技术,很好地解决了批量索引创建和临时添加索引等性能瓶颈问题,帮助用户更快建立好索引。想要进一步了解快速创建索引的秘诀,请不要错过本文。本文分享自华为云社区[《GaussDB(for MySQL)如何快速创建索引?华为云数据库资深架构师为您揭秘》](https://bbs.huaweicloud.com/blogs/300350?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=database&utm_content=content),作者:华为云数据库资深架构师苏斌。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/17/104111u3mwioirlvzicgzc.png) 苏斌,华为云数据库资深架构师,拥有16年数据库内核研发经验,之前作为MySQL官方InnoDB团队主要研发人员,参与和主导了多个重要特性的开发和发布。目前在华为公司负责和参与华为云RDS主要产品RDS for MySQL和GaussDB(for MySQL)内核功能的设计和研发。 # 导读 云服务环境下,如何解决客户基于大量数据创建索引的性能问题,成为云服务厂商的一个挑战。华为云GaussDB(for MySQL)通过引入并行创建索引技术,很好地解决了批量索引创建和临时添加索引等性能瓶颈问题,帮助用户更快建立好索引。想要进一步了解快速创建索引的秘诀,请不要错过本文。 # 关于MySQL索引 我们都知道,数据库使用索引技术加快数据的查询。MySQL数据库也支持若干种索引结构提高查询的性能(参见MySQL文档:https://dev.mysql.com/doc/refman/8.0/en/create-index.html),其中使用最广泛的是B+tree索引,因为B+tree索引在查询和修改的性能之间有很好的平衡,同时其存储和维护的代价也是比较优的。 MySQL的表本身由聚簇索引(必须是B+tree索引)表示,再加上若干个二级索引,包括B+tree索引,共同组成一个MySQL的独立表,可以说MySQL的表是由一组索引共同组成的。我们都知道索引是一把双刃剑,充分的索引可以更好地提升可以适配的查询的性能,但是需要维护这些索引使得其和数据同步,所以在数据修改操作阶段,更多的索引也会带来更高的开销。索引创建与否的权衡通常是动态的,用户不一定能做到在表定义之初就知道需要建立哪些索引,需要随着业务的发展变化而调整索引,这也带来了动态索引创建的一些问题。 # MySQL的索引创建逻辑 我们先看一下MySQL索引创建的逻辑。首先,MySQL索引的创建可以使用两种不同的DDL(Data Definition Language: 数据定义语言)算法来实现。第一种是COPY算法,它非常低效,就是在两个表之间进行数据拷贝,来完成表结构相关的修改,尤其是它要求加表锁,现在基本不使用了。第二种是INPLACE算法,该算法不要求加锁,因此很多DDL操作是不阻塞DML(Data Manipulation Language: 数据操纵语句)操作的,比如创建索引。该算法具体的实现在存储引擎层面完成,可以进行更多的优化。实际上DDL语句还有一种INSTANT算法,但是它无法支持创建索引操作,这里不展开介绍。 对于INPLACE算法,在5.7版本之前,是采用索引记录不断地向建好的空索引插入的方式。由于插入的数据的无序性,该方法导致了明显的性能问题和潜在的空间浪费。在5.7版本以后,MySQL优化了建索引步骤,将其改进为对已排序的索引记录进行自底向上批量插入并且紧凑拼装的创建方式,如果有多个索引要创建,会单独对每个索引执行相同的算法。新的算法会经历读取数据、排序数据和创建索引这几个主要步骤。 总体而言,创建索引这类DDL操作,会比普通的DML等操作要费时,而该类DDL耗时会导致用户在继续动态添加索引加速查询的时候,需要等待很长的时间,极大影响业务;而且用户的MySQL实例开启了Binlog复制,耗时的DDL操作容易引起备库的长时间落后。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/17/104145g6lg3pvm0f1pbdvb.png) MySQL的创建索引流程图 # 云化场景下索引创建的问题 随着越来越多用户把数据托管在云服务上,以及用户数据量的不断增长,前述的动态添加索引导致的问题非常影响用户体验。同时客户的单表数据逐渐达到几TB甚至几十TB,客户对创建索引太慢所带来的性能问题的抱怨越来越多,尤其是创建索引周期如果太长,我们可能很难找到一段合适的业务低峰期来动态创建索引,避免业务的波动。因此,如何在云服务环境下,解决客户基于大量数据创建索引的性能问题,成为云服务厂商的一个挑战。 在云化场景下,还有一个主要场景对客户的体验非常重要。我们知道客户的业务要迁移上云,需要对数据进行大规模的迁移(华为云提供了数据复制服务DRS工具支持各类数据迁移场景),数据迁移比较高效的方式为: 1. 逻辑导出源端数据 2. 在目标端建表(注意,表不含二级索引) 3. 将源端导出的数据插入到目标端 4. 对目标端的表建立二级索引 如果涉及动态数据同步,相关步骤会更复杂一些,由于和该主题无关,这里不展开。以上步骤中,需要重点注意的是步骤2和4,在目标端创建表的时候先不创建二级索引。这个优化对性能影响很大,尤其是一个表有很多二级索引的场景。我们知道Btree索引的插入如果是有序的,对插入性能和结果的空间利用率是最好的,因为Btree索引的分裂会在插入区域的尾部产生,同时由于分裂算法的优化,分裂产生的页面填充率会比较高;相反地,如果是随机插入,尤其是并发地随机插入,很容易导致Btree索引在不同的节点进行分裂,并且分裂后的页面填充率都处于一个半满的状态,导致Btree最终的一个膨胀。 有了这个背景之后,我们就容易理解上面的问题,插入表数据的时候,我们屏蔽了二级索引,等所有数据都准备好了,再采用批量建立索引的方式创建二级索引,这对于二级索引创建效率是最高的。如果不这么做,每插入一条记录,就要去插入相应的二级索引,那么二级索引就是一个无序的随机插入,并发起来性能会变差很多。 虽然在数据同步准备好后,批量创建二级索引是一个有效的方案,但是如果数据量很大,这么创建二级索引还是非常耗时,导致客户在数据迁移完之后需要等待很长时间才能开展业务,这个等待周期可能是小时甚至天级别的。虽然可以考虑表级别的并发创建索引,但是这个方法也有明显的缺点:应用场景有限,要求有多表;以及表和表之间的并发其实不是一个最有效的并发形式,相互影响比较大。 # GaussDB(for MySQL)如何快速创建索引? 综上所述,在创建索引这个点上存在两个性能瓶颈点:一个是用户迁移数据之后的批量索引创建;第二个是用户临时需要添加一个二级索引。无论哪个点,我们都需要更快的建立好索引,提升用户的使用体验。 华为云GaussDB(for MySQL)引入了**并行创建索引的技术**,它改进了社区版MySQL创建索引只用单线程的问题,以此提高创建索引的效率,并一起解决了前述两个痛点。前面提到的社区版创建索引逻辑是单线程的,首先存在资源利用率不够饱满的问题;其次创建索引过程是CPU和IO开销交替进行的过程,在做一个操作的时候,即使不是资源竞争的操作也只有等待。多线程创建索引可以充分利用CPU和IO资源,同时有的线程在做CPU计算时,别的线程可以并发的做IO操作。 GaussDB(for MySQL)使用的并行创建索引,是一个全链路的并行技术。前面提到,创建索引包含了若干个阶段,我们的并行创建算法,对这里的每个阶段都做并行处理,从读取数据、排序、到创建索引,都是并行操作,每一步都由指定的N个线程并发处理。它的逻辑如下图所示: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/17/1042268g6a9qump3cckxaj.png) GaussDB(for MySQL)尤其对数据的归并排序做了多种优化,使得我们常规的归并排序能够充分的并行,充分利用CPU、内存和IO的资源。在并行创建索引之后的合并步骤,也使用了一套简化的算法,正确处理各种索引结构的场景。 # 支持的索引和场景 GaussDB(for MySQL)的并行创建索引功能,目前支持的索引为Btree二级索引。对于virtual index二级索引,将会在不久的将来提供全面的支持,而MySQL的spatial index和fulltext index不在该并行创建索引覆盖范围内。 特别要注意的是,主键索引的创建目前也是不支持并行的,因此如果一个并行创建索引的SQL语句包含创建主键索引,或者前面提及的spatial index与fulltext index,那么客户端将会收到一个告警,提示该操作不支持并行创建索引,同时该语句会采用单线程创建索引的方式执行完成。 从SQL语句的角度,如前所述,创建索引可以采用不同的算法,由于COPY算法(ALGORITHM=COPY)不是采用批量插入的方式,因此不会受益于该并行创建索引优化。而对于INPLACE算法,如果创建索引用的是非rebuild的方式,都可以受益于该优化;一旦需要使用rebuild的方式创建索引,因为涉及到主键索引的建立,将无法使用并行创建索引的算法。 # 示例 下面我们通过几个实例来了解一下如何使用并行创建索引算法加快创建速度,以及我们的条件约束是如何生效的。 1、我们使用sysbench的表,表内有1亿条数据 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/17/104249vvlkscshiuxzjsvr.png) 2、在该表的k字段建索引,采用社区默认单线程,耗时146.82s ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/17/104256jqwmjqlyvhq0kb5k.png) 3、通过设置innodb_rds_parallel_index_creation_threads = 4启用4个线程建索引,可以看到建索引耗时38.72s,速度提升3.79倍。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/17/104304xxanpkukqudyeqza.png) 4、假设我们要修改主键索引,虽然指定了多线程,但是会收到一个warning,实际上只能通过单线程建索引 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/17/104314qvogmsmxb5yxkuvw.png) # 注意事项 首先对innodb_rds_parallel_index_creation_threads这个参数进行一下说明,它控制了系统中所有并行DDL可以使用的总线程数,取值范围是[1-128]。该参数取值为1表示使用原始的单线程创建索引,取值为N,表示接下来的DDL使用N个线程创建。如果一个DDL使用了100个线程在执行,那么另外一个也要使用并行的DDL且最多只能使用剩下的28个线程;而如果128个线程都被并行DDL语句占用了,新来的DDL只能走原始的单线程创建的逻辑。 虽然该并行创建索引加快了索引的创建速度,但是在具体使用场景下,还是需要有审慎的评估。我们知道在并行算法应用之后,该DDL对硬件资源的使用会尽可能的充分,这也意味着其它操作就得不到太多的资源了。因此,针对不同的场景需要具体地分析,它决定了我们如何创建索引。 对于迁移场景,由于这时候还没有任何业务接入,用户希望尽快完成所有索引的创建,因此可以尽量设置多线程数,比如我们是16核规格的实例,那么我们就可以把并行线程的数量指定为16,加速完成操作。 如果是用户业务运行阶段要创建索引,我们还是不希望DDL操作,对正在运行的业务如DML操作等有太多的影响。因此,这时候创建索引可以指定相对少一些的线程数量,比如2-4(或者根据CPU规格以及负载决定,同时不鼓励并发地执行多个DDL操作)。这样既能相对地加速创建索引的进程,也能保证DML的正常进行。 综上所述,GaussDB(for MySQL)支持了并行创建索引,通过缩短创建索引使用的时间,很好地解决了客户关切的两类问题,提升了客户的体验。但技术无止境,在创建索引领域,还有其它的问题需要我们优化解决,例如如何减少创建索引步骤对IO的影响等等。我们后续会针对这些点进行优化,给客户带来更多的惊喜。 目前,华为云GaussDB(for MySQL) 并行创建索引优化功能已上线,欢迎大家前往华为云官网体验:https://www.huaweicloud.com/product/gaussdb_mysql.html
总条数:1406 到第
上滑加载中