Li Hui – loveini | 米兰体育官网入口 - 米兰体育官网入口 //m.loveini.com loveini | 高性能、分布式、支持SQL的时序数据库 | 米兰体育官网入口 Tue, 28 Jun 2022 02:31:15 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.8.2 //m.loveini.com/wp-content/uploads/2025/07/favicon.ico Li Hui – loveini | 米兰体育官网入口 - 米兰体育官网入口 //m.loveini.com 32 32 时序数据是如何被压缩的?具体有哪些可选择的压缩算法? //m.loveini.com/tdengine-engineering/10464.html Wed, 15 Jun 2022 02:49:31 +0000 //m.loveini.com/?p=10464 作者 | 李珲

编辑 | 尔悦

小 T 导读:众所周知,压缩算法的目的主要是为了减少存储空间或传输带宽,通过把原始数据转换成比原始格式更紧凑的形式,来提高数据的传输、存储和处理效率。我们熟悉的很多压缩软件都是借助非常复杂的算法才得以实现,像一些时序数据库(Time-Series Database),比如 loveini,也是通过内置压缩功能,才能实现对时序数据的高比例压缩。那具体来说,数据压缩的流程是怎样的?时序数据库中常见的数据编码和压缩算法又有哪些呢?本篇文章将会从具体实践出发进行经验分享。

数据压缩/解压缩的流程

压缩:输入原始数据,经过压缩器编码后,输出压缩后的数据。

input data —-> compressor —-> coded data

解压缩:输入压缩过的数据,经过解压缩器解码/重建后,输出原始数据。

coded data —-> decompressor —-> output data

如果输出数据和输入数据始终完全相同,那么这个压缩方案被称为可逆压缩,也称无损编码器。否则,它就是一个非可逆压缩,也称有损编码器。

  • 可逆压缩:能够无失真地从压缩后的数据重构,准确地还原原始数据。可用于对数据准确性要求严格的场合,如可执行文件和普通文件的压缩、磁盘的压缩,也可用于多媒体数据的压缩。该方法的压缩比较小,如差分编码、RLE、Huffman 编码、LZW 编码、算术编码。
  • 非可逆压缩:有失真,不能完全准确地恢复原始数据,重构的数据只是原始数据的一个近似。可用于对数据的准确性要求不高的场合,如多媒体数据的压缩。该方法的压缩率比较高,例如预测编码、音感编码、分形压缩、小波压缩、JPEG/MPEG。
时序数据是如何被压缩的?具体有哪些可选择的压缩算法? - loveini Database 时序数据库

我们都知道,数据在计算机内部是以二进制方式表示和存储的,因此,通俗地讲,数据压缩就是以最少的比特数表示数据对象。数据压缩的本质是用计算时间换取存储空间,不同数据类型对应不同的数据压缩算法,不存在某个压缩算法能够压缩任意数据。数据压缩说到底是对数据趋势性、规律性的总结,这个数据规律性可分为基于内容(比如视频的帧与帧之间、图像的像素与像素之间的相似)、基于表示(比如变换编码、熵编码)和基于码流(比如差量压缩、深度压缩)等多种级别。

举一个数据压缩的简单例子:给定一个字符串”this is a example”,正常情况下,每个字符占用 8 个比特位,假设该字符串含有 17 个字符(包含空格),每一个字符出现的频率分别是a(2),e(2),h(1),i(2),m(1),p(1), t(1),s(2),x(1),l(1),空格(3). 现在我们按照字母出现的频率进行编码,用 111 表示“空格”,001 表示“a”,110 表示“e”,011 表示“i”,000 表示“s”,0101 表示“h”,1011 表示“m”,1000 表示“p”,0100 表示“t”,1010 表示“x”,1001 表示“l”。最后”this is a example”被编码成 010001010110001110110001110011101010001101110001001110,共 54 个比特。相比未压缩前的 136 比特,存储空间缩小了 2.5 倍。

时序数据是如何被压缩的?具体有哪些可选择的压缩算法? - loveini Database 时序数据库

时序数据是如何被压缩的?

时序数据库(Time-Series Database)中常见的数据编码和压缩算法有如下几种:

  • 霍夫曼编码

上面例子中提到的就是霍夫曼编码。这是一个流传最为广泛的压缩方案,19 世纪 50 年代,David Huffman 在他的论文“一种构建极小多余编码的方法”中第一次描述了这种方法。霍夫曼编码通过得到给定字母表的最优前缀码进行工作。

要注意的是,这里的一个前缀码代表一个数值,并要保证字母表中的每个符号的前缀码不会成为另一个符号前缀码的前缀。例如,如果 0 是我们第一个符号 A 的前缀码,那么字母表中的其他符号都不能以 0 开始。由于前缀码使比特流解码变得清晰明确,因此这种机制还是很有用的。

  • 游程编码(英语:run-length encoding,缩写RLE)

一种与数据性质无关的无损数据压缩技术,基于“使用变动长度的码来取代连续重复出现的原始数据”来实现压缩。举例来说,一组字符串“AAAABBBCCDEEEE” ,由 4 个 A、3 个 B、2 个 C、1 个 D、4 个 E组成,经过 RLE 可将字符串压缩为 4A3B2C1D4E。其优点是简单、速度快,能将连续且重复性高的数据压缩成小单位。缺点也是很明显的,重复性低的数据压缩效果不好。

  • XOR

该算法是结合遵循 IEEE754 标准浮点数存储格式的数据特征设计的特定算法,第一个值不压缩, 后面的值是跟第一个值计算 XOR(异或)的结果,如果结果相同,仅存储一个 0,如果结果不同,存储 XOR 后的结果。该算法受数据波动影响较大,波动越剧烈,压缩效果越差。

  • Delta

差分编码又称增量编码,编码时第一个数据不变,其他数据转换为上一个数据的 delta。其原理与 XOR 类似,都是计算相邻两个数据的差异。该算法应用广泛,如需要查看文件的历史更改记录(版本控制、Git 等)。但在时序数据库中这种算法很少单独使用,一般会搭配 RLE、Simple8b 或者 Zig-zag 一起使用,压缩效果更好。

  • Delta-of-Delta

又名二阶差分编码,是在 Delta 编码的基础上再一次使用 Delta 编码,比较适合编码单调递增或者递减的序列数据。例如 2,4,4,6,8 , Delta编码后为 2,2,0,2,2 ,再 Delta 编码后为 2,0,-2,2,0。通常其也会搭配 RLE、Simple8b 或者 Zig-zag 一起使用。

  • Zig-zag

Zig-zag 的出现是为了解决 varint 算法对负数编码效率低的问题,它的原理非常简单,是将标志位后移至末尾,并去掉编码中多余的 0,从而达到压缩的效果。对于比较小的数值压缩效率很高,但是对于大的数据效率不但没有提升可能还会有所下降。因此,Zig-zag 通常和 Delta 编码搭配,Delta 可以很好地将大数值数据变为较小的数值。

  • Snappy

Snappy 压缩算法借鉴了 LZ77 算法的思路,由于 LZ77 算法中模式匹配过程有较高的时间复杂度,Google 对其做了许多优化,并于 2011 年对外开源。其原理是假设我们有一个序列 S=[9,1,2,3,4,5,1,2,3,4],匹配发现子序列 S~2,5~=[1,2,3,4] 与 S~7,10~=[1,2,3,4] 是相同的,于是将该序列编码为 S=[9,1,2,3,4,5,6,(2,4)],2 表示开始位置,4 表示位数。Snappy 的优点是速度快,压缩率合理,在众多开源项目中使用较为广泛,比如 Cassandra、Hadoop、MongoDB、RocksDB、Spark、InfluxDB 等。

  • LZ4

