当前位置: 首页 > article >正文

数据库MySQL集群MGR

一、MGR原理

一、基本定义

MGR(MySQL Group Replication) 是 MySQL 官方推出的一种高可用、高可靠的数据库集群解决方案,基于分布式系统理论(如 Paxos 协议变种)实现,主要用于构建强一致性的主从复制集群,支持多主或单主模式,确保数据在多个节点之间的可靠复制和故障转移。

二、核心特性
  1. 强一致性(Consistency)

    • 通过分布式事务协调机制(基于 Paxos 的优化协议),确保所有节点的数据变更按相同顺序提交,避免传统主从复制可能出现的异步延迟导致的数据不一致问题。
    • 所有写操作需多数节点(Quorum)确认后才会提交,保证集群内数据的强一致性。
  2. 高可用性(High Availability)

    • 自动检测节点故障,当主节点失效时,集群可自动选举新主节点(需满足多数节点存活),无需人工干预,减少服务中断时间。
    • 支持在线添加 / 删除节点,不影响集群正常运行。
  3. 多主或单主模式

    • 单主模式(Single-Master):仅允许一个主节点写入,其他节点作为从节点只读,适合传统主从架构场景,避免多主写入冲突。
    • 多主模式(Multi-Master):允许多个节点同时写入,通过冲突检测机制(如行级锁、全局事务 ID)避免写入冲突,适合读写分离或分布式写入场景。
  4. 成员管理与故障检测

    • 基于组通信协议(如 NetXCOM)实现节点间的状态同步和心跳检测,实时监控集群成员状态。
    • 节点加入 / 退出集群时,通过自动数据同步(State Transfer)快速完成数据初始化,无需手动备份恢复。
三、架构原理
  1. 节点角色

    • 主节点(Primary):处理写操作并将变更同步到其他节点(单主模式下唯一可写节点;多主模式下所有节点均可写)。
    • 从节点(Replica):接收主节点的变更并应用,提供读服务。
  2. 关键组件

    • Group Replication Plugin:实现节点加入集群、事务协调、故障检测等核心逻辑。
    • MySQL Binlog:记录数据变更,通过组复制协议在节点间同步。
    • InnoDB 存储引擎:支持事务和行级锁,确保冲突检测和一致性。
  3. 工作流程

    • 写事务提交时,主节点将事务包装为 “写集合”(Write Set),通过组播协议发送给所有从节点。
    • 从节点验证事务是否冲突(如更新同一行记录),无冲突则应用事务,有冲突则回滚。
    • 多数节点确认事务提交后,主节点才最终提交事务,确保数据一致性。

二、部署MGR集群

部署mgr集群需要三个MySQL单实例,MySQL安装单机版本安装就好了,这里不再说MySQL单机部署了跳过,介绍MGR集群如果构建。

介绍基础环境 三个节点10.10.65.101,10.10.65.102,10.10.65.103,已安装了MySQL单实例(注意这里要把MySQL的密码策略调整一致,如果不一致后期会因为这个组复制失败)

一、基础环境 把三台机器的信息写入到/etc/hosts文件里。

cat >> /etc/hosts <<  EOF
10.10.65.101 mgr1-010010065101
10.10.65.102 mgr2-010010065102
10.10.65.103 mgr3-010010065103
EOF

二、部署多主模式

有两种模式 一种是 single-primary 一种是 multi-primary 即单主或多主,这里部署的是多主模式

配置注意

每个节点配置需要不同

server-id=1

每个节点配置文件这个参数是自己节点的IP地址

group_replication_local_address=10.10.65.101:33061

每个节点配置文件uuid需要都相同

group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f

配置文件每个节点不一样

10.10.65.101 的配置文件

[client]  
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
NGINE_SUBSTITUTION
character-set-server=utf8mb4
# 注意这里我改了MySQL的存储目录
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysqld/mysqld.pid# MGR集群
# 插件目录
plugin_dir=/usr/lib64/mysql/pluginserver-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64# MGR配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
early_plugin_load="group_replication.so"
group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f
group_replication_start_on_boot=OFF
group_replication_local_address=10.10.65.101:33061
group_replication_group_seeds=10.10.65.101:33061,10.10.65.102:33061,10.10.65.103:33061
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON# 其他优化参数
innodb_buffer_pool_size=1G
innodb_flush_log_at_trx_commit=2
sync_binlog=0

