完整搭建windows下mysql8.0源码编译调试环境!

背景:

前段时间一直在看mysql相关的博客,所以对源码起了浓厚的兴趣,所以尝试通过vmware和vscode在windosw环境中搭建一套编译调试的环境~

看了一下网上的搭建教程基本杂乱无章,想要从零跟着搭建出一个完善的调试环境也不是易事,所以写下了这章搭建教程,系统性梳理好MySQL8.0源码编译调试的详细搭建过程。

注意 vmware提前预留磁盘空间 50G,编译出来的源码最起码占了 30G

如果需要扩容 请参考我的另一篇博客 ubuntu20 vmware硬盘空间不够,进行扩容,实操成功!-CSDN博客

安装依赖,源码编译
# 安装依赖
sudo apt-get install build-essential cmake bison libncurses5-dev libssl-dev pkg-config# 下载源码
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.16.tar.gz
tar xzv -f mysql-boost-8.0.16.tar.gz# 进入源码目录
cd mysql-8.0.16/ ; ls# 开始编译 非常慢的过程,我在虚拟机里搞了快一个小时~
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DWITH_BOOST=boost -DFORCE_INSOURCE_BUILD=ON# 需要加sudo,否则可能权限不够会报错
# 好在出错后,重新执行命令还能接着执行
sudo make && sudo make install
mysql初始化
# 初始化前准备 权限不够的话 就加上 sudo
groupadd mysql
useradd -g mysql mysql
mkdir -p /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql# 开始初始化 权限不够的话 就加上 sudo
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

初始化完成,注意找个地方记着生成的临时密码
A temporary password is generated for root@localhost: 3=0&wjy%yW%<

weweaq@ubuntu:/usr/local/mysql$ sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2024-08-17T16:23:24.516295Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.16) initializing of server in progress as process 19010
2024-08-17T16:23:25.695438Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 3=0&wjy%yW%<
2024-08-17T16:23:26.354597Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.16) initializing of server has completed

写命令的时候,由于不是root用户,所以老是需要输入sudo,并且需要输入密码,非常麻烦
所以考虑如何不输入密码?
两个解决方案:

  1. 切root用户
  2. 将用户加入root用户组? 具体就是 sudo visudo, 复制root ALL=(ALL:ALL) ALL,将自己的用户名替换了root,放到之下面
    Ctrl+o 保存 按回车确认保存 Ctrl+x 退出

方法1 参考
VMware _ Ubuntu _ root 密码是什么,怎么进入 root 账户_vmware安装ubuntu22.04完成 root密码-CSDN博客
方法2 参考
ubuntu避免每次都输入sudo_ubuntu取消sudo-CSDN博客

实际方法2并不好用,所以这里使用,切成root用户执行命令 设置root用户的密码为:1111

配置mysql

在/etc目录下新建一个全局用的简单的配置文件


vim /etc/my.cnf# 然后将以下内容复制进去 #
[client]
socket = /tmp/mysql.sock[mysqld]
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data

将mysql服务注册到系统服务

# 注意看自己mysql的安装目录,如果是按照我的教程话,那就是一样的
# 之前cmake的时候定义了安装目录 /usr/local/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
update-rc.d mysqld defaults
service mysqld start

mysql/support-files/下的mysql.server复制到 /etc/init.d/下,并且重新命名为mysqld,这是为了后续能够通过 service mysqld start 来方便的控制mysql,start可以替换成/stop/status/restart分别控制mysql关闭,重启,查看状态~

添加path

echo -e '# MySQL PATH\nexport PATH=/usr/local/mysql/bin:$PATH\n' >> /etc/profile
source /etc/profile

连接登录MySQL并修改root账户密码(需要使用之前存的临时密码)。

mysql -uroot -p'3=0&wjy%yW%<`'# 主要在mysql8.0中已经不可以使用 update mysql.user set password = password('xxx') where user = 'xxx';的写法了
ALTER USER 'root'@'localhost' IDENTIFIED BY '1111';

因为本次安装只是个人使用(非生产环境),所以可以额外的将账户密码信息写入配置文件,以后连接直接使用mysql命令即可,无需再输入账户密码~

