【原创】Percona 之 tcprstat 安装及使用

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

本文描述 tcprstat 工具的安装和使用。 

========== 我是分割线 ========== 

【安装】 

      tcprstat 的源码管理方式使用的是 bzr 。bzr 的简介和相应客户端的安装可以参考《  安装和使用 TPCC-MySQL 工具遇到的问题   》。 

下载源码。 
?
1
2
[root@Betty WGET_DIR] # bzr branch lp:tcprstat
Branched 73 revisions.

压缩备份。

?
1
[root@Betty WGET_DIR] # tar czvf tcprstat.tar.gz ./tcprstat
查看相关文件。 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@Betty WGET_DIR] # cd tcprstat/
[root@Betty tcprstat] # ll
total 72
-rw-r--r-- 1 root root    38 Aug 23 17:18 AUTHORS
-rw-r--r-- 1 root root 35147 Aug 23 17:18 COPYING
-rw-r--r-- 1 root root     0 Aug 23 17:18 ChangeLog
-rw-r--r-- 1 root root   922 Aug 23 17:18 Makefile.am
-rw-r--r-- 1 root root   914 Aug 23 17:18 NEWS
-rw-r--r-- 1 root root  2730 Aug 23 17:18 README
-rw-r--r-- 1 root root    81 Aug 23 17:18 TODO
-rw-r--r-- 1 root root   926 Aug 23 17:18 bootstrap
-rw-r--r-- 1 root root  2643 Aug 23 17:18 configure.ac
drwxr-xr-x 2 root root  4096 Aug 23 17:18 libpcap
drwxr-xr-x 2 root root  4096 Aug 23 17:18 src
[root@Betty tcprstat] #
README 中一句话说明:tcprstat 是一个基于 pcap 提取 TCP 应答时间信息的工具。 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@Betty tcprstat] # vi README
 
                                  ~ tcprstat ~
 
tcprstat is a pcap-based tool that extracts information about TCP response
times .
tcprstat 是一个基于 pcap 提取 TCP 应答时间信息的工具。
 
It works by sniffing for TCP "requests" (inbound packets) and measures the time
that it takes for sending a "response" (next outbound packet). While this
approach might seem too simple, it works for simple protocols that are based in
such request /response system, like HTTP and the MySQL protocol. In the future,
we may write more complex protocol decoding.
# 工作原理:嗅探 TCP 的 request 并测量发送 response 所需的事件间隔。适用于一问一答式协议类型
的处理,如 HTTP 和 MySQL 协议。
 
tcprstat sniffs for a while , and then shows some stats about the sniffed
packets, similar to the way top (1) works.
tcpstat 会嗅探一段时间,然后展现一些统计信息,工作方式类似于 top
 
tcprstat uses libpcap to capture TCP. Due to many distros not shipping
libpcap >= 1.0.0, tcprstat ships libpcap 1.1.1 and uses it if it can't find a
suitable version
tcpstat 使用 libpcap 来捕获 TCP 包。鉴于许多发行版并不提供 libpcap >= 1.0.0 ,tcpstat
源码包中自带了相关源文件。
 
The build process delivers a static version, tcprstat-static, with no external
linking (some castration is needed at libpcap) so it can be copied directly to
a server with no need for compilation tools.
构建过程会生成一个 static 版本 -- tcpstat-static ,其不需要依赖任何外部链接,所以可以直接
拷贝其他机器上使用。
 
tcprstat is released under the GPL, version 2 or 3.
 
################################################################################
#                                                                              #
#   tcprstat -- Extract stats about TCP response times                         #
#   Copyright (C) 2010  Ignacio Nin                                            #
#                                                                              #
#   This program is free software; you can redistribute it and/or modify       #
#   it under the terms of the GNU General Public License as published by       #
#   the Free Software Foundation; either version 2 of the License, or          #
#   (at your option) any later version.                                        #
#                                                                              #
#   This program is distributed in the hope that it will be useful,            #
#   but WITHOUT ANY WARRANTY; without even the implied warranty of             #
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              #
#   GNU General Public License for more details.                               #
#                                                                              #
#   You should have received a copy of the GNU General Public License          #
#   along with this program; if not, write to the Free Software                #
#   Foundation, Inc.,                                                          #
#   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA               #
#                                                                              #
################################################################################
为 bootstrap 增加可执行权限后尝试执行。 
?
1
2
3
4
[root@Betty tcprstat] # chmod +x bootstrap 
[root@Betty tcprstat] # ./bootstrap 
. /bootstrap : line 23: aclocal: command not found
[root@Betty tcprstat] #
查看 bootstrap 文件内容。 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@Betty tcprstat]
[root@Betty tcprstat] # vi bootstrap 
 