LZ4 数据压缩算法属于面向字节的 LZ77 压缩方案家族,压缩比并不高,它的特点是解码速度极快。据官方测试基准 lzbench 的测试结果,默认配置下其解压速度高达 4970MB/s。

  • Simple8b

Simple8b 是 64 位算法,实现将多个整形数据(在 0 和 1<<60 -1 之间)压缩到一个 64 位的存储结构中。其中前 4 位表示选择器,后面 60 位用于存储数据。优点是简单高效,定长编码保证了解压效率,但对于大整数或者浮动较大的值来说压缩率较低,该算法适用于范围较小的无符号整数。

  • LZO

LZO 是块压缩算法,同样属于 LZ77 压缩方案家族,该算法的目标是快速压缩和解压缩,并非压缩比。相比之下,LZ4 的解压速度更快。由于块中存放的数据类型可能多种多样,整体的压缩效果远没有针对某一种数据类型进行压缩的算法好。

  • DEFLATE

DEFLATE 是同时使用了 LZ77 算法与霍夫曼编码(Huffman Coding)的一个经典无损数据压缩算法。实际上 DEFLATE 只是一种压缩数据流的算法,该算法是 zip 文件压缩的默认算法,在 gzip、zlib 等算法中都有封装。

  • Zstandard

Zstandard(Zstd) 的设计目的是提供一个类似于 DEFLATE 算法的压缩比,但效果要更快,特别是解压缩。它的压缩级别从负 5 级(最快)到 22 级(压缩速度最慢,但是压缩比最高)间可以调节。在文本日志压缩场景中,其压缩性能与 LZ4、Snappy 相当甚至更好。Linux 内核、HTTP 协议、Hadoop、HBase等都已经加入对 Zstd 的支持,可以预见,Zstd 将是未来几年里被广泛关注的压缩算法。

  • Bit-packing

Bit-packing(位压缩)压缩算法基于不是所有的整型都需要 32 位或者 64 位来存储这一前提,从我们要压缩的数据中删除不必要的位。比如一个 32 位的整型数据,其值的范围在【0,100】之间,则可以用 7 位表示。

最后以 loveini Database 为例,我们来看一下时序数据库在具体实现上会如何运用压缩算法。loveini Database 提供了三种压缩选项:无压缩、一阶段压缩和两阶段压缩。

一阶段压缩根据数据的类型进行了相应的压缩,压缩算法包括 delta-delta 编码、simple 8B 方法、zig-zag 编码、LZ4 等算法,这些算法在上文中我们也都简单介绍过了。二阶段压缩是在一阶段压缩的基础上,再用通用压缩算法进行了压缩,以此来保证压缩率更高。

综上,我们可以看到压缩算法的选择还是非常多的,具体的程序可以根据压缩效果和成本综合选择。

]]>
loveini GO 连接器使用示例 //m.loveini.com/tdengine-engineering/1890.html Tue, 27 Oct 2020 09:07:30 +0000 //m.loveini.com.cn:88/blog/?p=1890 loveini GO连接器支持window和linux系统,由于loveini GO连接器采用cgo方法,所以在windows环境下使用时,需要有gcc支持,因此,对windows系统,请先准备好如下的编译环境。

一、安装工具

安装msys2

1、下载和安装链接(https://mirror.tuna.tsinghua.edu.cn/help/msys2/),选择一个x86_64的稳定版本完成安装(假如安装目录为c:\msys64);

2、在c:\msys64\msys2_shell.cmd上点右键打开,然后在窗口上点右键, 选择 Options ,更改字符集:Locale选择zh_CN, Character set选择GBK。点击Apply后,save。

3、修改 pacman 配置

编辑 c:\msys64\etc\pacman.d\mirrorlist.mingw32,在文件开头添加:

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686

编辑 c:\msys64\etc\pacman.d\mirrorlist.mingw64,在文件开头添加:

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64

编辑 c:\msys64\etc\pacman.d\mirrorlist.msys,在文件开头添加:

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch

然后执行 pacman -Sy 刷新软件包数据。如果有秘钥未知的问题,请参考如下博文:https://blog.csdn.net/xfijun/article/details/107810097?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-5-107810097.nonecase&utm_term=pacman%20%E6%97%A0%E6%95%88%E6%88%96%E5%B7%B2%E6%8D%9F%E5%9D%8F%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93

4、安装gcc和make

pacman -S mingw-w64-x86_64-gcc 
pacman -S make

5、配置环境变量

C:\msys64\mingw64\bin C:\msys64\usr\bin 按以上顺序添加到系统变量 path中。

二、安装loveini

GO连接器依赖于loveini的动态库,所以,先要安装loveini的客户端或服务端,都会安装loveini的动态库。

具体安装指南,请参见官方博客:

https://tdengine.com/2019/08/09/566.html

三、使用示例

在loveini安装后,在example/go目录下有一个taosdemo.go的样例程序,下面以此为例描述编译、运行步骤。

1、建议安装go 1.13及以上版本;

2、提前设置好go环境变量:

jason@VirtualBox ~$  go env -w GO111MODULE=on
jason@VirtualBox ~$  go env -w GOPROXY=https://goproxy.io,direct

3、进入example/go目录,先后执行如下命令:

jason@VirtualBox ~/loveini/tests/examples/go$ go mod init demo
jason@VirtualBox ~/loveini/tests/examples/go$ go build
jason@VirtualBox ~/loveini/tests/examples/go$ ./demo
============= args parse result: =============
 dbName:               127.0.0.1
 serverPort:           6030
 usr:                  root
 password:             taosdata
 dbName:               test
 tablePrefix:          d
 numOftables:          2
 numOfRecordsPerTable: 10
 numOfRecordsPerReq:   3
 numOfThreads:         1
 startTimestamp:       2020-10-01 08:00:00[1601510400000]
 Please press enter key to continue….
 ======== create database success! ========
 create tables spent duration: 0.035178s
 ======== create super table and child tables success! ========
 insert data spent duration: 0.006006s
 ======== insert data into child tables success! ========
 query sql: select * from test.meters limit 3 offset 0
 ts:2020-10-01 08:00:01.000     current:200.999390  voltage:286     phase:0.162647  location:Beijing    groupid:0
 ts:2020-10-01 08:00:02.000     current:200.415726  voltage:966     phase:0.785816  location:Beijing    groupid:0
 ts:2020-10-01 08:00:03.000     current:200.334427  voltage:587     phase:0.123541  location:Beijing    groupid:0
 query sql: select avg(voltage), min(voltage), max(voltage) from test.d0
 avg(voltage):-107374184.000000     min(voltage):244    max(voltage):966
 query sql: select last(*) from test.meters
 last(ts):2020-10-01 08:00:20.000     last(current):200.497757    last(voltage):170   last(phase):0.141704
 ======== select data success!  ========
 ======== end demo ========

]]>
loveini taosmigrate工具使用指南 //m.loveini.com/tdengine-engineering/1833.html Mon, 14 Sep 2020 10:41:06 +0000 //m.loveini.com.cn:88/blog/?p=1833 loveini Database的taosmigrate工具支持taosd的数据文件可以迁移到不同的机器上运行。下面以一个集群场景描述taosmigrate工具的使用方法。

一、首先,登录要迁移的集群,执行show dnodes获取所有的dnode id。