vim /etc/my.cnf
[client]
# 把这几行添加到client选项组下面 #
user = root
password = 1111
port = 3306

尝试登陆 直接输入mysql, 并给root用户配置外部所有host均可连接。

UPDATE `mysql`.`user` SET `Host` = '%' WHERE `User` = 'root';
FLUSH PRIVILEGES;

![[Pasted image 20240818181342.png]]

当出现这个界面时,mysql配置成功!

配置ssh

由于我们是利用vscode通过ssh远程登陆虚拟机来调试代码,所以需要先在虚拟机上安装ssh~

# 安装并开启
sudo apt install openssh-server
sudo service ssh restart# 开启默认端口号和prohibit-password配置项
# 虚拟机默认是不允许root用户登录的
sudo vi /etc/ssh/sshd_config

![[Pasted image 20240818213225.png]]

最后,重启ssh服务

sudo service ssh restart

接下来开始配置vscode进行调试!

vscode配置

vscode配置以及连接vmware虚拟机

首先下载vscode并安装,一路往下点
Visual Studio Code - Code Editing. Redefined

随后,下载必须的插件,c/c++与remote-ssh
![[Pasted image 20240818211317.png]]

![[Pasted image 20240818180258.png]]

![[Pasted image 20240818211240.png]]

随后,利用ssh插件远程连接虚拟机
![[Pasted image 20240818211533.png]]

其中给了具体的填写方式,如 ssh root@xxx, 其中xxx为具体虚拟机的ip,可以通过ifconfig命令来查看,如果没有ifconfig,使用apt-get安装一下即可。

![[Pasted image 20240818211803.png]]

可以看到此时我的虚拟机IP为 192.168.113.129,所以在vscode中填入 ssh root@192.168.113.129

选择第一个配置即可
![[Pasted image 20240818211932.png]]

点击connect! 开始连接!
![[Pasted image 20240818211954.png]]

连接选择Linux,输入密码进行连接
![[Pasted image 20240818213421.png]]

此时ubuntu的命令行已经弹出来了说明我们已经成功连接上了虚拟机
![[Pasted image 20240818213543.png]]

如果连接失败,提供两个思路进行检查

  1. 虚拟机上的ssh是否开启?sshd的配置是否正常?
  2. ssh xxx@xxx 用户密码是否对应的上?

此时再选择需要打开的目录后,就可以在vscode上看到虚拟机上的代码啦!
![[Pasted image 20240818213921.png]]

不出意外的话,就是这样
![[Pasted image 20240818214011.png]]

vscode调试mysql8.0源码

首先给远端安装插件

  • C/C++(gdb 插件调试时使用)

装完后,左侧会如图显示:分上下两栏。上栏是你本地 Windows 上装的 VSCode 插件;下栏是你远端 ubuntu 上装的 VSCode 插件。
![[Pasted image 20240818214526.png]]

随后进入到源码的位置下,配置vscode插件

cd /home/weweaq/sqlcode/mysql-8.0.16
mkdir .vscode 
cd .vscode 
vi launch.json

launch.json中输入

{"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "cppdbg","request": "launch","program": "/usr/local/mysql/bin/mysqld","args": [],"stopAtEntry": false,"cwd": "/home/weweaq/sqlcode/mysql-8.0.16","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}]}]}

保存退出后,即可尝试调试啦!冲!
![[Pasted image 20240818214930.png]]

不出意外的话应该是会报错~

2024-08-17T18:23:43.533899Z 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.16) starting as process 12916 2024-08-17T18:23:43.538507Z 0 [ERROR] [MY-010123] [Server] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

说什么mysql不可以通过root用户来启动~ 没想到还有这种限制~

仔细想来,之前我们给mysql配置的时候不是配置了mysql用户组和mysql用户吗?为什么没通过mysql用户把服务起起来?

检查 /etc/my.cnf 配置文件,发现竟然没有配置启动mysql的用户,于是在mysqld栏下配置user=mysql
![[Pasted image 20240818215336.png]]

报错退出后,再次尝试,服务跑起来了,但是不一会又出错了

![[Pasted image 20240818215417.png]]

