MySQL 8.4.0 LTS 变更解析:MySQL 的复制与组复制

MySQL 8.4.0 LTS 变更解析:MySQL 的复制与组复制

ShawnYan Lv.6

MySQL 8.4.0 LTS 已经发布 ,作为发版模型变更后的第一个长期支持版本,注定要承担未来生产环境的重任,那么这个版本都有哪些新特性、变更,接下来少安将带大家一起来 get 新知识点。

环境准备

本节内容继续沿用前文的环境,不同的是在前文的基础之上搭建了主从复制。

这里启动两个DB服务来验证复制的相关变更,分别监听3306和3316端口。

1
2
3
4
5
6
[mysql@shawnyan build]$ ./bin/mysql -uroot -h127.1 -P3306 -e 'select @@server_id' -E
*************************** 1. row ***************************
@@server_id: 10
[mysql@shawnyan build]$ ./bin/mysql -uroot -h127.1 -P3316 -e 'select @@server_id' -E
*************************** 1. row ***************************
@@server_id: 11
  1. 创建复制用户
1
2
3
CREATE USER 'replica' IDENTIFIED BY 'replica';
GRANT REPLICATION SLAVE ON *.* TO 'replica';
FLUSH PRIVILEGES;
  1. 配置复制源
1
2
3
4
5
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '127.0.0.1',
SOURCE_PORT = 3306,
SOURCE_SSL = 1,
SOURCE_AUTO_POSITION = 1;
  1. 启动复制

这里为了安全考虑,不推荐将 user/password 信息配置在创建复制源语句,而是在启动复制语句中设定。

1
START REPLICA USER = 'replica' PASSWORD = 'replica';
  1. 查看复制状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
mysql> show replica status\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: 127.0.0.1
Source_User: replica
Source_Port: 3306
Connect_Retry: 60
Source_Log_File: binlog.000001
Read_Source_Log_Pos: 432
Relay_Log_File: bitdlniu05021-relay-bin.000003
Relay_Log_Pos: 643
Relay_Source_Log_File: binlog.000001
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Source_Log_Pos: 432
Relay_Log_Space: 1043
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Source_SSL_Allowed: Yes
Source_SSL_CA_File:
Source_SSL_CA_Path:
Source_SSL_Cert:
Source_SSL_Cipher:
Source_SSL_Key:
Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Source_Server_Id: 10
Source_UUID: 4db16b24-1268-11ef-bc66-00155d098dce
Source_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
Source_Retry_Count: 10
Source_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Source_SSL_Crl:
Source_SSL_Crlpath:
Retrieved_Gtid_Set: 4db16b24-1268-11ef-bc66-00155d098dce:1
Executed_Gtid_Set: 4db16b24-1268-11ef-bc66-00155d098dce:1
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Source_TLS_Version:
Source_public_key_path:
Get_Source_public_key: 0
Network_Namespace:
1 row in set (0.00 sec)

从 MySQL 8.4.0 LTS 开始,master/slave 见上帝去了,以后都将与 replica 伴舞。

复制 SQL 语句

之前版本的 MySQL 中已弃用的与 MySQL 复制相关的许多功能的语法现已删除,具体清单如下。

Removed Replacements
START SLAVE START REPLICA
STOP SLAVE STOP REPLICA
SHOW SLAVE STATUS SHOW REPLICA STATUS
SHOW SLAVE HOSTS SHOW REPLICAS
RESET SLAVE RESET REPLICA
CHANGE MASTER TO CHANGE REPLICATION SOURCE TO
RESET MASTER RESET BINARY LOGS AND GTIDS
SHOW MASTER STATUS SHOW BINARY LOG STATUS
PURGE MASTER LOGS PURGE BINARY LOGS
SHOW MASTER LOGS SHOW BINARY LOGS

如果继续沿用之前的语法,会直接抛出错误。

1
2
mysql> start slave;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slave' at line 1

SQL 语句选项

CHANGE REPLICATION SOURCE TO 语句的选项,发生了移除、替换变更,清单如下:

Removed Replacements
MASTER_AUTO_POSITION SOURCE_AUTO_POSITION
MASTER_HOST SOURCE_HOST
MASTER_BIND SOURCE_BIND
MASTER_USER SOURCE_USER
MASTER_PASSWORD SOURCE_PASSWORD
MASTER_PORT SOURCE_PORT
MASTER_CONNECT_RETRY SOURCE_CONNECT_RETRY
MASTER_RETRY_COUNT SOURCE_RETRY_COUNT
MASTER_DELAY SOURCE_DELAY
MASTER_SSL SOURCE_SSL
MASTER_SSL_CA SOURCE_SSL_CA
MASTER_SSL_CAPATH SOURCE_SSL_CAPATH
MASTER_SSL_CIPHER SOURCE_SSL_CIPHER
MASTER_SSL_CRL SOURCE_SSL_CRL
MASTER_SSL_CRLPATH SOURCE_SSL_CRLPATH
MASTER_SSL_KEY SOURCE_SSL_KEY
MASTER_SSL_VERIFY_SERVER_CERT SOURCE_SSL_VERIFY_SERVER_CERT
MASTER_TLS_VERSION SOURCE_TLS_VERSION
MASTER_TLS_CIPHERSUITES SOURCE_TLS_CIPHERSUITES
MASTER_SSL_CERT SOURCE_SSL_CERT
MASTER_PUBLIC_KEY_PATH SOURCE_PUBLIC_KEY_PATH
GET_MASTER_PUBLIC_KEY GET_SOURCE_PUBLIC_KEY
MASTER_HEARTBEAT_PERIOD SOURCE_HEARTBEAT_PERIOD
MASTER_COMPRESSION_ALGORITHMS SOURCE_COMPRESSION_ALGORITHMS
MASTER_ZSTD_COMPRESSION_LEVEL SOURCE_ZSTD_COMPRESSION_LEVEL
MASTER_LOG_FILE SOURCE_LOG_FILE
MASTER_LOG_POS SOURCE_LOG_POS