10.10.65.102 的配置文件

[client]  
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysqld/mysqld.pid# MGR集群
# 插件目录
plugin_dir=/usr/lib64/mysql/pluginserver-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64# MGR配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
early_plugin_load="group_replication.so"
group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f
group_replication_start_on_boot=OFF
group_replication_local_address=10.10.65.102:33061
group_replication_group_seeds=10.10.65.101:33061,10.10.65.102:33061,10.10.65.103:33061
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON# 其他优化参数
innodb_buffer_pool_size=1G
innodb_flush_log_at_trx_commit=2
sync_binlog=0

10.10.65.103 的配置文件

[client]  
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/data/mysql/mysqld.log
pid-file=/data/mysqld/mysqld.pid# MGR集群
# 插件目录
plugin_dir=/usr/lib64/mysql/pluginserver-id=3
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64# MGR配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
early_plugin_load="group_replication.so"
group_replication_group_name=70e4c56a-63b9-4666-bcd1-165266666eb9f
group_replication_start_on_boot=OFF
group_replication_local_address=10.10.65.103:33061
group_replication_group_seeds=10.10.65.101:33061,10.10.65.102:33061,10.10.65.103:33061
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON# 其他优化参数
innodb_buffer_pool_size=1G
innodb_flush_log_at_trx_commit=2
sync_binlog=0

准备好上述配置文件后,重启MySQL数据库 。

三、创建用于MGR集群组复制的账号

以下sql在所有节点上操作

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> SELECT User, Host FROM user;
+---------------+-----------+
| User          | Host      |
+---------------+-----------+
| admin         | %         |
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)mysql> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'ReplicationPassword1!';
Query OK, 0 rows affected (0.00 sec)mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
Query OK, 0 rows affected (0.00 sec)mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

四、创建mgr集群

在第一节点操作 引导创建集群

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;

查询第一个节点创建出来的集群信息,目前只有一个节点。

SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST           | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| group_replication_applier | 2e1544a9-3203-11f0-b40b-005056914eca | mgr1-010010065101 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
1 row in set (0.00 sec)

在第二和三节点上运行

STOP GROUP_REPLICATION;RESET SLAVE ALL;
CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='ReplicationPassword1!' FOR CHANNEL 'group_replication_recovery';START GROUP_REPLICATION;

验证集群有几个节点,在任意一个节点都可以执行。这里需要查看每个节点的状态是ONLINE,说明节点是正常的,如果这里是RECOVERING状态需要注意,如果有节点长时间是RECOVERING状态,可能是这个节点没有完成数据同步,也有可能节点出现了异常,需要查看。

SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST           | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| group_replication_applier | 2e1544a9-3203-11f0-b40b-005056914eca | mgr1-010010065101 |        3306 | ONLINE       |
| group_replication_applier | 31cc45ea-3203-11f0-8d5f-005056916f84 | mgr2-010010065102 |        3306 | ONLINE       |
| group_replication_applier | 337c4d3d-3203-11f0-a4a4-005056916d63 | mgr3-010010065103 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
3 rows in set (0.00 sec)

查看这里说明MGR已经部署完成了,你可以在任意节点上创建数据库和sql,每个节点都可以读写,

问题:节点RECOVERING状态

如果节点异常RECOVERING状态,需要重新加入集群,运行以下代码,先停止复制,重置清空复制数据,最后开起组复制。

STOP GROUP_REPLICATION;
RESET SLAVE ALL;
CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='ReplicationPassword1!' 
FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;

问题:ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.

mgr集群出现 这个报错的时候查看报错日志,这里是因为binlog读取异常,这里要把binlog重置数据,停止复制后,重置binlog数据,再开启复制。

 mysql]# tail -fn 300 mysqld.log | grep ERROR
2025-05-23T08:33:58.077528Z 0 [ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 11b3c0dd-37a9-11f0-b76b-0050569f8e51:1-8 > Group transactions: 70e4c56a-63b9-40a2-bcd1-1652eb52eb88:1-4'
2025-05-23T08:33:58.077610Z 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'

节点恢复操作

-- 停止组复制
STOP GROUP_REPLICATION;-- 清除所有复制信息
RESET MASTER;
RESET SLAVE ALL;-- 配置复制用户
CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='ReplicationPassword1!' 
FOR CHANNEL 'group_replication_recovery';-- 启动组复制
START GROUP_REPLICATION;

相关文章:

数据库MySQL集群MGR

一、MGR原理 一、基本定义 MGR&#xff08;MySQL Group Replication&#xff09; 是 MySQL 官方推出的一种高可用、高可靠的数据库集群解决方案&#xff0c;基于分布式系统理论&#xff08;如 Paxos 协议变种&#xff09;实现&#xff0c;主要用于构建强一致性的主从复制集群…...

Ubuntu22.04 安装 ROS2 Humble

ROS2 Documentation: Humble Ubuntu 22.04 对应的 ROS 2 版本是 ROS 2 Humble Hawksbill (LTS)。 1.设置系统区域 确保区域设置支持UTF-8 sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 L…...

Spring Boot,注解,@RestController

RestController 是 Spring MVC 中用于创建 RESTful Web 服务的核心注解。 RestController 核心知识点 REST 作用: RestController 是一个方便的组合注解&#xff0c;它结合了 Controller 和 ResponseBody 两个注解。 Controller: 将类标记为一个控制器&#xff0c;使其能够处理…...

C++中新式类型转换static_cast、const_cast、dynamic_cast、reinterpret_cast

C中新式类型转换static_cast、const_cast、dynamic_cast、reinterpret_cast 在C中&#xff0c;新式类型转换&#xff08;也称为强制类型转换&#xff09;是C标准引入的一种更安全、更明确的类型转换方式&#xff0c;用以替代C语言风格的类型转换。C提供了四种新式类型转换操作…...

AXI 协议补充(二)

axi协议存在slave 和master 之间的数据交互,在ahb ,axi-stream 高速接口 ,叠加大位宽代码逻辑中,往往有时序问题,valid 和ready 的组合电路中的问题引发的时序问题较多。 本文根据axi 协议和现有解决反压造成的时序问题的方法做一个详细的科普。 1. 解决时序问题的方法:…...

Linux 基础指令入门指南:解锁命令行的实用密码

文章目录 引言&#xff1a;Linux 下基本指令常用选项ls 指令pwd 命令cd 指令touch 指令mkdir 指令rmdir 指令 && rm 指令man 指令cp 指令mv 指令cat 指令more 指令less 指令head 指令tail 指令date 指令cal 指令find 指令按文件名搜索按文件大小搜索按修改时间搜索按文…...

标准精读:2025 《可信数据空间 技术架构》【附全文阅读】

《可信数据空间 技术架构》规范了可信数据空间的技术架构,明确其作为国家数据基础设施的定位,以数字合约和使用控制技术为核心,涵盖功能架构(含服务平台与接入连接器的身份管理、目录管理、数字合约管理等功能)、业务流程(登记、发现、创建空间及数据流通利用)及安全要求…...

山东大学软件学院项目实训-基于大模型的模拟面试系统-面试官和面试记录的分享功能(2)

本文记录在发布文章时&#xff0c;可以添加自己创建的面试官和面试记录到文章中这一功能的实现。 前端 首先是在原本的界面的底部添加了两个多选框&#xff08;后期需要美化调整&#xff09; 实现的代码&#xff1a; <el-col style"margin-top: 1rem;"><e…...

Webug4.0靶场通关笔记05- 第5关SQL注入之过滤关键字

目录 一、代码审计 1、源码分析 2、SQL注入分析 &#xff08;1&#xff09;大小写绕过 &#xff08;2&#xff09;双写绕过 二、第05关 过滤型注入 1、进入靶场 2、sqlmap渗透 &#xff08;1&#xff09;bp抓包保存报文 &#xff08;2&#xff09;sqlmap渗透 &…...

ONLYOFFICE文档API:更强的安全功能

在数字化办公时代&#xff0c;文档的安全性与隐私保护已成为企业和个人用户的核心关切。如何确保信息在存储、传输及协作过程中的安全&#xff0c;是开发者与IT管理者亟需解决的问题。ONLYOFFICE作为一款功能强大的开源办公套件&#xff0c;不仅提供了高效的文档编辑与协作体验…...

深入浅出MQTT协议:从物联网基础到实战应用全解析

深入浅出MQTT协议&#xff1a;从物联网基础到实战应用全解析 作为一名在物联网领域摸爬滚打多年的老程序员&#xff0c;今天来和大家聊聊物联网通信中最核心的技术之一——MQTT协议。无论是Java后端开发还是嵌入式硬件开发&#xff0c;掌握MQTT都能让你在物联网项目中如鱼得水…...

解析楼宇自控系统:分布式结构的核心特点与优势展现

在建筑智能化发展的进程中&#xff0c;楼宇自控系统作为实现建筑高效运行与管理的关键&#xff0c;其系统结构的选择至关重要。传统的集中式楼宇自控系统在面对日益复杂的建筑环境和多样化的管理需求时&#xff0c;逐渐暴露出诸多弊端&#xff0c;如可靠性低、扩展性差、响应速…...

C#数字图像处理(三)

文章目录 前言1.图像平移1.1 图像平移定义1.2 图像平移编程实例 2.图像镜像2.1 图像镜像定义2.2 图像镜像编程实例 3.图像缩放3.1 图像缩放定义3.2 灰度插值法3.3 图像缩放编程实例 4.图像旋转4.1 图像旋转定义4.2 图像旋转编程实例 前言 在某种意义上来说&#xff0c;图像的几…...

STM32 智能小车项目 L298N 电机驱动模块

今天开始着手做智能小车的项目了 在智能小车或机器人项目中&#xff0c;我们经常会听到一个词叫 “H 桥电机驱动”&#xff0c;尤其是常见的 L298N 模块&#xff0c;就是基于“双 H 桥”原理设计的。那么&#xff0c;“H 桥”到底是什么&#xff1f;为什么要用“双 H 桥”来驱动…...

SQL Transactions(事务)、隔离机制

目录 Why Transactions? Example: Bad Interaction Transactions ACID Transactions COMMIT ROLLBACK How the Transaction Log Works How Data Is Stored Example: Interacting Processes Interleaving of Statements Example: Strange Interleaving Fixing the…...

【动画】unity中实现骨骼蒙皮动画

我是一名资深的游戏客户端&#xff0c;没事的时候我就想手搓轮子 本文目标 搓一个骨骼动画的核心实现&#xff0c;促进理解骨骼动画本质 骨骼动画简介 官方解释上网搜或者问豆包 快速理解 想知道骨骼动画怎么个事要先知道模型是怎么个事 简单来说&#xff1a;模型 顶点数…...

VSCODE的终端无法执行npm命令

问题原因&#xff1a;PowerShell 默认可能限制脚本执行。 解决方法&#xff1a; 在 PowerShell 中运行以下命令&#xff0c;查看当前策略&#xff1a; Get-ExecutionPolicy 如果结果是 Restricted&#xff0c;改为 RemoteSigned&#xff1a; Set-ExecutionPolicy RemoteSigne…...

Langchian - 自定义提示词模板 提取结构化的数据

场景:从自然语言中提取固定结构信息返回 例如:根据一段文字,提取文字中人的具体特征 马路上走来一个1米7的女生,她一头乌黑的长发披在肩上随风飘动,在她旁边的是她的男朋友,叫:刘山;比她高10厘米 如果想要提取上面这句话中人的身高及头发的颜色,并以固定的格式返回,…...

【机器学习基础】机器学习入门核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation)

