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