#!/bin/sh
 
#
#   tcprstat -- Extract stats about TCP response times
#   Copyright (C) 2010  Ignacio Nin
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc.,
#   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
#
 
aclocal &&
autoheader &&
#libtoolize --automake &&
automake --add-missing &&
autoconf <span>< /span ><span>< /span >
安装 automake 和 autoconf 。  
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@Betty tcprstat] # yum list|grep automake
automake.noarch                            1.9.6-2.3.el5               base     
automake14.noarch                          1.4p6-13.el5.1              base     
automake15.noarch                          1.5-16.el5.2                base     
automake16.noarch                          1.6.3-8.el5.1               base     
automake17.noarch                          1.7.9-7.el5.2               base     
[root@Betty tcprstat]
[root@Betty tcprstat]
[root@Betty tcprstat] # yum list|grep autoconf
autoconf.noarch                            2.59-12                     base     
autoconf-archive.noarch                    2012.09.08-1.el5            epel     
autoconf213.noarch                         2.13-12.1                   base     
ocaml-autoconf.noarch                      1.0-4.el5                   epe<span>< /span >l     
[root@Betty tcprstat]
[root@Betty tcprstat] # yum -y install automake
安装成功后,重新执行 bootstrap ,发现不够。 
?
1
2
3
4
5
6
[root@Betty tcprstat] # ./bootstrap 
configure.ac:24: error: Autoconf version 2.61 or higher is required
configure.ac:24: the top level
autom4te: /usr/bin/m4 failed with exit status: 63
aclocal: autom4te failed with exit status: 63
[root@Betty tcprstat] #
只能卸载 yum 安装,然后通过源码安装 automake 和 autoconf ,安装成功后,执行 bootstrap 。 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@Betty tcprstat] # ./bootstrap 
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals
autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals
autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals
autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
configure.ac:30: installing './compile'
configure.ac:26: installing './install-sh'
configure.ac:26: installing './missing'
Makefile.am: installing './INSTALL'
src /Makefile .am: installing './depcomp'
configure.ac:80: warning: AC_CONFIG_SUBDIRS: you should use literals
autoconf /status .m4:1106: AC_CONFIG_SUBDIRS is expanded from...
configure.ac:80: the top level
[root@Betty tcprstat] #
再执行 
?
1
2
[root@Betty tcprstat] # ./configure
[root@Betty tcprstat] # make
查看都生成了哪些文件。 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@Betty tcprstat] # ll
total 484
-rw-r--r-- 1 root root     38 Aug 23 16:02 AUTHORS
-rw-r--r-- 1 root root  35147 Aug 23 16:02 COPYING
-rw-r--r-- 1 root root      0 Aug 23 16:02 ChangeLog
lrwxrwxrwx 1 root root     38 Aug 23 16:57 INSTALL -> /usr/local/share/automake-1 .14 /INSTALL
-rw-r--r-- 1 root root  25282 Aug 23 16:58 Makefile
-rw-r--r-- 1 root root    922 Aug 23 16:02 Makefile.am
-rw-r--r-- 1 root root  25101 Aug 23 16:57 Makefile. in
-rw-r--r-- 1 root root    914 Aug 23 16:02 NEWS
-rw-r--r-- 1 root root   2730 Aug 23 16:02 README
-rw-r--r-- 1 root root     81 Aug 23 16:02 TODO
-rw-r--r-- 1 root root  41921 Aug 23 16:57 aclocal.m4
drwxr-xr-x 2 root root   4096 Aug 23 16:57 autom4te.cache
-rwxr-xr-x 1 root root    926 Aug 23 16:02 bootstrap
lrwxrwxrwx 1 root root     38 Aug 23 16:57 compile -> /usr/local/share/automake-1 .14 /compile
-rw-r--r-- 1 root root   3192 Aug 23 16:58 config.h
-rw-r--r-- 1 root root   2940 Aug 23 16:57 config.h. in
-rw-r--r-- 1 root root  62239 Aug 23 16:58 config.log
-rwxr-xr-x 1 root root  33714 Aug 23 16:58 config.status
-rwxr-xr-x 1 root root 191969 Aug 23 16:57 configure
-rw-r--r-- 1 root root   2643 Aug 23 16:02 configure.ac
lrwxrwxrwx 1 root root     38 Aug 23 16:57 depcomp -> /usr/local/share/automake-1 .14 /depcomp
lrwxrwxrwx 1 root root     41 Aug 23 16:57 install -sh -> /usr/local/share/automake-1 .14 /install-sh
drwxr-xr-x 3 root root   4096 Aug 23 16:58 libpcap
lrwxrwxrwx 1 root root     38 Aug 23 16:57 missing -> /usr/local/share/automake-1 .14 /missing
drwxr-xr-x 3 root root   4096 Aug 23 16:59 src
-rw-r--r-- 1 root root     23 Aug 23 16:58 stamp-h1
[root@Betty tcprstat] #
进入 src 目录后可以看到生成了可执行程序。 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@Betty tcprstat] # cd src/
[root@Betty src] # ll
total 1780
-rw-r--r-- 1 root root   46379 Aug 23 16:58 Makefile
-rw-r--r-- 1 root root    1800 Aug 23 16:02 Makefile.am
-rw-r--r-- 1 root root   52447 Aug 23 16:57 Makefile. in
-rw-r--r-- 1 root root    3006 Aug 23 16:02 capture.c
-rw-r--r-- 1 root root    1057 Aug 23 16:02 capture.h
-rw-r--r-- 1 root root    4015 Aug 23 16:02 functions.c
-rw-r--r-- 1 root root    1019 Aug 23 16:02 functions.h
-rw-r--r-- 1 root root    4325 Aug 23 16:02 local -addresses.c
-rw-r--r-- 1 root root    1065 Aug 23 16:02 local -addresses.h
-rw-r--r-- 1 root root   10157 Aug 23 16:02 output.c
-rw-r--r-- 1 root root    1315 Aug 23 16:02 output.h
-rw-r--r-- 1 root root    3970 Aug 23 16:02 process-packet.c
-rw-r--r-- 1 root root    1139 Aug 23 16:02 process-packet.h
-rw-r--r-- 1 root root    7845 Aug 23 16:02 stats- hash .c
-rw-r--r-- 1 root root    1480 Aug 23 16:02 stats- hash .h
-rw-r--r-- 1 root root   10411 Aug 23 16:02 stats.c
-rw-r--r-- 1 root root    1958 Aug 23 16:02 stats.h
-rwxr-xr-x 1 root root  280074 Aug 23 16:59 tcprstat
-rw-r--r-- 1 root root   10976 Aug 23 16:59 tcprstat-capture.o
-rw-r--r-- 1 root root   10720 Aug 23 16:59 tcprstat-functions.o
-rw-r--r-- 1 root root   13816 Aug 23 16:59 tcprstat- local -addresses.o
-rw-r--r-- 1 root root   23528 Aug 23 16:59 tcprstat-output.o
-rw-r--r-- 1 root root   13776 Aug 23 16:59 tcprstat-process-packet.o
-rwxr-xr-x 1 root root 1019964 Aug 23 16:59 tcprstat-static
-rw-r--r-- 1 root root   16544 Aug 23 16:59 tcprstat-stats- hash .o
-rw-r--r-- 1 root root   27720 Aug 23 16:59 tcprstat-stats.o
-rw-r--r-- 1 root root   19080 Aug 23 16:59 tcprstat-tcprstat.o
-rw-r--r-- 1 root root    5970 Aug 23 16:02 tcprstat.c
-rw-r--r-- 1 root root    1339 Aug 23 16:02 tcprstat.h
-rw-r--r-- 1 root root   10976 Aug 23 16:59 tcprstat_static-capture.o
-rw-r--r-- 1 root root   10720 Aug 23 16:59 tcprstat_static-functions.o
-rw-r--r-- 1 root root   13816 Aug 23 16:59 tcprstat_static- local -addresses.o
-rw-r--r-- 1 root root   23528 Aug 23 16:59 tcprstat_static-output.o
-rw-r--r-- 1 root root   13776 Aug 23 16:59 tcprstat_static-process-packet.o
-rw-r--r-- 1 root root   16544 Aug 23 16:59 tcprstat_static-stats- hash .o
-rw-r--r-- 1 root root   27720 Aug 23 16:59 tcprstat_static-stats.o
-rw-r--r-- 1 root root   19080 Aug 23 16:59 tcprstat_static-tcprstat.o
[root@Betty src] #