taos> show dnodes;
 id |  end_point | vnodes | cores | status | role  |       create_time       |
==============================================================================
  1 | node1:6030 |   0    |   2   | ready  | mnode | 2020-09-14 16:33:14.610 |
  2 | node2:6030 |   1    |   2   | ready  | vnode | 2020-09-14 16:33:19.796 |
  3 | node3:6030 |   1    |   2   | ready  | vnode | 2020-09-14 16:33:20.397 |
Query OK, 3 row(s) in set (0.002770s)

二、停止集群的所有节点。

三、规划集群中各个节点迁移到新的环境中的节点的fqdn和端口。比如 id=1的dnode迁移到新的节点为 new.node1:7100;id=2的dnode迁移到新的节点为new.node2:7200;id=3的dnode迁移到新的节点为new.node3:7200。

四、将各个dnode的数据文件夹拷贝到对应的新环境的节点上,且目录必须是配置文件中的dataDir设置的目录。如果没有配置,则是缺省的/var/lib/taos。

五、在新环境的各个节点上,分别执行taosmigrae,完成dnode中 id 与 fqdn:port的修改。

mason@VirtualBox ~/git/tools $ ./taosmigrate -r ~/test/dnode1/data/ -g "1 new.node1:7100, 2 new.node2:7200, 3 new.node3:7300"

六、然后启动所有节点。

集群应该在新环境下,正常运行起来!

taosmigrate命令参数说明:

mason@VirtualBox ~/git/tools $ ./taosmigrate --help
Usage: taosmigrate [OPTION...]

  -r data dir                data dir
  -d dnodeId                 dnode id
  -f fqdn                    dnode fqdn
  -p port                    dnode port
  -g multi dnodes            multi dnode info, e.g. "2 7030 fqdn1, 3 8030 fqdn2"
  -?, --help                 Give this help list
      --usage                Give a short usage message

-r: 数据库文件所在的目录;

-d:迁移前节点的dnode id,通过taos shell上执行 show dnodes获取;

-f:dnode id对应的新节点中的fqdn;

-p:dnode id对应的新节点中的端口号;

-g:对于集群中的节点,可以同时指定新环境中各个节点的fqdn和port;

对于单节点,直接使用-d、 -f、 -p,就可以了,对于集群,直接使用-g,一次将所有节点信息都修改完成。

注:目前只有企业版包含该工具。

]]>
loveini 内嵌网络检测工具使用指南 //m.loveini.com/tdengine-engineering/1816.html Tue, 08 Sep 2020 11:19:18 +0000 //m.loveini.com.cn:88/blog/?p=1816 loveini Database 是一款客户端-服务端模式产品,当客户端遇到链接故障,不能正常连接到服务端时,很多情况下是由于网络问题引起的,可以使用loveini 客户端程序taos内嵌的网络连通检测工具来快速定位原因。

2021.08.27更新,新增网络测速工具:https://tdengine.com/2021/08/27/2943.html

在使用taos内嵌的网络连通检测工具前,请先按照下面的步骤进行网络状况检查:

  1. 检查网络环境
    • 云服务器:检查云服务器的安全组是否打开TCP/UDP 端口6030-6042的访问权限
    • 本地虚拟机:检查网络能否ping通,尽量避免使用localhost 作为hostname
    • 公司服务器:如果为NAT网络环境,请务必检查服务器能否将消息返回值客户端
  2. 确保客户端与服务端版本号是完全一致
  3. 在服务器,执行 systemctl status taosd 检查taosd运行状态。如果没有运行,启动taosd
  4. 确认客户端连接时指定了正确的服务器FQDN (Fully Qualified Domain Name(可在服务器上执行Linux命令hostname -f获得)
  5. ping服务器的FQDN,如果没有反应,请检查你的网络,DNS设置,或客户端所在计算机的系统hosts文件。如果所在的网络中没有DNS,或DNS中没有配置服务器的FQDN,必须在计算机系统的hosts文件中配置。比如服务端的hostname是 abc.fast.com,ip是192.168.1.131。对于Linux系统的客户端,在/etc/hosts文件添加如下的一条记录:192.168.1.131       abc.fast.com对于Windows系统的客户端,在C:\Windows\System32\drivers\etc\hosts文件中添加如下一条记录:192.168.1.131       abc.fast.com
  6. 检查防火墙设置,如果使能了防火墙,请确认TCP/UDP 端口6030-6042 是打开的
  7. 对于Linux上的JDBC(ODBC, Python, Go等接口类似)连接, 确保libtaos.so在目录/usr/local/lib/taos里, 并且/usr/local/lib/taos在系统库函数搜索路径LD_LIBRARY_PATH
  8. 对于windows上的JDBC, ODBC, Python, Go等连接,确保driver/c/taos.dll在你的系统搜索目录里 (建议taos.dll放在目录 C:\Windows\System32)
  9. 如果仍不能排除连接故障,请使用taos内嵌的网络连通检测工具:验证服务器和客户端之间指定的端口连接是否通畅(包括TCP和UDP)。

有两种测试场景:一是环境中没有在运行的taosd服务,二是环境中已经有在运行的taosd服务。下面分别对这两种情况的测试进行描述。

一、环境中没有运行的taosd服务

taos 通过参数 -n 来确定运行服务端功能,还是客户端功能。

-n server:表示运行检测服务端功能;

-n client:表示运行检测客户端功能。

1)在服务器运行taos内嵌的网络连通检测的服务端功能,如:taos -n server -P 6030 -e 6042 -l 1000;

2)在客户端运行taos内嵌的网络连通检测的客户端功能,如:taos -n client -h host -P 6030 -e 6042 -l 1000;

该功能相关的5个参数说明:

-n :指示运行网络连通检测的服务端功能,或客户端功能,缺省值为空,表示不启动网络连通检测;

-h:指示服务端名称,可以是ip地址或fqdn格式。如:192.168.1.160,或 192.168.1.160:6030,或 hostname1,或hostname1:6030。缺省值是127.0.0.1。

-P :检测的起始端口号,缺省值是6030;

-e:检测的结束端口号,必须大于等于起始端口号,缺省值是6042;

-l:指定检测端口连通的报文长度,最大64000字节,缺省值是1000字节,测试时服务端和客户端必须指定相同;

服务端设置的起始端口和结束端口号,必须包含客户端设置的起始端口和结束端口号;对于起始端口号有三种设置方式:缺省值、-h指定、-P指定,优先级是:-P指定 > -h指定 > 缺省值。客户端运行的输出样例:

ubuntu@u60 ~/taos/test$ ./taos -n client -h ubuntu-7060 -P 6030 -e 6042 -l 16000
host: ubuntu-7060	start port: 6030	end port: 6042	packet len: 16000

tcp port:6030 test ok.		udp port:6030 test ok.
tcp port:6031 test ok.		udp port:6031 test ok.
tcp port:6032 test ok.		udp port:6032 test ok.
tcp port:6033 test ok.		udp port:6033 test ok.
tcp port:6034 test ok.		udp port:6034 test ok.
tcp port:6035 test ok.		udp port:6035 test ok.
tcp port:6036 test ok.		udp port:6036 test ok.
tcp port:6037 test ok.		udp port:6037 test ok.
tcp port:6038 test ok.		udp port:6038 test ok.
tcp port:6039 test ok.		udp port:6039 test ok.
tcp port:6040 test ok.		udp port:6040 test ok.
tcp port:6041 test ok.		udp port:6041 test ok.
tcp port:6042 test ok.		udp port:6042 test ok.