机器学习入门核心&#xff1a;Jaccard相似度 &#xff08;Jaccard Index&#xff09; 和 Pearson相似度 &#xff08;Pearson Correlation&#xff09; 一、算法逻辑Jaccard相似度 (Jaccard Index)**Pearson相似度 (Pearson Correlation)** 二、算法原理与数学推导1. Jaccard相…...

QT之头像剪裁效果实现

文章目录 源码地址&#xff0c;环境&#xff1a;QT5.15&#xff0c;MinGW32位效果演示导入图片设置剪裁区域创建剪裁小窗口重写剪裁小窗口的鼠标事件mousePressEventmouseMoveEventmouseReleaseEvent 小窗口移动触发父窗口的重绘事件剪裁效果实现 源码地址&#xff0c;环境&…...

apptrace 视角下移动端深度链接技术与优势​

官网链接&#xff1a;AppTrace - 专业的移动应用推广追踪平台 App 拉起&#xff0c;本质上是移动端深度链接技术的具象化呈现。在这一领域&#xff0c;apptrace 凭借前沿技术与创新理念&#xff0c;实现从 H5 网页到 App 的无缝跳转&#xff0c;精准定位 App 内指定页面&#…...

微前端之micro-app数据通信

在这之前如果还没接触过微前端,可以找一些视频、资料先去了解一下,就不在这里赘述了。 现在常见的微前端框架包括: single-spa micro-app qiankun EMP 无界 目前了解到的基本上是这些哈,大家感兴趣可以自行去了解一下,看下它们之间的区别。 因为我目前使用的是mic…...