【 
用户手册   】 

      tcprstat 是一个免费、开源的 TCP 分析工具,可以用来观测网络通信状态以及计算 request 和 response 之间的延迟。通过它可以获得应答时间统计信息并将其显示输出。输出格式类似于 Unix 中各种 -stat 工具的模式,如 vmstat、iostat、mpstat 。该工具可以选择观测指定 port 上的通信负载,这种方式使其在针对单实例 daemon 进程 request-response 时间测量上具有实际意义,例如针对 mysqld、httpd、memcached 等。

tcprstat 的优点

  • 轻量级。无需写和分析大块日志文件。
  • request 和 response 之间时间间隔的精度为微秒。
  • 输出结果易于导入到 spreadsheet 中,易于通过命令行脚本进行处理,易于通过 gnuplot 进行绘图。
  • 协议无关性。可被用于各种具有 request-response 模式的 client-server 协议模型。

      tcprstat 是与 tcpstat 相近的工具,但是其专注于 response 时间的测量,而不是网络通信负载的量和包大小。所以它是更加符合目标驱动性能优化(Goal-Driven Performance Optimization)的技术。
      下面是一个 tcprstat 输出样例,内容显示的是 MySQL 服务器的 3306 端口上的网络通信情况。

# tcprstat -p 3306 -t 1 -n 5
timestamp	count	max	min	avg	med	stddev	95_max	95_avg	95_std	99_max	99_avg	99_std
1283261499	1870	559009	39	883	153	13306	1267	201	150	6792	323	685
1283261500	1865	25704	29	578	142	2755	889	175	107	23630	333	1331
1283261501	1887	26908	33	583	148	2761	714	176	94	23391	339	1340
1283261502	2015	304965	35	624	151	7204	564	171	79	8615	237	507
1283261503	1650	289087	35	462	146	7133	834	184	120	3565	244	358

      内容以每次一行、一行一秒的形式输出,输出持续了 5 秒时间。每一行都包含了时间戳,且包含了与 query 对应的 response 的时间。列输出中包含了标准的 response 时间值,以微秒为单位。同时还给出了各种 95% 和 99% 应答时间的值。
      response 时间值的计算是通过测量最后收到包和随后第一个发出包之间的花费时间来计算的。仅包含 TCP 控制信息的特定类型的包会被忽略。