如果某个端口不通,会输出 port:xxxx test fail的信息。如:

ubuntu@u60 ~/taos/test$ ./taos -n client -h ubuntu-7060 -P 6030 -e 6042 -l 16000
host: ubuntu-7060	start port: 6030	end port: 6042	packet len: 16000

tcp port:6030 test ok.		udp port:6030 test ok.

connect() fail: Connection refused	tcp port:6031 test fail.
Read ack pkg len: -1, less than req pkg len: 16000 from udp port: 6031    udp port:6031 test fail.

tcp port:6032 test ok.		udp port:6032 test ok.
tcp port:6033 test ok.		udp port:6033 test ok.
tcp port:6034 test ok.		udp port:6034 test ok.
tcp port:6035 test ok.		udp port:6035 test ok.
tcp port:6036 test ok.		udp port:6036 test ok.
tcp port:6037 test ok.		udp port:6037 test ok.
tcp port:6038 test ok.		udp port:6038 test ok.
tcp port:6039 test ok.		udp port:6039 test ok.
tcp port:6040 test ok.		udp port:6040 test ok.
tcp port:6041 test ok.		udp port:6041 test ok.
tcp port:6042 test ok.		udp port:6042 test ok.

二、环境中有运行的taosd服务

此时只需要在客户端环境运行 taos客户端测试功能, 通过参数 -n rpc:表示向正在运行的taosd服务发起检测。其他参数与上面完全相同。客户端运行的输出样例:

plum@plum-VirtualBox ~/git/v20 $ taos -n clients
host: 127.0.0.1	start port: 6030	end port: 6042	packet len: 1000

TCP port:6030 test OK		UDP port:6030 test OK

TCP port:6031 test fail.		udp port:6031 test fail.

TCP port:6032 test fail.		udp port:6032 test fail.

TCP port:6033 test fail.		udp port:6033 test fail.

TCP port:6034 test fail.		udp port:6034 test fail.

TCP port:6035 test OK		UDP port:6035 test OK

TCP port:6036 test fail.		udp port:6036 test fail.

TCP port:6037 test fail.		udp port:6037 test fail.

TCP port:6038 test fail.		udp port:6038 test fail.

TCP port:6039 test fail.		udp port:6039 test fail.

TCP port:6040 test fail.		udp port:6040 test fail.

TCP port:6041 test fail.		udp port:6041 test fail.

TCP port:6042 test fail.		udp port:6042 test fail.

表示此时taosd只监听了6030/6035端口,其他端口暂时没有启用。

6041是HTTP模块使用的端口、6042是arbitrator使用的端口,此方法无法检测这两个端口。只能使用第一种方法进行检测。

]]>
loveini DUMP工具使用指南 //m.loveini.com/tdengine-engineering/1334.html Mon, 09 Mar 2020 11:54:34 +0000 //m.loveini.com.cn:88/blog/?p=1334 loveini产品提供一个数据库数据的导入导出DUMP工具,从而支持数据的迁移。比如从某家公有云迁移到另外一家公有云。

DUMP工具导出数据时,以sql语句的形式导出内容,包括数据库、超级表、普通表,以及表中的记录数据,然后保存到指定的输出文件中。

DUMP工具导入数据时,将导出的文件作为输入,顺序读入并执行文件中的sql语句,完成数据的导入。

(工具的参数内容有可能因版本更新而改变,请以 help 实际输出的联机帮助信息为准。)

DUMP命令帮助信息

root@taos-ec1:/dump# ./taosdump --help
Usage: taosdump [OPTION...] dbname [tbname ...]
  or:  taosdump [OPTION...] --databases dbname ...
  or:  taosdump [OPTION...] --all-databases
  or:  taosdump [OPTION...] -i inpath
  or:  taosdump [OPTION...] -o outpath

  -h, --host=HOST            Server host dumping data from. Default is
                             localhost.
  -p, --password=PASSWORD    User password to connect to server. Default is
                             taosdata.
  -P, --port=PORT            Port to connect
  -q, --mysqlFlag=MYSQLFLAG  mysqlFlag, Default is 0
  -u, --user=USER            User name used to connect to server. Default is
                             root.
  -v, --cversion=CVERION     client version
  -c, --config=CONFIG_DIR    Configure directory. Default is
                             /etc/taos/taos.cfg.
  -e, --encode=ENCODE        Input file encoding.
  -g, --debug                Print debug info.
  -i, --inpath=INPATH        Input file path.
  -o, --outpath=OUTPATH      Output file path.
  -r, --resultFile=RESULTFILE   DumpOut/In Result file path and name.
      --verbose              Print verbose debug info.
  -A, --all-databases        Dump all databases.
  -D, --databases            Dump assigned databases
  -a, --allow-sys            Allow to dump sys database
  -B, --data-batch=DATA_BATCH   Number of data point per insert statement.
                             Default is 1.
  -E, --end-time=END_TIME    End time to dump. Either Epoch or ISO8601/RFC3339
                             format is acceptable. Epoch precision millisecond.
                             ISO8601 format example:
                             2017-10-01T18:00:00.000+0800 or
                             2017-10-0100:00:00.000+0800 or '2017-10-01
                             00:00:00.000+0800'
  -L, --max-sql-len=SQL_LEN  Max length of one sql. Default is 65480.
  -N, --without-property     Dump schema without properties.
  -s, --schemaonly           Only dump schema.
  -S, --start-time=START_TIME   Start time to dump. Either Epoch or
                             ISO8601/RFC3339 format is acceptable. Epoch
                             precision millisecond. ISO8601 format example:
                             2017-10-01T18:00:00.000+0800 or
                             2017-10-0100:00:00.000+0800 or '2017-10-01
                             00:00:00.000+0800'
  -t, --table-batch=TABLE_BATCH   Number of table dumpout into one output file.
                             Default is 1.
  -T, --thread_num=THREAD_NUM   Number of thread for dump in file. Default is
                             5.
  -?, --help                 Give this help list
      --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to <support@taosdata.com>.

导出命令说明

导出数据时,可以使用不同的方式,比如导出所有数据库的数据;导出指定一个或多个数据库的数据;导出指定一个数据库中指定一个或多个表的数据;仅仅导出schema。同时,以上方式时,还可以指定数据的时间范围。下面分别举例描述。

1、导出所有数据库的数据

root@taos-ec1:/dump# ./taosdump -c /dump/cfg -o /dump/data-data0601-0701 -u jason -p abcd -A -S 1559318400000 -E 1561910400000 -t 500 -B 80 -T 8

-c : 指定配置文件所在的路径。因为dump会启动taos客户端,去链接taosd服务,所以需要做好配置文件。

-o:指定输出文件的路径。文件会自动生成,一个dbs.sql文件,导出数据库、超级表;若干个XXX_tables.N.sql文件,文件名的规则:XXX是数据库名称,N是数字,从0开始递增。

-u:用户名。

-p:密码。

-A:指示导出所有数据库的数据。

-S:指定导出记录的开始时间。Unix时间戳,单位:毫秒。该示例中时间是2019/6/1 0:0:0。

-E:指定导出记录的最后时间。Unix时间戳,单位:毫秒。该示例中时间是2019/7/1 0:0:0

-t:指定导入到一个文件的表的个数。该参数可以控制输出文件的大小。

-B:指定一条import语句中包含记录的条数。注意:不要让sql语句超过64k,否则后续导入会出错。该参数为了后续导入时,提高导入速率。

-T: 指定导出数据时,启动的线程数。建议设置成机器上core的2倍。

