首页 文章 精选 留言 我的

精选列表

搜索[数据传输服务],共10027篇文章
优秀的个人博客,低调大师

MySQL 数据传输参数设置对数据一致性的影响

作者通过全面系统的测试,揭秘 lower_case_table_names 设置对数据一致性的影响。 作者:刘安 爱可生测试团队成员,主要负责 DTLE 开源项目相关测试任务,擅长 Python 自动化测试开发。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 背景 最近有客户询问:源端 MySQL 和目标端 MySQL 的 lower_case_table_names 的配置不一致时,DTLE 是否能正常同步数据? 本文就这个问题测试一下 lower_case_table_names 的设置对 DTLE 同步数据的影响。 为了简化场景这里只讨论 Linux 环境下 lower_case_table_names 配置为 0 或 1 的情况。 环境准备 部署 DTLE 4.23.04.2 两个 MySQL 实例,lower_case_table_names 配置不同 # lower_case_table_names=0 $ dbdeployer deploy single 5.7 --port 3306 --sandbox-directory sandbox --port-as-server-id --remote-access % --bind-address 0.0.0.0 -c skip-name-resolve -c binlog_format=ROW -c binlog_row_image=FULL -c log_slave_updates=ON --gtid -c lower_case_table_names=0 # lower_case_table_names=1 $ dbdeployer deploy single 5.7 --port 3306 --sandbox-directory sandbox --port-as-server-id --remote-access % --bind-address 0.0.0.0 -c skip-name-resolve -c binlog_format=ROW -c binlog_row_image=FULL -c log_slave_updates=ON --gtid -c lower_case_table_names=1 第一种情况 源端 MySQL @@lctn=0 目标端 MySQL @@lctn=1 根据 DTLE 的开发文档 可知,此种情况下的 DTLE 行为: 源端按原大小写执行。 目标端收到 BinlogEntry - DML/DDL 按原大小写执行,MySQL 会自动转为小写。 以下是执行一些典型 SQL 的数据同步结果: 源端 SQL 与数据 目标段数据 CREATE DATABASE ACTION_DB; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ******<br>Database: ACTION_DB mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br>Database: dtle<br/> CREATE TABLE ACTION_DB.A(id int(11)) <br/>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: A mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a INSERT INTO ACTION_DB.A VALUES (1); <br><br>mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 ALTER TABLE ACTION_DB.A ADD D CHAR(20); <br><br>mysql> SHOW CREATE TABLE ACTION_DB.A\G <br>****** 1. row ****** <br>Table: A <br><br>Create Table: CREATE TABLE `A` ( <br>`id` int(11) DEFAULT NULL, <br>`D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 mysql> SHOW CREATE TABLE ACTION_DB.A\G <br>****** 1. row ****** <br>Table: A <br><br>Create Table: CREATE TABLE `a` (<br/>`id` int(11) DEFAULT NULL, <br/>`D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 ALTER TABLE ACTION_DB.A RENAME TO ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: B mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: b DROP TABLE ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>Empty set (0.00 sec) mysql> SHOW TABLES\G <br>Empty set (0.00 sec) 可以看到 DTLE 同步后的数据是符合预期。在源端 MySQL 与 SQL 的大小写一致,在目标端 MySQL 自动转为小写。 接下来看一些极端情况: 源端 SQL 和数据 目标端数据 CREATE DATABASE ACTION_DB; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: ACTION_DB mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br/>Database: dtle CREATE DATABASE action_db; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: ACTION_DB <br>****** 2. row ****** <br>Database: action_db mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br>Database: dtle CREATE TABLE ACTION_DB.A(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> use ACTION_DB <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: A mysql> use action_db <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br/>Tables_in_action_db: a CREATE TABLE ACTION_DB.a(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> use ACTION_DB <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: A <br>****** 2. row ****** <br>Tables_in_ACTION_DB: a mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a CREATE TABLE action_db.A(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br> mysql> USE action_db <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: A mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a CREATE TABLE action_db.a(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> USE action_db <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: A <br>****** 2. row ****** <br>Tables_in_action_db: a mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a INSERT INTO ACTION_DB.A VALUES (1); <br><br>mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 INSERT INTO ACTION_DB.a VALUES (2); <br><br> mysql> SELECT * FROM ACTION_DB.a\G <br>****** 1. row ****** <br>id: 2 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 <br>****** 2. row ****** <br>id: 2 INSERT INTO action_db.A VALUES (3); <br><br>mysql> SELECT * FROM action_db.A\G <br>****** 1. row ****** <br>id: 3 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 <br>****** 2. row ****** <br>id: 2 <br>****** 3. row ****** <br>id: 3 INSERT INTO action_db.a VALUES (4); <br><br>mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 4 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 <br>****** 2. row ****** <br>id: 2 <br>****** 3. row ****** <br>id: 3 <br>****** 4. row ****** <br>id: 4 可以看到此时 DTLE 的行为,相当于把 ACTION_DB.A、ACTION_DB.a、action_db.A 和 action_db.a 四个表的数据合并到一张表。 所以为了避免此种情况,可以通过在创建 DTLE 作业的时候,为每个重名的库配置 TableSchemaRename 属性、重名表配置 Table.TableRename 属性的方式来解决。 第二种情况 源端 MySQL @@lctn=1 目标端MySQL @@lctn=0 根据 DTLE 的开发文档 里面介绍,此种情况下的 DTLE 行为: 用户填写的复制范围,应转化为小写。 不复制已有的大写 SCHEMA.TABLE。 新增的 Schema.Table,转化为小写后,加入复制范围。 目标端无论 @@lctn=0 或 @@lctn=1,都应该复制源端的效果,即小写。 目标端收到的 BinlogEntry 中,schema.tableName 已为小写。 以下是执行一些典型 SQL 的数据同步结果: 源端 SQL 和数据 目标端数据 CREATE DATABASE ACTION_DB; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br>Database: dtle CREATE TABLE ACTION_DB.A(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a INSERT INTO ACTION_DB.A VALUES (1); <br><br>mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 ALTER TABLE ACTION_DB.A ADD D CHAR(20); <br><br>mysql> SHOW CREATE TABLE ACTION_DB.A\G <br>****** 1. row ****** <br> Table: A <br><br>Create Table: CREATE TABLE `a` ( <br> `id` int(11) DEFAULT NULL, <br> `D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 mysql> SHOW CREATE TABLE action_db.a\G <br>****** 1. row ****** <br> Table: a <br><br>Create Table: CREATE TABLE `a` (<br> id int(11) DEFAULT NULL, <br> `D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 ALTER TABLE ACTION_DB.A RENAME TO ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: b mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: b DROP TABLE ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>Empty set (0.00 sec) mysql> SHOW TABLES\G <br>Empty set (0.00 sec) 可以看到 DTLE 同步后的数据是符合预期。在源端 MySQL 自动转为小写,在目标端 MySQL 同步的数据也是小写的。 其他限制 通过观察 general log 可以得知,DTLE 作业是在初始化作业的时候获取源端以及目标端 MySQL 的 lower_case_table_names 配置的,所以在 DTLE 作业存续期间更改 MySQL 的该参数是 DTLE 无法感知并处理的。因此禁止在 DTLE 作业存续期间更改此配置。 总结 原则上 DTLE 还是建议源端和目标端设置相同。 当源端 MySQL @@lctn=0 且目标端 MySQL @@lctn=1 时,需要注意源端仅大小写不同的同名库表在目标端会汇聚到同一个表中的问题。 DTLE 作业存续期间,MySQL 上的 lower_case_table_names 配置不可改变。 关于 SQLE 爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 SQLE 获取 类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.github.io/sqle-docs/ 发布信息 https://github.com/actiontech/sqle/releases 数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册