运行 tcpstat 需要 root 权限

      最简单的用法是所有参数都采用默认值来执行该工具。默认情况下,其会测量一次 10 秒时间长度的 TCP 通信量,并输出显示内容头和一行统计信息值。

  # timestamp	count	max	min	avg	med	stddev	95_max	95_avg	95_std	99_max	99_avg	99_std
  1283265068	23892	425546	30	505	161	6240	835	186	102	4179	261	429

      实际使用中,你通常会选择一个指定的 port 来进行测量,并设置其迭代执行次数,以及改变默认的 10 秒长度的测量时间间隔。为了完成这些设置,需要使用下列参数:

  1. -p <port> 选择一个端口。
  2. -i <secs> 设置测量的时间间隔,以秒为单位。
  3. -n <iter> 迭代执行的次数;0 意味着无限循环。

例如,为了以一秒为时间间隔持续观察 Sphinx 通信状况,需要执行:

?
1
# tcprstat -p 3312 -i 1 -n 0

      tcprstat 的输出内容可以被改变:包含或者省略其所测量得到的网络通信各的种类型统计信息。默认输出的列包含了一些在大多场景下有用的项。输出可以通过格式代码 %C 来进行控制,其中 C 是单个字符。下表中给出了各种格式代码和其对应的输出含义。

Format Code Header Default? Meaning
%n count y 在迭代期间完成的 request 个数
%a avg y 平均 response 时间
%s sum y response 时间的总和
%x sqs response 时间的平方和
%m min y 最小 response time
%M max y 最大 response time
%h med y 中间 response time
%S stddev y response 时间值标准差
%v var response 时间的总体方差
%I iter# 迭代次数
%t elapsed 从第一次迭代开始流逝的秒数
%T timestamp y Unix 时间戳
%% % 字符
\t tab 字符
\n 换行字符
95,99 Adds a prefix y 百分比指示符

      你能够通过自定义控制选项 -f 来改变 tcpstat 的输出格式。例如,为了输出每秒向 MySQL 服务器 3306 端口发送的 request 数,执行下面的命令:

# tcprstat -f '%n\n' -p 3306 -t 1 -n 0
count
2212
2070
...

      你同样可以使用百分比指示符,以显示占 response 时间总体值 N% 的统计值。该工具当前默认仅支持 95% 和 99% 两种输出。如果想要输出任意百分比值的统计信息,则需要在 % 字符和格式代码之间插入指定的百分比值。默认的列输出中将会包含相应的百分比头部信息。下面的列子中以微秒为单位,输出了最大、95%、99% response 时间的值:

# tcprstat -f '%M\t%95M\t%99M\n' -p 3306 -t 1 -n 0
max	95_max	99_max
31221	411	3001
52721	495	2828
12173	507	1513
...

      tcpstat 不仅能够对实时网络通信进行分析,还能够对通过 tcpdump 创建的网络通信抓包文件进行分析。这也就使得在微秒可以在某台机器上进行网络通信转包,而在另外的机器上在任意的时间点对其进行分析。为了将网络包存放下来以备日后分析,需要在执行 tcpdump 时指定 -w 参数来确定保存文件名。之后,tcprstat 可以使用 -r 选项从上述文件中读取并分析网络通信内容。

      tcprstat 通常情况下,能够根据本地网卡接口上绑定的一系列ip地址,确定收到的 request 和发出的 response 之间的配对关系。但是,从文件中获取信息进行分析的时候可能会无法正确处理,因为该文件是从一个不同的 host 上获取到的。在这种情况下,你可以使用 -l 选项自定义指定一组 ip 地址用于分析文件内容。


命令行选项

      下面是一份完整的 tcpstat 命令行选项清单。你也总是可以通过 --help 选项获取到完整的命令行选项及其相应的使用信息。

Option Name Short Name Type Default Value Meaning
--format -f string ”%T\t%n\t%M\t%m\t%a\t%h\t%S
\t%95M\t%95a\t%95S\t%99M\t%99a\t%99S\n”
格式控制字串
--[no]header string Enabled 如果没有指定任何参数,tcpstat 会根据 --format 选项自动产生显示输出头部信息。如果指定了参数,tcpstat 将使用该参数对应的头作为输出头。如果指定了 --no-header 选项,tcpstat 将不显示输出头信息。
--help 显示程序信息和用法。
--interval -t integer 10 tcpstat 在连续两行输出之间等待的时间间隔,以秒为单位。
--iterations -n integer 1 tcpstat 在程序退出前,需要执行迭代的次数;0 表示无限。
--local -l string 指定以逗号分隔的用作本地ip地址的列表,用以取代默认的从操作系统获取的ip地址列表。
--port -p integer 指定用于捕获网络通信的 TCP 端口,如果未指定则捕获所有端口。
--read -r string 从 pcap 文件中读取信息。而不是从网络上实时获取
--version 显示版本信息

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
存储 SQL 关系型数据库
MySQL阅读网上MySQL文章有感的杂记
MySQL阅读网上MySQL文章有感的杂记
43 0
|
7月前
|
关系型数据库 MySQL Linux
Centos7 yum安装mysql5.7 “坑“————作者实测
Centos7 yum安装mysql5.7 “坑“————作者实测
117 0
|
9月前
|
网络协议 关系型数据库 MySQL
MySQL8.0社区版安装教程
MySQL8.0社区版安装教程
180 0
|
9月前
|
关系型数据库 MySQL 数据库
MySQL最新安装教程——超级详细讲解,一起来踩坑!(下)
MySQL最新安装教程——超级详细讲解,一起来踩坑!(下)
54 0
|
9月前
|
SQL Oracle 关系型数据库
MySQL最新安装教程——超级详细讲解,一起来踩坑!(上)
MySQL最新安装教程——超级详细讲解,一起来踩坑!(上)
324 0
|
SQL 存储 Oracle
CTO MySQL 技术分享
CTO MySQL 技术分享
487 1
CTO MySQL 技术分享
|
Oracle 关系型数据库 MySQL
趣谈MySQL历史,以及MariaDB初体验
趣谈MySQL历史,以及MariaDB初体验
268 0
趣谈MySQL历史,以及MariaDB初体验
|
SQL 关系型数据库 Java
MariaDB学习记录
MariaDB的学习 .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeiti, "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, Song, ...
1539 0
|
关系型数据库
|
关系型数据库 数据库