马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本文介绍 TiDB 数据库8.1版本的编译和部署。
配景
自前年(2023年)打仗了TiDB后,做了简单的测试就直接利用了。因一些事务的不连续性,导致部门成果没有保存,客岁年底又重新拾起,利用了新的LTS版本(8.1.0),同时编译了x86、arm、loongarch三大版本。
TiDB新版本说明
下面是从官方文档摘录的内容:
TiDB 高度兼容 MySQL 协议,以及 MySQL 5.7 和 MySQL 8.0 常用的功能及语法。MySQL 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver 和其他工具)、客户端等均适用于 TiDB。
但 TiDB 尚未支持一些 MySQL 功能,大概的缘故原由如下:
有更好的办理方案,比方 JSON 取代 XML 函数。
目前对这些功能的需求度不高,比方存储过程和函数。
一些功能在分布式系统上的实现难度较大。
下载
下载地点:https://github.com/pingcap/tidb/releases 。
本文选用了新的LTS版本,下载文件为:tidb-8.1.0.tar.gz,2024.5.24发布。(注:因测试缘故原由,又下载了tidb-8.1.1.tar.gz,该版本在2024.8.27发布)
该版本的功能概览文档:https://docs.pingcap.com/zh/tidb/v8.1/basic-features/
情况
TiDB利用go语言编写,8.1.0版本要求golang 1.21及以上,经过查阅源码,新版本源码利用了slices、maps、cmp等标准库。
编译
编译压缩包,进入源码目录,先下载go依赖库:
再进行编译:
编译输出:
- fatal: not a git repository (or any parent up to mount point /)
- CGO_ENABLED=1 GO111MODULE=on go build -tags codes -ldflags '-X "github.com/pingcap/tidb/pkg/parser/mysql.TiDBReleaseVersion=" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBBuildTS=2024-11-29 06:45:27" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBGitHash=" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBGitBranch=" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBEdition=Community" ' -o bin/tidb-server ./cmd/tidb-server
- go: downloading golang.org/x/oauth2 v0.18.0
- ...
复制代码 不管何种平台,编译版本要求和命令都是一样的。在实际操纵中,笔者利用了qemu技术编译了arm、loong64平台。两个平台的编译较耗时,一台普通且有别的程序运行的服务器上进行编译,花费近1个钟头。
必要在此处提出的是,编译龙芯架构版本时出现了错误,详见附录说明。
运行
设置参考官方文件:
- https://github.com/pingcap/tidb-docker-compose/blob/master/config/tidb.toml
复制代码 就测试而言,直接运行程序即可:
利用指定设置文件的运行方法:
- ./bin/tidb-server --config tidb.toml
复制代码 测试
利用mysql毗连检察数据库。
实验不指定用户毗连:
- $ mysql -h 127.0.0.1 -P 4000
- ERROR 1045 (28000): Access denied for user 'toll'@'127.0.0.1' (using password: NO)
复制代码 提示出错,添加root用户:
- $ mysql -h 127.0.0.1 -P 4000 -u root
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MySQL connection id is 2097160
- Server version: 8.0.11-TiDB- TiDB Server (Apache License 2.0) Community Edition, MySQL 8.0 compatible
复制代码 root用户默认是没有暗码的。从上面信息可以看到已经成功毗连了。不过,体现的版本号有点希奇。MySQL的兼容版本已经改为了8.0版本了(通过阅读源码确认)。
根据以往经验,在设置文件中修改了版本号信息,再次毗连,体现信息如下:
- $ mysql -h 127.0.0.1 -P 4000 -u root
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MySQL connection id is 2097154
- Server version: 8.1.0 TiDB Server (Apache License 2.0) 8.1.0 Edition, MySQL 8.0 compatible
复制代码 创建用户,修改root暗码,操纵如下:
- mysql -h 127.0.0.1 -P 4000 -u root
- use mysql;
- # 创建latelee用户
- CREATE USER 'latelee'@'%' IDENTIFIED BY '123456';
- GRANT ALL PRIVILEGES ON *.* TO 'latelee'@'%' WITH GRANT OPTION;
- # 修改root密码
- ALTER USER 'root' IDENTIFIED BY '123456';
复制代码 小结
本次实践,分别编译了三大平台的TiDB,办理编译错误花了一些时间,如通过检察go发行版本确认TiDB利用的新的标准库。当然,也顺道学习了些别的的知识。从开端测试情况下,是正常,后续必要进一步系统地根据业务来测试。以便更全面相识TiDB。不过,TiDB版本迭代非常快,限于精神,大概会隔较长时间再回到这上面。
特别说明:
本文利用loong64称谓龙芯架构,一是较简便,二是golang语言利用该字符串作为龙架构的名称。实际上,笔者对差别平台的程序定名均以简便有易于区分为原则。如arm平台,直接用arm即可,不利用arm64或aarch64。像龙芯平台,是利用loong,而不是loongarch64这种,笔者偶然到场新天下、旧天下的纠缠中,以自己适用为目的。差别场景采用方式差别,如在编码中,则按各语言既定的规则来。如要在同一目录分出差别平台,则会用x86_64和arm这种较明显的名称(而不是amd64和arm64)。
附
在编译过程中,均需升级golang,办理版本问题。在x86和arm平台编译很顺利,重要问题集中在龙芯平台。本次编译所遇问题如下。
golang版本问题
golang版本最低为1.21。如果利用较低版本golang编译,会报如下错误:
- pkg/types/compare.go:18:2: cannot find package "." in:
- /tmp/tidb-8.1.0-vendor/vendor/cmp
- vendor/github.com/tikv/client-go/v2/internal/locate/region_request.go:40:2: cannot find package "." in:
- /tmp/tidb-8.1.0-vendor/vendor/maps
- vendor/github.com/prometheus/common/model/labelset.go:20:2: cannot find package "." in:
- /tmp/tidb-8.1.0-vendor/vendor/slices
- make: *** [server] 错误 1
复制代码 分析:TiDB8.1.0版本引入了cmp等标准库,更新版本即可。
loong64平编译出现未界说变量
编译错误信息如下:
- # github.com/cockroachdb/pebble/internal/rawalloc
- vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc.go:23:12: undefined array length maxArrayLen or missing type constraint
- # github.com/cockroachdb/pebble/internal/manual
- vendor/github.com/cockroachdb/pebble/internal/manual/manual.go:48:12: undefined array length MaxArrayLen or missing type constraint
复制代码 分析:在tidb8.1.0版本发布几天后,pebble库添加了loong64的界说,见issue:https://github.com/cockroachdb/pebble/issues/3630 。本文用的版本不支持,因此,要手动添加。如下:
- vim vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc_64bit.go
- 添加loong64:
- //go:build amd64 || arm64 || arm64be || ppc64 || ppc64le || mips64 || mips64le || s390x || sparc64 || loong64
- // +build amd64 arm64 arm64be ppc64 ppc64le mips64 mips64le s390x sparc64 loong64
- vim vendor/github.com/cockroachdb/pebble/internal/manual/manual_64bit.go
- 添加loong64:
- //go:build amd64 || arm64 || arm64be || ppc64 || ppc64le || mips64 || mips64le || s390x || sparc64 || loong64
- // +build amd64 arm64 arm64be ppc64 ppc64le mips64 mips64le s390x sparc64 loong64
复制代码 loong64平台编译出现runtime.buildVersion未界说
编译错误信息如下:
- # github.com/pingcap/tidb/cmd/tidb-server
- link: github.com/pingcap/tidb/pkg/util/printer: invalid reference to runtime.buildVersion
- make: *** [Makefile:201: server] Error 1
复制代码 分析:在printer.go文件会输出构建版本号,利用runtime.buildVersion实现。关键代码如下:
- //go:linkname buildVersion runtime.buildVersion
- var buildVersion string
复制代码 但是,在龙芯平台无法用go:linkname,该问题已有相关issue:https://github.com/pingcap/tidb/issues/53618 。本次参考https://github.com/pingcap/tidb/pull/53619/files 修改,涉及文件为pkg/util/printer/printer.go 。如下:
- 引入包删除L21、L22 _ "runtime" // import link package _ "unsafe" // required by go:linkname添加"runtime"代码:删除最后2行//go:linkname buildVersion runtime.buildVersion
- var buildVersion string
- 在约L30处添加:var buildVersion stringfunc init() { buildVersion = runtime.Version()}
复制代码 注:按TiDB的说法,在发布的8.1.1版本中已经fix了,但笔者下载该版本,检查再三,发现的确没有,因而手动改之。
笔者没用过linkname,看帖子,这个特性不建议广泛利用,可以看看大牛级别Russ Cox的提案: https://github.com/golang/go/issues/67401,笔者不是布道者,因此仅作为爱好稍作相识。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |