Mysql8.4参考手册走读(六)

MySQL 8.4 常见问题解答:服务器 SQL 模式

问题答案
什么是服务器 SQL 模式?服务器 SQL 模式定义了 MySQL 应支持的 SQL 语法和它应该执行哪种类型的数据验证检查。这使在不同环境中使用 MySQL 变得更加容易,并且将 MySQL 与其他数据库服务器一起使用。
有多少种服务器 SQL 模式?每种模式都可以独立打开和关闭。请参见第 7.1.11 节 “服务器 SQL 模式”,以获取可用的完整列表模式。
如何确定服务器 SQL 模式?您可以使用 --sql-mode 选项设置默认 SQL 模式(用于 mysqld 启动)。使用语句 SET [全球
模式是否依赖于数据库或连接?模式未链接到特定数据库。可以设置模式本地到会话(连接),或全局到服务器。您可以使用 SET 更改这些设置 [全球
严格模式的规则可以扩展吗?当我们提到严格模式时,我们的意思是模式,其中至少启用了 TRADITIONAL、STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 模式之一。选项可以组合,因此您可以向模式添加限制。
严格模式会影响性能吗?对某些设置的输入数据进行密集验证与未完成验证相比,需要更多时间。虽然性能影响不是那么大,如果你不需要这样验证(也许您的应用程序已经处理了所有 this),那么MySQL可以选择离开严格模式禁用。但是,如果您确实需要它,严格模式可以提供这种验证。
MySQL 8.4时的默认服务器SQL模式是什么已安装?MySQL 8.0 中的默认 SQL 模式包括以下模式:ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、和NO_ENGINE_SUBSTITUTION。
  1. ONLY_FULL_GROUP_BY: 当设置此变量时,MySQL将拒绝那些在SELECT语句中使用了GROUP BY子句但未包含所有非聚合列的查询。

  2. STRICT_TRANS_TABLES: 此变量启用严格模式,这意味着如果数据在事务中被更改,则不能提交事务。这对于确保数据的完整性非常重要。

  3. NO_ZERO_IN_DATE: 此变量禁止在日期值中使用零。如果尝试插入一个包含零的日期,则会生成一个错误。

  4. NO_ZERO_DATE: 此变量禁止使用零作为日期值。如果尝试插入一个零日期,则会生成一个错误。

  5. ERROR_FOR_DIVISION_BY_ZERO: 此变量指定如果除数为零,则应生成错误而不是返回NULL。

  6. NO_ENGINE_SUBSTITUTION: 此变量指定如果所需的存储引擎不可用,则不应使用不同的存储引擎。相反,应生成错误。

  7. 禁用表达式:这是SQL中的一个概念,它指的是在查询中不允许使用的特定表达式或函数。例如,某些数据库系统可能不允许在WHERE子句中使用聚合函数。

MySQL 8.4 常见问题解答:复制

问题答案
副本必须始终连接到源吗?不,它没有。复制副本可能会关闭或保持断开连接数小时甚至数天,然后重新连接并赶上更新。例如,您可以设置源/副本拨号链路上的关系,其中链路仅处于打开状态零星和短时间。含义也就是说,在任何给定时间,都无法保证副本与源同步,除非您采取一些特殊措施。
我必须在源和副本上启用联网才能启用复制吗?是的,必须在源和副本上启用网络。如果未启用网络,副本无法连接到源并传输二进制日志。验证skip_networking系统变量尚未在配置文件中启用服务器。
如何知道副本与源副本相比有多晚?换句话说,我怎么知道最后一句话的日期被副本复制?检查SHOW REPLICA|SLAVE STATUS输出中的列
如何强制源阻止更新,直到副本赶上?使用以下过程:在源上,执行以下语句: mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS;记录复制坐标(当前二进制日志文件名和位置)来自 SHOW 语句的输出。在副本上,发出以下语句,其中 SOURCE_POS_WAIT() 或 MASTER_POS_WAIT()函数的参数是在上一步: mysql> SELECT MASTER_POS_WAIT(‘log_name’, log_pos); 或从MySQL 8.0.26: mysql> SELECT SOURCE_POS_WAIT(‘log_name’, log_pos);SELECT 语句块直到副本到达指定的日志文件,并且位置。此时,副本与源和语句返回。在源上,发出以下语句以启用源再次开始处理更新: mysql> UNLOCK TABLES;
设置双向时应注意哪些问题复制?MySQL复制目前不支持任何锁定源和副本之间的协议,以保证原子性分布式(跨服务器)更新。换句话说,它是客户端A可以对协源1进行更新,并进行同时,在它传播到客户端B的共同源2之前可以对Co-source2进行更新,使客户端A的工作方式与在共同源1上的工作方式不同。因此,当客户端A的更新使其进入共同源2,它产生与共同源1上的表不同,即使在Co-Source2的所有更新之后,也传播。这意味着您不应该链接两个服务器在双向复制关系中一起,除非你是确保您的更新可以按任何顺序安全地进行,或者除非您可以在客户端代码中以某种方式处理错误排序的更新。您还应该意识到,双向复制确实可以就更新而言,性能不会提高太多(如果有的话)。每个服务器必须执行相同数量的更新,就像你有一个服务器一样。唯一的区别是锁争用少了一点,因为源自另一台服务器的更新在一台服务器中序列化复制线程。甚至这种好处也可能被网络所抵消延误。
如何使用复制来提高系统的性能?将一台服务器设置为源,并将所有写入定向到该服务器。然后,根据预算配置任意数量的副本,并机架空间的机架空间并在源和副本之间分配负载。您也可以使用–skip-innodb选项启动副本,启用low_priority_updates系统变量,并设置delay_key_write系统变量以提高副本结束的速度。在这种情况下,副本使用非事务表而不是表来获得更快的速度消除事务开销。ALL MyISAM InnoDB
在我自己的应用程序中准备客户端代码时应该怎么做使用性能增强复制?请参见使用复制作为横向扩展解决方案的指南,第19.4.5节“使用复制进行横向扩展”。
MySQL复制何时以及在多大程度上可以提高性能我的系统?MySQL复制对于处理频繁读取和不频繁写入。从理论上讲,通过使用单源/多副本设置,可以扩展系统通过添加更多副本,直到网络用完为止带宽,或者您的更新负载增长到以下点源无法处理它。确定在添加之前可以使用的副本数福利开始趋于平稳,您可以提高多少您网站的性能,您必须了解您的查询模式,以及通过对典型源和典型副本进行基准测试。这里的示例显示了一个相当简化的计算复制可以得到什么假设系统。let并表示读取和写入的次数每秒。reads writes
如何判断复制源服务器是否正在使用基于语句还是基于行的二进制日志记录格式?检查binlog_format系统变量的值: mysql> SHOW VARIABLES LIKE ‘binlog_format’;显示的值始终是、或之一。对于模式,使用基于语句的日志记录默认情况下,但复制会自动切换到基于行在某些情况下进行日志记录(例如不安全语句)下进行日志记录。为有关何时可能发生这种情况的信息,请参见第7.4.4.3节“混合二进制日志记录格式”。STATEMENT ROW MIXED
如何告诉副本使用基于行的复制?副本会自动知道要使用哪种格式。
如何防止GRANT和REVOKE语句要复制到复印机?使用–replicate-wild-ignore-table=mysql.%选项启动服务器以忽略数据库中表的复制。
复制是否适用于混合操作系统(例如,源代码在Linux上运行,而副本在macOS上运行,并且Windows)?是的。
复制是否适用于混合硬件体系结构(例如,源在64位计算机上运行,而副本在32位机器上运行)?是的。
副本必须始终连接到源吗?不,它没有。复制副本可能会关闭或保持断开连接数小时甚至数天,然后重新连接并赶上更新。例如,您可以设置源/副本拨号链路上的关系,其中链路仅处于打开状态零星和短时间。含义也就是说,在任何给定时间,都无法保证副本与源同步,除非您采取一些特殊措施。
我必须在源和副本上启用联网才能启用复制吗?是的,必须在源和副本上启用网络。如果未启用网络,副本无法连接到源并传输二进制日志。验证skip_networking系统变量尚未在配置文件中启用服务器。
如何知道副本与源副本相比有多晚?换句话说,我怎么知道最后一句话的日期被副本复制?检查 SHOW 的输出 复制品
如何强制源阻止更新,直到副本赶上?使用以下过程:在源上,执行以下语句: mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS;记录复制坐标(当前二进制日志文件名和位置)来自 SHOW 语句的输出。在副本上,发出以下语句,其中 SOURCE_POS_WAIT() 或 MASTER_POS_WAIT()函数的参数是在上一步: mysql> SELECT MASTER_POS_WAIT(‘log_name’, log_pos); 或从MySQL 8.0.26: mysql> SELECT SOURCE_POS_WAIT(‘log_name’, log_pos);SELECT 语句块直到副本到达指定的日志文件,并且位置。此时,副本与源和语句返回。在源上,发出以下语句以启用源再次开始处理更新: mysql> UNLOCK TABLES;
设置双向时应注意哪些问题复制?MySQL复制目前不支持任何锁定源和副本之间的协议,以保证原子性分布式(跨服务器)更新。换句话说,它是客户端A可以对协源1进行更新,并进行同时,在它传播到客户端B的共同源2之前可以对Co-source2进行更新,使客户端A的工作方式与在共同源1上的工作方式不同。因此,当客户端A的更新使其进入共同源2,它产生与共同源1上的表不同,即使在Co-Source2的所有更新之后,也传播。这意味着您不应该链接两个服务器在双向复制关系中一起,除非你是确保您的更新可以按任何顺序安全地进行,或者除非您可以在客户端代码中以某种方式处理错误排序的更新。您还应该意识到,双向复制确实可以就更新而言,性能不会提高太多(如果有的话)。每个服务器必须执行相同数量的更新,就像你有一个服务器一样。唯一的区别是锁争用少了一点,因为源自另一台服务器的更新在一台服务器中序列化复制线程。甚至这种好处也可能被网络所抵消延误。
如何使用复制来提高系统的性能?将一台服务器设置为源,并将所有写入定向到该服务器。然后,根据预算配置任意数量的副本,并机架空间的机架空间并在源和副本之间分配负载。您也可以使用–skip-innodb选项启动副本,启用low_priority_updates系统变量,并设置delay_key_write系统变量以提高副本结束的速度。在这种情况下,副本使用非事务表而不是表来获得更快的速度消除事务开销。ALL MyISAM InnoDB
在我自己的应用程序中准备客户端代码时应该怎么做使用性能增强复制?请参见使用复制作为横向扩展解决方案的指南,第19.4.5节“使用复制进行横向扩展”。
MySQL复制何时以及在多大程度上可以提高性能我的系统?MySQL复制对于处理频繁读取和不频繁写入。从理论上讲,通过使用单源/多副本设置,可以扩展系统通过添加更多副本,直到网络用完为止带宽,或者您的更新负载增长到以下点源无法处理它。确定在添加之前可以使用的副本数福利开始趋于平稳,您可以提高多少您网站的性能,您必须了解您的查询模式,以及通过对典型源和典型副本进行基准测试。这里的示例显示了一个相当简化的计算复制可以得到什么假设系统。let并表示读取和写入的次数每秒。reads writes
如何判断复制源服务器是否正在使用基于语句还是基于行的二进制日志记录格式?检查binlog_format系统变量的值: mysql> SHOW VARIABLES LIKE ‘binlog_format’;显示的值始终是、或之一。对于模式,使用基于语句的日志记录默认情况下,但复制会自动切换到基于行在某些情况下进行日志记录(例如不安全语句)下进行日志记录。为有关何时可能发生这种情况的信息,请参见第7.4.4.3节“混合二进制日志记录格式”。STATEMENT ROW MIXED
如何告诉副本使用基于行的复制?副本会自动知道要使用哪种格式。
如何防止GRANT和REVOKE语句要复制到复印机?使用–replicate-wild-ignore-table=mysql.%选项启动服务器以忽略数据库中表的复制。
复制是否适用于混合操作系统(例如,源代码在Linux上运行,而副本在macOS上运行,并且Windows)?是的。
复制是否适用于混合硬件体系结构(例如,源在64位计算机上运行,而副本在32位机器上运行)?是的。
  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴代庄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值