常見(jiàn)問(wèn)題及反饋
問(wèn)題反饋
如果 FAQ 中的信息不能夠幫到您,需要 TDengine 技術(shù)團(tuán)隊(duì)的技術(shù)支持與協(xié)助,請(qǐng)將以下兩個(gè)目錄中內(nèi)容打包:
- /var/log/taos (如果沒(méi)有修改過(guò)默認(rèn)路徑)
- /etc/taos
附上必要的問(wèn)題描述,包括使用的 TDengine 版本信息、平臺(tái)環(huán)境信息、發(fā)生該問(wèn)題的執(zhí)行操作、出現(xiàn)問(wèn)題的表征及大概的時(shí)間,在 GitHub 提交 Issue。
為了保證有足夠的 debug 信息,如果問(wèn)題能夠重復(fù),請(qǐng)修改/etc/taos/taos.cfg文件,最后面添加一行“debugFlag 135"(不帶引號(hào)本身),然后重啟 taosd, 重復(fù)問(wèn)題,然后再遞交。也可以通過(guò)如下 SQL 語(yǔ)句,臨時(shí)設(shè)置 taosd 的日志級(jí)別。
ALTER DNODE <dnode_id> debugFlag 135;
但系統(tǒng)正常運(yùn)行時(shí),請(qǐng)一定將 debugFlag 設(shè)置為 131,否則會(huì)產(chǎn)生大量的日志信息,降低系統(tǒng)效率。
常見(jiàn)問(wèn)題列表
1. TDengine 2.0 之前的版本升級(jí)到 2.0 及以上的版本應(yīng)該注意什么?☆☆☆
2.0 版在之前版本的基礎(chǔ)上,進(jìn)行了完全的重構(gòu),配置文件和數(shù)據(jù)文件是不兼容的。在升級(jí)之前務(wù)必進(jìn)行如下操作:
- 刪除配置文件,執(zhí)行
sudo rm -rf /etc/taos/taos.cfg - 刪除日志文件,執(zhí)行
sudo rm -rf /var/log/taos/ - 確保數(shù)據(jù)已經(jīng)不再需要的前提下,刪除數(shù)據(jù)文件,執(zhí)行
sudo rm -rf /var/lib/taos/ - 安裝最新穩(wěn)定版本的 TDengine
- 如果需要遷移數(shù)據(jù)或者數(shù)據(jù)文件損壞,請(qǐng)聯(lián)系濤思數(shù)據(jù)官方技術(shù)支持團(tuán)隊(duì),進(jìn)行協(xié)助解決
2. Windows平臺(tái)下JDBCDriver找不到動(dòng)態(tài)鏈接庫(kù),怎么辦?
請(qǐng)看為此問(wèn)題撰寫(xiě)的技術(shù)博客。
3. 創(chuàng)建數(shù)據(jù)表時(shí)提示 more dnodes are needed
請(qǐng)看為此問(wèn)題撰寫(xiě)的技術(shù)博客。
4. 如何讓 TDengine crash 時(shí)生成 core 文件?
請(qǐng)看為此問(wèn)題撰寫(xiě)的技術(shù)博客。
5. 遇到錯(cuò)誤“Unable to establish connection”, 我怎么辦?
客戶端遇到連接故障,請(qǐng)按照下面的步驟進(jìn)行檢查:
-
檢查網(wǎng)絡(luò)環(huán)境
- 云服務(wù)器:檢查云服務(wù)器的安全組是否打開(kāi) TCP/UDP 端口 6030-6042 的訪問(wèn)權(quán)限
- 本地虛擬機(jī):檢查網(wǎng)絡(luò)能否 ping 通,盡量避免使用
localhost作為 hostname - 公司服務(wù)器:如果為 NAT 網(wǎng)絡(luò)環(huán)境,請(qǐng)務(wù)必檢查服務(wù)器能否將消息返回值客戶端
-
確保客戶端與服務(wù)端版本號(hào)是完全一致的,開(kāi)源社區(qū)版和企業(yè)版也不能混用
-
在服務(wù)器,執(zhí)行
systemctl status taosd檢查taosd運(yùn)行狀態(tài)。如果沒(méi)有運(yùn)行,啟動(dòng)taosd -
確認(rèn)客戶端連接時(shí)指定了正確的服務(wù)器 FQDN (Fully Qualified Domain Name —— 可在服務(wù)器上執(zhí)行 Linux 命令
hostname -f獲得),F(xiàn)QDN 配置參考:一篇文章說(shuō)清楚 TDengine 的 FQDN。 -
ping 服務(wù)器 FQDN,如果沒(méi)有反應(yīng),請(qǐng)檢查你的網(wǎng)絡(luò),DNS 設(shè)置,或客戶端所在計(jì)算機(jī)的系統(tǒng)
hosts文件。如果部署的是 TDengine 集群,客戶端需要能 ping 通所有集群節(jié)點(diǎn)的 FQDN。 -
檢查防火墻設(shè)置(Ubuntu 使用
ufw status,CentOS 使用firewall-cmd --list-port),確認(rèn) TCP/UDP 端口 6030-6042 是打開(kāi)的 -
對(duì)于 Linux 上的 JDBC(ODBC, Python, Go 等接口類(lèi)似)連接, 確保libtaos.so在目錄/usr/local/taos/driver里, 并且/usr/local/taos/driver在系統(tǒng)庫(kù)函數(shù)搜索路徑LD_LIBRARY_PATH里
-
對(duì)于 Windows 上的 JDBC, ODBC, Python, Go等連接,確保C:\TDengine\driver\taos.dll在你的系統(tǒng)庫(kù)函數(shù)搜索目錄里 (建議taos.dll放在目錄 C:\Windows\System32)
-
如果仍不能排除連接故障
-
Linux 系統(tǒng)請(qǐng)使用命令行工具
nc來(lái)分別判斷指定端口的 TCP 和 UDP 連接是否通暢 檢查 UDP 端口連接是否工作:nc -vuz {hostIP} {port}檢查服務(wù)器側(cè) TCP 端口連接是否工作:nc -l {port}檢查客戶端側(cè) TCP 端口連接是否工作:nc {hostIP} {port} -
Windows 系統(tǒng)請(qǐng)使用 PowerShell 命令 Net-TestConnection -ComputerName {fqdn} -Port {port} 檢測(cè)服務(wù)段端口是否訪問(wèn)
-
-
也可以使用
taos程序內(nèi)嵌的網(wǎng)絡(luò)連通檢測(cè)功能,來(lái)驗(yàn)證服務(wù)器和客戶端之間指定的端口連接是否通暢(包括 TCP 和 UDP):TDengine 內(nèi)嵌網(wǎng)絡(luò)檢測(cè)工具使用指南。
6. 遇到錯(cuò)誤“Unexpected generic error in RPC”或者“Unable to resolve FQDN”,我怎么辦?
產(chǎn)生這個(gè)錯(cuò)誤,是由于客戶端或數(shù)據(jù)節(jié)點(diǎn)無(wú)法解析 FQDN(Fully Qualified Domain Name)導(dǎo)致。對(duì)于 TAOS Shell 或客戶端應(yīng)用,請(qǐng)做如下檢查:
- 請(qǐng)檢查連接的服務(wù)器的 FQDN 是否正確,F(xiàn)QDN 配置參考:一篇文章說(shuō)清楚 TDengine 的 FQDN
- 如果網(wǎng)絡(luò)配置有 DNS server,請(qǐng)檢查是否正常工作
- 如果網(wǎng)絡(luò)沒(méi)有配置 DNS server,請(qǐng)檢查客戶端所在機(jī)器的
hosts文件,查看該 FQDN 是否配置,并是否有正確的 IP 地址 - 如果網(wǎng)絡(luò)配置 OK,從客戶端所在機(jī)器,你需要能 ping 該連接的 FQDN,否則客戶端是無(wú)法連接服務(wù)器的
- 如果服務(wù)器曾經(jīng)使用過(guò) TDengine,且更改過(guò) hostname,建議檢查
data目錄的dnodeEps.json是否符合當(dāng)前配置的 EP,路徑默認(rèn)為/var/lib/taos/dnode。正常情況下,建議更換新的數(shù)據(jù)目錄或者備份后刪除以前的數(shù)據(jù)目錄,這樣可以避免該問(wèn)題。 - 檢查
/etc/hosts和`/etc/hostname是否是預(yù)配置的 FQDN
7. 雖然語(yǔ)法正確,為什么我還是得到 "Invalid SQL" 錯(cuò)誤
如果你確認(rèn)語(yǔ)法正確,2.0之前版本,請(qǐng)檢查 SQL 語(yǔ)句長(zhǎng)度是否超過(guò) 64K。如果超過(guò),也會(huì)返回這個(gè)錯(cuò)誤。
8. 是否支持validation queries?
TDengine 還沒(méi)有一組專(zhuān)用的 validation queries。然而建議你使用系統(tǒng)監(jiān)測(cè)的數(shù)據(jù)庫(kù)”log"來(lái)做。
9. 我可以刪除或更新一條記錄嗎?
TDengine 目前尚不支持刪除功能,未來(lái)根據(jù)用戶需求可能會(huì)支持。
從 2.0.8.0 開(kāi)始,TDengine 支持更新已經(jīng)寫(xiě)入數(shù)據(jù)的功能。使用更新功能需要在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)使用 UPDATE 1 參數(shù),之后可以使用 INSERT INTO 命令更新已經(jīng)寫(xiě)入的相同時(shí)間戳數(shù)據(jù)。UPDATE 參數(shù)不支持 ALTER DATABASE 命令修改。沒(méi)有使用 UPDATE 1 參數(shù)創(chuàng)建的數(shù)據(jù)庫(kù),寫(xiě)入相同時(shí)間戳的數(shù)據(jù)不會(huì)修改之前的數(shù)據(jù),也不會(huì)報(bào)錯(cuò)。
另需注意,在 UPDATE 設(shè)置為 0 時(shí),后發(fā)送的相同時(shí)間戳的數(shù)據(jù)會(huì)被直接丟棄,但并不會(huì)報(bào)錯(cuò),而且仍然會(huì)被計(jì)入 affected rows (所以不能利用 INSERT 指令的返回信息進(jìn)行時(shí)間戳查重)。這樣設(shè)計(jì)的主要原因是,TDengine 把寫(xiě)入的數(shù)據(jù)看做一個(gè)數(shù)據(jù)流,無(wú)論時(shí)間戳是否出現(xiàn)沖突,TDengine 都認(rèn)為產(chǎn)生數(shù)據(jù)的原始設(shè)備真實(shí)地產(chǎn)生了這樣的數(shù)據(jù)。UPDATE 參數(shù)只是控制這樣的流數(shù)據(jù)在進(jìn)行持久化時(shí)要怎樣處理—— UPDATE 為 0 時(shí),表示先寫(xiě)入的數(shù)據(jù)覆蓋后寫(xiě)入的數(shù)據(jù);而 UPDATE 為 1 時(shí),表示后寫(xiě)入的數(shù)據(jù)覆蓋先寫(xiě)入的數(shù)據(jù)。這種覆蓋關(guān)系如何選擇,取決于對(duì)數(shù)據(jù)的后續(xù)使用和統(tǒng)計(jì)中,希望以先還是后生成的數(shù)據(jù)為準(zhǔn)。
此外,從 2.1.7.0 版本開(kāi)始,支持將 UPDATE 參數(shù)設(shè)為 2,表示“支持部分列更新”。也即,當(dāng) UPDATE 設(shè)為 1 時(shí),如果更新一個(gè)數(shù)據(jù)行,其中某些列沒(méi)有提供取值,那么這些列會(huì)被設(shè)為 NULL;而當(dāng) UPDATE 設(shè)為 2 時(shí),如果更新一個(gè)數(shù)據(jù)行,其中某些列沒(méi)有提供取值,那么這些列會(huì)保持原有數(shù)據(jù)行中的對(duì)應(yīng)值。
10. 我怎么創(chuàng)建超過(guò)1024列的表?
使用 2.0 及其以上版本,默認(rèn)支持 1024 列;2.0 之前的版本,TDengine 最大允許創(chuàng)建 250 列的表。但是如果確實(shí)超過(guò)限值,建議按照數(shù)據(jù)特性,邏輯地將這個(gè)寬表分解成幾個(gè)小表。(從 2.1.7.0 版本開(kāi)始,表的最大列數(shù)增加到了 4096 列。)
11. 最有效的寫(xiě)入數(shù)據(jù)的方法是什么?
批量插入。每條寫(xiě)入語(yǔ)句可以一張表同時(shí)插入多條記錄,也可以同時(shí)插入多張表的多條記錄。
12. Windows 系統(tǒng)下插入的 nchar 類(lèi)數(shù)據(jù)中的漢字被解析成了亂碼如何解決?
Windows下插入 nchar 類(lèi)的數(shù)據(jù)中如果有中文,請(qǐng)先確認(rèn)系統(tǒng)的地區(qū)設(shè)置成了中國(guó)(在Control Panel里可以設(shè)置),這時(shí)cmd中的 taos 客戶端應(yīng)該已經(jīng)可以正常工作了;如果是在 IDE 里開(kāi)發(fā) Java 應(yīng)用,比如 Eclipse, IntelliJ,請(qǐng)確認(rèn) IDE 里的文件編碼為 GBK(這是 Java 默認(rèn)的編碼類(lèi)型),然后在生成 Connection 時(shí),初始化客戶端的配置,具體語(yǔ)句如下:
Class.forName("com.taosdata.jdbc.TSDBDriver");
Properties properties = new Properties();
properties.setProperty(TSDBDriver.LOCALE_KEY, "UTF-8");
Connection = DriverManager.getConnection(url, properties);
13.JDBC 報(bào)錯(cuò): the excuted SQL is not a DML or a DDL?
請(qǐng)更新至最新的 JDBC 驅(qū)動(dòng)
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>2.0.27</version>
</dependency>
14. taos connect failed, reason: invalid timestamp
常見(jiàn)原因是服務(wù)器和客戶端時(shí)間沒(méi)有校準(zhǔn),可以通過(guò)和時(shí)間服務(wù)器同步的方式(Linux 下使用 ntpdate 命令,Windows 在系統(tǒng)時(shí)間設(shè)置中選擇自動(dòng)同步)校準(zhǔn)。
15. 表名顯示不全
由于 taos shell 在終端中顯示寬度有限,有可能比較長(zhǎng)的表名顯示不全,如果按照顯示的不全的表名進(jìn)行相關(guān)操作會(huì)發(fā)生 Table does not exist 錯(cuò)誤。解決方法可以是通過(guò)修改 taos.cfg 文件中的設(shè)置項(xiàng) maxBinaryDisplayWidth, 或者直接輸入命令 set max_binary_display_width 100?;蛘咴诿罱Y(jié)尾使用 \G 參數(shù)來(lái)調(diào)整結(jié)果的顯示方式。
16. 如何進(jìn)行數(shù)據(jù)遷移?
TDengine 是根據(jù) hostname 唯一標(biāo)志一臺(tái)機(jī)器的,在數(shù)據(jù)文件從機(jī)器A移動(dòng)機(jī)器B時(shí),注意如下兩件事:
- 2.0.0.0 至 2.0.6.x 的版本,重新配置機(jī)器B的 hostname 為機(jī)器A的 hostname。
- 2.0.7.0 及以后的版本,到 /var/lib/taos/dnode 下,修復(fù) dnodeEps.json 的 dnodeId 對(duì)應(yīng)的 FQDN,重啟。確保機(jī)器內(nèi)所有機(jī)器的此文件是完全相同的。
- 1.x 和 2.x 版本的存儲(chǔ)結(jié)構(gòu)不兼容,需要使用遷移工具或者自己開(kāi)發(fā)應(yīng)用導(dǎo)出導(dǎo)入數(shù)據(jù)。
17. 如何在命令行程序 taos 中臨時(shí)調(diào)整日志級(jí)別
為了調(diào)試方便,從 2.0.16 版本開(kāi)始,命令行程序 taos 新增了與日志記錄相關(guān)的兩條指令:
ALTER LOCAL flag_name flag_value;
其含義是,在當(dāng)前的命令行程序下,修改一個(gè)特定模塊的日志記錄級(jí)別(只對(duì)當(dāng)前命令行程序有效,如果 taos 命令行程序重啟,則需要重新設(shè)置):
- flag_name 的取值可以是:debugFlag,cDebugFlag,tmrDebugFlag,uDebugFlag,rpcDebugFlag
- flag_value 的取值可以是:131(輸出錯(cuò)誤和警告日志),135( 輸出錯(cuò)誤、警告和調(diào)試日志),143( 輸出錯(cuò)誤、警告、調(diào)試和跟蹤日志)
ALTER LOCAL RESETLOG;
其含義是,清空本機(jī)所有由客戶端生成的日志文件。
18. 時(shí)間戳的時(shí)區(qū)信息是怎樣處理的?
TDengine 中時(shí)間戳的時(shí)區(qū)總是由客戶端進(jìn)行處理,而與服務(wù)端無(wú)關(guān)。具體來(lái)說(shuō),客戶端會(huì)對(duì) SQL 語(yǔ)句中的時(shí)間戳進(jìn)行時(shí)區(qū)轉(zhuǎn)換,轉(zhuǎn)為 UTC 時(shí)區(qū)(即 Unix 時(shí)間戳——Unix Timestamp)再交由服務(wù)端進(jìn)行寫(xiě)入和查詢;在讀取數(shù)據(jù)時(shí),服務(wù)端也是采用 UTC 時(shí)區(qū)提供原始數(shù)據(jù),客戶端收到后再根據(jù)本地設(shè)置,把時(shí)間戳轉(zhuǎn)換為本地系統(tǒng)所要求的時(shí)區(qū)進(jìn)行顯示。
客戶端在處理時(shí)間戳字符串時(shí),會(huì)采取如下邏輯:
- 在未做特殊設(shè)置的情況下,客戶端默認(rèn)使用所在操作系統(tǒng)的時(shí)區(qū)設(shè)置。
- 如果在 taos.cfg 中設(shè)置了 timezone 參數(shù),則客戶端會(huì)以這個(gè)配置文件中的設(shè)置為準(zhǔn)。
- 如果在 C/C++/Java/Python 等各種編程語(yǔ)言的 Connector Driver 中,在建立數(shù)據(jù)庫(kù)連接時(shí)顯式指定了 timezone,那么會(huì)以這個(gè)指定的時(shí)區(qū)設(shè)置為準(zhǔn)。例如 Java Connector 的 JDBC URL 中就有 timezone 參數(shù)。
- 在書(shū)寫(xiě) SQL 語(yǔ)句時(shí),也可以直接使用 Unix 時(shí)間戳(例如
1554984068000)或帶有時(shí)區(qū)的時(shí)間戳字符串,也即以 RFC 3339 格式(例如2013-04-12T15:52:01.123+08:00)或 ISO-8601 格式(例如2013-04-12T15:52:01.123+0800)來(lái)書(shū)寫(xiě)時(shí)間戳,此時(shí)這些時(shí)間戳的取值將不再受其他時(shí)區(qū)設(shè)置的影響。
19. TDengine 都會(huì)用到哪些網(wǎng)絡(luò)端口?
在 TDengine 2.0 版本中,會(huì)用到以下這些網(wǎng)絡(luò)端口(以默認(rèn)端口 6030 為前提進(jìn)行說(shuō)明,如果修改了配置文件中的設(shè)置,那么這里列舉的端口都會(huì)出現(xiàn)變化),管理員可以參考這里的信息調(diào)整防火墻設(shè)置:
| 協(xié)議 | 默認(rèn)端口 | 用途說(shuō)明 | 修改方法 |
|---|---|---|---|
| TCP | 6030 | 客戶端與服務(wù)端之間通訊。 | 由配置文件設(shè)置 serverPort 決定。 |
| TCP | 6035 | 多節(jié)點(diǎn)集群的節(jié)點(diǎn)間通訊。 | 隨 serverPort 端口變化。 |
| TCP | 6040 | 多節(jié)點(diǎn)集群的節(jié)點(diǎn)間數(shù)據(jù)同步。 | 隨 serverPort 端口變化。 |
| TCP | 6041 | 客戶端與服務(wù)端之間的 RESTful 通訊。 | 隨 serverPort 端口變化。注意 taosAdapter 配置或有不同,請(qǐng)參考相應(yīng)文檔。 |
| TCP | 6042 | Arbitrator 的服務(wù)端口。 | 隨 Arbitrator 啟動(dòng)參數(shù)設(shè)置變化。 |
| TCP | 6043 | TaosKeeper 監(jiān)控服務(wù)端口。 | 隨 TaosKeeper 啟動(dòng)參數(shù)設(shè)置變化。 |
| TCP | 6044 | 支持 StatsD 的數(shù)據(jù)接入端口。 | 隨 taosAdapter 啟動(dòng)參數(shù)設(shè)置變化(2.3.0.1+以上版本)。 |
| UDP | 6045 | 支持 collectd 數(shù)據(jù)接入端口。 | 隨 taosAdapter 啟動(dòng)參數(shù)設(shè)置變化(2.3.0.1+以上版本)。 |
| TCP | 6060 | 企業(yè)版內(nèi) Monitor 服務(wù)的網(wǎng)絡(luò)端口。 | |
| UDP | 6030-6034 | 客戶端與服務(wù)端之間通訊。 | 隨 serverPort 端口變化。 |
| UDP | 6035-6039 | 多節(jié)點(diǎn)集群的節(jié)點(diǎn)間通訊。 | 隨 serverPort 端口變化。 |
20. Go 語(yǔ)言編寫(xiě)組件編譯失敗怎樣解決?
新版本 TDengine 2.3.0.0 包含一個(gè)使用 Go 語(yǔ)言開(kāi)發(fā)的 taosAdapter 獨(dú)立組件,需要單獨(dú)運(yùn)行,取代之前 taosd 內(nèi)置的 httpd ,提供包含原 httpd 功能以及支持多種其他軟件(Prometheus、Telegraf、collectd、StatsD 等)的數(shù)據(jù)接入功能。
使用最新 develop 分支代碼編譯需要先 git submodule update --init --recursive 下載 taosAdapter 倉(cāng)庫(kù)代碼后再編譯。
目前編譯方式默認(rèn)自動(dòng)編譯 taosAdapter。Go 語(yǔ)言版本要求 1.14 以上,如果發(fā)生 Go 編譯錯(cuò)誤,往往是國(guó)內(nèi)訪問(wèn) go mod 問(wèn)題,可以通過(guò)設(shè)置 Go 環(huán)境變量來(lái)解決:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
如果希望繼續(xù)使用之前的內(nèi)置 httpd,可以關(guān)閉 taosAdapter 編譯,使用
cmake .. -DBUILD_HTTP=true 使用原來(lái)內(nèi)置的 httpd。
支持和反饋
感謝您成為我們社區(qū)的一員!歡迎您對(duì)本文檔或其他任何 TDengine 錯(cuò)誤進(jìn)行修改或報(bào)告。

