先决条件
平台:Windows 11
docker:docker dekstop application
可访问docker hub官网进行下载https://hub.docker.com/
windows下的docker可以选用wsl2作为backend,使用起来十分方便。
启动docker
打开docker desktop后,界面如下
这时候我们便可以开始拉取镜像,安装容器了。
打开windows下的终端powershell,输入命令拉取opengauss-dev版本镜像
docker pull opengauss/opengauss-dev:5.0.0
这个镜像有些大,全部下载完毕大小7GB左右,注意预留好对应磁盘空间。
下载后镜像后,我们便可以依托镜像启动我们的容器。
powershell下使用命令:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined --name gs-dev --privileged -it opengauss/opengauss-dev:5.0.0
这样便会创建一个名为gs-dev的容器,在我们的docker desktop图形化界面也能看到
这个时候容器便已经处于启动状态,接下来便可以连入docker进行相应开发。
这里我们选用vscode来进行连接开发!
VScode连接docker容器
在VScode扩展商店中搜索docker,下载对应官方扩展
下载后,侧边栏便会多出一个名为docker的侧边栏
可以看到我们docker中对应的continer容器以及image镜像都会在这里显示,我们右键单击对应的容器,点击attach VScode的选项,便会新开一个vscode窗口,进入容器环境。
进一步的在vscode容器环境内,点击扩展,下载c++相关插件,让代码看起来更加舒服轻便。
修改容器配置
opengauss-dev容器内有一些小bug,需要我们对配置进行一些修改,以便更好地使用。
打开entrypoint.sh文件,将图示中的两行进行注释。
entrypoint.sh文件在每次我们docker start或者在docker desktop界面手动start容器时都会运行,而图示中的两行执行的是initdb操作,如果不注释掉,就会导致stop容器后,再次strat打开便会失败,因为实际容器内已经存在对应的数据库,initdb操作失败而使得容器start失败。
容器内部目录结构解析
在对应目录下,主要的文件是红框中的opengauss目录与openGauss-server目录
目录 | 内容 |
---|---|
openGauss | 存储初始化的数据库相关内容 |
openGauss-server-v5.0.0 | opengauss服务器源码 |
源码编译构建命令
在开发修改服务器源码后,需要重新对源码重新编译构建。
首先进入服务器源码目录下
[opengauss@acf63d7ebcf5 ~]$ cd openGauss-server-v5.0.0/
可以看到对应的configure命令,我们可以通过命令进行编译
[opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ ./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0 -g' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-cassert --enable-thread-safety --enable-debug --without-readline --without-zlib
编译完成后,通过make命令进行构建
[opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ make -j 8 && make install -j 8
看到终端显示opengauss installation complete说明构建成功。
opengauss数据库服务端启动与客户端连接
服务端相关命令
- 启动oepngauss server
gs_ctl start -D /home/opengauss/openGauss/data -Z single_node
gaussdb -D /home/opengauss/openGauss/data --single_node
显示server started说明服务器启动成功。
也可以通过查找gaussdb进程pid号,来判断是否启动成功。
[opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ pgrep gaussdb
- 关闭opengauss server
gs_ctl stop -D /home/opengauss/openGauss/data - 重启opengauss server
gs_ctl restart -D /home/opengauss/openGauss/data -Z single_node
客户端相关命令
- 连接数据库服务端
[opengauss@acf63d7ebcf5 ~]$ gsql -d postgres
进入到openGauss数据库用户下
- 断开数据库连接
在命令行输入\q即可
- 获取当前系统所有公共表
openGauss=# SELECT tablename FROM pg_tables WHERE schemaname='public';
- 获取某个表的相关信息
openGauss=# select column_name, data_type from information_schema.columns where table_name='health_data';
使用gdb附着gaussdb服务端进行调试
先备条件
- 启动服务端
gs_ctl start -D /home/opengauss/openGauss/data -Z single_node - 客户端连接
gsql -d postgres - 查找服务端进程pid
pgrep gaussdb
开始调试
使用gdb attach +进程pid的命令进行调试进程附着(attach 也可以简写为 a)
[opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ gdb a 13606
gaussdb服务端进程被附着后会生起各种线程来处理数据库中的不同操作。
在gdb中可以通过 info threads命令来获取全部线程信息(info 也可以简写为 i)
(gdb) i threads
对于调试客户端连接的sql语句执行流程而言,最重要的就是其中最后一个worker线程,它是用来处理接收客户端连接信息的。
我们可以通过thread +线程id,也就是线程信息中第一列,来跳转到对应线程上来查看其信息。查看调用堆栈信息,可以使用backtrace命令(简写 bt)
(gdb) thread 37
(gdb) bt
可以看到37号worker线程正处于recv等待客户端信息阶段。
opengauss具体打断点调试前的必备操作!
由于opengauss内置了特别的SIGUSR1与SIGUSR2的自定义signal。
为了更好的调试体验,我们需要在具体打断点调试前,先使用handle命令禁用掉这两个信号。
(gdb) handle SIGUSR1 noprint nostop pass
(gdb) handle SIGUSR2 noprint nostop pass
gdb常用命令
command | use method |
---|---|
breakpoint(简写为 b) | b 具体文件:具体行数 b 具体函数名 |
info breakponits(简写为 i b) | 查看全部的断点信息 |
delete(简写为 d) | d 具体断点号 删除具体断点 d 删除全部断点 |
watch | watch 变量名 监视某一个变量,如发生变化,则在变化处终端程序 |
disable(简写为 dis) | disable 具体断点号,暂时禁用断点 |
enable(简写为 en) | enable 具体断点号,重新启动断点 |
command | use method |
---|---|
next(简写为 n) | 单步执行代码 |
step(简写为 si) | 步入至当前代码位置的调用函数 |
list(简写为 l) | 显示当前位置的源代码 |
finish(简写为 fin) | 执行程序直到从当前函数返回为止,并停在调用该函数的地方 |
continue(简写为 c) | 继续执行程序,直至程序结束或遇到下一个断点 |
print(简写为 p) | p 具体变量名 查看当前程序运行阶段该变量的值 |