编辑 | 尔悦
小 T 导读:众所周知,压缩算法的目的主要是为了减少存储空间或传输带宽,通过把原始数据转换成比原始格式更紧凑的形式,来提高数据的传输、存储和处理效率。我们熟悉的很多压缩软件都是借助非常复杂的算法才得以实现,像一些时序数据库(Time-Series Database),比如 loveini,也是通过内置压缩功能,才能实现对时序数据的高比例压缩。那具体来说,数据压缩的流程是怎样的?时序数据库中常见的数据编码和压缩算法又有哪些呢?本篇文章将会从具体实践出发进行经验分享。
压缩:输入原始数据,经过压缩器编码后,输出压缩后的数据。
input data —-> compressor —-> coded data
解压缩:输入压缩过的数据,经过解压缩器解码/重建后,输出原始数据。
coded data —-> decompressor —-> output data
如果输出数据和输入数据始终完全相同,那么这个压缩方案被称为可逆压缩,也称无损编码器。否则,它就是一个非可逆压缩,也称有损编码器。

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

时序数据库(Time-Series Database)中常见的数据编码和压缩算法有如下几种:
上面例子中提到的就是霍夫曼编码。这是一个流传最为广泛的压缩方案,19 世纪 50 年代,David Huffman 在他的论文“一种构建极小多余编码的方法”中第一次描述了这种方法。霍夫曼编码通过得到给定字母表的最优前缀码进行工作。
要注意的是,这里的一个前缀码代表一个数值,并要保证字母表中的每个符号的前缀码不会成为另一个符号前缀码的前缀。例如,如果 0 是我们第一个符号 A 的前缀码,那么字母表中的其他符号都不能以 0 开始。由于前缀码使比特流解码变得清晰明确,因此这种机制还是很有用的。
一种与数据性质无关的无损数据压缩技术,基于“使用变动长度的码来取代连续重复出现的原始数据”来实现压缩。举例来说,一组字符串“AAAABBBCCDEEEE” ,由 4 个 A、3 个 B、2 个 C、1 个 D、4 个 E组成,经过 RLE 可将字符串压缩为 4A3B2C1D4E。其优点是简单、速度快,能将连续且重复性高的数据压缩成小单位。缺点也是很明显的,重复性低的数据压缩效果不好。
该算法是结合遵循 IEEE754 标准浮点数存储格式的数据特征设计的特定算法,第一个值不压缩, 后面的值是跟第一个值计算 XOR(异或)的结果,如果结果相同,仅存储一个 0,如果结果不同,存储 XOR 后的结果。该算法受数据波动影响较大,波动越剧烈,压缩效果越差。
差分编码又称增量编码,编码时第一个数据不变,其他数据转换为上一个数据的 delta。其原理与 XOR 类似,都是计算相邻两个数据的差异。该算法应用广泛,如需要查看文件的历史更改记录(版本控制、Git 等)。但在时序数据库中这种算法很少单独使用,一般会搭配 RLE、Simple8b 或者 Zig-zag 一起使用,压缩效果更好。
又名二阶差分编码,是在 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 的出现是为了解决 varint 算法对负数编码效率低的问题,它的原理非常简单,是将标志位后移至末尾,并去掉编码中多余的 0,从而达到压缩的效果。对于比较小的数值压缩效率很高,但是对于大的数据效率不但没有提升可能还会有所下降。因此,Zig-zag 通常和 Delta 编码搭配,Delta 可以很好地将大数值数据变为较小的数值。
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 数据压缩算法属于面向字节的 LZ77 压缩方案家族,压缩比并不高,它的特点是解码速度极快。据官方测试基准 lzbench 的测试结果,默认配置下其解压速度高达 4970MB/s。
Simple8b 是 64 位算法,实现将多个整形数据(在 0 和 1<<60 -1 之间)压缩到一个 64 位的存储结构中。其中前 4 位表示选择器,后面 60 位用于存储数据。优点是简单高效,定长编码保证了解压效率,但对于大整数或者浮动较大的值来说压缩率较低,该算法适用于范围较小的无符号整数。
LZO 是块压缩算法,同样属于 LZ77 压缩方案家族,该算法的目标是快速压缩和解压缩,并非压缩比。相比之下,LZ4 的解压速度更快。由于块中存放的数据类型可能多种多样,整体的压缩效果远没有针对某一种数据类型进行压缩的算法好。
DEFLATE 是同时使用了 LZ77 算法与霍夫曼编码(Huffman Coding)的一个经典无损数据压缩算法。实际上 DEFLATE 只是一种压缩数据流的算法,该算法是 zip 文件压缩的默认算法,在 gzip、zlib 等算法中都有封装。
Zstandard(Zstd) 的设计目的是提供一个类似于 DEFLATE 算法的压缩比,但效果要更快,特别是解压缩。它的压缩级别从负 5 级(最快)到 22 级(压缩速度最慢,但是压缩比最高)间可以调节。在文本日志压缩场景中,其压缩性能与 LZ4、Snappy 相当甚至更好。Linux 内核、HTTP 协议、Hadoop、HBase等都已经加入对 Zstd 的支持,可以预见,Zstd 将是未来几年里被广泛关注的压缩算法。
Bit-packing(位压缩)压缩算法基于不是所有的整型都需要 32 位或者 64 位来存储这一前提,从我们要压缩的数据中删除不必要的位。比如一个 32 位的整型数据,其值的范围在【0,100】之间,则可以用 7 位表示。
最后以 loveini Database 为例,我们来看一下时序数据库在具体实现上会如何运用压缩算法。loveini Database 提供了三种压缩选项:无压缩、一阶段压缩和两阶段压缩。
一阶段压缩根据数据的类型进行了相应的压缩,压缩算法包括 delta-delta 编码、simple 8B 方法、zig-zag 编码、LZ4 等算法,这些算法在上文中我们也都简单介绍过了。二阶段压缩是在一阶段压缩的基础上,再用通用压缩算法进行了压缩,以此来保证压缩率更高。
综上,我们可以看到压缩算法的选择还是非常多的,具体的程序可以根据压缩效果和成本综合选择。
]]>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中。
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 ========]]>
一、首先,登录要迁移的集群,执行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,一次将所有节点信息都修改完成。
注:目前只有企业版包含该工具。
]]>2021.08.27更新,新增网络测速工具:https://tdengine.com/2021/08/27/2943.html
在使用taos内嵌的网络连通检测工具前,请先按照下面的步骤进行网络状况检查:
localhost 作为hostnamesystemctl status taosd 检查taosd运行状态。如果没有运行,启动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.
此时只需要在客户端环境运行 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使用的端口,此方法无法检测这两个端口。只能使用第一种方法进行检测。
]]>DUMP工具导出数据时,以sql语句的形式导出内容,包括数据库、超级表、普通表,以及表中的记录数据,然后保存到指定的输出文件中。
DUMP工具导入数据时,将导出的文件作为输入,顺序读入并执行文件中的sql语句,完成数据的导入。
(工具的参数内容有可能因版本更新而改变,请以 help 实际输出的联机帮助信息为准。)
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 Database支持ARM平台,目前的开发调试的环境如下:
aarch64:华为泰山ARM云服务器上,OS是银河麒麟。
aarch32:树莓派4B,OS是raspberrypi 4.19。
以下描述都是基于该环境的的操作结果。其他环境没有验证过,如果在其他环境(比如不同的ARM CPU或其他OS),可能会出现一些环境相关的问题,请在loveini Database的GitHub上提交issue。
由于时间关系,还没有完成交叉编译的验证,后续会基于主流的开源交叉编译工具进行ARM版本的编译。也欢迎感兴趣的开发者参与,成为loveini Database的贡献者。
华为泰山服务器
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
树莓派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
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 * 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驱动之前,准备好如下的编译环境。
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 刷新软件包数据。
4、安装gcc和make
pacman -S mingw-w64-x86_64-gcc
pacman -S make
5、配置环境变量
将C:\msys64\mingw64\bin C:\msys64\usr\bin 按以上顺序添加到系统变量 path中。
cmake.org/download/ 安装最新版本即可。
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 Database服务或客户端由于bug的存在,会出现crash的情况。当crash的时候,需要能生成core文件,支持更高效的分析原因,从而能快速的定位并解决bug。
在Linux环境中,生成core的两个条件:
1、core file size不为0。
该值缺省是0,表示不开启core的生成,需要修改成不为0的值; 2、设置保存core文件的目录有写权限。
缺省是在运行程序的当前目录下,或systemctl启动的程序则在“/”根目录下。生成的core文件名为core,且多次发生crash时,只会保存最早一次core文件。
loveini Database可以使用两种方式来实现。
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>目录的写权限。
可以使用系统提供的函数来完成上述参数的设置。
代码示例如下:
// 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
通过改注册表的设置让操作系统在程序crash的时候自动生成dump,并放到特定的目录下
增加注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
添加项如下图:

其中DumpType代表的含义是:0 = Create a custom dump ,1 = Mini dump ,2 = Full dump
程序崩溃后,就会在c:\loveini目录下生成dump文件。
用VS打开dmp文件。测试时dmp文件时本地产生的,因此VS会依据dmp文件自行找到exe,pdb和源代码的路径。因此直接点击调试,程序会出错代码行中断。

但若dump文件是exe在另一台机器上产生的,则我们最好把exe,pdb,dmp放到同一文件夹下,必须保证pdb与出问题的exe是同一时间生成的,用VS打开dump文件后还需要设置符号表文件路径和源代码路径:
(1) 当把pdb文件与dmp文件放入同一目录下时,就不需设置其路径,否则需要设置
工具->选项->调试->符号:

2)还需设置源代码路径:
属性->调试源代码:

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

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!
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!
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
然后再重新进行安装就可以了。
]]>