【GPT入门】第40课 vllm与ollama特性对比,与模型部署

【GPT入门】第40课 vllm与ollama特性对比&#xff0c;与模型部署 1.两种部署1.1 vllm与ollama特性对比2. vllm部署2.1 服务器准备2.1 下载模型2.2 提供模型服务 1.两种部署 1.1 vllm与ollama特性对比 2. vllm部署 2.1 服务器准备 在autodl 等大模型服务器提供商&#xff0c;…...

unity开发棋牌游戏

使用unity开发的棋牌游戏&#xff0c;目前包含麻将、斗地主、比鸡、牛牛四种玩法游戏。 相关技术 客户端&#xff1a;unity 热更新&#xff1a;xlua 服务器&#xff1a;c Web服务器&#xff1a;ruoyi 游戏视频 unity开发棋牌游戏 游戏截图...

Nat Commun项目文章 ▏小麦CUTTag助力解析转录因子TaTCP6调控小麦氮磷高效利用机制

今年2月份发表在《Nature Communications》&#xff08;IF14.4&#xff09;的“TaTCP6 is required for efficientand balanced utilization of nitrate and phosphorus in wheat”揭示了TaTCP6在小麦氮磷利用中的关键调控作用&#xff0c;为优化肥料利用和提高作物产量提供了理…...

Qt OpenGL 相机实现

在Qt中使用OpenGL实现相机功能主要涉及视图矩阵(view matrix)的操作&#xff0c;包括相机位置、观察方向和上向量等概念。下面我将介绍如何在Qt中实现一个基本的3D相机。 基本概念 OpenGL相机本质上是通过视图矩阵(view matrix)来实现的&#xff0c;它定义了从世界空间到观察…...

云原生时代 Kafka 深度实践:03进阶特性与最佳实践

3.1 数据可靠性与一致性 Producer 端可靠性策略 Kafka 通过acks参数控制消息确认机制&#xff0c;不同设置适用于不同场景&#xff1a; acks0&#xff1a;Producer 发送消息后不等待 Broker 确认&#xff0c;立即返回。这种模式吞吐量最高&#xff0c;但可能丢失消息&#x…...

基于关联表字段映射的批量数据更新 SQL 实现方案(AIGC)

UPDATE po_upfiles u JOIN po_micro m ON u.from_id = m.ent_id_old SET u.from_id = m.ent_id; 我的提问 批量更新po_upfiles数据中from_id=ent_id_old的数据中from_id为ent_id,语句怎么写“问题重新按照适合AI的逻辑进行提问,如何修改 精确版...

Hadoop复习(二)

部署Hadoop 考试不考部署&#xff0c;就复习选择和大题 问题 1 单项选择 2 / 2 分 下面哪个是MapReduce的核心配置文件 core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml 问题 2 单项选择 2 / 2 分 下面哪个是HDFS的核心配置文件 core-site.xml hdf…...

C 语言开发中常见的开发环境

目录 1.Dev-C 2.Visual Studio Code 3.虚拟机 Linux 环境 4.嵌入式 MCU 专用开发环境 1.Dev-C 使用集成的 C/C 开发环境&#xff08;适合基础学习&#xff09;,下载链接Dev-C下载 - 官方正版 - 极客应用 2.Visual Studio Code 结合 C/C 扩展 GCC/MinGW 编译器&#xff0c…...