仔细观察错误发现,一直在提示./ibdata1文件使用不了,提示可能有其他线程在使用

于是直接kill掉所有mysql相关的线程,重启一下mysql服务

ps aux |grep mysql  
kill  mysql进程cd /var/lib/mysql  
删除 mysql.sock.lock 文件# 重启mysql
service mysqld restart

再次点击gdb调试,好像没有报错了~

小小试试看能否调试

在vscode中按下快捷键ctrl+p搜索文件sql_parse.cc
![[Pasted image 20240818215915.png]]

在2946行打上断点

![[Pasted image 20240818220531.png]]

咱们去服务器上执行一条select语句,看看是不是真的调试起来了

![[Pasted image 20240818220724.png]]

![[Pasted image 20240818220810.png]]

可以看到真的停下来啦!!

说明我们的调试环境配置完毕!!!

XDM安心去看源码吧 :)

(同时通过前一张图可以看到,在进mysql的时候,断点也停了,其实是说明在进库时,mysql也会执行select语句检查输入的账户与密码是否和库中存的相等,这也说明mysql其实默默帮我们做了很多事情我是还要学还需要学)*

后续我会开一个系列专门记录我的mysql学习过程,xdm可以关注一波,一起学习!!!

参考
Ubuntu Linux系统MySQL8.0源码编译安装笔记_ubuntu please install the appropriate openssl deve-CSDN博客
技术分享 | Windows 下 MySQL 源码学习环境搭建步骤【建议收藏】-腾讯云开发者社区-腾讯云 (tencent.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403724.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode3232. 判断是否可以赢得数字游戏

Every day a Leetcode 题目来源&#xff1a;3232. 判断是否可以赢得数字游戏 解法1&#xff1a;3232. 判断是否可以赢得数字游戏 用一个 sum1 统计个位数的和&#xff0c;sum2 统计十位数的和。 只要 sum1 和 sum2 不相等&#xff0c;Alice 拿大的就能赢得这场游戏。 代码…

Maven的依赖范围

依赖的jar包&#xff0c;默认情况下&#xff0c;可以在任何地方使用&#xff0c;可以通过scope来设置作用范围 作用范围&#xff1a; 主程序范围有效&#xff08;main文件夹范围内&#xff09;测试程序范围有效&#xff08;test文件夹范围内&#xff09;是否参与打包运行&…

一次日志记录中使用fastjson涉及到ByteBuffer的教训

背景 目前本人在公司负责的模块中&#xff0c;有一个模块是负责数据同步的&#xff0c;主要是将我们数据产线使用的 AWS Dynamodb 同步的我们的测试QA 的环境的 MongoDB 的库中&#xff0c;去年开始也提供了使用 EMR 批量同步的功能&#xff0c;但是有时候业务也需要少量的数据…

【OpenCV_python】凸包检测 轮廓特征 直方图均衡化 模板匹配 霍夫变换

凸包特征检测 凸包就是图像的最小外接多边形&#xff0c;通过图像的轮廓点&#xff0c;找到距离最远的两个点的直线&#xff0c;根据直线找到距离最远的下一个点&#xff0c;直到所有的点被包围在多边形内 读取图像二值化找图像的轮廓获取凸包点的坐标绘制凸包点 convexHull 获…

程序员如何写PLC程序

PLC是可编程逻辑控制器的简称&#xff0c;常用的编程语言是IEC61131-3&#xff08;梯形图、结构化文本、指令表、功能块、顺序功能图&#xff09;和西门子的SCL。程序员常用的编程语言是JS、Java、Python、C/C、Go等。PLC广泛采用编程工具有codesys、博图等。程序员常用的编程工…

敏捷架构在数字时代的应用:从理论到实践的全面指南

在数字化转型和技术变革的浪潮中&#xff0c;企业面临着不断提升敏捷性和应对复杂环境的挑战。敏捷架构在数字时代的应用不仅从理论层面阐述了敏捷架构的基本原理&#xff0c;还为企业提供了详细的实践指南&#xff0c;帮助企业从理论走向实际操作。本文将从理论与实践的双重视…

STM32——CAN通讯基础知识

CAN 协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称&#xff0c;它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的&#xff0c;并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下&#xff1a; 高速CAN可以达…

YOLOv8_det/seg/pose/obb推理流程

本章将介绍目标检测、实例分割、关键点检测和旋转目标检测的推理原理,基于onnx模型推理,那么首先就需要了解onnx模型的输入和输出,对输入的图片需要进行预处理的操作,对输出的结果需要进行后处理的操作,这部分内容在我的另一个专栏《YOLOv8深度剖析》中也有介绍,如果对YO…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…

实训第二十八天(haproxy与利用python实现mysql主从的读写分离)

1、练习 [rootnat ~]# ipvsadm -d -t 192.168.10.101:3306 -r 10.0.0.22:3306 #删除真实主机 nat: [rootnat ~]# ifconfig ens33: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.10 netmask 255.255.255.0 broadcast 10.0.0.25…

【JVM】深入理解类加载机制(二)

深入理解类加载机制 HSDB工具的使用 Hotspot Debugger(HSDB):JDK原生自带 以Windows系统为例&#xff0c;jdk8的环境&#xff0c;在jdk的lib目录下&#xff0c;启动之前&#xff0c;你需要确保你进入的lib目录和你当前的JAVA_HOME配置的JDK是相同的&#xff0c;否则可能会出现…

2.1 文件内容差异对比方法

2.1 文件内容差异对比方法 文件内容差异对比方法2.1.1 两个字符串的差异对比2.1.2 生成美观的HTML格式文档2.1.3 对比nginx 配置文件差异代码封装 文件内容差异对比方法 介绍如何通过difflib模块实现文件内容差异对比。difflib作为Python的标准库模块无需安装&#xff0c;作用…

2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增

随着 OT 组织不断在其业务环境中集成各种数字工具和技术&#xff0c;它们面临的安全挑战也日益变得愈加复杂和多样化。正如 NIST 指出&#xff0c; “虽然安全解决方案旨在解决典型 IT系统中的一些问题&#xff0c;但将这些相同的解决方案引入不同的 OT 环境时&#xff0c;必须…

ruoyi-vue-pro项目新建模块的接口都报404错误

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 新建模块之后,该模块后端的请求都是返回404,如图所示: 2. 原理分析 抛开这个项目,对于路径请求不成功,返回404 主要的步骤如下: 检查路由配置: 确保在路由配置文件中添加了新模块的路由 例如,在Spring Boot中,这…

vue3+ts 前端word文档下载文件时不预览直接下载方法(支持 doc / excel / ppt / pdf 等)

前端word文档下载文件时不预览直接下载方法支持 doc / excel / ppt / pdf 等 根据需要&#xff0c;要实现一个下载文档的需要 最简单的方法就是使用a标签 如果是相同域可以直接下载&#xff0c;但如果是不同域的&#xff0c;就会先打开一个预览页&#xff0c;在预览页再点下载…

StarRocks Lakehouse 快速入门——Apache Paimon

StarRocks Lakehouse 快速入门指南为您提供了湖仓技术概览&#xff0c;旨在帮助您迅速掌握其核心特性、独特优势和应用场景。本指南将指导您如何高效地利用 StarRocks 构建解决方案。文章末尾&#xff0c;我们集合了来自阿里云、饿了么、喜马拉雅和同程旅行等行业领导者在 Star…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践&#xff1a;构建高效的微服务架构 Eureka的核心原理Eureka Server&#xff1a;服务注册中心Eureka Client&#xff1a;服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client&#xff08;服务提供者&…

什么叫日志门面

日志门面&#xff0c;是门面模式的一个典型的应用。 门面模式&#xff08;Facade Pattern&#xff09;&#xff0c;也称之为外观模式&#xff0c;其核心为&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;使得子系统更易于使用。 就像Log4j、Lo…

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

Linux系统-通用权限管理

目录 一、文件类型 二、通用权限 1.文件的常规权限 权限类型 壹.对于文件&#xff1a; 贰.对于目录&#xff1a; 查看和修改权限 说明&#xff1a; 举例&#xff1a; 字母表示法 数字表示法 2.文件的访问控制列表&#xff08;FACL File access control list&#…