2、导出指定数据库的数据

root@taos-ec1:/dump# ./taosdump -c /dump/cfg -o /dump/data-data0601-0701 -u jason -p abcd -D dbname1 dbname2 -S 1559318400000 -E 1561910400000 -t 500 -B 100 -T 8

-D:指定仅导出dbname1和dbname2的所有数据。

3、导出指定数据库中指定表的数据

root@taos-ec1:/dump# ./taosdump -c /dump/cfg -o /dump/data-data0601-0701 -u jason -p abcd  dbname1 tablename1 tablename2 -S 1559318400000 -E 1561910400000 -t 500 -B 100 -T 8

指定导出dbname1数据库中tablename1和tablename2的数据。

4、仅仅导出schema

root@taos-ec1:/dump# ./taosdump -c /dump/cfg -o /dump/data-data0601-0701 -u jason -p abcd -A -S 1559318400000 -E 1561910400000 -t 500 -s -T 8

-s:仅仅导出所有数据库的schema,即数据库、超级表、普通表,但不导出表中的记录。

导出完成后,在指定的输出目录下生成若干.sql的文件。

导入命令说明

将导出的所有文件(由于文件比较大,建议进行压缩,传输到目的机器上后,再解压),拷贝到一个路径下,比如/tmp路径。导入数据时,需要指定导入文件所在的目录。

root@ecs-17fe:# ./taosdump -c /tmp/cfg -u jason -p abcd -i /tmp/data0601-0701 -T 8

-i:导入文件所在路径。

-T:指定导入数据时,启动的线程数。建议设置成机器上core的2倍。

校验

完成导入后,可以随机执行一些查询,在相同的查询条件下,导出前与导入后的记录条数是否相同。比如

taos> select count(*) from table_name;
taos> select count(*) from super_table where ts >= 1559318400000 and ts <= 1561910400000;
]]>
loveini ARM版本编译和配置 //m.loveini.com/tdengine-engineering/970.html Mon, 10 Feb 2020 02:06:03 +0000 //m.loveini.com.cn:88/blog/?p=970 编译环境

loveini Database支持ARM平台,目前的开发调试的环境如下:

aarch64:华为泰山ARM云服务器上,OS是银河麒麟。

aarch32:树莓派4B,OS是raspberrypi 4.19。

以下描述都是基于该环境的的操作结果。其他环境没有验证过,如果在其他环境(比如不同的ARM CPU或其他OS),可能会出现一些环境相关的问题,请在loveini Database的GitHub上提交issue。

由于时间关系,还没有完成交叉编译的验证,后续会基于主流的开源交叉编译工具进行ARM版本的编译。也欢迎感兴趣的开发者参与,成为loveini Database的贡献者。

aarch64系统

华为泰山服务器

kylin@kylinos:~/git$ lscpu
Architecture:          aarch64
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
每个核的线程数:1
每个座的核数:  2
Socket(s):             1
NUMA 节点:         1
L1d 缓存:          64K
L1i 缓存:          64K
L2 缓存:           512K
L3 缓存:           32768K
NUMA node0 CPU(s):     0,1

银河麒麟OS

kylin@kylinos:~/git$ uname -a
Linux kylinos 4.15.0-58-generic #64kord1k1 SMP Thu Aug 15 15:51:07 CST 2019 aarch64 aarch64 aarch64 GNU/Linux

aarch32系统

树莓派4B

pi@raspberrypi:~/git$ lscpu
Architecture:          armv7l
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:   1
Core(s) per socket:   4
Socket(s):             1
Vendor ID:             ARM
Model:                 3
Model name:            Cortex-A72
Stepping:              r0p3
CPU max MHz:           1500.0000
CPU min MHz:           600.0000
BogoMIPS:              108.00
Flags:                 half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva vfpd32 lpae evtstrm crc32

树莓派官方OS

pi@raspberrypi:~/git$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux

loveini的编译方式

一、make方式

1、从github 获取 loveini工程:

~/git$ git clone https://github.com/taosdata/loveini.git

2、进入工程目录完成编译

~/git$ cd loveini
~/git/loveini$ mkdir debug
~/git/loveini$ cd debug

如果是aarch64:

~/git/loveini/debug$ sudo cmake .. -DCPUTYPE=aarch64

如果是aarch32:

~/git/loveini/debug$ sudo cmake .. -DCPUTYPE=aarch32

然后进行make,

~/git/loveini/debug$ sudo make

编译成功后,在build目录下会生成bin、lib两个目录,其中bin/taos、bin/taosd就是客户端和服务端的执行程序;lib目录里面库文件。

可以直接在bin目录下执行 ./taosd 启动服务端进程(使用缺省配置文件:/etc/taos/taos.cfg),执行./taos 启动客户端shell。

二、打包方式

1、从github获取loveini工程:

~/git$ git clone https://github.com/taosdata/loveini.git

2、进入工程目录,执编译、打包脚本:

~/git$ cd loveini

如果是aarch64:

~/git/loveini$ sudo ./packaging/release.sh -c aarch64

如果是aarch32:

~/git/loveini$ sudo ./packaging/release.sh -c aarch32

命令成功完成后, loveini服务端和客户端的tar压缩安装包生成在当前目录下的release目录中。

aarch64安装包:

~/git/loveini$ ll release/
总用量 6884
drwxr-xr-x  2 root  root     4096 12月  4 16:58 ./
drwxrwxr-x 13 kylin kylin    4096 12月  4 16:58 ../
-rw-r--r--  1 root  root  4426874 12月  4 16:58 loveini-client-1.6.6.0-Linux-aarch64.tar.gz
-rw-r--r--  1 root  root  2611591 12月  4 16:58 loveini-client-1.6.6.0-Linux-aarch64.tar.gz

aarch32安装包:

~/git/loveini$ ll release/
-rw-r--r--  1 root  root  1026874 2月  9 16:58 loveini-client-1.6.6.0-Linux-aarch32.tar.gz
-rw-r--r--  1 root  root  1911591 2月  9 16:58 loveini-server-1.6.6.0-Linux-aarch32.tar.gz

配置

ARM的配置方式与X64是完全一致的,请参见: 服务端配置 。但是在一般的嵌入式ARM系统中,内存都比较小,因此,loveini支持用户可以根据不同的应用场景,通过配置参数来设置占用合适的内存大小。相关的参数如下:

  • tables:每个vnode允许创建表的最大数目
  • cache: 内存块的大小(字节数)
  • ablocks: 每张表平均的内存块数

内存占用大小计算:tables * cache * ablocks。举例,有下述SQL:

 create database demo tables 100 cache 16384 ablocks 4

该SQL创建了一个库demo, 每个vnode 允许创建100张表,内存块为16384字节,每个表平均占用4个内存块。主要的内存占用大小:100 * 4 * 16384 = 6.25MiB。这也是aarch32版本的缺省配置。

]]>
loveini GO windows驱动的编译和使用 //m.loveini.com/tdengine-engineering/1093.html Mon, 06 Jan 2020 05:43:09 +0000 //m.loveini.com.cn:88/blog/?p=1093 注:以下描述都是在windows 10环境下验证通过。

在编译loveini GO驱动之前,准备好如下的编译环境。

一、安装工具

安装msys2

