MySQL源码调试环境搭建
最近在学习mysql数据库,学习的过程中记录了不少网络或书本上的知识,如果需要再深入学习的话,搭建一个源代码的调试环境来尝试深入学习一些数据库开发的知识
环境和工具准备
环境及软件准备
- Win10
- VMware WorkStation 14 PRO
- CentOS7( 虚拟机中部署linux)
- vscode
- mysql-8.0.34源码包
CentOS7的下载
进入CentOS下载官网,找到64位的CentOS7版本。
下载everything版本和原版都可以,everything会多很多可以用的工具
创建新的虚拟机
创建虚拟机用的镜像文件选好刚刚下载的镜像
内存和cpu尽量设置多一点,不然虚拟机运行起来会很卡很慢,这也根据自己电脑去调配
安装好后,有一个问题是 CentOS7 默认 YUM 源的开发依赖包太老旧了,我需要使用 epel-release
的包来安装更加新的 Debug 依赖包。
打开终端,连好网络
# 创建存放源码的根目录
mkdir -p /root/code
# 进入存放源码的根目录
cd /root/code
# 安装 wget、下载源码 & 解压
yum install wget -y
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.34.tar.gz
tar zxvf mysql-boost-8.0.34.tar.gz
# 用于安装 cmake3 的 yum 源
yum -y install epel-release
# 用于安装高版本 gcc、gcc-c++、make 的 yum 源
yum -y install centos-release-scl
# 安装依赖软件
yum -y install devtoolset-11-gcc \
devtoolset-11-gcc-c++ \
devtoolset-11-make \
cmake3 \
openssl-devel \
ncurses-devel \
bison
# 安装 gdb
yum -y install devtoolset-11-gdb
# 让 scl 环境临时生效
source /opt/rh/devtoolset-11/enable
# 让 scl 环境永久生效
vi /etc/profile.d/scl.sh
# 把以下内容写入 scl.sh,然后保存退出
source /opt/rh/devtoolset-11/enable
编译安装 MySQL Debug 版
cd /root/code/mysql-8.0.34
cmake3 . \
-DWITH_BOOST=./boost/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DWITH_DEBUG=1 \
##编译代码
make && make install
编译完成后 输入
echo $?
查看还有没有没有编译完成的,如果是0则编译成功了
MySQL 初始化
# 创建配置文件目录 & 数据目录
mkdir -p /mysql/8.0.34/data #你可以改这里
# 创建用户 & 组
groupadd mysql
useradd -g mysql mysql
# 创建配置文件
vi /etc/my.cnf
# 把以下内容覆盖到 my.cnf
[mysqld]
user=mysql
innodb_file_per_table=1
server_id=100
basedir=/usr/local/mysql
datadir=/mysql/8.0.34/data #你可以改这里
log-error=/mysql/8.0.34/data/error.log #你可以改这里
# 初始化数据目录
/usr/local/mysql/bin/mysqld --initialize-insecure
安装 VSCode 插件
本地安装ssh,远程安装这两个插件,远程下载插件很慢,可以下载好插件的安装文件,导入虚拟机,然后在虚拟机中安装,点这里
连上虚拟机的ip,输入密码,打开源码文件
调试,配置 VSCode 插件
cd /root/code/mysql-8.0.34
mkdir .vscode
cd .vscode
vi launch.json
内容
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "/usr/local/mysql/bin/mysqld",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
启动 gdb
CentOS 上登录连接 MySQL
/usr/local/mysql/bin/mysql # 登录 MySQL
连接 MySQL 成功之后,在 MySQL 源码中打个断点,先打开 sql/sql_parse.cc
文件:
打上断点
先在 CentOS 上的 MySQL 终端上执行一条 SQL。
SELECT user FROM mysql.user;
停在断点处