对复制实施主键约束
作者:Pedro Gomes 译:徐轶韬
在本文中,我们介绍一个配置选项,该选项控制复制通道是否允许创建没有主键的表。这延续了我们最近在复制安全性方面的工作,在该工作中,我们允许用户强制执行权限检查和/或强制执行基于行的事件。
在8.0.20上,我们为CHANGE MASTER TO语句引入了一个新选项:REQUIRE_TABLE_PRIMARY_KEY_CHECK。复制通道在执行创建或更改表定义及其主键时可以选择自己的策略。
在表定义上强制主键很重要。例如,在使用基于行的日志模式下进行复制时,表的主键对从数据库的性能起着重要作用。服务器中使用变量sql_require_primary_key强制执行此策略。在复制的上下文中,该变量的值将与所有更改表结构(也称为DDL)的查询一起发送,因此从数据库将遵循主数据库上的任何限制。
如果从数据库的操作员无法控制或信任主服务器,仅仅遵循在那里定义的限制是不够的。因此,现在可以用REQUIRE_TABLE_PRIMARY_KEY_CHECK的值来影响此行为。
可以在复制通道上将此参数设置为:
- ON:复制通道在复制操作中始终对sql_require_primary_key系统变量使用值“ON”,在所有create和alter table操作中都需要主键。
- OFF:复制通道在复制操作中始终对sql_require_primary_key系统变量使用值“OFF” ,创建或更改表时不需要主键,即使主数据库强制执行了此类限制。
- STREAM:默认值,复制通道为每个事务使用从主数据库复制的值。这样可以保留以前的服务器行为。
用法和优点
第一个用例出现在对数据来源的主数据库没有严格控制的场景中。在这种情况下, REQUIRE_TABLE_PRIMARY_KEY_CHECK = ON可确保表定义中没有删除任何主键,不会导致性能问题。
在多源复制方案中,此功能也非常有用。使sql_require_primary_key的值保持一致,允许来自不同主数据库的复制通道之间的行为更加统一。当多个主数据库更新同一组表,并且其中一个表存在错误时,使用ON可以防止丢失主键。使用OFF可使多个主数据库一起工作而不管它们能否操作主键。
在复制通道中使用权限检查时,此功能也具有优势,因为将REQUIRE_TABLE_PRIMARY_KEY_CHECK设置为ON或OFF意味着具有PRIVILEGE_CHECKS_USER权限的帐户不再需要额外的权限来操作sql_require_primary_key。如果设置为STREAM,除了需要创建或更改表的基本权限外,还要求权限检查用户具有会话管理级别的权限用以复制查询。
配置
若要显式更改复制通道在处理主键检查策略的行为,您需要停止复制SQL线程。
可观察性
相关的Performance Schema表进行了功能增强,用以显示新的CHANGE MASTER TO
…语句选项REQUIRE_TABLE_PRIMARY_KEY_CHECK的状态:
使用注意事项
此功能受RESET SLAVE ALL的影响,但不受RESET SLAVE的影响。
同样,虽然群组复制插件强制使用主键执行每个查询,但该检查不依赖于sql_require_primary_key并且限制较少。详情参阅“https://dev.mysql.com/doc/refman/8.0/en/group-replication-requirements.html”。
摘要
此功能是一种新工具,可在复杂多样的环境中保护您的复制流,同时您可以更好地控制复制用户的权限。
希望这项新功能可以使您利用MySQL创建更安全的解决方案。欢迎进行测试,并告诉我们您的意见。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 01 . SaltStack部署配置及简单应用
- 02 . SaltStack高级用法(Python API)
- 小加载动画
- 日志收集工具简单对比
- [蓝桥杯][2013年第四届真题]幸运数
- 04 . Filebeat简介原理及配置文件和一些案例
- 05 . ELK Stack+Redis日志收集平台
- python开发【第一篇】
- 内置函数--bin() oct() int() hex()
- 08 . Prometheus+Grafana监控haproxy+rabbitmq
- 内置函数值 -- chr() ord() -- 字符和ascii的转换
- python内置函数-compile()
- 02 . Shell变量和逻辑判断及循环使用
- Python内置函数(21)——filter
- 内置函数 -- filter 和 map