系统状态变量

MySQL 服务器中的多个系统状态变量也发生了变更,具体清单如下。

Removed Replacements
Com_slave_start Com_replica_start
Com_slave_stop Com_replica_stop
Com_show_slave_status Com_show_replica_status
Com_show_slave_hosts Com_show_replicas
Com_show_master_status Com_show_binary_log_status
Com_change_master Com_change_replication_source

组复制

1. group_replication_allow_local_lower_version_join 系统变量弃用

group_replication_allow_local_lower_version_join 是 5.7.17 引入的系统变量,表示当前服务器的插件版本比组的插件版本低时也允许加入组。

从 8.4.0 开始被弃用,如果更改值将会抛出如下警告。

1
2
3
4
mysql> set global group_replication_allow_local_lower_version_join = 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

Warning (Code 1681): 'group_replication_allow_local_lower_version_join' is deprecated and will be removed in a future release.

2. group_replication_recovery_complete_at 系统变量被移除

group_replication_allow_local_lower_version_join 是 5.7.17 引入的系统变量,表示状态传输后处理缓存中的事务时的恢复策略。在 8.0.34 中被废弃。

从此版本开始,分布式恢复过程中应用的策略始终是仅在新成员收到、认证并应用其加入组之前发生的所有事务后才将其标记为在线; 这相当于在以前版本的 MySQL 中将 group_replication_recovery_complete_at 设置为 TRANSACTIONS_APPLIED。

3. 系统变量默认值变更

  1. group_replication_consistency 系统变量的默认值现在是 BEFORE_ON_PRIMARY_FAILOVER ; 以前是 EVENTUAL 。

在组复制单主模式下,设定为 BEFORE_ON_PRIMARY_FAILOVER 时,新主有未应用的backlog时,客户端的请求会等到,直到应用为止,以此确保事务一致性。

  1. group_replication_exit_state_action 系统变量的默认值现在是 OFFLINE_MODE 。

该变量在 8.0.16 及以上版本的默认值为 READ_ONLY,从 8.0.18 增加 OFFLINE_MODE 选项。

如果成员无意中退出组或用尽自动重新加入尝试,实例会将 MySQL 切换到离线模式。在此模式下,已连接的客户端用户在下一个请求时将断开连接,并且不再接受连接,具有 CONNECTION_ADMIN 权限(或已弃用的 SUPER 权限)的客户端用户除外。

版本升级

这里有几点升级的注意事项或建议,以供参考。

  1. MySQL 5.7 不支持直接升级到 MySQL 8.4,需要先升级到 MySQL 8.0 再过渡到 8.4。

  2. MySQL 8.4 移除了对 8.0 早期版本的一些特殊处理,建议在升级到 8.4 之前,先升级到 8.0 最新版本。

  3. 当前 MySQL 8.0 系列的最新版本为 MySQL 8.0.37

总结

本章节我们介绍了编译 MySQL 8.4.0 LTS 源码需要注意几点变更,以及连接数据库时认证插件发生的变化。

下一节我们继续介绍其他新特性,欢迎关注本专栏。

往期精彩

– END –

foot.png

如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)

  • Title: MySQL 8.4.0 LTS 变更解析:MySQL 的复制与组复制
  • Author: ShawnYan
  • Created at: 2024-05-16 21:00:00
  • Updated at: 2024-05-16 21:00:00
  • Link: https://shawnyan.cn/2024/mysql/mysql-8-4-0-lts-change-replica/
  • License: This work is licensed under CC BY-NC-SA 4.0.
if (hexo-config('comment.enable') == true && hexo-config('comment.system') != "") { if (hexo-config('comment.system') == "waline") { @require "./waline.styl" } else if (hexo-config('comment.system') == "gitalk") { @require "./gitalk.styl" } else if (hexo-config('comment.system') == "twikoo") { @require "./twikoo.styl" } } .comments-container display inline-block margin-top $spacing-unit width 100% #comment-anchor width 100% height 10px .comment-area-title width 100% margin 10px 0 font-size 1.38rem color var(--default-text-color) font-family 'Consolas', '宋体', sans-serif font-weight bold i color var(--default-text-color) +redefine-tablet() margin 5px 0 font-size 1.2rem