背景:
前段时间一直在看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,并且需要输入密码,非常麻烦
所以考虑如何不输入密码?
两个解决方案:
- 切root用户
- 将用户加入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;
当出现这个界面时,mysql配置成功!
配置ssh
由于我们是利用vscode通过ssh远程登陆虚拟机来调试代码,所以需要先在虚拟机上安装ssh~
# 安装并开启
sudo apt install openssh-server
sudo service ssh restart
# 开启默认端口号和prohibit-password配置项
# 虚拟机默认是不允许root用户登录的
sudo vi /etc/ssh/sshd_config
最后,重启ssh服务
sudo service ssh restart
接下来开始配置vscode进行调试!
vscode配置
vscode配置以及连接vmware虚拟机
首先下载vscode并安装,一路往下点
Visual Studio Code - Code Editing. Redefined
随后,下载必须的插件,c/c++与remote-ssh
随后,利用ssh插件远程连接虚拟机
其中给了具体的填写方式,如 ssh root@xxx
, 其中xxx
为具体虚拟机的ip,可以通过ifconfig
命令来查看,如果没有ifconfig
,使用apt-get安装一下即可。
可以看到此时我的虚拟机IP为 192.168.113.129
,所以在vscode中填入 ssh root@192.168.113.129
选择第一个配置即可
点击connect! 开始连接!
连接选择Linux
,输入密码进行连接
此时ubuntu的命令行已经弹出来了说明我们已经成功连接上了虚拟机
如果连接失败,提供两个思路进行检查
- 虚拟机上的ssh是否开启?sshd的配置是否正常?
- ssh xxx@xxx 用户密码是否对应的上?
此时再选择需要打开的目录后,就可以在vscode上看到虚拟机上的代码啦!
不出意外的话,就是这样
vscode调试mysql8.0源码
首先给远端安装插件
- C/C++(gdb 插件调试时使用)
装完后,左侧会如图显示:分上下两栏。上栏是你本地 Windows 上装的 VSCode 插件;下栏是你远端 ubuntu 上装的 VSCode 插件。
随后进入到源码的位置下,配置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
}
]
}
]
}
保存退出后,即可尝试调试啦!冲!
不出意外的话应该是会报错~
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
报错退出后,再次尝试,服务跑起来了,但是不一会又出错了
仔细观察错误发现,一直在提示./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
在2946行打上断点
咱们去服务器上执行一条select语句,看看是不是真的调试起来了
可以看到真的停下来啦!!
说明我们的调试环境配置完毕!!!
XDM安心去看源码吧 :)
(同时通过前一张图可以看到,在进mysql的时候,断点也停了,其实是说明在进库时,mysql也会执行select语句检查输入的账户与密码是否和库中存的相等,这也说明mysql其实默默帮我们做了很多事情我是还要学还需要学)*
后续我会开一个系列专门记录我的mysql学习过程,xdm可以关注一波,一起学习!!!
参考
Ubuntu Linux系统MySQL8.0源码编译安装笔记_ubuntu please install the appropriate openssl deve-CSDN博客
技术分享 | Windows 下 MySQL 源码学习环境搭建步骤【建议收藏】-腾讯云开发者社区-腾讯云 (tencent.com)