diff --git "a/content/zh/post/zhaoyanliang/openGauss\345\255\246\344\271\240\357\274\210\344\270\200\357\274\211--centos\345\256\211\350\243\205.md" "b/content/zh/post/zhaoyanliang/openGauss\345\255\246\344\271\240\357\274\210\344\270\200\357\274\211--centos\345\256\211\350\243\205.md" new file mode 100644 index 0000000000000000000000000000000000000000..cfdea26a08b10f3bf812f5e6d7f7873c1779929a --- /dev/null +++ "b/content/zh/post/zhaoyanliang/openGauss\345\255\246\344\271\240\357\274\210\344\270\200\357\274\211--centos\345\256\211\350\243\205.md" @@ -0,0 +1,287 @@ ++++ +title = "openGauss学习(一)--centos安装" +date = "2021-11-30" +tags = ["openGauss社区开发入门"] +archives = "2021-30" +author = "zhaoyanliang" +summary = "openGauss社区开发入门" +img = "/zh/post/zhaoyanliang/title/title.jpg" +times = "13:30" + ++++ + + + +在centos上安装opengauss教程 + + + +#### 一、opengauss介绍 + +openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss早期版本内核源自PostgreSQL,深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。 + +openGauss目前支持在centos及openEuler系统上运行 + + + +#### 二、centos安装教程 + +1. ##### 环境配置 + + VMware Workstation Pro虚拟机软件,centos7.9(最好是7.6及以上版本,因为之后会手动修改版本号到7.6,如果7.6以下版本可能不能向上兼容) + + + +2. ##### 虚拟机软件VMware Workstation Pro安装 + + 下载链接:[下载 VMware Workstation Pro | CN](https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html) + + 该软件安装较为简单,按照普通软件安装即可,如遇问题网上也有很多教程 + + + +3. ##### centos镜像下载 + + 我使用的是校园网,可以直接到清华源、中科大源等网站下载;如果是非校园网,到官网下载速度偏慢 + + 清华源链接:[清华大学开源软件镜像站 | Tsinghua Open Source Mirror](https://mirrors.tuna.tsinghua.edu.cn/) + + + + 步骤一:点击“获取下载链接” + + ![image-20211011110017529](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011110017529.png) + + + + 步骤二:选择centos及版本号为7的DVD镜像文件,点击即可下载(下载为7.9版本) + + ![image-20211011110243320](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011110243320.png) + + + +4. ##### centos虚拟机配置 + + 1. 启动VMware Workstation Pro,点击创建新的虚拟机 + + ![image-20211011110532504](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011110532504.png) + + + + 2. 选择“自定义”,点击下一步 + + ![image-20211011111105402](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011111105402.png) + + + + 3. 保持默认,点击下一步 + + ![image-20211011111152764](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011111152764.png) + + + + 4. 选择“稍后安装” + + ![image-20211011112527795](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011112527795.png) + + + + 5. 选择图中选项 + + ![image-20211011112604966](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011112604966.png) + + + + 6. 给虚拟机随便起个名称和选择安装位置,均可自定义 + + ![image-20211011112641119](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011112641119.png) + + + + 7. 配置处理器,图中为我的设置,可根据自己电脑性能配置,如果决定不妥后面可在虚拟机设置更改 + + ![image-20211011112912990](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011112912990.png) + + + + 8. 设置内存大小(建议保持默认推荐的设置) + + ![image-20211011113011613](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011113011613.png) + + + + 9. 选择网络类型,这里选择“网络地址转换” + + ![image-20211011114156879](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114156879.png) + + + + 10. 以下几步保持默认 + + ![image-20211011114220394](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114220394.png) + + ![image-20211011114251134](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114251134.png) + + ![image-20211011114306010](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114306010.png) + + + + 11. 磁盘分配,选择“拆分多个文件”,磁盘容量建议保持默认 + + ![image-20211011114348393](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114348393.png) + + + + 12. 以下保持默认,之后点击“完成”即可 + + ![image-20211011114445675](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114445675.png) + + + + 13. 点击“编辑虚拟机设置” + + ![image-20211011114558025](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114558025.png) + + + + 14. 选择镜像iso文件 + + ![image-20211011114657689](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114657689.png) + + + + 15. 移除打印机这个不存在的设备,之后点击“确定”保存 + + ![image-20211011114813694](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011114813694.png) + + 16. 添加第二张网卡和修改模式(重要步骤) + + ![image-20211103160714362](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103160714362.png) + + ![image-20211103160845726](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103160845726.png) + + 17. 启动centos + + 启动安装第一界面,直接按下“Enter“键后就会进入自检界面。 + + ​ ![image-20211011120425966](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011120425966.png) + + 在自检界面按下“Esc“键跳过自检,然后进入如下界面 + + 18. 选择语言 + + ![image-20211011120501686](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011120501686.png) + + + + 19. 选择安装位置进行分区 + + ![image-20211011120618314](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011120618314.png) + + ![image-20211011120648928](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011120648928.png) + + 20. 手动配置分区,下拉选择标准分区 + + ![image-20211011120857291](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011120857291.png) + + 点击“点这里创建它们” + + ![image-20211011120945745](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011120945745.png) + + ![image-20211011121025609](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011121025609.png) + + 接受更改 + + 21. 在安装信息摘要页面,点击“网络和主机名“进行网络和主机名设置,具体如下: + + ![image-20211011121053125](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211011121053125.png) + + 22. 安装信息摘要页面,点击“网络和主机名“进行网络和主机名设置,具体如下: + + 选择第一张网卡: + + ![image-20211103162822965](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103162822965.png) + + 如以太网(enpOs3)网卡,先点击“关闭“边上的按钮把网卡打开。设置主机名(如:db1),并点击“应用(A)”,然后点击“配置“。 + + ​ ![image-20211103163644877](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103163644877.png) + + 说明:设置主机名时一定要注意,如果在同一网段内有多位学员按此文档来安装,请尽量把主机名设成不一样 + + ![image-20211103163927741](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103163927741.png) + + 在配置页中,选择“常规“,然后勾选”可用时自动链接到这个网络“,接着点击”保存“。 + + 接着照着第一张网卡设置进行第二张网卡的设置: + + ![image-20211103164056986](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103164056986.png) + + ![image-20211103164127187](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103164127187.png) + + 点击完成进行保存: + + ![image-20211103165558378](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103165558378.png) + + 23. 在安装信息摘要页面,点击“软件选择 “进行软件安装设置,具体如下: + + 1. 2. ![image-20211103165736561](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103165736561.png) + + 在此页面选择“GNOME桌面“,并在右边勾选”GNOME应用程序“、”开发工具“、”安全性工具“、”系统管理工具“。然后点击完成。 + + ​ ![image-20211103170212856](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103170212856.png) + + 点击“开始安装”: + + ![image-20211103170442514](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103170442514.png) + + + + 24. 安装界面设置: + + ![image-20211103171515916](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103171515916.png) + + 点击“ROOT密码“,给ROOT用户设置密码(如:openGauss@123)。 + + ![image-20211103171533677](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103171533677.png) + + 点击“创建用户“,在此新创建一个用户(如:用户test,密码openGauss@123),具体如下: + + ​ ![image-20211103171544484](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103171544484.png) + + ​ + + 点击“完成配置“,系统安装中,等待数分钟后会出现如下界面: + + ​ ![image-20211103171600132](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103171600132.png) + + 出现此界面表示,系统安装完成,然后点击“重启“。 + + ![image-20211103171632754](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103171632754.png) + + 25. 接受许可证 + + ![image-20211103172432749](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103172432749.png) + + 点击完成配置: + + ![image-20211103172510280](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103172510280.png) + + 26. 点击用户和输入密码进入系统: + + ![image-20211103172630663](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103172630663.png) + + 其他的有一些语言设置,直接选择和跳过就好,不赘诉。 + + ![image-20211103172944323](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103172944323.png) + + 27. 在Linux操作系统上,通过ifconfig来查看二张网卡是否都正常启动,具体如下: + + ![image-20211103173057702](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103173057702.png) + + 通过ping baidu.com确认是否能上网,具体如下: + + ![image-20211103173156715](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211103173156715.png) + + 出现上述页面则一切正常(按ctrl+c可停止)。 + +至此,centos完全安装完成,运行opengauss的环境全部配置完成 \ No newline at end of file diff --git "a/content/zh/post/zhaoyanliang/openGauss\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211--openGauss\346\225\260\346\215\256\345\272\223\345\256\211\350\243\205.md" "b/content/zh/post/zhaoyanliang/openGauss\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211--openGauss\346\225\260\346\215\256\345\272\223\345\256\211\350\243\205.md" new file mode 100644 index 0000000000000000000000000000000000000000..ec03bc25eff16475678252687d3fb264156ca7b4 --- /dev/null +++ "b/content/zh/post/zhaoyanliang/openGauss\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211--openGauss\346\225\260\346\215\256\345\272\223\345\256\211\350\243\205.md" @@ -0,0 +1,310 @@ ++++ +title = "openGauss学习(二)openGauss数据库安装" +date = "2021-11-30" +tags = ["openGauss社区开发入门"] +archives = "2021-11" +author = "zhaoyanliang" +summary = "openGauss社区开发入门" +img = "/zh/post/zhaoyanliang/title/title.jpg" +times = "13:30" + ++++ + +## opengauss安装教程(二) + +前面我们已经完成了虚拟机centos的安装和环境配置,接下来我们要进入opengauss的安装了 + + + +#### 一、操作系统环境准备 + +1. **修改系统版本** + + + + 先使用su指令切换到root用户: + + ![image-20211108162752916](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108162752916.png) + + 如果CentOS版本不是7.6的需要进行修改,如果是7.6则无需修改, + + 先vi /etc/redhat-releas 打开编辑文件,然后将内容改为CentOS Linux release 7.6.2003 (Core)。输入”i”切换到编辑模式,移动鼠标到修改位置修改内容,然后按下ESC键退出编辑模式,然后输入”:wq”退出并进行保存,具体如下: + + ![image-20211110161157466](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110161157466.png) + +2. **关闭防火墙** + +​ 执行以下二个命令将防火墙关闭, + +​ systemctl stop firewalld.service + +​ systemctl disable firewalld.service,具体如下 + +​ ![image-20211108163254936](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108163254936.png) + +3. **设置字符集及环境变量** + + + + ![image-20211108163954650](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108163954650.png) + + 验证变量是否生效: + + ![image-20211108165054078](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108165054078.png) + + + +4. **关闭swap内存** + + swapoff -a + + ![image-20211108165558448](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108165558448.png) + +5. **准备yum环境** + + 备份原有的yum配置文件: + + mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak + + + + ![image-20211108165833119](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108165833119.png) + + + + 下载可用源的repo文件,可通过以下二种方式下载: + + 方式一: + + curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo + + 方式二: + + curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo + + 如图: + + ![image-20211108170027609](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108170027609.png) + + 查看repo文件内容是否正确,如果显示的内容不正确,请选择另一种方式下载可用源的repo文件。 + + ![image-20211108170353485](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211108170353485.png) + + + +6. **yum安装相关包。** + + 3. 执行以下命令,安装所需的包 + + yum install -y libaio-devel flex bison ncurses-devel glibc.devel patch lsb_release wget python3 + + 如下: + + ![image-20211110164431185](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110164431185.png) + + 此处可能你会出错:-bash: /usr/bin/yum: /usr/bin/python: bad interpreter: No such file or directory + + 因为我也出错了。。。。 + + 解决方法: + + [-bash: /usr/bin/yum: /usr/bin/python: bad interpreter: No such file or directory_weixin_38169359的博客-CSDN博客](https://blog.csdn.net/weixin_38169359/article/details/101292719) + + 根据你的路径决定修改后python数字是2.4还是2.7亦或是其它哦(我是2.7) + +7. **设置默认Python版本为3.x。** + + ![image-20211110164207128](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110164207128.png) + + 修改完成后,需要确认yum是否能使用,如果不能使用需要修改/usr/bin/yum文件,把#!/usr/bin/python这行修改为#!/usr/bin/python2.7(或者对应的python 2.x的版本)。输入”i”切换到编辑模式,移动鼠标到修改位置修改内容,然后按下ESC键退出编辑模式,然后输入”:wq”退出并进行保存。如下: + + ![image-20211110164540792](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110164540792.png) + + 用yum --help命令来验证yum是否能使用: + + ![image-20211110164642691](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110164642691.png) + +8. **创建数据库存放安装目录:** + + ![image-20211110164843604](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110164843604.png) + +9. **下载数据库安装包** + + ![image-20211110164953102](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110164953102.png) + + + +#### 二、安装opengauss数据库 + +1. **创建XML配置文件,用于数据库安装** + + ![image-20211110165208487](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110165208487.png) + + 将以下内容添加进clusterconfig.xml文件中。输入”i”切换到编辑模式,复制内容黏贴到文档中,然后按下ESC键退出编辑模式,然后输入”:wq”退出并进行保存。 + + ![image-20211110165401524](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110165401524.png) + + ``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ``` + + 说明:其中标红的内容,需要根据自己实际的IP和主机名进行修改,如果其中的中文出现乱码时可以删除这些行。 + +2. **将下载好的安装包解压至存放目录** + + 先解压openGauss-1.1.0-CentOS-64bit-all.tar.gz包 + + ![image-20211110170430428](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110170430428.png) + + 再先解压openGauss-1.1.0-CentOS-64bit-om.tar.gz包。 + + ![image-20211110170638586](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110170638586.png) + + 解压后如下,用ls命令查看如下: + + ![image-20211110170721864](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110170721864.png) + + 安装包解压后,会在/opt/software/openGauss路径下自动生成script子目录,并且在script目录下生成gs_preinstall等各种OM工具脚本。 + + 更改权限。 + + ![image-20211110170828835](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110170828835.png) + +3. **执行初始化脚本** + + ![image-20211110171525896](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110171525896.png) + + 期间需要输入操作系统root用户的密码(如密码:openGauss@123)和创建操作系统omm用户及设置密码(如密码:openGauss@123)。密码依然不回显,直接输入密码并回车即可。 + + 当返回Preinstallation succeeded内容时,表明初始化完成。 + +4. **初始化数据库。** + + 用init 6 重启下虚拟机(主要是为了释放一些内存资源)。 + + ![image-20211110171651494](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110171651494.png) + + 更新权限: + + ![image-20211110173502716](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110173502716.png) + + 然后使用omm用户进行数据库初始化。 + + 注意:根据用户实际内存大小设置对应的共享内存的大小,如果对该参数进行了设置,会在数据库启动时候报错,本实验虚拟机总内存大小是2G。 + + gs_install -X /opt/software/openGauss/clusterconfig.xml --gsinit-parameter="--encoding=UTF8" --dn-guc="max_process_memory=**2GB**" --dn-guc="shared_buffers=**128MB**" --dn-guc="bulk_write_ring_size=**128MB**" --dn-guc="cstore_buffers=**16MB**" + + 具体如下: + + ![image-20211110173619641](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110173619641.png) + + (我已经安装过一遍,和你的页面可能不太一样) + +5. **清理软件安装包** + + ![image-20211110174019749](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211110174019749.png) + + (我同样已经删过一遍) + +#### 三、数据库基础使用 + + 1. **切换用户到omm:** + + ![image-20211114002741385](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211114002741385.png) + + 2. **启动服务** + + 启动服务命令:**gs_om -t start** + + ![image-20211114002839042](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211114002839042.png) + + 3. **连接数据库** + + 连接指令:**gsql -d postgres -p 26000 -r** + + 当结果显示为如下信息,则表示连接成功。 + + ![image-20211114003113627](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211114003113627.png) + + 其中,postgres为openGauss安装完成后默认生成的数据库。初始可以连接到此数据库进行新数据库的创建。26000为数据库主节点的端口号,需根据openGauss的实际情况做替换,请确认连接信息获取。 + + **引申信息:** + + 使用数据库前,需先使用客户端程序或工具连接到数据库,然后就可以通过客户端程序或工具执行SQL来使用数据库了。gsql是openGauss数据库提供的命令行方式的数据库连接工具。 + + 4. **第一次连接数据库时,需要先修改omm用户密码,新密码修改为Bigdata@123(建议用户自定义密码)** + + + **alter role omm identified by *'Bigdata@123*' replace *'openGauss@123'*;** + + 显示“ALTER ROLE”则成功 + +5. **创建数据库用户**。 + + 默认只有openGauss安装时创建的管理员用户可以访问初始数据库,您还可以创建其他数据库用户帐号。 + + 指令:**CREATE USER joe WITH PASSWORD "Bigdata@123";** + + ![image-20211114004255316](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211114004255316.png) + + 如上创建了一个用户名为joe,密码为Bigdata@123的用户。 + +6. **创建数据库。** + + 指令:**CREATE DATABASE db_tpcc OWNER joe;** + + ![image-20211114004314410](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211114004314410.png) + + 退出数据库: + + ![image-20211114004408389](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211114004408389.png) + + 使用新用户连接到此数据库: + + 指令: **gsql -d db_tpcc -p 26000 -U joe -W Bigdata@123 -r** + + 显示如下内容表示成功: + + ![image-20211114004517198](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211114004517198.png) + + + +**至此,opengauss数据库安装全部完成** + + + + + +​ + diff --git "a/content/zh/post/zhaoyanliang/openGauss\346\272\220\347\240\201\345\255\246\344\271\240--SQL\350\247\243\346\236\220\346\250\241\345\235\227.md" "b/content/zh/post/zhaoyanliang/openGauss\346\272\220\347\240\201\345\255\246\344\271\240--SQL\350\247\243\346\236\220\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..17e7e36309f2ed246669a93526be5923b0978b98 --- /dev/null +++ "b/content/zh/post/zhaoyanliang/openGauss\346\272\220\347\240\201\345\255\246\344\271\240--SQL\350\247\243\346\236\220\346\250\241\345\235\227.md" @@ -0,0 +1,259 @@ ++++ +title = "openGauss源码学习--SQL解析模块" +date = "2021-11-30" +tags = ["openGauss社区开发入门"] +archives = "2021-11" +author = "zhaoyanliang" +summary = "openGauss社区开发入门" +img = "/zh/post/zhaoyanliang/title/title.jpg" +times = "13:30" + ++++ + +## openGauss源码解析 ------ SQL语句解析模块 + + + +#### 一、概述 + +openGauss数据库是华为深度融合在数据库领域多年经验,结合企业级场景要求推出的新一代企业级开源数据库。openGauss是关系型数据库,采用客户端/服务器,单进程多线程架构;支持单机和一主多备部署方式,同时支持备机可读、双机高可用等特性。 + +openGauss是基于postgresql数据库开发的。 + +开源地址:[openGauss/openGauss-server - 码云 - 开源中国 (gitee.com)](https://gitee.com/opengauss/openGauss-server?_from=gitee_search) + + + +#### 二、SQL解析 + +数据库的SQL引擎作为SQL解析模块是数据库重要的子系统之一,它对上负责承接应用程序发送的SQL语句,对下负责指挥执行器运行执行计划,是整个数据库的第一个执行的模块。具体而言,就是讲用户输入的SQL语句转换为具体的能被机器识别的要求从而被执行,类似与各种编程语言的编译器。 + +完整过程: + +![img](https://img-blog.csdnimg.cn/d31a28994415490dbaec2fde6d09ec1e.png#pic_center) + +本文主要讲解前两部分:词法解析和语法解析。 + +源码文件夹:/src/common/backend/parser + + + +#### 三、SQL解析总体功能 + +1. 当openGauss的后台服务进程openGuass收到前台发来的查询语句后,首先将其传递到查询分析模块,进行词法分析,语法分析和语义分析。 +2. 若是功能性命令(例如create table,create user和backup命令等)则将其分配到功能性命令处理模块; +3. 对于查询处理命令(SELECT/INSERT/DELETE/UPDATE)则为其构建查询语法树,交给查询重写模块。 + +总的来说流程如下: + +SQL命令 --(词法和语法分析)--> 分析树 --(语义分析)--> 查询树 + +在代码里的调用路径如下(方框内为函数,数字显示了调用顺序) + +![img](https://images2015.cnblogs.com/blog/579102/201611/579102-20161108231520936-605686873.png) + +#### 四、源码文件及作用: + +| parser.cpp | **解析主程序** | +| ----------------------- | ---------------------------------------- | +| scan.l | 词法分析,分解查询成token | +| scansup.cpp | 处理查询语句转义符 | +| kwlookup.cpp | 将关键词转化为具体的token | +| keywords.cpp | 标准关键词列表 | +| analyze.cpp | 语义分析 | +| gram.y | 语法分析,解析查询tokens并产生原始解析树 | +| parse_agg.cpp | 处理聚集操作,比如SUM(col1),AVG(col2) | +| parse_clause.cpp | 处理子句,比如WHERE,ORDER BY | +| parse_compatibility.cpp | 处理数据库兼容语法和特性支持 | +| parse_coerce.cpp | 处理表达式数据类型强制转换 | +| parse_collate.cpp | 对完成表达式添加校对信息 | +| parse_cte.cpp | 处理公共表格表达式(WITH 子句) | +| parse_expr.cpp | 处理表达式,比如col, col+3, x = 3 | +| parse_func.cpp | 处理函数,table.column和列标识符 | +| parse_node.cpp | 对各种结构创建解析节点 | +| parse_oper.cpp | 处理表达式中的操作符 | +| parse_param.cpp | 处理参数 | +| parse_relation.cpp | 支持表和列的关系处理程序 | +| parse_target.cpp | 处理查询解析的结果列表 | +| parse_type.cpp | 处理数据类型 | +| parse_utilcmd.cpp | 处理实用命令的解析分析 | + + + +#### 五、词法解析部分 + +**对于字符串流的输入,根据词表,将关键字、变量等转化成自定义逻辑结构,用于下一步的语法分析** + +分为三部分:定义段、规则段、用户程序段 + +- 定义段: + + 这一部分一般是一些声明及选项设置等; + + C语言的注释、头文件包含等一般就放在%{%}之间,这一部分的内容会被直接复制到生成的C文件中,还有一些参数项通过%option来设置; + + 采用正则表达式定义词法规范; + + 只有符合规范的关键词才允许接受,否则报错。 + +- 规则段: + + 规则段为一系列匹配模式和动作,模式一般使用正则表达式书写,动作部分为C代码; + + 规则段模板: + + 模式1 + + { + + 动作1 (C代码) + + } + + 在输入和模式1匹配的时候,执行动作部分的代码 + +- 用户程序段: + + 用户自定义的程序,无固定模式· + + + +#### 六、词法解析代码举例 + +##### 定义段: + +头文件、宏定义等: + +![image-20211113113829772](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113113829772.png) + +%option 此部分是Flex(词法工具)支持的一些参数,通过%option 来设置 + +![image-20211113113850972](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113113850972.png) + +![image-20211113114005056](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113114005056.png) + +%option reentrant 可重入词法分析器:传统词法分析器只能一次处理一个输入流,所以很多变量都定义的为静态变量这样分析器才能记住上次分析的地方继而可以继续分析。但是不能同时处理多个输入流。为了解决这个问题引入了可重入词法分析器。通过参数reentrant来控制。 + +%option bison-bridge :bison桥模式 + +bison的发展和flex的发展沟通并不是很密切,导致二者对yyles的调用参数不一致。所以在flex中提拱了桥模式,如果按%option bison-bridge做了声明,那么在flex中yylex将被声明为int yylex(YYSTYPE* lvalp, yyscan_t scaninfo),这样就兼容了bison。 + +其它的读者可自行搜索。 + + + +词法规则制定:采用正则表达式规定可接受的字符组合 + +![image-20211113114229404](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113114229404.png) + + + +##### 规则段: + +表示匹配到了某字符组合该执行什么动作: + +![image-20211113114352188](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113114352188.png) + + + +#### 七、语法解析部分: + +**以词法分析器生成的单词符号序列作为输入,根据语言的语法规则识别出各种语法成分(如表达式、语句、程序段乃至整个程序等),并在分析过程中进行语法检查,检查所给单词符号序列是否是该语言的文法的一个句子。** + +同样分为三段,定义段,规则段和代码段。也是通过%%做三个段的分割。源码文件为gram.y, 最后通过Bison 编译源文件生成 gram.c + +- 定义段:{% ... %}中的代码将被原样copy到生成的文件gram.c中.其中包含头文件包含,结构体定义和函数声明等,与词法分析一致 +- 规则段:主要是文法产生式,规定规约的规则,对于输入的SQL语句只要能规约到文法产生式顶层非终结符,则判断该SQL语句是语法合法的。在规约过程中顺便构建起语法分析树,为后面的语义分析做铺垫。 + +**总体流程**: + +![image-20211113115728294](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113115728294.png) + +**具体流程**: + +![image-20211113115755438](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113115755438.png) + + + +#### 八、语法解析代码举例: + +##### 定义段: + +基本设置: + +![image-20211113115919830](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113115919830.png) + + + +%pure-parser 声明此语法分析器是纯语法分析器。这样可以实现可重入。 + +%expect 0 ,意思是期待0个冲突。即不希望有任何冲突出现。 + +%name-prefix="base_yy" 代表生成的函数和变量名从yy改成base_yy,同flex,为了在一个产品里使用多个语法分析器,分析不同的数据类。 + + %locations 声明使用位置信息。 + +union表示联合体: + +![image-20211113120551288](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113120551288.png) + +%union{} 定义yylval类型,在flex中通过yylval的返回匹配的值。 + +type表示非终结符: + +![image-20211113120618565](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113120618565.png) + +非终结符用于文法产生式,为生成语法分析树服务 + +优先级定义: + +![image-20211113120715393](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113120715393.png) + +优先级和左右结合的定义可以解决一些语法上的矛盾。 + +具体文法产生式: + +![image-20211113120741461](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113120741461.png) + +Opengauss总的文法产生式极其复杂,这里只节选。 + + + +#### 九、具体案例 + +**SQL语句:** + +INSERT INTO films (code, title, did, date_prod, kind) VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama’); + +**产生的函数调用:** + +PostgresMain->exec_simple_query->pg_parse_query->raw_parser->base_yyparse(yyscanner) + + + +词法匹配(SCAN.I): + +![image-20211113120940437](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113120940437.png) + +Identifier可以匹配到insert。 + +根据规则执行动作: + +![image-20211113121016189](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113121016189.png) + +代码中keywordopengauss内置的关键字,像insert就是一个关键字keyword。 + +可以看到一个判断是keyword非空即检测到关键字时,根据关键字不同类型执行动作。 + +在yylex返回INSERT 这个token.然后分析gram.y中这个token 对应的规则 由于flex 默认向前查看一个token, 根据第二部可知第二个token 为INTO.在规则段中找到如下规则: + +![image-20211113121303515](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113121303515.png) + +opt_with_clause 可以为空,并且后面跟着一个INSERT INTO, 所以即匹配上这个规则。 + +**类似上面方法继续分析剩下的SQL语句** + +结果放到InsertStmt中,后面继续根据以下规则做规约处理,由于在规则段中第一个出现的非终结符号,stmtblock是我们要的结果。通过不断的规约即reduce,最后的分析结果即剩下stmtblock这一个符号即开始符号,所以是匹配成功的。 + +![image-20211113121416459](C:\Users\赵小黑\AppData\Roaming\Typora\typora-user-images\image-20211113121416459.png) +