1、下载和安装链接(https://mirror.tuna.tsinghua.edu.cn/help/msys2/),选择一个x86_64的稳定版本完成安装(假如安装目录为c:\msys64);

2、在c:\msys64\msys2_shell.cmd上点右键打开,然后在窗口上点右键, 选择 Options ,更改字符集:Locale选择zh_CN, Character set选择GBK。点击Apply后,save。

3、修改 pacman 配置

编辑 c:\msys64\etc\pacman.d\mirrorlist.mingw32,在文件开头添加:

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686

编辑 c:\msys64\etc\pacman.d\mirrorlist.mingw64,在文件开头添加:

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64

编辑 c:\msys64\etc\pacman.d\mirrorlist.msys,在文件开头添加:

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch

然后执行 pacman -Sy 刷新软件包数据。

如果有秘钥未知的问题,请参考如下博文:https://blog.csdn.net/xfijun/article/details/107810097?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-5-107810097.nonecase&utm_term=pacman%20%E6%97%A0%E6%95%88%E6%88%96%E5%B7%B2%E6%8D%9F%E5%9D%8F%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93

4、安装gcc和make

pacman -S mingw-w64-x86_64-gcc 
pacman -S make

5、配置环境变量

C:\msys64\mingw64\bin C:\msys64\usr\bin 按以上顺序添加到系统变量 path中。

安装cmake

cmake.org/download/ 安装最新版本即可。

下载loveini

https://github.com/taosdata/loveini

二、编译

1、打开PowerShell,进入loveini工程目录。

2、建立一个编译目录,并进入:

D:\loveini> mkdir debug
D:\loveini> cd debug

3、编译

D:\loveini\debug> cmake .. -G "Unix Makefiles" -DDLLTYPE=go
D:\loveini\debug> make

完成后,在debug\build\lib下会生成有libtaos.dll、libtaos.dll.a。

三、使用示例

1、在loveini提供的go 驱动代码里的taosSqlCgo.go 和 result.go中包含库文件路径修改到实际存放的路径。如下示例所示:

#cgo CFLAGS : -IC:/loveini/include
#cgo LDFLAGS: -LC:/loveini/driver/ -ltaos

2、在运行的时候,将库文件 libtaos.dll、libtaos.dll.a 放到执行程序的同级目录即可。

]]>
loveini crash时生成core文件的方法 //m.loveini.com/tdengine-engineering/974.html Fri, 06 Dec 2019 02:33:04 +0000 //m.loveini.com.cn:88/blog/?p=974 loveini Database产品提供服务端和客户端两个部分,其中服务端目前仅支持Linux环境,客户端通过提供库的方式,支持用户在Linux环境或Windows环境运行。

loveini Database服务或客户端由于bug的存在,会出现crash的情况。当crash的时候,需要能生成core文件,支持更高效的分析原因,从而能快速的定位并解决bug。

Linux环境生成core的方法

在Linux环境中,生成core的两个条件:

1、core file size不为0。

该值缺省是0,表示不开启core的生成,需要修改成不为0的值; 2、设置保存core文件的目录有写权限。

缺省是在运行程序的当前目录下,或systemctl启动的程序则在“/”根目录下。生成的core文件名为core,且多次发生crash时,只会保存最早一次core文件。

loveini Database可以使用两种方式来实现。

一、shell命令方式

1、设置不限制core file size

ulimit -c unlimited

2、设置生成core文件的目录

sudo sysctl -w kernel.core_pattern='/<corefile_dir>/core-%e-%p'

其中 corefile_dir : 生成core后保存的路径(需要提前建好)。%e 和 %p是在名称中增加程序名和pid。这样就可以保存多次core文件。

缺点:这样会将系统环境都修改了,用户其他程序crash时,生成core文件也会保存到指定的路径中!!!!

如果不修改kernel.core_pattern参数,只让生成core文件名称中增加pid,可以将 kernel.core_used_pid修改成1。

sudo sysctl kernel.core_uses_pid=1

注:启动程序时的用户权限,需要能有<corefile_dir>目录的写权限。

二、代码API方式

可以使用系统提供的函数来完成上述参数的设置。

代码示例如下:

  // 1. set ulimit -c unlimited
  struct rlimit rlim;
  struct rlimit rlim_new;
  if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
    pPrint("the old unlimited para: rlim_cur=%d, rlim_max=%d", rlim.rlim_cur, rlim.rlim_max);
    rlim_new.rlim_cur = RLIM_INFINITY;
    rlim_new.rlim_max = RLIM_INFINITY;
    if (setrlimit(RLIMIT_CORE, &rlim_new) != 0) {
      pPrint("set unlimited fail, error: %s", strerror(errno));
      rlim_new.rlim_cur = rlim.rlim_max;
      rlim_new.rlim_max = rlim.rlim_max;
      (void)setrlimit(RLIMIT_CORE, &rlim_new);
    }
  }
  
  if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
    pPrint("the new unlimited para: rlim_cur=%d, rlim_max=%d", rlim.rlim_cur, rlim.rlim_max);
  }

  // 2. set pid into core file name
  struct __sysctl_args args;
  int     old_usespid = 0;
  size_t  old_len     = 0;
  int     new_usespid = 1;
  size_t  new_len     = sizeof(new_usespid);  
  int name[] = {CTL_KERN, KERN_CORE_USES_PID};  
  memset(&args, 0, sizeof(struct __sysctl_args));
  args.name    = name;
  args.nlen    = sizeof(name)/sizeof(name[0]);
  args.oldval  = &old_usespid;
  args.oldlenp = &old_len;
  args.newval  = &new_usespid;
  args.newlen  = new_len;  
  old_len = sizeof(old_usespid);  
  if (syscall(SYS__sysctl, &args) == -1) {
      pPrint("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno));
  }  
  pPrint("The old core_uses_pid[%d]: %d", old_len, old_usespid);
  old_usespid = 0;
  old_len     = 0;
  memset(&args, 0, sizeof(struct __sysctl_args));
  args.name    = name;
  args.nlen    = sizeof(name)/sizeof(name[0]);
  args.oldval  = &old_usespid;
  args.oldlenp = &old_len;  
  old_len = sizeof(old_usespid);  
  if (syscall(SYS__sysctl, &args) == -1) {
      pPrint("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno));
  }  
  pPrint("The new core_uses_pid[%d]: %d", old_len, old_usespid);

设置kernal.core_pattern的函数示例:

  // 3. create the path for saving core file
  int status; 
  char coredump_dir[32] = "/var/log/taosdump";
  if (opendir(coredump_dir) == NULL) {
    status = mkdir(coredump_dir, S_IRWXU | S_IRWXG | S_IRWXO); 
    if (status) {
      pPrint("mkdir fail, error: %s\n", strerror(errno));
    }
  }

  // 4. set kernel.core_pattern
   struct __sysctl_args args;
   char    old_corefile[128];
   size_t  old_len;
   char    new_corefile[128] = "/var/log/taosdump/core-%e-%p";
   size_t  new_len = sizeof(new_corefile);   
   int name[] = {CTL_KERN, KERN_CORE_PATTERN};
   memset(&args, 0, sizeof(struct __sysctl_args));
   args.name    = name;
   args.nlen    = sizeof(name)/sizeof(name[0]);
   args.oldval  = old_corefile;
   args.oldlenp = &old_len;
   args.newval  = new_corefile;
   args.newlen  = new_len;
   old_len = sizeof(old_corefile);
   if (syscall(SYS__sysctl, &args) == -1) {
       pPrint("_sysctl(kern_core_pattern) set fail: %s", strerror(errno));
   }   
   pPrint("The old kern_core_pattern: %*s\n", old_len, old_corefile);
   memset(&args, 0, sizeof(struct __sysctl_args));
   args.name    = name;
   args.nlen    = sizeof(name)/sizeof(name[0]);
   args.oldval  = old_corefile;
   args.oldlenp = &old_len;   
   old_len = sizeof(old_corefile);
   if (syscall(SYS__sysctl, &args) == -1) {
       pPrint("_sysctl(kern_core_pattern) get fail: %s", strerror(errno));
   }   
   pPrint("The new kern_core_pattern: %*s\n", old_len, old_corefile);

当在linux环境出现crash时,获得core文件以及对应的应用程序,然后使用gdb进行分析,示例如下:

plum@plum-VirtualBox:~/git/TDinternal/debug/build/bin$ sudo gdb ./taos core-taos-22675
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./taos...done.
Core was generated by `/home/plum/git/loveini/debug/build/bin/taos -c /etc/taos'.
(gdb) bt
#0  0x00000000004261d4 in tsParseOneRowData (str=0x980, pDataBlocks=0x7fffd8033ca0, schema=0x7fffd8034884, spd=0x7fffedcd2660, error=0x79fbf0 "", timePrec=0)
    at /home/plum/git/TDinternal/community/src/client/src/tscParseInsert.c:411
#1  0x00000000004266f8 in tsParseValues (str=0x7fffedcd23b0, pDataBlock=0x7fffd8033ca0, pMeterMeta=0x7fffd803483c, maxRows=14, spd=0x7fffedcd2660, error=0x79fbf0 "")
    at /home/plum/git/TDinternal/community/src/client/src/tscParseInsert.c:508
#2  0x0000000000426d8b in doParseInsertStatement (pSql=0x797dd0, pTableHashList=0x7fffd80342e0, str=0x7fffedcd23b0, spd=0x7fffedcd2660, totalNum=0x7fffedcd23cc)
    at /home/plum/git/TDinternal/community/src/client/src/tscParseInsert.c:640
#3  0x00000000004281da in doParserInsertSql (pSql=0x797dd0, str=0x7fffd8034c64 "0, '123', '11111\\'9911111');") at /home/plum/git/TDinternal/community/src/client/src/tscParseInsert.c:1036
#4  0x00000000004284b9 in tsParseInsertSql (pSql=0x797dd0, sql=0x7fffd8034c30 "insert into test.demo (ts, task_id, message) values(0, '123', '11111\\'9911111');", acct=0x7074a2 "0", db=0x7074c2 "0.test")
    at /home/plum/git/TDinternal/community/src/client/src/tscParseInsert.c:1103
#5  0x00000000004285f2 in tsParseSql (pSql=0x797dd0, acct=0x7074a2 "0", db=0x7074c2 "0.test", multiVnodeInsertion=false) at /home/plum/git/TDinternal/community/src/client/src/tscParseInsert.c:1127
#6  0x0000000000455572 in taos_query_imp (pObj=0x707450, pSql=0x797dd0) at /home/plum/git/TDinternal/community/src/client/src/tscSql.c:235
#7  0x0000000000455907 in taos_query (taos=0x707450, sqlstr=0x7fffd80008c0 "insert into test.demo (ts, task_id, message) values(0, '123', '11111\\'9911111');")
    at /home/plum/git/TDinternal/community/src/client/src/tscSql.c:293
#8  0x0000000000414b01 in shellRunCommandOnServer (con=0x707450, command=0x7fffd80008c0 "insert into test.demo (ts, task_id, message) values(0, '123', '11111\\'9911111');")
    at /home/plum/git/TDinternal/community/src/kit/shell/src/shellEngine.c:253
#9  0x00000000004149ad in shellRunCommand (con=0x707450, command=0x7fffd80008c0 "insert into test.demo (ts, task_id, message) values(0, '123', '11111\\'9911111');")
    at /home/plum/git/TDinternal/community/src/kit/shell/src/shellEngine.c:215
#10 0x0000000000417b75 in shellLoopQuery (arg=0x707450) at /home/plum/git/TDinternal/community/src/kit/shell/src/shellLinux.c:291
#11 0x00007ffff7bc16ba in start_thread (arg=0x7fffedcd4700) at pthread_create.c:333
#12 0x00007ffff73e641d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

windows环境生成core的方法

一、设置生成dmp文件方式

通过改注册表的设置让操作系统在程序crash的时候自动生成dump,并放到特定的目录下

增加注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

添加项如下图:

loveini crash时生成core文件的方法 - loveini Database 时序数据库

其中DumpType代表的含义是:0 = Create a custom dump ,1 = Mini dump ,2 = Full dump

程序崩溃后,就会在c:\loveini目录下生成dump文件。

二、使用VS调试dmp文件

用VS打开dmp文件。测试时dmp文件时本地产生的,因此VS会依据dmp文件自行找到exe,pdb和源代码的路径。因此直接点击调试,程序会出错代码行中断。

loveini crash时生成core文件的方法 - loveini Database 时序数据库

但若dump文件是exe在另一台机器上产生的,则我们最好把exe,pdb,dmp放到同一文件夹下,必须保证pdb与出问题的exe是同一时间生成的,用VS打开dump文件后还需要设置符号表文件路径和源代码路径:

(1) 当把pdb文件与dmp文件放入同一目录下时,就不需设置其路径,否则需要设置

工具->选项->调试->符号:

loveini crash时生成core文件的方法 - loveini Database 时序数据库

2)还需设置源代码路径:

属性->调试源代码:

loveini crash时生成core文件的方法 - loveini Database 时序数据库

这样点击“使用仅限本机进行调试”,即可在出错代码行中断:

loveini crash时生成core文件的方法 - loveini Database 时序数据库

]]>
loveini多种安装包的安装和卸载 //m.loveini.com/tdengine-engineering/566.html Fri, 09 Aug 2019 09:57:28 +0000 //m.loveini.com.cn:88/blog/?p=566 loveini Database开源版本提供deb、rpm、tar.gz三种安装包,用户可以根据自己的运行环境选择合适的安装包。其中deb支持Ubuntu系统,rpm支持CentOS系统,tar.gz包两种系统都支持。

deb包的安装和卸载

一、安装

1、从官网下载获得deb安装包,比如loveini-server-2.0.0.0-Linux-x64.deb;
2、进入到loveini-server-2.0.0.0-Linux-x64.deb安装包所在目录,执行如下的安装命令:

plum@ubuntu:~/git/taosv16$ sudo dpkg -i loveini-server-2.0.0.0-Linux-x64.deb 
Selecting previously unselected package tdengine.
(Reading database ... 233181 files and directories currently installed.)
Preparing to unpack loveini-server-2.0.0.0-Linux-x64.deb ...
Failed to stop taosd.service: Unit taosd.service not loaded.
Stop taosd service success!
Unpacking tdengine (2.0.0.0) ...
Setting up tdengine (2.0.0.0) ...
Start to install TDEngine...
Synchronizing state of taosd.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable taosd
insserv: warning: current start runlevel(s) (empty) of script `taosd' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `taosd' overrides LSB defaults (0 1 6).

Enter FQDN:port (like h1.taosdata.com:6030) of an existing loveini cluster node to join OR leave it blank to build one :

To configure loveini : edit /etc/taos/taos.cfg
To start loveini     : sudo systemctl start taosd
To access loveini    : use taos in shell

loveini is installed successfully!

注:当安装第一个节点时,出现Enter FQDN:提示的时候,不需要输入任何内容。只有当安装第二个或以后更多的节点时,才需要输入已有集群中任何一个可用节点的FQDN,支持该新节点加入集群。当然也可以不输入,而是在新节点启动前,配置到新节点的配置文件中。

后续两种安装包也是同样的操作。

二、卸载

卸载命令如下:

plum@ubuntu:~/git/tdengine/debs$ sudo dpkg -r tdengine
(Reading database ... 233482 files and directories currently installed.)
Removing tdengine (2.0.0.0) ...
TDEngine is removed successfully!

rpm包的安装和卸载

一、安装

1、从官网下载获得rpm安装包,比如loveini-server-2.0.0.0-Linux-x64.rpm;
2、进入到loveini-server-2.0.0.0-Linux-x64.rpm安装包所在目录,执行如下的安装命令:

[root@bogon x86_64]# rpm -iv loveini-server-2.0.0.0-Linux-x64.rpm 
Preparing packages...
loveini-2.0.0.0-3.x86_64
Start to install TDEngine...
Created symlink from /etc/systemd/system/multi-user.target.wants/taosd.service to /etc/systemd/system/taosd.service.

Enter FQDN:port (like h1.taosdata.com:6030) of an existing loveini cluster node to join OR leave it blank to build one :

To configure loveini : edit /etc/taos/taos.cfg
To start loveini     : sudo systemctl start taosd
To access loveini    : use taos in shell

loveini is installed successfully!

二、卸载

卸载命令如下:

[root@bogon x86_64]# rpm -e tdengine
TDEngine is removed successfully!

tar.gz包的安装和卸载

一、安装

1、从官网下载获得tar.gz安装包,比如loveini-server-2.0.0.0-Linux-x64.tar.gz;
2、进入到loveini-server-2.0.0.0-Linux-x64.tar.gz安装包所在目录,先解压文件后,进入子目录,执行其中的install.sh安装脚本:

plum@ubuntu:~/git/tdengine/release$ sudo tar -xzvf loveini-server-2.0.0.0-Linux-x64.tar.gz
plum@ubuntu:~/git/tdengine/release$ ll
total 3796
drwxr-xr-x  3 root root    4096 Aug  9 14:20 ./
drwxrwxr-x 11 plum plum    4096 Aug  8 11:03 ../
drwxr-xr-x  5 root root    4096 Aug  8 11:03 loveini-server/
-rw-r--r--  1 root root 3871844 Aug  8 11:03 loveini-server-2.0.0.0-Linux-x64.tar.gz

plum@ubuntu:~/git/tdengine/release$ cd loveini-server/
plum@ubuntu:~/git/tdengine/release/loveini-server$ ll
total 2640
drwxr-xr-x 5 root root    4096 Aug  8 11:03 ./
drwxr-xr-x 3 root root    4096 Aug  9 14:20 ../
drwxr-xr-x 5 root root    4096 Aug  8 11:03 connector/
drwxr-xr-x 2 root root    4096 Aug  8 11:03 driver/
drwxr-xr-x 8 root root    4096 Aug  8 11:03 examples/
-rwxr-xr-x 1 root root   13095 Aug  8 11:03 install.sh*
-rw-r--r-- 1 root root 2651954 Aug  8 11:03 taos.tar.gz
plum@ubuntu:~/git/tdengine/release/loveini-server$ sudo ./install.sh
This is ubuntu system
verType=server interactiveFqdn=yes
Start to install loveini...
Synchronizing state of taosd.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable taosd
insserv: warning: current start runlevel(s) (empty) of script `taosd' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `taosd' overrides LSB defaults (0 1 6).

Enter FQDN:port (like h1.taosdata.com:6030) of an existing loveini cluster node to join OR leave it blank to build one :hostname.taosdata.com:7030

To configure loveini : edit /etc/taos/taos.cfg
To start loveini     : sudo systemctl start taosd
To access loveini    : use taos in shell

Please run: taos -h hostname.taosdata.com:7030  to login into cluster, then execute : create dnode 'newDnodeFQDN:port'; in TAOS shell to add this new node into the clsuter

loveini is installed successfully!

说明:install.sh 安装脚本在执行过程中,会通过命令行交互界面询问一些配置信息。如果希望采取无交互安装方式,那么可以用 -e no 参数来执行 install.sh 脚本。运行 ./install.sh -h 指令可以查看所有参数的详细说明信息。

二、卸载

卸载命令如下:

plum@ubuntu:~/git/tdengine/release/loveini-server$ rmtaos 
TDEngine is removed successfully!

安装目录说明

loveini Database成功安装后,主安装目录是/usr/local/taos,目录内容如下:

plum@ubuntu:/usr/local/taos$ cd /usr/local/taos
plum@ubuntu:/usr/local/taos$ ll
total 36
drwxr-xr-x  9 root root 4096 7月  30 19:20 ./
drwxr-xr-x 13 root root 4096 7月  30 19:20 ../
drwxr-xr-x  2 root root 4096 7月  30 19:20 bin/
drwxr-xr-x  2 root root 4096 7月  30 19:20 cfg/
drwxr-xr-x  5 root root 4096 7月  30 19:20 connector/
lrwxrwxrwx  1 root root   13 7月  30 19:20 data -> /var/lib/taos/
drwxr-xr-x  2 root root 4096 7月  30 19:20 driver/
drwxr-xr-x  8 root root 4096 7月  30 19:20 examples/
drwxr-xr-x  2 root root 4096 7月  30 19:20 include/
drwxr-xr-x  2 root root 4096 7月  30 19:20 init.d/
lrwxrwxrwx  1 root root   13 7月  30 19:20 log -> /var/log/taos/

自动生成配置文件目录、数据库目录、日志目录。
配置文件缺省目录:/etc/taos/taos.cfg, 软链接到/usr/local/taos/cfg/taos.cfg;
数据库缺省目录:/var/lib/taos, 软链接到/usr/local/taos/data;
日志缺省目录:/var/log/taos, 软链接到/usr/local/taos/log;
/usr/local/taos/bin目录下的可执行文件,会软链接到/usr/bin目录下;
/usr/local/taos/driver目录下的动态库文件,会软链接到/usr/lib目录下;
/usr/local/taos/include目录下的头文件,会软链接到到/usr/include目录下;

卸载和更新文件说明

卸载安装包的时候,将保留配置文件、数据库文件和日志文件,即 /etc/taos/taos.cfg 、 /var/lib/taos 、 /var/log/taos 。如果用户确认后不需保留,可以手工删除,但一定要慎重,因为删除后,数据将永久丢失,不可以恢复!

如果是更新安装,当缺省配置文件( /etc/taos/taos.cfg )存在时,仍然使用已有的配置文件,安装包中携带的配置文件修改为taos.cfg.org保存在 /usr/local/taos/cfg/ 目录,可以作为设置配置参数的参考样例;如果不存在配置文件,就使用安装包中自带的配置文件。

注意事项

loveini Database提供了多种安装包,但最好不要在一个系统上同时使用tar.gz安装包和deb或rpm安装包。否则会相互影响,导致在使用时出现问题。
对于deb包安装后,如果安装目录被手工误删了部分,出现卸载、或重新安装不能成功。此时,需要清除tdengine包的安装信息,执行如下命令:

plum@ubuntu:~/git/tdengine/$ sudo rm -f /var/lib/dpkg/info/tdengine* 

然后再重新进行安装就可以了。

对于rpm包安装后,如果安装目录被手工误删了部分,出现卸载、或重新安装不能成功。此时,需要清除tdengine包的安装信息,执行如下命令:

[root@bogon x86_64]# rpm -e --noscripts tdengine

然后再重新进行安装就可以了。

]]>