Merge branch '3.0' of github.com:taosdata/TDengine into enh/TS-5089
This commit is contained in:
commit
8dc8b81ca6
|
@ -0,0 +1,457 @@
|
||||||
|
name: TDengine CI Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
# pull_request:
|
||||||
|
# branches:
|
||||||
|
# - 'main'
|
||||||
|
# - '3.0'
|
||||||
|
# - '3.1'
|
||||||
|
# paths-ignore:
|
||||||
|
# - 'packaging/**'
|
||||||
|
# - 'docs/**'
|
||||||
|
repository_dispatch:
|
||||||
|
types: [run-tests]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.ref || github.event.client_payload.ref}}-${{ github.event_name == 'repository_dispatch' && 'dispatch' || ''}}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONTAINER_NAME: 'taosd-test'
|
||||||
|
WKDIR: '/var/lib/jenkins/workspace'
|
||||||
|
WK: '/var/lib/jenkins/workspace/TDinternal'
|
||||||
|
WKC: '/var/lib/jenkins/workspace/TDinternal/community'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
fetch-parameters:
|
||||||
|
runs-on:
|
||||||
|
group: CI
|
||||||
|
labels: [self-hosted, Linux, X64, testing]
|
||||||
|
outputs:
|
||||||
|
tdinternal: ${{ steps.parameters.outputs.tdinternal }}
|
||||||
|
run_function_test: ${{ steps.parameters.outputs.run_function_test }}
|
||||||
|
run_tdgpt_test: ${{ steps.parameters.outputs.run_tdgpt_test }}
|
||||||
|
source_branch: ${{ steps.parameters.outputs.source_branch }}
|
||||||
|
target_branch: ${{ steps.parameters.outputs.target_branch }}
|
||||||
|
pr_number: ${{ steps.parameters.outputs.pr_number }}
|
||||||
|
steps:
|
||||||
|
- name: Determine trigger source and fetch parameters
|
||||||
|
id: parameters
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
# check the trigger source and get branch information
|
||||||
|
if [ "${{ github.event_name }}" == "repository_dispatch" ]; then
|
||||||
|
tdinternal="true"
|
||||||
|
source_branch=${{ github.event.client_payload.tdinternal_source_branch }}
|
||||||
|
target_branch=${{ github.event.client_payload.tdinternal_target_branch }}
|
||||||
|
pr_number=${{ github.event.client_payload.tdinternal_pr_number }}
|
||||||
|
run_tdgpt_test="true"
|
||||||
|
run_function_test="true"
|
||||||
|
else
|
||||||
|
tdinternal="false"
|
||||||
|
source_branch=${{ github.event.pull_request.head.ref }}
|
||||||
|
target_branch=${{ github.event.pull_request.base.ref }}
|
||||||
|
pr_number=${{ github.event.pull_request.number }}
|
||||||
|
|
||||||
|
# check whether to run tdgpt test cases
|
||||||
|
cd ${{ env.WKC }}
|
||||||
|
changed_files_non_doc=$(git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD $target_branch`|grep -v "^docs/en/"|grep -v "^docs/zh/"|grep -v ".md$" | tr '\n' ' ' || :)
|
||||||
|
|
||||||
|
if [[ "$changed_files_non_doc" != '' && "$changed_files_non_doc" =~ /forecastoperator.c|anomalywindowoperator.c|tanalytics.h|tanalytics.c|tdgpt_cases.task|analytics/ ]]; then
|
||||||
|
run_tdgpt_test="true"
|
||||||
|
else
|
||||||
|
run_tdgpt_test="false"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check whether to run function test cases
|
||||||
|
changed_files_non_tdgpt=$(git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD $target_branch`|grep -v "^docs/en/"|grep -v "^docs/zh/"|grep -v ".md$" | grep -Ev "forecastoperator.c|anomalywindowoperator.c|tanalytics.h|tanalytics.c|tdgpt_cases.task|analytics" | tr '\n' ' ' ||:)
|
||||||
|
if [ "$changed_files_non_tdgpt" != '' ]; then
|
||||||
|
run_function_test="true"
|
||||||
|
else
|
||||||
|
run_function_test="false"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "tdinternal=$tdinternal" >> $GITHUB_OUTPUT
|
||||||
|
echo "run_function_test=$run_function_test" >> $GITHUB_OUTPUT
|
||||||
|
echo "run_tdgpt_test=$run_tdgpt_test" >> $GITHUB_OUTPUT
|
||||||
|
echo "source_branch=$source_branch" >> $GITHUB_OUTPUT
|
||||||
|
echo "target_branch=$target_branch" >> $GITHUB_OUTPUT
|
||||||
|
echo "pr_number=$pr_number" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
run-tests-on-linux:
|
||||||
|
needs: fetch-parameters
|
||||||
|
runs-on:
|
||||||
|
group: CI
|
||||||
|
labels: [self-hosted, Linux, X64, testing]
|
||||||
|
timeout-minutes: 200
|
||||||
|
env:
|
||||||
|
IS_TDINTERNAL: ${{ needs.fetch-parameters.outputs.tdinternal }}
|
||||||
|
RUN_RUNCTION_TEST: ${{ needs.fetch-parameters.outputs.run_function_test }}
|
||||||
|
RUN_TDGPT_TEST: ${{ needs.fetch-parameters.outputs.run_tdgpt_test }}
|
||||||
|
SOURCE_BRANCH: ${{ needs.fetch-parameters.outputs.source_branch }}
|
||||||
|
TARGET_BRANCH: ${{ needs.fetch-parameters.outputs.target_branch }}
|
||||||
|
PR_NUMBER: ${{ needs.fetch-parameters.outputs.pr_number }}
|
||||||
|
steps:
|
||||||
|
- name: Output the environment information
|
||||||
|
run: |
|
||||||
|
echo "::group::Environment Info"
|
||||||
|
date
|
||||||
|
hostname
|
||||||
|
env
|
||||||
|
echo "Runner: ${{ runner.name }}"
|
||||||
|
echo "Trigger Source from TDinternal: ${{ env.IS_TDINTERNAL }}"
|
||||||
|
echo "Workspace: ${{ env.WKDIR }}"
|
||||||
|
git --version
|
||||||
|
echo "${{ env.WKDIR }}/restore.sh -p ${{ env.PR_NUMBER }} -n ${{ github.run_number }} -c ${{ env.CONTAINER_NAME }}"
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Prepare repositories
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
prepare_environment() {
|
||||||
|
cd "$1"
|
||||||
|
git reset --hard
|
||||||
|
git clean -f
|
||||||
|
git remote prune origin
|
||||||
|
git fetch
|
||||||
|
git checkout "$2"
|
||||||
|
}
|
||||||
|
prepare_environment "${{ env.WK }}" "${{ env.TARGET_BRANCH }}"
|
||||||
|
prepare_environment "${{ env.WKC }}" "${{ env.TARGET_BRANCH }}"
|
||||||
|
|
||||||
|
- name: Get latest codes and logs for TDinternal PR
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'true' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WK }}
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "`date "+%Y%m%d-%H%M%S"` TDinternalTest/${{ env.PR_NUMBER }}:${{ github.run_number }}:${{ env.TARGET_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "CHANGE_BRANCH:${{ env.SOURCE_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "TDinternal log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
git fetch origin +refs/pull/${{ env.PR_NUMBER }}/merge
|
||||||
|
git checkout -qf FETCH_HEAD
|
||||||
|
git log -5
|
||||||
|
echo "TDinternal log merged: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
cd ${{ env.WKC }}
|
||||||
|
git remote prune origin
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "community log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
- name: Get latest codes and logs for TDengine PR
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}
|
||||||
|
git remote prune origin
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "`date "+%Y%m%d-%H%M%S"` TDengineTest/${{ env.PR_NUMBER }}:${{ github.run_number }}:${{ env.TARGET_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "CHANGE_BRANCH:${{ env.SOURCE_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "community log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
git fetch origin +refs/pull/${{ env.PR_NUMBER }}/merge
|
||||||
|
git checkout -qf FETCH_HEAD
|
||||||
|
git log -5
|
||||||
|
echo "community log merged: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
cd ${{ env.WK }}
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "TDinternal log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
- name: Update submodule
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}
|
||||||
|
git submodule update --init --recursive
|
||||||
|
- name: Output the 'file_no_doc_changed' information to the file
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' && env.TARGET_BRANCH != '3.1' }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ env.WKDIR }}/tmp/${{ env.PR_NUMBER }}_${{ github.run_number }}
|
||||||
|
changed_files_non_doc=$(git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD ${{ env.TARGET_BRANCH }}`|grep -v "^docs/en/"|grep -v "^docs/zh/"|grep -v ".md$" | tr '\n' ' ' || :)
|
||||||
|
echo $changed_files_non_doc > ${{ env.WKDIR }}/tmp/${{ env.PR_NUMBER }}_${{ github.run_number }}/docs_changed.txt
|
||||||
|
- name: Check assert testing
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' && env.TARGET_BRANCH != '3.1' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}/tests/parallel_test
|
||||||
|
./run_check_assert_container.sh -d ${{ env.WKDIR }}
|
||||||
|
- name: Check void function testing
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' && env.TARGET_BRANCH != '3.1' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}/tests/parallel_test
|
||||||
|
./run_check_void_container.sh -d ${{ env.WKDIR }}
|
||||||
|
- name: Build docker container
|
||||||
|
if: ${{ env.RUN_RUNCTION_TEST == 'true' }}
|
||||||
|
run: |
|
||||||
|
date
|
||||||
|
rm -rf ${{ env.WKC }}/debug
|
||||||
|
cd ${{ env.WKC }}/tests/parallel_test
|
||||||
|
time ./container_build.sh -w ${{ env.WKDIR }} -e
|
||||||
|
- name: Get parameters for testing
|
||||||
|
id: get_param
|
||||||
|
run: |
|
||||||
|
log_server_file="/home/log_server.json"
|
||||||
|
timeout_cmd=""
|
||||||
|
extra_param=""
|
||||||
|
|
||||||
|
if [ -f "$log_server_file" ]; then
|
||||||
|
log_server_enabled=$(jq '.enabled' "$log_server_file")
|
||||||
|
timeout_param=$(jq '.timeout' "$log_server_file")
|
||||||
|
if [ "$timeout_param" != "null" ] && [ "$timeout_param" != "0" ]; then
|
||||||
|
timeout_cmd="timeout $timeout_param"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$log_server_enabled" == "1" ]; then
|
||||||
|
log_server=$(jq '.server' "$log_server_file" | sed 's/\\\"//g')
|
||||||
|
if [ "$log_server" != "null" ] && [ "$log_server" != "" ]; then
|
||||||
|
extra_param="-w $log_server"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "timeout_cmd=$timeout_cmd" >> $GITHUB_OUTPUT
|
||||||
|
echo "extra_param=$extra_param" >> $GITHUB_OUTPUT
|
||||||
|
- name: Run function returns with a null pointer scan testing
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' && env.TARGET_BRANCH != '3.1' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}/tests/parallel_test
|
||||||
|
./run_scan_container.sh -d ${{ env.WKDIR }} -b ${{ env.PR_NUMBER }}_${{ github.run_number }} -f ${{ env.WKDIR }}/tmp/${{ env.PR_NUMBER }}_${{ github.run_number }}/docs_changed.txt ${{ steps.get_param.outputs.extra_param }}
|
||||||
|
- name: Run tdgpt test cases
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' && env.TARGET_BRANCH != '3.1' && env.RUN_TDGPT_TEST == 'true' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}/tests/parallel_test
|
||||||
|
export DEFAULT_RETRY_TIME=2
|
||||||
|
date
|
||||||
|
timeout 600 time ./run.sh -e -m /home/m.json -t tdgpt_cases.task -b ${{ env.PR_NUMBER }}_${{ github.run_number }} -l ${{ env.WKDIR }}/log -o 300 ${{ steps.get_param.outputs.extra_param }}
|
||||||
|
- name: Run function test cases
|
||||||
|
if: ${{ env.RUN_RUNCTION_TEST == 'true'}}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}/tests/parallel_test
|
||||||
|
export DEFAULT_RETRY_TIME=2
|
||||||
|
date
|
||||||
|
${{ steps.get_param.outputs.timeout_cmd }} time ./run.sh -e -m /home/m.json -t cases.task -b ${{ env.PR_NUMBER }}_${{ github.run_number }} -l ${{ env.WKDIR }}/log -o 1200 ${{ steps.get_param.outputs.extra_param }}
|
||||||
|
|
||||||
|
run-tests-on-mac:
|
||||||
|
needs: fetch-parameters
|
||||||
|
if: ${{ needs.fetch-parameters.outputs.run_function_test == 'true' }}
|
||||||
|
runs-on:
|
||||||
|
group: CI
|
||||||
|
labels: [self-hosted, macOS, ARM64, testing]
|
||||||
|
timeout-minutes: 60
|
||||||
|
env:
|
||||||
|
IS_TDINTERNAL: ${{ needs.fetch-parameters.outputs.tdinternal }}
|
||||||
|
SOURCE_BRANCH: ${{ needs.fetch-parameters.outputs.source_branch }}
|
||||||
|
TARGET_BRANCH: ${{ needs.fetch-parameters.outputs.target_branch }}
|
||||||
|
PR_NUMBER: ${{ needs.fetch-parameters.outputs.pr_number }}
|
||||||
|
steps:
|
||||||
|
- name: Output the environment information
|
||||||
|
run: |
|
||||||
|
echo "::group::Environment Info"
|
||||||
|
date
|
||||||
|
hostname
|
||||||
|
env
|
||||||
|
echo "Runner: ${{ runner.name }}"
|
||||||
|
echo "Trigger Source from TDinternal: ${{ env.IS_TDINTERNAL }}"
|
||||||
|
echo "Workspace: ${{ env.WKDIR }}"
|
||||||
|
git --version
|
||||||
|
echo "${{ env.WKDIR }}/restore.sh -p ${{ env.PR_NUMBER }} -n ${{ github.run_number }} -c ${{ env.CONTAINER_NAME }}"
|
||||||
|
echo "::endgroup::"
|
||||||
|
- name: Prepare repositories
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
prepare_environment() {
|
||||||
|
cd "$1"
|
||||||
|
git reset --hard
|
||||||
|
git clean -f
|
||||||
|
git remote prune origin
|
||||||
|
git fetch
|
||||||
|
git checkout "$2"
|
||||||
|
}
|
||||||
|
prepare_environment "${{ env.WK }}" "${{ env.TARGET_BRANCH }}"
|
||||||
|
prepare_environment "${{ env.WKC }}" "${{ env.TARGET_BRANCH }}"
|
||||||
|
- name: Get latest codes and logs for TDinternal PR
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'true' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WK }}
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "`date "+%Y%m%d-%H%M%S"` TDinternalTest/${{ env.PR_NUMBER }}:${{ github.run_number }}:${{ env.TARGET_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "CHANGE_BRANCH:${{ env.SOURCE_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "TDinternal log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
git fetch origin +refs/pull/${{ env.PR_NUMBER }}/merge
|
||||||
|
git checkout -qf FETCH_HEAD
|
||||||
|
git log -5
|
||||||
|
echo "TDinternal log merged: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
cd ${{ env.WKC }}
|
||||||
|
git remote prune origin
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "community log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
- name: Get latest codes and logs for TDengine PR
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' }}
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}
|
||||||
|
git remote prune origin
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "`date "+%Y%m%d-%H%M%S"` TDengineTest/${{ env.PR_NUMBER }}:${{ github.run_number }}:${{ env.TARGET_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "CHANGE_BRANCH:${{ env.SOURCE_BRANCH }}" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
echo "community log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
git fetch origin +refs/pull/${{ env.PR_NUMBER }}/merge
|
||||||
|
git checkout -qf FETCH_HEAD
|
||||||
|
git log -5
|
||||||
|
echo "community log merged: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
cd ${{ env.WK }}
|
||||||
|
git pull >/dev/null
|
||||||
|
git log -5
|
||||||
|
echo "TDinternal log: `git log -5`" >>${{ env.WKDIR }}/jenkins.log
|
||||||
|
- name: Update submodule
|
||||||
|
run: |
|
||||||
|
cd ${{ env.WKC }}
|
||||||
|
git submodule update --init --recursive
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
date
|
||||||
|
cd ${{ env.WK }}
|
||||||
|
rm -rf debug
|
||||||
|
mkdir debug
|
||||||
|
cd ${{ env.WK }}/debug
|
||||||
|
echo $PATH
|
||||||
|
echo "PATH=/opt/homebrew/bin:$PATH" >> $GITHUB_ENV
|
||||||
|
cmake .. -DBUILD_TEST=true -DBUILD_HTTPS=false -DCMAKE_BUILD_TYPE=Release
|
||||||
|
make -j10
|
||||||
|
ctest -j10 || exit 7
|
||||||
|
date
|
||||||
|
|
||||||
|
run-tests-on-windows:
|
||||||
|
needs: fetch-parameters
|
||||||
|
if: ${{ needs.fetch-parameters.outputs.run_function_test == 'true' }}
|
||||||
|
runs-on:
|
||||||
|
group: CI
|
||||||
|
labels: [self-hosted, Windows, X64, testing]
|
||||||
|
timeout-minutes: 126
|
||||||
|
env:
|
||||||
|
IS_TDINTERNAL: ${{ needs.fetch-parameters.outputs.tdinternal }}
|
||||||
|
SOURCE_BRANCH: ${{ needs.fetch-parameters.outputs.source_branch }}
|
||||||
|
TARGET_BRANCH: ${{ needs.fetch-parameters.outputs.target_branch }}
|
||||||
|
PR_NUMBER: ${{ needs.fetch-parameters.outputs.pr_number }}
|
||||||
|
WIN_INTERNAL_ROOT: "C:\\workspace\\0\\TDinternal"
|
||||||
|
WIN_COMMUNITY_ROOT: "C:\\workspace\\0\\TDinternal\\community"
|
||||||
|
WIN_SYSTEM_TEST_ROOT: "C:\\workspace\\0\\TDinternal\\community\\tests\\system-test"
|
||||||
|
WIN_VS_PATH: "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat"
|
||||||
|
WIN_CPU_TYPE: "x64"
|
||||||
|
steps:
|
||||||
|
- name: Output the environment information
|
||||||
|
run: |
|
||||||
|
hostname
|
||||||
|
taskkill /f /t /im python.exe
|
||||||
|
taskkill /f /t /im bash.exe
|
||||||
|
taskkill /f /t /im taosd.exe
|
||||||
|
ipconfig
|
||||||
|
set
|
||||||
|
date /t
|
||||||
|
time /t
|
||||||
|
rd /s /Q "%WIN_INTERNAL_ROOT%\debug" || exit 0
|
||||||
|
shell: cmd
|
||||||
|
- name: Prepare repositories
|
||||||
|
run: |
|
||||||
|
:: Prepare internal repository
|
||||||
|
if exist "%WIN_INTERNAL_ROOT%" (
|
||||||
|
cd /d "%WIN_INTERNAL_ROOT%"
|
||||||
|
git reset --hard
|
||||||
|
git clean -f
|
||||||
|
git remote prune origin
|
||||||
|
git fetch
|
||||||
|
git checkout "%TARGET_BRANCH%"
|
||||||
|
) else (
|
||||||
|
echo Directory does not exist: "%WIN_INTERNAL_ROOT%"
|
||||||
|
exit 1
|
||||||
|
)
|
||||||
|
|
||||||
|
:: Prepare community repository
|
||||||
|
if exist "%WIN_COMMUNITY_ROOT%" (
|
||||||
|
cd /d "%WIN_COMMUNITY_ROOT%"
|
||||||
|
git reset --hard
|
||||||
|
git clean -f
|
||||||
|
git remote prune origin
|
||||||
|
git fetch
|
||||||
|
git checkout "%TARGET_BRANCH%"
|
||||||
|
) else (
|
||||||
|
echo Directory does not exist: "%WIN_COMMUNITY_ROOT%"
|
||||||
|
exit 1
|
||||||
|
)
|
||||||
|
shell: cmd
|
||||||
|
- name: Get latest codes and logs for TDinternal PR
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'true' }}
|
||||||
|
run: |
|
||||||
|
cd %WIN_INTERNAL_ROOT%
|
||||||
|
git pull origin %TARGET_BRANCH%
|
||||||
|
git fetch origin +refs/pull/%PR_NUMBER%/merge
|
||||||
|
git checkout -qf FETCH_HEAD
|
||||||
|
cd %WIN_COMMUNITY_ROOT%
|
||||||
|
git remote prune origin
|
||||||
|
git pull
|
||||||
|
shell: cmd
|
||||||
|
- name: Get latest codes and logs for TDengine PR
|
||||||
|
if: ${{ env.IS_TDINTERNAL == 'false' }}
|
||||||
|
run: |
|
||||||
|
cd %WIN_INTERNAL_ROOT%
|
||||||
|
git pull origin %TARGET_BRANCH%
|
||||||
|
cd %WIN_COMMUNITY_ROOT%
|
||||||
|
git remote prune origin
|
||||||
|
git pull origin %TARGET_BRANCH%
|
||||||
|
git fetch origin +refs/pull/%PR_NUMBER%/merge
|
||||||
|
git checkout -qf FETCH_HEAD
|
||||||
|
shell: cmd
|
||||||
|
- name: Output branch and log information
|
||||||
|
run: |
|
||||||
|
cd %WIN_INTERNAL_ROOT%
|
||||||
|
git branch
|
||||||
|
git log -5
|
||||||
|
|
||||||
|
cd %WIN_COMMUNITY_ROOT%
|
||||||
|
git branch
|
||||||
|
git log -5
|
||||||
|
shell: cmd
|
||||||
|
- name: Update submodule
|
||||||
|
run: |
|
||||||
|
cd %WIN_COMMUNITY_ROOT%
|
||||||
|
git submodule update --init --recursive
|
||||||
|
shell: cmd
|
||||||
|
- name: Build on windows
|
||||||
|
run: |
|
||||||
|
echo "building ..."
|
||||||
|
time /t
|
||||||
|
cd %WIN_INTERNAL_ROOT%
|
||||||
|
mkdir debug
|
||||||
|
cd debug
|
||||||
|
time /t
|
||||||
|
call "%WIN_VS_PATH%" %WIN_CPU_TYPE%
|
||||||
|
set CL=/MP8
|
||||||
|
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cmake"
|
||||||
|
time /t
|
||||||
|
cmake .. -G "NMake Makefiles JOM" -DBUILD_TEST=true -DBUILD_TOOLS=true || exit 7
|
||||||
|
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jom -j 6"
|
||||||
|
time /t
|
||||||
|
jom -j 6 || exit 8
|
||||||
|
time /t
|
||||||
|
|
||||||
|
cd %WIN_COMMUNITY_ROOT%/tests/ci
|
||||||
|
pip3 install taospy==2.7.21
|
||||||
|
pip3 install taos-ws-py==0.3.8
|
||||||
|
xcopy /e/y/i/f %WIN_INTERNAL_ROOT%\\debug\\build\\lib\\taos.dll C:\\Windows\\System32
|
||||||
|
shell: cmd
|
||||||
|
- name: Run ctest
|
||||||
|
run: |
|
||||||
|
echo "windows ctest ..."
|
||||||
|
time /t
|
||||||
|
cd %WIN_INTERNAL_ROOT%\\debug
|
||||||
|
ctest -j 1 || exit 7
|
||||||
|
time /t
|
||||||
|
shell: cmd
|
||||||
|
- name: Run function test
|
||||||
|
run: |
|
||||||
|
echo "windows test ..."
|
||||||
|
xcopy /e/y/i/f "%WIN_INTERNAL_ROOT%\debug\build\lib\taos.dll" C:\Windows\System32
|
||||||
|
ls -l "C:\Windows\System32\taos.dll"
|
||||||
|
time /t
|
||||||
|
cd %WIN_SYSTEM_TEST_ROOT%
|
||||||
|
echo "testing ..."
|
||||||
|
test-all.bat ci
|
||||||
|
time /t
|
||||||
|
shell: cmd
|
|
@ -1,17 +1,13 @@
|
||||||
name: TDengine Doc Build
|
name: TDengine Doc Build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
pull_request:
|
||||||
inputs:
|
branches:
|
||||||
target_branch:
|
- 'main'
|
||||||
description: "Target branch name of for building the document"
|
- '3.0'
|
||||||
required: true
|
paths:
|
||||||
type: string
|
- 'docs/**'
|
||||||
|
- '*.md'
|
||||||
target_pr_number:
|
|
||||||
description: "PR number of target branch to merge for building the document"
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
DOC_WKC: "/root/doc_ci_work"
|
DOC_WKC: "/root/doc_ci_work"
|
||||||
|
@ -21,81 +17,32 @@ env:
|
||||||
TOOLS_REPO: "taos-tools"
|
TOOLS_REPO: "taos-tools"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
build-doc:
|
||||||
runs-on:
|
runs-on:
|
||||||
group: CI
|
group: CI
|
||||||
labels: [self-hosted, doc-build]
|
labels: [self-hosted, doc-build]
|
||||||
outputs:
|
|
||||||
changed_files_zh: ${{ steps.set_output.outputs.changed_files_zh }}
|
|
||||||
changed_files_en: ${{ steps.set_output.outputs.changed_files_en }}
|
|
||||||
changed_files_non_doc: ${{ steps.set_output.outputs.changed_files_non_doc }}
|
|
||||||
changed_files_non_tdgpt: ${{ steps.set_output.outputs.changed_files_non_tdgpt }}
|
|
||||||
steps:
|
|
||||||
- name: Get the latest document contents from the repository
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
# ./.github/scripts/update_repo.sh ${{ env.DOC_WKC }}/${{ env.TD_REPO }} ${{ inputs.target_branch }} ${{ inputs.target_pr_number }}
|
|
||||||
cd ${{ env.DOC_WKC }}/${{ env.TD_REPO }}
|
|
||||||
git reset --hard
|
|
||||||
git clean -f
|
|
||||||
git remote prune origin
|
|
||||||
git fetch
|
|
||||||
git checkout ${{ inputs.target_branch }}
|
|
||||||
git pull >/dev/null
|
|
||||||
git fetch origin +refs/pull/${{ inputs.target_pr_number }}/merge
|
|
||||||
git checkout -qf FETCH_HEAD
|
|
||||||
- name: Check whether the document is changed and set output variables
|
|
||||||
id: set_output
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
cd ${{ env.DOC_WKC }}/${{ env.TD_REPO }}
|
|
||||||
changed_files_zh=$(git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD ${{ inputs.tartget_branch }}`| grep "^docs/zh/" | tr '\n' ' ' || :)
|
|
||||||
changed_files_en=$(git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD ${{ inputs.tartget_branch }}`| grep "^docs/en/" | tr '\n' ' ' || :)
|
|
||||||
changed_files_non_doc=$(git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD ${{ inputs.tartget_branch }}`|grep -v "^docs/en/"|grep -v "^docs/zh/"|grep -v ".md$" | tr '\n' ' ' || :)
|
|
||||||
changed_files_non_tdgpt=$(git --no-pager diff --name-only FETCH_HEAD `git merge-base FETCH_HEAD ${{ inputs.tartget_branch }}`|grep -v "^docs/en/"|grep -v "^docs/zh/"|grep -v ".md$" | grep -Ev "forecastoperator.c|anomalywindowoperator.c|tanalytics.h|tanalytics.c|tdgpt_cases.task|analytics" | tr '\n' ' ' ||:)
|
|
||||||
echo "changed_files_zh=${changed_files_zh}" >> $GITHUB_OUTPUT
|
|
||||||
echo "changed_files_en=${changed_files_en}" >> $GITHUB_OUTPUT
|
|
||||||
echo "changed_files_non_doc=${changed_files_non_doc}" >> $GITHUB_OUTPUT
|
|
||||||
echo "changed_files_non_tdgpt=${changed_files_non_tdgpt}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
build:
|
|
||||||
needs: check
|
|
||||||
runs-on:
|
|
||||||
group: CI
|
|
||||||
labels: [self-hosted, doc-build]
|
|
||||||
if: ${{ needs.check.outputs.changed_files_zh != '' || needs.check.outputs.changed_files_en != '' }}
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Get the latest document contents
|
- name: Get the latest document contents
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
#./.github/scripts/update_repo.sh ${{ env.DOC_WKC }}/${{ env.TD_REPO }} ${{ inputs.target_branch }} ${{ inputs.target_pr_number }}
|
|
||||||
cd ${{ env.DOC_WKC }}/${{ env.TD_REPO }}
|
cd ${{ env.DOC_WKC }}/${{ env.TD_REPO }}
|
||||||
git reset --hard
|
git reset --hard
|
||||||
git clean -f
|
git clean -f
|
||||||
git remote prune origin
|
git remote prune origin
|
||||||
git fetch
|
git fetch
|
||||||
git checkout ${{ inputs.target_branch }}
|
git checkout ${{ github.event.pull_request.base.ref }}
|
||||||
git pull >/dev/null
|
git pull >/dev/null
|
||||||
git fetch origin +refs/pull/${{ inputs.target_pr_number }}/merge
|
git fetch origin +refs/pull/${{ github.event.pull_request.number }}/merge
|
||||||
git checkout -qf FETCH_HEAD
|
git checkout -qf FETCH_HEAD
|
||||||
|
|
||||||
- name: Build the chinese document
|
- name: Build the chinese document
|
||||||
if: ${{ needs.check.outputs.changed_files_zh != '' }}
|
|
||||||
run: |
|
run: |
|
||||||
cd ${{ env.DOC_WKC }}/${{ env.ZH_DOC_REPO }}
|
cd ${{ env.DOC_WKC }}/${{ env.ZH_DOC_REPO }}
|
||||||
yarn ass local
|
yarn ass local
|
||||||
yarn build
|
yarn build
|
||||||
|
|
||||||
- name: Build the english document
|
- name: Build the english document
|
||||||
if: ${{ needs.check.outputs.changed_files_en != '' }}
|
|
||||||
run: |
|
run: |
|
||||||
cd ${{ env.DOC_WKC }}/${{ env.EN_DOC_REPO }}
|
cd ${{ env.DOC_WKC }}/${{ env.EN_DOC_REPO }}
|
||||||
yarn ass local
|
yarn ass local
|
||||||
yarn build
|
yarn build
|
||||||
|
|
||||||
outputs:
|
|
||||||
changed_files_zh: ${{ needs.check.outputs.changed_files_zh }}
|
|
||||||
changed_files_en: ${{ needs.check.outputs.changed_files_en }}
|
|
||||||
changed_files_non_doc: ${{ needs.check.outputs.changed_files_non_doc }}
|
|
||||||
changed_files_non_tdgpt: ${{ needs.check.outputs.changed_files_non_tdgpt }}
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
IF (DEFINED VERNUMBER)
|
IF (DEFINED VERNUMBER)
|
||||||
SET(TD_VER_NUMBER ${VERNUMBER})
|
SET(TD_VER_NUMBER ${VERNUMBER})
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(TD_VER_NUMBER "3.3.5.2.alpha")
|
SET(TD_VER_NUMBER "3.3.5.8.alpha")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (DEFINED VERCOMPATIBLE)
|
IF (DEFINED VERCOMPATIBLE)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taosws-rs
|
# taosws-rs
|
||||||
ExternalProject_Add(taosws-rs
|
ExternalProject_Add(taosws-rs
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git
|
||||||
GIT_TAG 3.0
|
GIT_TAG main
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -53,6 +53,8 @@ It is not necessary to configure your cluster specifically for active-active mod
|
||||||
- The sink endpoint is the FQDN of TDengine on the secondary node.
|
- The sink endpoint is the FQDN of TDengine on the secondary node.
|
||||||
- You can use the native connection (port 6030) or WebSocket connection (port 6041).
|
- You can use the native connection (port 6030) or WebSocket connection (port 6041).
|
||||||
- You can specify one or more databases to replicate only the data contained in those databases. If you do not specify a database, all databases on the node are replicated except for `information_schema`, `performance_schema`, `log`, and `audit`.
|
- You can specify one or more databases to replicate only the data contained in those databases. If you do not specify a database, all databases on the node are replicated except for `information_schema`, `performance_schema`, `log`, and `audit`.
|
||||||
|
- New databases in both sides will be detected periodically to start replication, with optional `--new-database-checking-interval <SECONDS>` argument.
|
||||||
|
- New databases checking will be disabled with `--no-new-databases`.
|
||||||
|
|
||||||
When the command is successful, the replica ID is displayed. You can use this ID to add other databases to the replication task if necessary.
|
When the command is successful, the replica ID is displayed. You can use this ID to add other databases to the replication task if necessary.
|
||||||
|
|
||||||
|
@ -97,7 +99,6 @@ You can manage your active-active deployment with the following commands:
|
||||||
:::note
|
:::note
|
||||||
- This command cannot create duplicate tasks. It only adds the specified databases to the specified task.
|
- This command cannot create duplicate tasks. It only adds the specified databases to the specified task.
|
||||||
- The replica ID is globally unique within a taosX instance and is independent of the source/sink combination.
|
- The replica ID is globally unique within a taosX instance and is independent of the source/sink combination.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
2. Check the status of a task:
|
2. Check the status of a task:
|
||||||
|
@ -124,6 +125,8 @@ You can manage your active-active deployment with the following commands:
|
||||||
|
|
||||||
If you specify a database, replication for that database is stopped. If you do not specify a database, all replication tasks on the ID are stopped. If you do not specify an ID, all replication tasks on the instance are stopped.
|
If you specify a database, replication for that database is stopped. If you do not specify a database, all replication tasks on the ID are stopped. If you do not specify an ID, all replication tasks on the instance are stopped.
|
||||||
|
|
||||||
|
Use `--no-new-databases` to not stop new-databases checking.
|
||||||
|
|
||||||
4. Restart a replication task:
|
4. Restart a replication task:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
@ -132,6 +135,14 @@ You can manage your active-active deployment with the following commands:
|
||||||
|
|
||||||
If you specify a database, replication for that database is restarted. If you do not specify a database, all replication tasks in the instance are restarted. If you do not specify an ID, all replication tasks on the instance are restarted.
|
If you specify a database, replication for that database is restarted. If you do not specify a database, all replication tasks in the instance are restarted. If you do not specify an ID, all replication tasks on the instance are restarted.
|
||||||
|
|
||||||
|
5. Update new databases checking interval:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
taosx replica update id --new-database-checking-interval <SECONDS>
|
||||||
|
```
|
||||||
|
|
||||||
|
This command will only update the checking interval for new databases.
|
||||||
|
|
||||||
5. Check the progress of a replication task:
|
5. Check the progress of a replication task:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|
|
@ -7,7 +7,7 @@ Apache Superset is a modern enterprise level business intelligence (BI) web appl
|
||||||
It is supported by the Apache Software Foundation and is an open source project with an active community and rich ecosystem.
|
It is supported by the Apache Software Foundation and is an open source project with an active community and rich ecosystem.
|
||||||
Apache Superset provides an intuitive user interface that makes creating, sharing, and visualizing data simple, while supporting multiple data sources and rich visualization options.
|
Apache Superset provides an intuitive user interface that makes creating, sharing, and visualizing data simple, while supporting multiple data sources and rich visualization options.
|
||||||
|
|
||||||
Through the Python connector of TDengine, Superset can support TDengine data sources and provide functions such as data presentation and analysis
|
Through the Python connector of TDengine, Superset can support TDengine data sources and provide functions such as data presentation and analysis.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,8 @@ Tableau is a well-known business intelligence tool that supports multiple data s
|
||||||
|
|
||||||
Prepare the following environment:
|
Prepare the following environment:
|
||||||
|
|
||||||
- TDengine 3.3.5.4 and above version is installed and running normally (both Enterprise and Community versions are available)
|
- TDengine 3.3.5.8 and above version is installed and running normally (both Enterprise and Community versions are available).
|
||||||
- taosAdapter is running normally, refer to [taosAdapter Reference](../../../tdengine-reference/components/taosadapter/)
|
- taosAdapter is running normally, refer to [taosAdapter Reference](../../../tdengine-reference/components/taosadapter/).
|
||||||
- Install and run Tableau Desktop (if not installed, please download and install Windows operating system 64-bit [Download Tableau Desktop](https://www.tableau.com/products/desktop/download)). Install Tableau please refer to [Tableau Desktop](https://www.tableau.com).
|
- Install and run Tableau Desktop (if not installed, please download and install Windows operating system 64-bit [Download Tableau Desktop](https://www.tableau.com/products/desktop/download)). Install Tableau please refer to [Tableau Desktop](https://www.tableau.com).
|
||||||
- Download the latest Windows operating system X64 client driver from the TDengine official website and install it, refer to [Install ODBC Driver](../../../tdengine-reference/client-libraries/odbc/#Installation).
|
- Download the latest Windows operating system X64 client driver from the TDengine official website and install it, refer to [Install ODBC Driver](../../../tdengine-reference/client-libraries/odbc/#Installation).
|
||||||
|
|
||||||
|
@ -19,6 +19,10 @@ Prepare the following environment:
|
||||||
|
|
||||||
**Step 1**, Search and open the "ODBC Data Source (64 bit)" management tool in the Start menu of the Windows operating system and configure it, refer to [Install ODBC Driver](../../../tdengine-reference/client-libraries/odbc/#Installation).
|
**Step 1**, Search and open the "ODBC Data Source (64 bit)" management tool in the Start menu of the Windows operating system and configure it, refer to [Install ODBC Driver](../../../tdengine-reference/client-libraries/odbc/#Installation).
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
It should be noted that when configuring the ODBC data source for Tableau, the [Database] configuration item on the TDengine ODBC data source configuration page is required. You need to select a database that can be successfully connected.
|
||||||
|
:::
|
||||||
|
|
||||||
**Step 2**, Start Tableau in the Windows system environment, then search for "ODBC" on its connection page and select "Other Databases (ODBC)".
|
**Step 2**, Start Tableau in the Windows system environment, then search for "ODBC" on its connection page and select "Other Databases (ODBC)".
|
||||||
|
|
||||||
**Step 3**, Click the `DSN` radio button, then select the configured data source (MyTDengine), and click the `Connect` button. After the connection is successful, delete the content of the string attachment, and finally click the `Sign In` button.
|
**Step 3**, Click the `DSN` radio button, then select the configured data source (MyTDengine), and click the `Connect` button. After the connection is successful, delete the content of the string attachment, and finally click the `Sign In` button.
|
||||||
|
|
|
@ -10,7 +10,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
Prepare the following environment:
|
Prepare the following environment:
|
||||||
|
|
||||||
- TDengine 3.3.5.7 and above version is installed and running normally (both Enterprise and Community versions are available).
|
- TDengine 3.3.5.8 and above version is installed and running normally (both Enterprise and Community versions are available).
|
||||||
- taosAdapter is running normally, refer to [taosAdapter Reference](../../../tdengine-reference/components/taosadapter/).
|
- taosAdapter is running normally, refer to [taosAdapter Reference](../../../tdengine-reference/components/taosadapter/).
|
||||||
- Install and run Excel. If not installed, please download and install it. For specific instructions, please refer to Microsoft's official documentation.
|
- Install and run Excel. If not installed, please download and install it. For specific instructions, please refer to Microsoft's official documentation.
|
||||||
- Download the latest Windows operating system X64 client driver from the TDengine official website and install it, refer to [Install ODBC Driver](../../../tdengine-reference/client-libraries/odbc/#Installation).
|
- Download the latest Windows operating system X64 client driver from the TDengine official website and install it, refer to [Install ODBC Driver](../../../tdengine-reference/client-libraries/odbc/#Installation).
|
||||||
|
|
|
@ -537,8 +537,10 @@ This document details the server error codes that may be encountered when using
|
||||||
|
|
||||||
| Error Code | Description | Possible Error Scenarios or Reasons | Recommended Actions for Users |
|
| Error Code | Description | Possible Error Scenarios or Reasons | Recommended Actions for Users |
|
||||||
| ---------- | --------------------- | ------------------------------------------------------------ | -------------------------------------------- |
|
| ---------- | --------------------- | ------------------------------------------------------------ | -------------------------------------------- |
|
||||||
|
| 0x800003E6 | Consumer not exist | Consumer timeout offline | rebuild consumer to subscribe data again |
|
||||||
|
| 0x800003EA | Consumer not ready | Consumer rebalancing | retry after 2s |
|
||||||
| 0x80004000 | Invalid message | The subscribed data is illegal, generally does not occur | Check the client-side error logs for details |
|
| 0x80004000 | Invalid message | The subscribed data is illegal, generally does not occur | Check the client-side error logs for details |
|
||||||
| 0x80004001 | Consumer mismatch | The vnode requested for subscription and the reassigned vnode are inconsistent, usually occurs when new consumers join the same consumer group | Internal error, not exposed to users |
|
| 0x80004001 | Consumer mismatch | The vnode requested for subscription and the reassigned vnode are inconsistent, usually occurs when new consumers join the same consumer group | Internal error |
|
||||||
| 0x80004002 | Consumer closed | The consumer no longer exists | Check if it has already been closed |
|
| 0x80004002 | Consumer closed | The consumer no longer exists | Check if it has already been closed |
|
||||||
| 0x80004017 | Invalid status, please subscribe topic first | tmq status invalidate | Without calling subscribe, directly poll data |
|
| 0x80004017 | Invalid status, please subscribe topic first | tmq status invalidate | Without calling subscribe, directly poll data |
|
||||||
| 0x80004100 | Stream task not exist | The stream computing task does not exist | Check the server-side error logs |
|
| 0x80004100 | Stream task not exist | The stream computing task does not exist | Check the server-side error logs |
|
||||||
|
|
|
@ -25,6 +25,10 @@ Download links for TDengine 3.x version installation packages are as follows:
|
||||||
|
|
||||||
import Release from "/components/ReleaseV3";
|
import Release from "/components/ReleaseV3";
|
||||||
|
|
||||||
|
## 3.3.5.8
|
||||||
|
|
||||||
|
<Release type="tdengine" version="3.3.5.8" />
|
||||||
|
|
||||||
## 3.3.5.2
|
## 3.3.5.2
|
||||||
|
|
||||||
<Release type="tdengine" version="3.3.5.2" />
|
<Release type="tdengine" version="3.3.5.2" />
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
---
|
||||||
|
title: TDengine 3.3.5.8 Release Notes
|
||||||
|
sidebar_label: 3.3.5.8
|
||||||
|
description: Version 3.3.5.8 Notes
|
||||||
|
slug: /release-history/release-notes/3.3.5.8
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
1. feat: suppport tmq subscription with ONLY META in JDBC
|
||||||
|
2. feat: support multiple-line SQL editor in Grafana
|
||||||
|
3. feat: add support for VARBINARY/GEOMETRY in ODBC
|
||||||
|
4. feat: support TDengine with ODBC dirver in Excel
|
||||||
|
5. feat: taosX agent use specific port range in local connection
|
||||||
|
|
||||||
|
## Enhancements
|
||||||
|
1. enh: websocket handle consumer error when tmq polled nothing
|
||||||
|
2. enh: JDBC add support for unsigned integers
|
||||||
|
3. enh: expose global.written_concurrent configuration for kafka/mqtt/csv in Explorer
|
||||||
|
4. enh: support integration with TDgpt in community version
|
||||||
|
5. enh: support BinaryRowData type in flink
|
||||||
|
6. enh: in stmt2 SQL statements, the LIMIT clause supports the use of ? as a parameter placeholder
|
||||||
|
7. enh: enable compression via websocket in taosX backup
|
||||||
|
8. enh: ODBC support SQL_ROWSET_SIZE in SQLSetStmtAttr
|
||||||
|
9. enh: expose num.of.consumers/writters configurations in Explorer
|
||||||
|
10. enh: Add connector files to the macOS installation package.
|
||||||
|
11. enh: handle errors when poll result is null in rust connector
|
||||||
|
12. enh: tsbs support csv output format
|
||||||
|
13. enh: add Classified Connections Counts table in TDinsight
|
||||||
|
14. enh: use consist float precision in explorer and tao shell
|
||||||
|
15. enh: flink table support update/delete
|
||||||
|
16. enh: taosX agent will resume connection when taosX server disconnected for long time
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
1. fix: explorer support signup email with dot `.`
|
||||||
|
2. fix: flock syscall error on aws cloud storage in taosAdapter
|
||||||
|
3. fix: modify boolean tag values in sub-tables results in erroneous metadata from data subscriptions.
|
||||||
|
4. fix: allow spaces in columns of csv in explorer datain
|
||||||
|
5. fix: resolved the issue of high CPU usage by the stmtbind thread when the system is in an idle state
|
||||||
|
6. fix: health state tick to idle when no data consumed
|
||||||
|
7. fix: fix security issues in JDBC sample code
|
||||||
|
8. fix: fix upgrade compaibility issue of taosX
|
||||||
|
9. fix: ODBC core when set SQL_ATTR_TXN_ISOLATION with SQLSetConnectAttr
|
||||||
|
10. fix: received/processed_messages should be reset when task rerun
|
||||||
|
11. fix: when restoring data using taosX, it may crash if the database is not specified
|
||||||
|
12. fix: when creating a database, the keep_time_offset options supports suffixes h (hours) and d (days) for time values
|
||||||
|
13. fix: potential deadlocks while drop stream
|
||||||
|
14. fix: failed to write data in a dual-replica database when a single dnode is disconnected from the network
|
||||||
|
15. fix: when querying the information_schema.ins_tables table, a "Sync leader is unreachable" error may be triggered if the Leader of the mnode changes.
|
||||||
|
16. fix: the time-filtering query results involving composite primary keys were incorrect after data compact
|
||||||
|
17. fix: when the join condition of the primary key column is not a simple equality condition, it may lead to incorrect JOIN results
|
||||||
|
18. fix: error caused by cursor.fetchmany with custom length in python taosws
|
||||||
|
19. fix: the issue where the "show grants" command returned an incorrect number of columns
|
||||||
|
20. fix: unexpected backup points before schedule executing
|
||||||
|
21. fix: taosX task does not restart after interrupted
|
||||||
|
22. fix: jdbc select server_version() caused mem high-usage
|
||||||
|
23. fix: when using the WHERE tbname IN () statement, executing LAST query may cause taosd crash if the subtables filtered out do not belong to the same super table
|
||||||
|
24. fix: after taosd exits abnormally and is restarted, if the WAL that has not been written to the data file is too large, it may cause an OOM error during startup
|
||||||
|
25. fix: when using interp interpolation, if the select list contains string constants or string tags, the returned string content may be incomplete.[#29353](https://github.com/taosdata/TDengine/issues/29353)
|
||||||
|
26. fix: when performing a JOIN query on a super table, using a subquery as the right table may lead to missing results
|
||||||
|
27. fix: syntax error while use DISTINCT and ORDER BY together.[#29263](https://github.com/taosdata/TDengine/issues/29263)
|
||||||
|
28. fix: when using the CAST function to convert a floating-point number to a binary and then performing a comparison, the result may be inaccurate due to loss of precision[#29382](https://github.com/taosdata/TDengine/issues/29382)
|
||||||
|
29. fix: after upgrading from version 3.3.4 to 3.3.5, the taosd service fails to start properly if the configured charset does not exist in the system
|
||||||
|
30. fix: websocket api timing field should not be negtive
|
||||||
|
31. fix: duplicates backup points in taosX
|
||||||
|
32. fix: configuration item s3BucketName was incorrectly set as a global variable, leading to failures while file uploads to S3.
|
||||||
|
|
|
@ -16,7 +16,7 @@ TDengine OSS 是一个开源的高性能时序数据库,与其他时序数据
|
||||||
|
|
||||||
在 TDengine OSS 的基础上,TDengine Enterprise 提供了增强的辅助功能,包括数据的备份恢复、异地容灾、多级存储、视图、权限控制、安全加密、IP 白名单、支持 MQTT、OPC-UA、OPC-DA、PI、Wonderware、Kafka 等各种数据源。这些功能为企业提供了更为全面、安全、可靠和高效的时序数据管理解决方案。更多的细节请看 [TDengine Enterprise](https://www.taosdata.com/tdengine-pro)。
|
在 TDengine OSS 的基础上,TDengine Enterprise 提供了增强的辅助功能,包括数据的备份恢复、异地容灾、多级存储、视图、权限控制、安全加密、IP 白名单、支持 MQTT、OPC-UA、OPC-DA、PI、Wonderware、Kafka 等各种数据源。这些功能为企业提供了更为全面、安全、可靠和高效的时序数据管理解决方案。更多的细节请看 [TDengine Enterprise](https://www.taosdata.com/tdengine-pro)。
|
||||||
|
|
||||||
此外,TDengine Cloud 作为一种全托管的云服务,存储与计算分离,分开计费,为企业提供了企业级的工具和服务,彻底解决了运维难题,尤其适合中小规模的用户使用。更多的细节请看[TDengine 云服务](https://cloud.taosdata.com/?utm_source=menu&utm_medium=webcn)
|
此外,TDengine Cloud 作为一种全托管的云服务,存储与计算分离,分开计费,为企业提供了企业级的工具和服务,彻底解决了运维难题,尤其适合中小规模的用户使用。更多的细节请看 [TDengine 云服务](https://cloud.taosdata.com/?utm_source=menu&utm_medium=webcn)。
|
||||||
|
|
||||||
## TDengine 主要功能与特性
|
## TDengine 主要功能与特性
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ import TabItem from "@theme/TabItem";
|
||||||
|
|
||||||
## 无模式写入行协议
|
## 无模式写入行协议
|
||||||
|
|
||||||
TDengine 的无模式写入行协议兼容 InfluxDB 的行协议、OpenTSDB 的 telnet 行协议和 OpenTSDB 的 JSON 格式协议。InfluxDB、OpenTSDB 的标准写入协议请参考各自的官方文档。
|
TDengine 的无模式写入行协议兼容 InfluxDB 的行协议、OpenTSDB 的 TELNET 行协议和 OpenTSDB 的 JSON 格式协议。InfluxDB、OpenTSDB 的标准写入协议请参考各自的官方文档。
|
||||||
|
|
||||||
下面首先以 InfluxDB 的行协议为基础,介绍 TDengine 扩展的协议内容。该协议允许用户采用更加精细的方式控制(超级表)模式。采用一个字符串来表达一个数据行,可以向写入 API 中一次传入多行字符串来实现多个数据行的批量写入,其格式约定如下。
|
下面首先以 InfluxDB 的行协议为基础,介绍 TDengine 扩展的协议内容。该协议允许用户采用更加精细的方式控制(超级表)模式。采用一个字符串来表达一个数据行,可以向写入 API 中一次传入多行字符串来实现多个数据行的批量写入,其格式约定如下。
|
||||||
|
|
||||||
|
@ -70,10 +70,9 @@ tag_set 中的所有的数据自动转化为 nchar 数据类型,并不需要
|
||||||
| 5 | i32/u32 | Int/UInt | 4 |
|
| 5 | i32/u32 | Int/UInt | 4 |
|
||||||
| 6 | i64/i/u64/u | BigInt/BigInt/UBigInt/UBigInt | 8 |
|
| 6 | i64/i/u64/u | BigInt/BigInt/UBigInt/UBigInt | 8 |
|
||||||
|
|
||||||
- t, T, true, True, TRUE, f, F, false, False 将直接作为 BOOL 型来处理。
|
- t、T、true、True、TRUE、f、F、false、False 将直接作为 BOOL 型来处理。
|
||||||
|
|
||||||
例如如下数据行表示:向名为 st 的超级表下的 t1 标签为 "3"(NCHAR)、t2 标签为 "4"(NCHAR)、t3
|
例如如下数据行表示:向名为 st 的超级表下的 t1 标签为 "3"(NCHAR)、t2 标签为 "4"(NCHAR)、t3 标签为 "t3"(NCHAR)的数据子表,写入 c1 列为 3(BIGINT)、c2 列为 false(BOOL)、c3
|
||||||
标签为 "t3"(NCHAR)的数据子表,写入 c1 列为 3(BIGINT)、c2 列为 false(BOOL)、c3
|
|
||||||
列为 "passit"(BINARY)、c4 列为 4(DOUBLE)、主键时间戳为 1626006833639000000 的一行数据。
|
列为 "passit"(BINARY)、c4 列为 4(DOUBLE)、主键时间戳为 1626006833639000000 的一行数据。
|
||||||
|
|
||||||
```json
|
```json
|
||||||
|
@ -94,24 +93,22 @@ TDengine 提供数据写入的幂等性保证,即您可以反复调用 API 进
|
||||||
"measurement,tag_key1=tag_value1,tag_key2=tag_value2"
|
"measurement,tag_key1=tag_value1,tag_key2=tag_value2"
|
||||||
```
|
```
|
||||||
|
|
||||||
- 需要注意的是,这里的 tag_key1, tag_key2 并不是用户输入的标签的原始顺序,而是使用了标签名称按照字符串升序排列后的结果。所以,tag_key1 并不是在行协议中输入的第一个标签。
|
- 需要注意的是,这里的 tag_key1、tag_key2 并不是用户输入的标签的原始顺序,而是使用了标签名称按照字符串升序排列后的结果。所以,tag_key1 并不是在行协议中输入的第一个标签。
|
||||||
排列完成以后计算该字符串的 MD5 散列值 "md5_val"。然后将计算的结果与字符串组合生成表名:“t_md5_val”。其中的 “t_” 是固定的前缀,每个通过该映射关系自动生成的表都具有该前缀。
|
排列完成以后计算该字符串的 MD5 散列值 "md5_val"。然后将计算的结果与字符串组合生成表名:"t_md5_val"。其中的 "t_" 是固定的前缀,每个通过该映射关系自动生成的表都具有该前缀。
|
||||||
|
|
||||||
- 如果不想用自动生成的表名,有两种指定子表名的方式(第一种优先级更高)。
|
- 如果不想用自动生成的表名,有两种指定子表名的方式(第一种优先级更高)。
|
||||||
1. 通过在taos.cfg里配置 smlAutoChildTableNameDelimiter 参数来指定(`@ # 空格 回车 换行 制表符`除外)。
|
- 通过在 taos.cfg 里配置 smlAutoChildTableNameDelimiter 参数来指定(`@ # 空格 回车 换行 制表符` 除外),例如配置 smlAutoChildTableNameDelimiter=- 插入数据为 st,t0=cpu1,t1=4 c1=3 1626006833639000000 则创建的表名为 cpu1-4。
|
||||||
1. 举例如下:配置 smlAutoChildTableNameDelimiter=- 插入数据为 st,t0=cpu1,t1=4 c1=3 1626006833639000000 则创建的表名为 cpu1-4。
|
- 通过在 taos.cfg 里配置 smlChildTableName 参数来指定,例如配置 smlChildTableName=tname 插入数据为 st,tname=cpu1,t1=4 c1=3 1626006833639000000 则创建的表名为 cpu1,注意如果多行数据 tname 相同,但是后面的 tag_set 不同,则使用第一行自动建表时指定的 tag_set,其他的行会忽略。
|
||||||
2. 通过在taos.cfg里配置 smlChildTableName 参数来指定。
|
|
||||||
1. 举例如下:配置 smlChildTableName=tname 插入数据为 st,tname=cpu1,t1=4 c1=3 1626006833639000000 则创建的表名为 cpu1,注意如果多行数据 tname 相同,但是后面的 tag_set 不同,则使用第一行自动建表时指定的 tag_set,其他的行会忽略。
|
|
||||||
|
|
||||||
2. 如果解析行协议获得的超级表不存在,则会创建这个超级表(不建议手动创建超级表,不然插入数据可能异常)。
|
2. 如果解析行协议获得的超级表不存在,则会创建这个超级表(不建议手动创建超级表,不然插入数据可能异常)。
|
||||||
3. 如果解析行协议获得子表不存在,则 Schemaless 会按照步骤 1 或 2 确定的子表名来创建子表。
|
3. 如果解析行协议获得子表不存在,则 schemaless 会按照步骤 1 或 2 确定的子表名来创建子表。
|
||||||
4. 如果数据行中指定的标签列或普通列不存在,则在超级表中增加对应的标签列或普通列(只增不减)。
|
4. 如果数据行中指定的标签列或普通列不存在,则在超级表中增加对应的标签列或普通列(只增不减)。
|
||||||
5. 如果超级表中存在一些标签列或普通列未在一个数据行中被指定取值,那么这些列的值在这一行中会被置为 NULL。
|
5. 如果超级表中存在一些标签列或普通列未在一个数据行中被指定取值,那么这些列的值在这一行中会被置为 NULL。
|
||||||
6. 对 BINARY 或 NCHAR 列,如果数据行中所提供值的长度超出了列类型的限制,自动增加该列允许存储的字符长度上限(只增不减),以保证数据的完整保存。
|
6. 对 BINARY 或 NCHAR 列,如果数据行中所提供值的长度超出了列类型的限制,自动增加该列允许存储的字符长度上限(只增不减),以保证数据的完整保存。
|
||||||
7. 整个处理过程中遇到的错误会中断写入过程,并返回错误代码。
|
7. 整个处理过程中遇到的错误会中断写入过程,并返回错误代码。
|
||||||
8. 为了提高写入的效率,默认假设同一个超级表中 field_set 的顺序是一样的(第一条数据包含所有的 field,后面的数据按照这个顺序),如果顺序不一样,需要配置参数 smlDataFormat 为 false,否则,数据写入按照相同顺序写入,库中数据会异常,从 3.0.3.0 开始,自动检测顺序是否一致,该配置废弃。
|
8. 为了提高写入的效率,默认假设同一个超级表中 field_set 的顺序是一样的(第一条数据包含所有的 field,后面的数据按照这个顺序),如果顺序不一样,需要配置参数 smlDataFormat 为 false,否则,数据写入按照相同顺序写入,库中数据会异常,从 3.0.3.0 开始,自动检测顺序是否一致,该配置废弃。
|
||||||
9. 由于 sql 建表表名不支持点号(.),所以 schemaless 也对点号(.)做了处理,如果 schemaless 自动建表的表名如果有点号(.),会自动替换为下划线(\_)。如果手动指定子表名的话,子表名里有点号(.),同样转化为下划线(\_)。
|
9. 由于 sql 建表表名不支持点号(.),所以 schemaless 也对点号(.)做了处理,如果 schemaless 自动建表的表名如果有点号(.),会自动替换为下划线(\_)。如果手动指定子表名的话,子表名里有点号(.),同样转化为下划线(\_)。
|
||||||
10. taos.cfg 增加 smlTsDefaultName 配置(值为字符串),只在client端起作用,配置后,schemaless自动建表的时间列名字可以通过该配置设置。不配置的话,默认为 _ts。
|
10. taos.cfg 增加 smlTsDefaultName 配置(字符串类型),只在 client 端起作用,配置后,schemaless 自动建表的时间列名字可以通过该配置设置。不配置的话,默认为 _ts。
|
||||||
11. 无模式写入的数据超级表或子表名区分大小写。
|
11. 无模式写入的数据超级表或子表名区分大小写。
|
||||||
12. 无模式写入仍然遵循 TDengine 对数据结构的底层限制,例如每行数据的总长度不能超过 48KB(从 3.0.5.0 版本开始为 64KB),标签值的总长度不超过 16KB。
|
12. 无模式写入仍然遵循 TDengine 对数据结构的底层限制,例如每行数据的总长度不能超过 48KB(从 3.0.5.0 版本开始为 64KB),标签值的总长度不超过 16KB。
|
||||||
|
|
||||||
|
@ -147,7 +144,7 @@ InfluxDB行协议的数据将被映射成具有模式的数据,其中,measu
|
||||||
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000
|
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000
|
||||||
```
|
```
|
||||||
|
|
||||||
该行数据映射生成一个超级表: st, 其包含了 3 个类型为 nchar 的标签,分别是:t1, t2, t3。五个数据列,分别是 ts(timestamp),c1 (bigint),c3(binary),c2 (bool), c4 (bigint)。映射成为如下 SQL 语句:
|
该行数据映射生成一个超级表:st, 其包含了 3 个类型为 nchar 的标签,分别是:t1、t2、t3。五个数据列,分别是 ts(timestamp)、c1 (bigint)、c3(binary)、c2 (bool)、c4 (bigint)。映射成为如下 SQL 语句:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
create stable st (_ts timestamp, c1 bigint, c2 bool, c3 binary(6), c4 bigint) tags(t1 nchar(1), t2 nchar(1), t3 nchar(2))
|
create stable st (_ts timestamp, c1 bigint, c2 bool, c3 binary(6), c4 bigint) tags(t1 nchar(1), t2 nchar(1), t3 nchar(2))
|
||||||
|
@ -164,7 +161,7 @@ st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4 1626006833639000000
|
||||||
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4i 1626006833640000000
|
st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4i 1626006833640000000
|
||||||
```
|
```
|
||||||
|
|
||||||
第一行的数据类型映射将 c4 列定义为 Double, 但是第二行的数据又通过数值后缀方式声明该列为 BigInt, 由此会触发无模式写入的解析错误。
|
第一行的数据类型映射将 c4 列定义为 Double, 但是第二行的数据又通过数值后缀方式声明该列为 bigInt, 由此会触发无模式写入的解析错误。
|
||||||
|
|
||||||
如果列前面的行协议将数据列声明为了 binary, 后续的要求长度更长的 binary 长度,此时会触发超级表模式的变更。
|
如果列前面的行协议将数据列声明为了 binary, 后续的要求长度更长的 binary 长度,此时会触发超级表模式的变更。
|
||||||
|
|
||||||
|
@ -299,7 +296,7 @@ writer.write(lineDemo, SchemalessProtocolType.LINE, SchemalessTimestampType.NANO
|
||||||
|
|
||||||
## 查询写入的数据
|
## 查询写入的数据
|
||||||
|
|
||||||
运行上节的样例代码,会在 power 数据库l中自动建表,我们可以通过 TDengine CLI 或者应用程序来查询数据。下面给出用 TDengine CLI 查询超级表和 meters 表数据的样例。
|
运行上节的样例代码,会在 power 数据库中自动建表,我们可以通过 TDengine CLI 或者应用程序来查询数据。下面给出用 TDengine CLI 查询超级表和 meters 表数据的样例。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
taos> show power.stables;
|
taos> show power.stables;
|
||||||
|
|
|
@ -19,9 +19,9 @@ import TabItem from "@theme/TabItem";
|
||||||
我们只推荐使用下面两种形式的 SQL 进行参数绑定写入:
|
我们只推荐使用下面两种形式的 SQL 进行参数绑定写入:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
一、确定子表存在:
|
一、确定子表存在
|
||||||
1. INSERT INTO meters (tbname, ts, current, voltage, phase) VALUES(?, ?, ?, ?, ?)
|
1. INSERT INTO meters (tbname, ts, current, voltage, phase) VALUES(?, ?, ?, ?, ?)
|
||||||
二、自动建表:
|
二、自动建表
|
||||||
1. INSERT INTO meters (tbname, ts, current, voltage, phase, location, group_id) VALUES(?, ?, ?, ?, ?, ?, ?)
|
1. INSERT INTO meters (tbname, ts, current, voltage, phase, location, group_id) VALUES(?, ?, ?, ?, ?, ?, ?)
|
||||||
2. INSERT INTO ? USING meters TAGS (?, ?) VALUES (?, ?, ?, ?)
|
2. INSERT INTO ? USING meters TAGS (?, ?) VALUES (?, ?, ?, ?)
|
||||||
```
|
```
|
||||||
|
|
|
@ -16,7 +16,7 @@ TDengine 提供了类似于消息队列产品的数据订阅和消费接口。
|
||||||
|
|
||||||
**注意**
|
**注意**
|
||||||
在 TDengine 连接器实现中,对于订阅查询,有以下限制。
|
在 TDengine 连接器实现中,对于订阅查询,有以下限制。
|
||||||
- 查询语句限制:订阅查询只能使用 select 语句,并不支持其他类型的SQL,如订阅库,订阅超级表(非 select 方式),insert、update 或 delete 等。
|
- 查询语句限制:订阅查询只能使用 select 语句,并不支持其他类型的 SQL,如订阅库、订阅超级表(非 select 方式)、insert、update 或 delete 等。
|
||||||
- 原始始数据查询:订阅查询只能查询原始数据,而不能查询聚合或计算结果。
|
- 原始始数据查询:订阅查询只能查询原始数据,而不能查询聚合或计算结果。
|
||||||
- 时间顺序限制:订阅查询只能按照时间正序查询数据。
|
- 时间顺序限制:订阅查询只能按照时间正序查询数据。
|
||||||
|
|
||||||
|
@ -28,25 +28,82 @@ TDengine 消费者的概念跟 Kafka 类似,消费者通过订阅主题来接
|
||||||
### 创建参数
|
### 创建参数
|
||||||
创建消费者的参数较多,非常灵活的支持了各种连接类型、 Offset 提交方式、压缩、重连、反序列化等特性。各语言连接器都适用的通用基础配置项如下表所示:
|
创建消费者的参数较多,非常灵活的支持了各种连接类型、 Offset 提交方式、压缩、重连、反序列化等特性。各语言连接器都适用的通用基础配置项如下表所示:
|
||||||
|
|
||||||
| 参数名称 | 类型 | 参数说明 | 备注 |
|
#### td.connect.ip
|
||||||
| :-----------------------: | :-----: | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
- 说明:服务端的 FQDN
|
||||||
| `td.connect.ip` | string | 服务端的 FQDN | 可以是ip或者host name |
|
- 类型:string
|
||||||
| `td.connect.user` | string | 用户名 | |
|
- 备注:可以是 ip 或者 host name
|
||||||
| `td.connect.pass` | string | 密码 | |
|
|
||||||
| `td.connect.port` | integer | 服务端的端口号 | |
|
|
||||||
| `group.id` | string | 消费组 ID,同一消费组共享消费进度 | <br />**必填项**。最大长度:192,超长将截断。<br />每个topic最多可建立 100 个 consumer group |
|
|
||||||
| `client.id` | string | 客户端 ID | 最大长度:255,超长将截断。 |
|
|
||||||
| `auto.offset.reset` | enum | 消费组订阅的初始位置 | <br />`earliest`: default(version < 3.2.0.0);从头开始订阅; <br/>`latest`: default(version >= 3.2.0.0);仅从最新数据开始订阅; <br/>`none`: 没有提交的 offset 无法订阅 |
|
|
||||||
| `enable.auto.commit` | boolean | 是否启用消费位点自动提交,true: 自动提交,客户端应用无需commit;false:客户端应用需要自行commit | 默认值为 true |
|
|
||||||
| `auto.commit.interval.ms` | integer | 消费记录自动提交消费位点时间间隔,单位为毫秒 | 默认值为 5000 |
|
|
||||||
| `msg.with.table.name` | boolean | 是否允许从消息中解析表名, 不适用于列订阅(列订阅时可将 tbname 作为列写入 subquery 语句)(从 3.2.0.0 版本该参数废弃,恒为 true) | 默认关闭 |
|
|
||||||
| `enable.replay` | boolean | 是否开启数据回放功能 | 默认关闭 |
|
|
||||||
| `session.timeout.ms` | integer | consumer 心跳丢失后超时时间,超时后会触发 rebalance 逻辑,成功后该 consumer 会被删除(从 3.3.3.0 版本开始支持) | 默认值为 12000,取值范围 [6000, 1800000] |
|
|
||||||
| `max.poll.interval.ms` | integer | consumer poll 拉取数据间隔的最长时间,超过该时间,会认为该 consumer 离线,触发 rebalance 逻辑,成功后该 consumer 会被删除(从 3.3.3.0 版本开始支持) | 默认值为 300000,[1000,INT32_MAX] |
|
|
||||||
| `fetch.max.wait.ms` | integer | 服务端单次返回数据的最大耗时(从 3.3.6.0 版本开始支持) | 默认值为 1000,[1,INT32_MAX] |
|
|
||||||
| `min.poll.rows` | integer | 服务端单次返回数据的最小条数(从 3.3.6.0 版本开始支持) | 默认值为 4096,[1,INT32_MAX] |
|
|
||||||
| `msg.consume.rawdata` | integer | 消费数据时拉取数据类型为二进制类型,不可做解析操作,内部参数,只用于 taosX 数据迁移(从 3.3.6.0 版本开始支持) | 默认值为 0 表示不起效, 非 0 为 起效 |
|
|
||||||
|
|
||||||
|
#### td.connect.user
|
||||||
|
- 说明:用户名
|
||||||
|
- 类型:string
|
||||||
|
|
||||||
|
#### td.connect.pass
|
||||||
|
- 说明:密码
|
||||||
|
- 类型:string
|
||||||
|
|
||||||
|
#### td.connect.port
|
||||||
|
- 说明:服务端的端口号
|
||||||
|
- 类型:integer
|
||||||
|
|
||||||
|
#### group.id
|
||||||
|
- 说明:消费组 ID,同一消费组共享消费进度
|
||||||
|
- 类型:string
|
||||||
|
- 备注:**必填项**。最大长度:192,超长将截断。<br />每个topic最多可建立 100 个 consumer group
|
||||||
|
|
||||||
|
#### client.id
|
||||||
|
- 说明:客户端 ID
|
||||||
|
- 类型:string
|
||||||
|
- 备注:最大长度 255,超长将截断
|
||||||
|
|
||||||
|
#### auto.offset.reset
|
||||||
|
- 说明:消费组订阅的初始位置
|
||||||
|
- 类型:enum
|
||||||
|
- 备注:<br />`earliest`:default(version < 3.2.0.0),从头开始订阅;<br/>`latest`:default(version >= 3.2.0.0),仅从最新数据开始订阅;<br/>`none`:没有提交的 offset 无法订阅。
|
||||||
|
|
||||||
|
#### enable.auto.commit
|
||||||
|
- 说明:是否启用消费位点自动提交
|
||||||
|
- 类型:boolean
|
||||||
|
- 备注:true:自动提交,客户端应用无需 commit;false:客户端应用需要自行 commit;默认值为 true。
|
||||||
|
|
||||||
|
#### auto.commit.interval.ms
|
||||||
|
- 说明:消费记录自动提交消费位点时间间隔
|
||||||
|
- 类型:integer
|
||||||
|
- 备注:单位为毫秒,默认值为 5000
|
||||||
|
|
||||||
|
#### msg.with.table.name
|
||||||
|
- 说明:是否允许从消息中解析表名
|
||||||
|
- 类型:boolean
|
||||||
|
- 备注:不适用于列订阅(列订阅时可将 tbname 作为列写入 subquery 语句),默认关闭。v3.2.0.0 该参数废弃。
|
||||||
|
|
||||||
|
#### enable.replay
|
||||||
|
- 说明:是否开启数据回放功能
|
||||||
|
- 类型:boolean
|
||||||
|
- 备注:默认关闭
|
||||||
|
|
||||||
|
#### session.timeout.ms
|
||||||
|
- 说明:consumer 心跳丢失后超时时间
|
||||||
|
- 类型:integer
|
||||||
|
- 备注:超时后会触发 rebalance 逻辑,成功后该 consumer 会被删除。默认值为 12000,取值范围 [6000,1800000]。v3.3.3.0 开始支持)
|
||||||
|
|
||||||
|
#### max.poll.interval.ms
|
||||||
|
- 说明:consumer poll 拉取数据间隔的最长时间
|
||||||
|
- 类型:integer
|
||||||
|
- 备注:超过该时间,会认为该 consumer 离线,触发 rebalance 逻辑,成功后该 consumer 会被删除。默认值为 300000,[1000,INT32_MAX]。v3.3.3.0 开始支持。
|
||||||
|
|
||||||
|
#### fetch.max.wait.ms
|
||||||
|
- 说明:服务端单次返回数据的最大耗时
|
||||||
|
- 类型:integer
|
||||||
|
- 备注:默认值为 1000,[1,INT32_MAX]。v3.3.6.0 开始支持。
|
||||||
|
|
||||||
|
#### min.poll.rows
|
||||||
|
- 说明:服务端单次返回数据的最小条数
|
||||||
|
- 类型:integer
|
||||||
|
- 备注:默认值为 4096,[1,INT32_MAX]。v3.3.6.0 开始支持。
|
||||||
|
|
||||||
|
#### msg.consume.rawdata
|
||||||
|
- 说明:消费数据时拉取数据类型为二进制类型,不可做解析操作 `内部参数,只用于 taosX 数据迁移`
|
||||||
|
- 类型:integer
|
||||||
|
- 备注:默认值为 0 表示不起效,非 0 为起效。v3.3.6.0 开始支持。
|
||||||
|
|
||||||
下面是各语言连接器创建参数:
|
下面是各语言连接器创建参数:
|
||||||
<Tabs defaultValue="java" groupId="lang">
|
<Tabs defaultValue="java" groupId="lang">
|
||||||
|
|
|
@ -323,7 +323,7 @@ def process(input: datablock) -> tuple[output_type]:
|
||||||
```
|
```
|
||||||
|
|
||||||
主要参数说明如下:
|
主要参数说明如下:
|
||||||
- input:datablock 类似二维矩阵,通过成员方法 data(row, col) 读取位于 row 行、col 列的 python 对象
|
- input:datablock 类似二维矩阵,通过成员方法 data(row, col) 读取位于 row 行、col 列的 Python 对象
|
||||||
- 返回值是一个 Python 对象元组,每个元素类型为输出类型。
|
- 返回值是一个 Python 对象元组,每个元素类型为输出类型。
|
||||||
|
|
||||||
#### 聚合函数接口
|
#### 聚合函数接口
|
||||||
|
@ -405,7 +405,7 @@ def finish(buf: bytes) -> output_type:
|
||||||
|
|
||||||
本文内容由浅入深包括 5 个示例程序,同时也包含大量实用的 debug 技巧。
|
本文内容由浅入深包括 5 个示例程序,同时也包含大量实用的 debug 技巧。
|
||||||
|
|
||||||
注意:**UDF 内无法通过 print 函数输出日志,需要自己写文件或用 python 内置的 logging 库写文件**。
|
注意:**UDF 内无法通过 print 函数输出日志,需要自己写文件或用 Python 内置的 logging 库写文件**。
|
||||||
|
|
||||||
#### 示例一
|
#### 示例一
|
||||||
|
|
||||||
|
@ -652,7 +652,7 @@ tail -20 taospyudf.log
|
||||||
2023-05-25 11:42:34.541 ERROR [1679419] [PyUdf::PyUdf@217] py udf load module failure. error ModuleNotFoundError: No module named 'moment'
|
2023-05-25 11:42:34.541 ERROR [1679419] [PyUdf::PyUdf@217] py udf load module failure. error ModuleNotFoundError: No module named 'moment'
|
||||||
```
|
```
|
||||||
|
|
||||||
这是因为 “moment” 所在位置不在 python udf 插件默认的库搜索路径中。怎么确认这一点呢?通过以下命令搜索 taospyudf.log。
|
这是因为 “moment” 所在位置不在 Python udf 插件默认的库搜索路径中。怎么确认这一点呢?通过以下命令搜索 taospyudf.log。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
grep 'sys path' taospyudf.log | tail -1
|
grep 'sys path' taospyudf.log | tail -1
|
||||||
|
@ -664,7 +664,7 @@ grep 'sys path' taospyudf.log | tail -1
|
||||||
2023-05-25 10:58:48.554 INFO [1679419] [doPyOpen@592] python sys path: ['', '/lib/python38.zip', '/lib/python3.8', '/lib/python3.8/lib-dynload', '/lib/python3/dist-packages', '/var/lib/taos//.udf']
|
2023-05-25 10:58:48.554 INFO [1679419] [doPyOpen@592] python sys path: ['', '/lib/python38.zip', '/lib/python3.8', '/lib/python3.8/lib-dynload', '/lib/python3/dist-packages', '/var/lib/taos//.udf']
|
||||||
```
|
```
|
||||||
|
|
||||||
发现 python udf 插件默认搜索的第三方库安装路径是: /lib/python3/dist-packages,而 moment 默认安装到了 /usr/local/lib/python3.8/dist-packages。下面我们修改 python udf 插件默认的库搜索路径。
|
发现 Python udf 插件默认搜索的第三方库安装路径是: /lib/python3/dist-packages,而 moment 默认安装到了 /usr/local/lib/python3.8/dist-packages。下面我们修改 Python udf 插件默认的库搜索路径。
|
||||||
先打开 python3 命令行,查看当前的 sys.path。
|
先打开 python3 命令行,查看当前的 sys.path。
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
@ -754,7 +754,7 @@ create or replace aggregate function myspread as '/root/udf/myspread.py' outputt
|
||||||
|
|
||||||
这个 SQL 语句与创建标量函数的 SQL 语句有两个重要区别。
|
这个 SQL 语句与创建标量函数的 SQL 语句有两个重要区别。
|
||||||
1. 增加了 aggregate 关键字
|
1. 增加了 aggregate 关键字
|
||||||
2. 增加了 bufsize 关键字,用来指定存储中间结果的内存大小,这个数值可以大于实际使用的数值。本例中间结果是两个浮点数组成的 tuple,序列化后实际占用大小只有 32 个字节,但指定的 bufsize 是128,可以用 python 命令行打印实际占用的字节数
|
2. 增加了 bufsize 关键字,用来指定存储中间结果的内存大小,这个数值可以大于实际使用的数值。本例中间结果是两个浮点数组成的 tuple,序列化后实际占用大小只有 32 个字节,但指定的 bufsize 是128,可以用 Python 命令行打印实际占用的字节数
|
||||||
|
|
||||||
```python
|
```python
|
||||||
>>> len(pickle.dumps((12345.6789, 23456789.9877)))
|
>>> len(pickle.dumps((12345.6789, 23456789.9877)))
|
||||||
|
|
|
@ -374,7 +374,7 @@ SQLWriter 类封装了拼 SQL 和写数据的逻辑。所有的表都没有提
|
||||||
- 已安装 Python3, 推荐版本 >= 3.8
|
- 已安装 Python3, 推荐版本 >= 3.8
|
||||||
- 已安装 taospy
|
- 已安装 taospy
|
||||||
|
|
||||||
2. 安装 faster-fifo 代替 python 内置的 multiprocessing.Queue
|
2. 安装 faster-fifo 代替 Python 内置的 multiprocessing.Queue
|
||||||
|
|
||||||
```
|
```
|
||||||
pip3 install faster-fifo
|
pip3 install faster-fifo
|
||||||
|
|
|
@ -36,7 +36,7 @@ taosAdapter 提供了以下功能:
|
||||||
- RESTful 接口;
|
- RESTful 接口;
|
||||||
- WebSocket 连接;
|
- WebSocket 连接;
|
||||||
- 兼容 InfluxDB v1 格式写入;
|
- 兼容 InfluxDB v1 格式写入;
|
||||||
- 兼容 OpenTSDB JSON 和 Telnet 格式写入;
|
- 兼容 OpenTSDB JSON 和 TELNET 格式写入;
|
||||||
- 无缝连接到 Telegraf;
|
- 无缝连接到 Telegraf;
|
||||||
- 无缝连接到 collectd;
|
- 无缝连接到 collectd;
|
||||||
- 无缝连接到 StatsD;
|
- 无缝连接到 StatsD;
|
||||||
|
@ -77,7 +77,7 @@ taosX Agent 是 TDengine Enterprise 数据管道功能的重要组成部分,
|
||||||
这些应用程序负责向业务集群写入、查询业务数据以及订阅数据。应用程序可以通过以下 3 种方式与业务集群进行交互。
|
这些应用程序负责向业务集群写入、查询业务数据以及订阅数据。应用程序可以通过以下 3 种方式与业务集群进行交互。
|
||||||
- 基于 taosc 的应用程序:采用原生连接的应用程序,直接连接到业务集群,默认端口为 6030。
|
- 基于 taosc 的应用程序:采用原生连接的应用程序,直接连接到业务集群,默认端口为 6030。
|
||||||
- 基于 RESTful 连接的应用程序:使用 RESTful 接口访问业务集群的应用程序,需要通过 taosAdapter 进行连接,默认端口为 6041。
|
- 基于 RESTful 连接的应用程序:使用 RESTful 接口访问业务集群的应用程序,需要通过 taosAdapter 进行连接,默认端口为 6041。
|
||||||
- 基于 WebSkcket 连接的应用程序:采用 WebSocket 连接的应用程序,同样需要通过 taosAdapter 进行连接,默认端口为 6041。
|
- 基于 WebSocket 连接的应用程序:采用 WebSocket 连接的应用程序,同样需要通过 taosAdapter 进行连接,默认端口为 6041。
|
||||||
|
|
||||||
2. 可视化/BI 工具
|
2. 可视化/BI 工具
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
在这些进程中,taoskeeper、taos-explorer、taosadapter 和 taosx 的资源占用相对较少,通常不需要特别关注。此外,这些进程对存储空间的需求也较低,其占用的 CPU 和内存资源一般为 taosd 进程的十分之一到几分之一(特殊场景除外,如数据同步和历史数据迁移。在这些情况下,涛思数据的技术支持团队将提供一对一的服务)。系统管理员应定期监控这些进程的资源消耗,并及时进行相应处理。
|
在这些进程中,taoskeeper、taos-explorer、taosadapter 和 taosx 的资源占用相对较少,通常不需要特别关注。此外,这些进程对存储空间的需求也较低,其占用的 CPU 和内存资源一般为 taosd 进程的十分之一到几分之一(特殊场景除外,如数据同步和历史数据迁移。在这些情况下,涛思数据的技术支持团队将提供一对一的服务)。系统管理员应定期监控这些进程的资源消耗,并及时进行相应处理。
|
||||||
|
|
||||||
在本节中,我们将重点讨论 TDengine 数据库引擎的核心进程—taosd 的资源规划。合理的资源规划将确保 taosd 进程的高效运行,从而提高整个时序数据平台的性能和稳定性。
|
在本节中,我们将重点讨论 TDengine 数据库引擎的核心进程 taosd 的资源规划。合理的资源规划将确保 taosd 进程的高效运行,从而提高整个时序数据平台的性能和稳定性。
|
||||||
|
|
||||||
## 服务器内存需求
|
## 服务器内存需求
|
||||||
|
|
||||||
|
@ -154,9 +154,9 @@ TDengine 的多级存储功能在使用上还具备以下优点。
|
||||||
| taosKeeper | 6043 | TCP |
|
| taosKeeper | 6043 | TCP |
|
||||||
| statsd 格式写入接口 | 6044 | TCP/UDP |
|
| statsd 格式写入接口 | 6044 | TCP/UDP |
|
||||||
| collectd 格式写入接口 | 6045 | TCP/UDP |
|
| collectd 格式写入接口 | 6045 | TCP/UDP |
|
||||||
| openTSDB Telnet 格式写入接口 | 6046 | TCP |
|
| openTSDB TELNET 格式写入接口 | 6046 | TCP |
|
||||||
| collectd 使用 openTSDB Telnet 格式写入接口 | 6047 | TCP |
|
| collectd 使用 openTSDB TELNET 格式写入接口 | 6047 | TCP |
|
||||||
| icinga2 使用 openTSDB Telnet 格式写入接口 | 6048 | TCP |
|
| icinga2 使用 openTSDB TELNET 格式写入接口 | 6048 | TCP |
|
||||||
| tcollector 使用 openTSDB Telnet 格式写入接口 | 6049 | TCP |
|
| tcollector 使用 openTSDB TELNET 格式写入接口 | 6049 | TCP |
|
||||||
| taosX | 6050, 6055 | TCP |
|
| taosX | 6050, 6055 | TCP |
|
||||||
| taosExplorer | 6060 | TCP |
|
| taosExplorer | 6060 | TCP |
|
||||||
|
|
|
@ -21,7 +21,7 @@ taosd 是 TDengine 集群中最主要的服务组件,本节介绍手动部署
|
||||||
在进行 TDengine 集群部署之前,全面检查所有 dnode 以及应用程序所在物理节点的网络设置至关重要。以下是检查步骤:
|
在进行 TDengine 集群部署之前,全面检查所有 dnode 以及应用程序所在物理节点的网络设置至关重要。以下是检查步骤:
|
||||||
|
|
||||||
- 第 1 步,在每个物理节点上执行 hostname -f 命令,以查看并确认所有节点的hostname 是唯一的。对于应用程序驱动所在的节点,这一步骤可以省略。
|
- 第 1 步,在每个物理节点上执行 hostname -f 命令,以查看并确认所有节点的hostname 是唯一的。对于应用程序驱动所在的节点,这一步骤可以省略。
|
||||||
- 第 2 步,在每个物理节点上执行 ping host 命令,其中 host 是其他物理节点的 hostname。这一步骤旨在检测当前节点与其他物理节点之间的网络连通性。如果发现无法 ping 通,请立即检查网络和 DNS 设置。对于 Linux 操作系统,请检查 /etc/hosts 文件;对于 Windows 操作系统,请检查C:\Windows\system32\drivers\etc\hosts 文件。网络不通畅将导致无法组建集群,请务必解决此问题。
|
- 第 2 步,在每个物理节点上执行 ping host 命令,其中 host 是其他物理节点的 hostname。这一步骤旨在检测当前节点与其他物理节点之间的网络连通性。如果发现无法 ping 通,请立即检查网络和 DNS 设置。对于 Linux 操作系统,请检查 /etc/hosts 文件;对于 Windows 操作系统,请检查 `C:\Windows\system32\drivers\etc\hosts` 文件。网络不通畅将导致无法组建集群,请务必解决此问题。
|
||||||
- 第 3 步,在应用程序运行的物理节点上重复上述网络检测步骤。如果发现网络不通畅,应用程序将无法连接到 taosd 服务。此时,请仔细检查应用程序所在物理节点的 DNS 设置或 hosts 文件,确保其配置正确无误。
|
- 第 3 步,在应用程序运行的物理节点上重复上述网络检测步骤。如果发现网络不通畅,应用程序将无法连接到 taosd 服务。此时,请仔细检查应用程序所在物理节点的 DNS 设置或 hosts 文件,确保其配置正确无误。
|
||||||
- 第 4 步,检查端口,确保集群中所有主机在端口 6030 上的 TCP 能够互通。
|
- 第 4 步,检查端口,确保集群中所有主机在端口 6030 上的 TCP 能够互通。
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ http {
|
||||||
|
|
||||||
### 部署 taosX-Agent
|
### 部署 taosX-Agent
|
||||||
|
|
||||||
有些数据源如 Pi, OPC 等,因为网络条件和数据源访问的限制,taosX 无法直接访问数据源,这种情况下需要部署一个代理服务 taosX-Agent,关于它的详细说明和部署请参考企业版参考手册。
|
有些数据源如 PI、OPC 等,因为网络条件和数据源访问的限制,taosX 无法直接访问数据源,这种情况下需要部署一个代理服务 taosX-Agent,关于它的详细说明和部署请参考企业版参考手册。
|
||||||
|
|
||||||
### 部署 taos-Explorer
|
### 部署 taos-Explorer
|
||||||
|
|
||||||
|
@ -342,7 +342,7 @@ spec:
|
||||||
|
|
||||||
### 有状态服务 StatefulSet
|
### 有状态服务 StatefulSet
|
||||||
|
|
||||||
根据 Kubernetes 对各类部署的说明,我们将使用 StatefulSet 作为 TDengine 的部署资源类型。 创建文件 tdengine.yaml,其中 replicas 定义集群节点的数量为 3。节点时区为中国(Asia/Shanghai),每个节点分配 5G 标准(standard)存储,你也可以根据实际情况进行相应修改。
|
根据 Kubernetes 对各类部署的说明,我们将使用 StatefulSet 作为 TDengine 的部署资源类型。 创建文件 tdengine.yaml,其中 replicas 定义集群节点的数量为 3。节点时区为中国(Asia/Shanghai),每个节点分配 5GB 标准(standard)存储,你也可以根据实际情况进行相应修改。
|
||||||
|
|
||||||
请特别注意 startupProbe 的配置,在 dnode 的 Pod 掉线一段时间后,再重新启动,这个时候新上线的 dnode 会短暂不可用。如果 startupProbe 配置过小,Kubernetes 会认为该 Pod 处于不正常的状态,并尝试重启该 Pod,该 dnode 的 Pod 会频繁重启,始终无法恢复到正常状态。
|
请特别注意 startupProbe 的配置,在 dnode 的 Pod 掉线一段时间后,再重新启动,这个时候新上线的 dnode 会短暂不可用。如果 startupProbe 配置过小,Kubernetes 会认为该 Pod 处于不正常的状态,并尝试重启该 Pod,该 dnode 的 Pod 会频繁重启,始终无法恢复到正常状态。
|
||||||
|
|
||||||
|
|
|
@ -12,38 +12,38 @@ sidebar_label: 集群维护
|
||||||
|
|
||||||
## 数据重整
|
## 数据重整
|
||||||
|
|
||||||
TDengine 面向多种写入场景,而很多写入场景下,TDengine 的存储会导致数据存储的放大或数据文件的空洞等。这一方面影响数据的存储效率,另一方面也会影响查询效率。为了解决上述问题,TDengine 企业版提供了对数据的重整功能,即 DATA COMPACT 功能,将存储的数据文件重新整理,删除文件空洞和无效数据,提高数据的组织度,从而提高存储和查询的效率。数据重整功能在 3.0.3.0 版本第一次发布,此后又经过了多次迭代优化,建议使用最新版本。
|
TDengine 面向多种写入场景,而很多写入场景下,TDengine 的存储会导致数据存储的放大或数据文件的空洞等。这一方面影响数据的存储效率,另一方面也会影响查询效率。为了解决上述问题,TDengine 企业版提供了对数据的重整功能,即 data compact 功能,将存储的数据文件重新整理,删除文件空洞和无效数据,提高数据的组织度,从而提高存储和查询的效率。数据重整功能在 3.0.3.0 版本第一次发布,此后又经过了多次迭代优化,建议使用最新版本。
|
||||||
|
|
||||||
### 语法
|
### 语法
|
||||||
|
|
||||||
```SQL
|
```SQL
|
||||||
COMPACT DATABASE db_name [start with 'XXXX'] [end with 'YYYY'] [META_ONLY];
|
compact DATABASE db_name [start with 'XXXX'] [end with 'YYYY'] [META_ONLY];
|
||||||
COMPACT [db_name.]VGROUPS IN (vgroup_id1, vgroup_id2, ...) [start with 'XXXX'] [end with 'YYYY'] [META_ONLY];
|
compact [db_name.]vgroups IN (vgroup_id1, vgroup_id2, ...) [start with 'XXXX'] [end with 'YYYY'] [META_ONLY];
|
||||||
SHOW COMPACTS;
|
show compacts;
|
||||||
SHOW COMPACT compact_id;
|
show compact compact_id;
|
||||||
KILL COMPACT compact_id;
|
kill compact compact_id;
|
||||||
```
|
```
|
||||||
|
|
||||||
### 效果
|
### 效果
|
||||||
|
|
||||||
- 扫描并压缩指定的 DB 中所有 VGROUP 中 VNODE 的所有数据文件
|
- 扫描并压缩指定的 DB 中所有 vgroup 中 vnode 的所有数据文件
|
||||||
- 扫描并压缩 DB 中指定的 VGROUP 列表中 VNODE 的所有数据文件, 若 db_name 为空,则默认为当前数据库
|
- 扫描并压缩 DB 中指定的 vgroup 列表中 vnode 的所有数据文件, 若 db_name 为空,则默认为当前数据库
|
||||||
- COMPCAT 会删除被删除数据以及被删除的表的数据
|
- compact 会删除被删除数据以及被删除的表的数据
|
||||||
- COMPACT 会合并多个 STT 文件
|
- compact 会合并多个 STT 文件
|
||||||
- 可通过 start with 关键字指定 COMPACT 数据的起始时间
|
- 可通过 start with 关键字指定 compact 数据的起始时间
|
||||||
- 可通过 end with 关键字指定 COMPACT 数据的终止时间
|
- 可通过 end with 关键字指定 compact 数据的终止时间
|
||||||
- 可通过 `META_ONLY` 关键字指定只 compact 元数据。元数据默认情况下不会 compact。
|
- 可通过 `META_ONLY` 关键字指定只 compact 元数据。元数据默认情况下不会 compact。
|
||||||
- COMPACT 命令会返回 COMPACT 任务的 ID
|
- compact 命令会返回 compact 任务的 ID
|
||||||
- COMPACT 任务会在后台异步执行,可以通过 SHOW COMPACTS 命令查看 COMPACT 任务的进度
|
- compact 任务会在后台异步执行,可以通过 show compacts 命令查看 compact 任务的进度
|
||||||
- SHOW 命令会返回 COMPACT 任务的 ID,可以通过 KILL COMPACT 命令终止 COMPACT 任务
|
- show 命令会返回 compact 任务的 ID,可以通过 kill compact 命令终止 compact 任务
|
||||||
|
|
||||||
|
|
||||||
### 补充说明
|
### 补充说明
|
||||||
|
|
||||||
- COMPACT 为异步,执行 COMPACT 命令后不会等 COMPACT 结束就会返回。如果上一个 COMPACT 没有完成则再发起一个 COMPACT 任务,则会等上一个任务完成后再返回。
|
- compact 为异步,执行 compact 命令后不会等 compact 结束就会返回。如果上一个 compact 没有完成则再发起一个 compact 任务,则会等上一个任务完成后再返回。
|
||||||
- COMPACT 可能阻塞写入,尤其是在 stt_trigger = 1 的数据库中,但不阻塞查询。
|
- compact 可能阻塞写入,尤其是在 stt_trigger = 1 的数据库中,但不阻塞查询。
|
||||||
|
|
||||||
## Vgroup Leader 再平衡
|
## vgroup leader 再平衡
|
||||||
|
|
||||||
当多副本集群中的一个或多个节点因为升级或其它原因而重启后,有可能出现集群中各个 dnode 负载不均衡的现象,极端情况下会出现所有 vgroup 的 leader 都位于同一个 dnode 的情况。为了解决这个问题,可以使用下面的命令,该命令在 3.0.4.0 版本中首次发布,建议尽可能使用最新版本。
|
当多副本集群中的一个或多个节点因为升级或其它原因而重启后,有可能出现集群中各个 dnode 负载不均衡的现象,极端情况下会出现所有 vgroup 的 leader 都位于同一个 dnode 的情况。为了解决这个问题,可以使用下面的命令,该命令在 3.0.4.0 版本中首次发布,建议尽可能使用最新版本。
|
||||||
|
|
||||||
|
@ -59,11 +59,11 @@ balance vgroup leader database <database_name>; # 再平衡一个 database 内
|
||||||
|
|
||||||
### 注意
|
### 注意
|
||||||
|
|
||||||
Vgroup 选举本身带有随机性,所以通过选举的重新分布产生的均匀分布也是带有一定的概率,不会完全的均匀。该命令的副作用是影响查询和写入,在vgroup重新选举时,从开始选举到选举出新的 leader 这段时间,这 个vgroup 无法写入和查询。选举过程一般在秒级完成。所有的vgroup会依次逐个重新选举。
|
vgroup 选举本身带有随机性,所以通过选举的重新分布产生的均匀分布也是带有一定的概率,不会完全的均匀。该命令的副作用是影响查询和写入,在 vgroup 重新选举时,从开始选举到选举出新的 leader 这段时间,这 个vgroup 无法写入和查询。选举过程一般在秒级完成。所有的 vgroup 会依次逐个重新选举。
|
||||||
|
|
||||||
## 恢复数据节点
|
## 恢复数据节点
|
||||||
|
|
||||||
当集群中的某个数据节点(dnode)的数据全部丢失或被破坏,比如磁盘损坏或者目录被误删除,可以通过 restore dnode 命令来恢复该数据节点上的部分或全部逻辑节点,该功能依赖多副本中的其它副本进行数据复制,所以只在集群中 dnode 数量大于等于 3 且副本数为 3 的情况下能够工作。
|
当集群中的某个数据节点(dnode)的数据全部丢失或被破坏,比如磁盘损坏或者目录被误删除,可以通过 `restore dnode` 命令来恢复该数据节点上的部分或全部逻辑节点,该功能依赖多副本中的其它副本进行数据复制,所以只在集群中 dnode 数量大于等于 3 且副本数为 3 的情况下能够工作。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
restore dnode <dnode_id>;# 恢复dnode上的mnode,所有vnode和qnode
|
restore dnode <dnode_id>;# 恢复dnode上的mnode,所有vnode和qnode
|
||||||
|
@ -79,7 +79,7 @@ restore qnode on dnode <dnode_id>;# 恢复dnode上的qnode
|
||||||
|
|
||||||
## 分裂虚拟组
|
## 分裂虚拟组
|
||||||
|
|
||||||
当一个 vgroup 因为子表数过多而导致 CPU 或 Disk 资源使用量负载过高时,增加 dnode 节点后,可通过split vgroup命令把该vgroup分裂为两个虚拟组。分裂完成后,新产生的两个 vgroup 承担原来由一个 vgroup 提供的读写服务。该命令在 3.0.6.0 版本第一次发布,建议尽可能使用最新版本。
|
当一个 vgroup 因为子表数过多而导致 CPU 或 Disk 资源使用量负载过高时,增加 dnode 节点后,可通过 `split vgroup` 命令把该 vgroup 分裂为两个虚拟组。分裂完成后,新产生的两个 vgroup 承担原来由一个 vgroup 提供的读写服务。该命令在 3.0.6.0 版本第一次发布,建议尽可能使用最新版本。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
split vgroup <vgroup_id>
|
split vgroup <vgroup_id>
|
||||||
|
@ -97,8 +97,6 @@ split vgroup <vgroup_id>
|
||||||
|
|
||||||
从 3.1.1.0 版本开始,TDengine Enterprise 支持在线热更新 `supportVnodes` 这个很重要的 dnode 配置参数。这个参数的原始配置方式是在 `taos.cfg` 配置文件中,表示该 dnode 能够支持的最大的 vnode 数量。当创建一个数据库时需要分配新的 vnode,当删除一个数据库时其 vnode 都会被销毁。
|
从 3.1.1.0 版本开始,TDengine Enterprise 支持在线热更新 `supportVnodes` 这个很重要的 dnode 配置参数。这个参数的原始配置方式是在 `taos.cfg` 配置文件中,表示该 dnode 能够支持的最大的 vnode 数量。当创建一个数据库时需要分配新的 vnode,当删除一个数据库时其 vnode 都会被销毁。
|
||||||
|
|
||||||
但在线更新 `supportVnodes` 不会产生持久化,当系统重启后,允许的最大 vnode 数量仍然由 taos.cfg 中配置的 `supportVnodes` 决定。
|
|
||||||
|
|
||||||
如果通过在线更新或配置文件方式设置的 `supportVnodes` 小于 dnode 当前已经实际存在的 vnode 数量,已经存在的 vnode 不会受影响。但当尝试创建新的 database 时,是否能够创建成功则仍然受实际生效的 `supportVnodes` 参数决定。
|
如果通过在线更新或配置文件方式设置的 `supportVnodes` 小于 dnode 当前已经实际存在的 vnode 数量,已经存在的 vnode 不会受影响。但当尝试创建新的 database 时,是否能够创建成功则仍然受实际生效的 `supportVnodes` 参数决定。
|
||||||
|
|
||||||
## 双副本
|
## 双副本
|
||||||
|
@ -107,7 +105,7 @@ split vgroup <vgroup_id>
|
||||||
|
|
||||||
### 查看 Vgroups 的状态
|
### 查看 Vgroups 的状态
|
||||||
|
|
||||||
通过以下 SQL 命令参看双副本数据库中各 Vgroup 的状态:
|
通过以下 SQL 命令参看双副本数据库中各 vgroup 的状态:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
show arbgroups;
|
show arbgroups;
|
||||||
|
@ -121,15 +119,15 @@ select * from information_schema.ins_arbgroups;
|
||||||
|
|
||||||
```
|
```
|
||||||
is_sync 有以下两种取值:
|
is_sync 有以下两种取值:
|
||||||
- 0: Vgroup 数据未达成同步。在此状态下,如果 Vgroup 中的某一 Vnode 不可访问,另一个 Vnode 无法被指定为 `AssignedLeader` role,该 Vgroup 将无法提供服务。
|
- 0: vgroup 数据未达成同步。在此状态下,如果 vgroup 中的某一 vnode 不可访问,另一个 vnode 无法被指定为 `AssignedLeader` role,该 vgroup 将无法提供服务。
|
||||||
- 1: Vgroup 数据达成同步。在此状态下,如果 Vgroup 中的某一 Vnode 不可访问,另一个 Vnode 可以被指定为 `AssignedLeader` role,该 Vgroup 可以继续提供服务。
|
- 1: vgroup 数据达成同步。在此状态下,如果 vgroup 中的某一 vnode 不可访问,另一个 vnode 可以被指定为 `AssignedLeader` role,该 vgroup 可以继续提供服务。
|
||||||
|
|
||||||
assigned_dnode:
|
assigned_dnode:
|
||||||
- 标识被指定为 AssignedLeader 的 Vnode 的 DnodeId
|
- 标识被指定为 AssignedLeader 的 vnode 的 DnodeId
|
||||||
- 未指定 AssignedLeader 时,该列显示 NULL
|
- 未指定 AssignedLeader 时,该列显示 NULL
|
||||||
|
|
||||||
assigned_token:
|
assigned_token:
|
||||||
- 标识被指定为 AssignedLeader 的 Vnode 的 Token
|
- 标识被指定为 AssignedLeader 的 vnode 的 Token
|
||||||
- 未指定 AssignedLeader时,该列显示 NULL
|
- 未指定 AssignedLeader时,该列显示 NULL
|
||||||
|
|
||||||
### 最佳实践
|
### 最佳实践
|
||||||
|
|
|
@ -40,7 +40,7 @@ taosKeeper 的配置文件默认位于 `/etc/taos/taoskeeper.toml`。 详细配
|
||||||
|
|
||||||
#### 导入仪表盘
|
#### 导入仪表盘
|
||||||
|
|
||||||
TDengine 数据源插件已提交至 Grafana 官网,如何安装 TDengine 数据源插件和配置数据源请参考:[安装 Grafana Plugin 并配置数据源](../../third-party/visual/grafana/#安装-grafana-plugin-并配置数据源)。完成插件的安装和数据源的创建后,可以进行 TDinsight 仪表盘的导入。
|
TDengine 数据源插件已提交至 Grafana 官网,如何安装 TDengine 数据源插件和配置数据源请参考 [安装 Grafana Plugin 并配置数据源](../../third-party/visual/grafana/#安装-grafana-plugin-并配置数据源)。完成插件的安装和数据源的创建后,可以进行 TDinsight 仪表盘的导入。
|
||||||
|
|
||||||
在 Grafana 的 “Home” -> “Dashboards” 页面,点击位于右上角的 “New” -> “import” 按钮,即可进入 Dashboard 的导入页面,它支持以下两种导入方式。
|
在 Grafana 的 “Home” -> “Dashboards” 页面,点击位于右上角的 “New” -> “import” 按钮,即可进入 Dashboard 的导入页面,它支持以下两种导入方式。
|
||||||
- Dashboard ID:18180。
|
- Dashboard ID:18180。
|
||||||
|
|
|
@ -4,7 +4,7 @@ title: 可视化管理工具
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
---
|
---
|
||||||
|
|
||||||
为方便用户更高效地使用和管理 TDengine,TDengine 3.0 版本推出了一个全新的可视化组件—taosExplorer。这个组件旨在帮助用户在不熟悉 SQL 的情况下,也能轻松管理 TDengine 集群。通过 taosExplorer,用户可以轻松查看 TDengine 的运行状态、浏览数据、配置数据源、实现流计算和数据订阅等功能。此外,用户还可以利用taosExplorer 进行数据的备份、复制和同步操作,以及配置用户的各种访问权限。这些功能极大地简化了数据库的使用过程,提高了用户体验。
|
为方便用户更高效地使用和管理 TDengine,TDengine 3.0 版本推出了一个全新的可视化组件 taosExplorer。这个组件旨在帮助用户在不熟悉 SQL 的情况下,也能轻松管理 TDengine 集群。通过 taosExplorer,用户可以轻松查看 TDengine 的运行状态、浏览数据、配置数据源、实现流计算和数据订阅等功能。此外,用户还可以利用 taosExplorer 进行数据的备份、复制和同步操作,以及配置用户的各种访问权限。这些功能极大地简化了数据库的使用过程,提高了用户体验。
|
||||||
|
|
||||||
本节介绍可视化管理的基本功能。
|
本节介绍可视化管理的基本功能。
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
下面通过创建数据库,来熟悉数据浏览器页面的功能和操作,接下来看创建数据库的两种方式:
|
下面通过创建数据库,来熟悉数据浏览器页面的功能和操作,接下来看创建数据库的两种方式:
|
||||||
|
|
||||||
1. 通过点击图中的 + 号,跳转到创建数据数库页面,点击 创建 按钮,如下图:
|
1. 通过点击图中的 + 号,跳转到创建数据数库页面,点击“创建”按钮,如下图:
|
||||||
|
|
||||||
第一步 点击 + 号;
|
第一步 点击 + 号;
|
||||||

|

|
||||||
|
@ -50,7 +50,7 @@ toc_max_heading_level: 4
|
||||||
弟三步 点击“创建”按钮之后,如下图左边出现数据库名称则创建数据库成功。
|
弟三步 点击“创建”按钮之后,如下图左边出现数据库名称则创建数据库成功。
|
||||||

|

|
||||||
|
|
||||||
2. 通过在 Sql 编辑器中数据 sql 语句,点击 执行 按钮,如下图:
|
2. 通过在 SQL 编辑器中数据 sql 语句,点击 执行 按钮,如下图:
|
||||||
|
|
||||||
第一步 输入 sql 语句;
|
第一步 输入 sql 语句;
|
||||||

|

|
||||||
|
@ -201,11 +201,11 @@ toc_max_heading_level: 4
|
||||||
## 工具
|
## 工具
|
||||||
|
|
||||||
通过 “工具” 页面,用户可以了解如下 TDengine 周边工具的使用方法。
|
通过 “工具” 页面,用户可以了解如下 TDengine 周边工具的使用方法。
|
||||||
- TDengine CLI。
|
- TDengine CLI
|
||||||
- taosBenchmark。
|
- taosBenchmark
|
||||||
- taosdump。
|
- taosdump
|
||||||
- TDengine 与 BI 工具的集成,例如 Google Data Studio、Power BI、永洪 BI 等。
|
- TDengine 与 BI 工具的集成,例如 Google Data Studio、Power BI、永洪 BI 等
|
||||||
- TDengine 与 Grafana、Seeq 的集成。
|
- TDengine 与 Grafana、Seeq 的集成
|
||||||
|
|
||||||
## 系统管理
|
## 系统管理
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
# 1. 基于 taosdump 进行数据备份恢复
|
# 1. 基于 taosdump 进行数据备份恢复
|
||||||
|
|
||||||
taosdump 是一个开源工具,用于支持从运行中的 TDengine 集群备份数据并将备份的数据恢复到相同或另一个正在运行的 TDengine
|
taosdump 是一个开源工具,用于支持从运行中的 TDengine 集群备份数据并将备份的数据恢复到相同或另一个正在运行的 TDengine 集群中。taosdump 可以将数据库作为逻辑数据单元进行备份,也可以对数据库中指定时间段内的数据记录进行备份。在使用 taosdump 时,可以指定数据备份的目录路径。如果不指定目录路径,taosdump 将默认将数据备份到当前目录。
|
||||||
集群中。taosdump 可以将数据库作为逻辑数据单元进行备份,也可以对数据库中指定时间段内的数据记录进行备份。在使用taosdump
|
|
||||||
时,可以指定数据备份的目录路径。如果不指定目录路径,taosdump 将默认将数据备份到当前目录。
|
|
||||||
|
|
||||||
以下为 taosdump 执行数据备份的使用示例。
|
以下为 taosdump 执行数据备份的使用示例。
|
||||||
|
|
||||||
|
@ -18,14 +16,11 @@ taosdump 是一个开源工具,用于支持从运行中的 TDengine 集群备
|
||||||
taosdump -h localhost -P 6030 -D dbname -o /file/path
|
taosdump -h localhost -P 6030 -D dbname -o /file/path
|
||||||
```
|
```
|
||||||
|
|
||||||
执行上述命令后,taosdump 会连接 localhost:6030 所在的 TDengine 集群,查询数据库 dbname 中的所有数据,并将数据备份到 /f
|
执行上述命令后,taosdump 会连接 localhost:6030 所在的 TDengine 集群,查询数据库 dbname 中的所有数据,并将数据备份到 /file/path 下。
|
||||||
ile/path 下。
|
|
||||||
|
|
||||||
在使用 taosdump 时,如果指定的存储路径已经包含数据文件,taosdump
|
在使用 taosdump 时,如果指定的存储路径已经包含数据文件,taosdump 会提示用户并立即退出,以避免数据被覆盖。这意味着同一存储路径只能用于一次备份。如果你看到相关提示,请谨慎操作,以免误操作导致数据丢失。
|
||||||
会提示用户并立即退出,以避免数据被覆盖。这意味着同一存储路径只能用于一次备份。如果你看到相关提示,请谨慎操作,以免误操作导致数据丢失。
|
|
||||||
|
|
||||||
要将本地指定文件路径中的数据文件恢复到正在运行的 TDengine 集群中,可以通过指定命令行参数和数据文件所在路径来执行 taosdump
|
要将本地指定文件路径中的数据文件恢复到正在运行的 TDengine 集群中,可以通过指定命令行参数和数据文件所在路径来执行 taosdump 命令。以下为 taosdump 执行数据恢复的示例代码。
|
||||||
命令。以下为 taosdump 执行数据恢复的示例代码。
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
taosdump -i /file/path -h localhost -P 6030
|
taosdump -i /file/path -h localhost -P 6030
|
||||||
|
@ -76,6 +71,17 @@ taosExplorer 服务页面中,进入“系统管理 - 备份”页面,在“
|
||||||
8. 备份文件大小:备份文件的大小限制。当备份文件大小达到此限制时,会自动创建新的备份文件。
|
8. 备份文件大小:备份文件的大小限制。当备份文件大小达到此限制时,会自动创建新的备份文件。
|
||||||
9. 文件压缩等级:备份文件的压缩等级。支持:最快速度、最佳压缩比、兼具速度和压缩比。
|
9. 文件压缩等级:备份文件的压缩等级。支持:最快速度、最佳压缩比、兼具速度和压缩比。
|
||||||
|
|
||||||
|
用户可以通过开启 S3 转储,将备份文件上传至 S3 存储服务上。开启 S3 转储,需要填写以下信息:
|
||||||
|
|
||||||
|
1. S3 节点:S3 节点的地址。
|
||||||
|
2. 访问密钥 ID:访问密钥 ID。
|
||||||
|
3. 访问密钥:访问密钥。
|
||||||
|
4. 存储桶:存储桶名称。
|
||||||
|
5. 区域:存储桶所在的区域。
|
||||||
|
6. 对象前缀:备份文件的对象前缀,类似于 S3 上的目录。
|
||||||
|
7. 本地备份文件的保留时长:本地备份的保留时间,所有早于`当前时间 - backup_retention_period`的文件都需要上传到 S3。
|
||||||
|
8. 本地备份文件的保留个数:本地备份文件的保留个数,本地只保留最新的`backup_retention_size`个备份文件。
|
||||||
|
|
||||||
创建成功后,备份计划会开始按照配置的参数运行。在“备份计划”下的列表中,可以查看已创建的备份计划。
|
创建成功后,备份计划会开始按照配置的参数运行。在“备份计划”下的列表中,可以查看已创建的备份计划。
|
||||||
|
|
||||||
备份计划支持以下操作:
|
备份计划支持以下操作:
|
||||||
|
|
|
@ -27,10 +27,8 @@ TDengine 支持 WAL 机制,实现数据的容错能力,保证数据的高可
|
||||||
|
|
||||||
- 第 3 步,访问 TDengine 集群 B,创建一个与集群 A 中数据库 db1 参数配置相同的数据库 db2。
|
- 第 3 步,访问 TDengine 集群 B,创建一个与集群 A 中数据库 db1 参数配置相同的数据库 db2。
|
||||||
|
|
||||||
- 第 4 步,通过 Web 浏览器访问集群 B 的 taosExplorer 服务,在 “数据浏览器” 页面找到 db2,在 “查看数据库配置” 选项中可以获取该数据库的 DSN,例如 taos+ws://root:taosdata@clusterB:6041/db2
|
- 第 4 步,通过 Web 浏览器访问集群 B 的 taosExplorer 服务,在 “数据浏览器” 页面找到 db2,在 “查看数据库配置” 选项中可以获取该数据库的 DSN,例如 `taos+ws://root:taosdata@clusterB:6041/db2`
|
||||||
|
|
||||||
- 第 5 步,在 taosExplorer 服务的“系统管理 - 数据同步”页面新增一个数据同步任务,在任务配置信息中填写需要同步的数据库 db1 和目标数据库 db2 的 DSN,完成创建任务后即可启动数据同步。
|
- 第 5 步,在 taosExplorer 服务的“系统管理 - 数据同步”页面新增一个数据同步任务,在任务配置信息中填写需要同步的数据库 db1 和目标数据库 db2 的 DSN,完成创建任务后即可启动数据同步。
|
||||||
|
|
||||||
- 第 6 步,访问集群 B,可以看到集群 B 中的数据库 db2 源源不断写入来自集群 A 数据库 db1 的数据,直至两个集群的数据库数据量基本保持一致。至此,一个简单的基于
|
- 第 6 步,访问集群 B,可以看到集群 B 中的数据库 db2 源源不断写入来自集群 A 数据库 db1 的数据,直至两个集群的数据库数据量基本保持一致。至此,一个简单的基于 TDengine Enterprise 的数据灾备体系搭建完成。
|
||||||
|
|
||||||
TDengine Enterprise 的数据灾备体系搭建完成。
|
|
|
@ -5,10 +5,10 @@ toc_max_heading_level: 4
|
||||||
---
|
---
|
||||||
|
|
||||||
本节介绍 TDengine Enterprise 特有的多级存储功能,其作用是将较近的热度较高的数据存储在高速介质上,而时间久远热度很低的数据存储在低成本介质上,达成了以下目标:
|
本节介绍 TDengine Enterprise 特有的多级存储功能,其作用是将较近的热度较高的数据存储在高速介质上,而时间久远热度很低的数据存储在低成本介质上,达成了以下目标:
|
||||||
- 降低存储成本 -- 将数据分级存储后,海量极冷数据存入廉价存储介质带来显著经济性
|
- **降低存储成本**:将数据分级存储后,海量极冷数据存入廉价存储介质带来显著经济性
|
||||||
- 提升写入性能 -- 得益于每级存储可支持多个挂载点,WAL 预写日志也支持 0 级的多挂载点并行写入,极大提升写入性能(实际场景测得支持持续写入每秒 3 亿测点以上),在机械硬盘上可获得极高磁盘 IO 吞吐(实测可达 2GB/s)
|
- **提升写入性能**:得益于每级存储可支持多个挂载点,WAL 预写日志也支持 0 级的多挂载点并行写入,极大提升写入性能(实际场景测得支持持续写入每秒 3 亿测点以上),在机械硬盘上可获得极高磁盘 IO 吞吐(实测可达 2GB/s)
|
||||||
- 方便维护 -- 配置好各级存储挂载点后,系统数据迁移等工作,无需人工干预;存储扩容更灵活、方便
|
- **方便维护**:配置好各级存储挂载点后,系统数据迁移等工作,无需人工干预;存储扩容更灵活、方便
|
||||||
- 对 SQL 透明 -- 无论查询的数据是否跨级,一条 SQL 可返回所有数据,简单高效
|
- **对 SQL 透明**:无论查询的数据是否跨级,一条 SQL 可返回所有数据,简单高效
|
||||||
|
|
||||||
多级存储所涉及的各层存储介质都是本地存储设备。除了本地存储设备之外,TDengine Enterprise 还支持使用对象存储(S3),将最冷的一批数据保存在最廉价的介质上,以进一步降低存储成本,并在必要时仍然可以进行查询,且数据存储在哪里也对 SQL 透明。支持对象存储在 3.3.0.0 版本中首次发布,建议使用最新版本。
|
多级存储所涉及的各层存储介质都是本地存储设备。除了本地存储设备之外,TDengine Enterprise 还支持使用对象存储(S3),将最冷的一批数据保存在最廉价的介质上,以进一步降低存储成本,并在必要时仍然可以进行查询,且数据存储在哪里也对 SQL 透明。支持对象存储在 3.3.0.0 版本中首次发布,建议使用最新版本。
|
||||||
|
|
||||||
|
@ -26,9 +26,11 @@ dataDir [path] <level> <primary>
|
||||||
```
|
```
|
||||||
|
|
||||||
- path: 挂载点的文件夹路径。
|
- path: 挂载点的文件夹路径。
|
||||||
- level: 介质存储等级,取值为 0,1,2。 0 级存储最新的数据,1 级存储次新的数据,2 级存储最老的数据,省略默认为 0。 各级存储之间的数据流向:0 级存储 -> 1 级存储 -> 2 级存储。 同一存储等级可挂载多个硬盘,同一存储等级上的数据文件分布在该存储等级的所有硬盘上。 需要说明的是,数据在不同级别的存储介质上的移动,是由系统自动完成的,用户无需干预。
|
- level:介质存储等级,取值为 0、1、2。 0 级存储最新的数据,1 级存储次新的数据,2 级存储最老的数据,省略默认为 0。各级存储之间的数据流向:0 级存储 -> 1 级存储 -> 2 级存储。 同一存储等级可挂载多个硬盘,同一存储等级上的数据文件分布在该存储等级的所有硬盘上。需要说明的是,数据在不同级别的存储介质上的移动,是由系统自动完成的,用户无需干预。
|
||||||
- primary: 是否为主挂载点,0(否)或 1(是),省略默认为 1。
|
- primary:是否为主挂载点,0(否)或 1(是),省略默认为 1。
|
||||||
|
|
||||||
在配置中,只允许一个主挂载点的存在(level=0,primary=1),例如采用如下的配置方式:
|
在配置中,只允许一个主挂载点的存在(level=0,primary=1),例如采用如下的配置方式:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
dataDir /mnt/data1 0 1
|
dataDir /mnt/data1 0 1
|
||||||
dataDir /mnt/data2 0 0
|
dataDir /mnt/data2 0 0
|
||||||
|
@ -38,7 +40,8 @@ dataDir /mnt/data5 2 0
|
||||||
dataDir /mnt/data6 2 0
|
dataDir /mnt/data6 2 0
|
||||||
```
|
```
|
||||||
|
|
||||||
**注意** 1. 多级存储不允许跨级配置,合法的配置方案有:仅 0 级,仅 0 级+ 1 级,以及 0 级+ 1 级+ 2 级。而不允许只配置 level=0 和 level=2,而不配置 level=1。
|
**注意**
|
||||||
|
1. 多级存储不允许跨级配置,合法的配置方案有:仅 0 级、仅 0 级 + 1 级、以及 0 级 + 1 级 + 2 级。而不允许只配置 level=0 和 level=2,而不配置 level=1。
|
||||||
2. 禁止手动移除使用中的挂载盘,挂载盘目前不支持非本地的网络盘。
|
2. 禁止手动移除使用中的挂载盘,挂载盘目前不支持非本地的网络盘。
|
||||||
|
|
||||||
### 负载均衡
|
### 负载均衡
|
||||||
|
@ -74,13 +77,13 @@ dataDir /mnt/data6 2 0
|
||||||
|
|
||||||
| 参数名称 | 参数含义 |
|
| 参数名称 | 参数含义 |
|
||||||
|:---------------------|:-----------------------------------------------|
|
|:---------------------|:-----------------------------------------------|
|
||||||
| s3EndPoint | 用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 的保持一致,否则无法访问。 |
|
| s3EndPoint | 用户所在地域的 COS 服务域名,支持 http 和 https,bucket 的区域需要与 endpoint 的保持一致,否则无法访问 |
|
||||||
| s3AccessKey | 冒号分隔的用户 SecretId:SecretKey。例如:AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E |
|
| s3AccessKey | 冒号分隔的用户 SecretId:SecretKey。例如:AKIDsQmwsfKxTo2A6nGVXZN0UlofKn6JRRSJ:lIdoy99ygEacU7iHfogaN2Xq0yumSm1E |
|
||||||
| s3BucketName | 存储桶名称,减号后面是用户注册 COS 服务的 AppId。其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔。参数值均为字符串类型,但不需要引号。例如:test0711-1309024725 |
|
| s3BucketName | 存储桶名称,减号后面是用户注册 COS 服务的 AppId。其中 AppId 是 COS 特有,AWS 和阿里云都没有,配置时需要作为 bucket name 的一部分,使用减号分隔。参数值均为字符串类型,但不需要引号。例如:test0711-1309024725 |
|
||||||
| s3UploadDelaySec | data 文件持续多长时间不再变动后上传至 s3,单位:秒。最小值:1;最大值:2592000(30天),默认值 60 秒 |
|
| s3UploadDelaySec | data 文件持续多长时间不再变动后上传至 s3,单位:秒。最小值:1;最大值:2592000(30天),默认值 60 秒 |
|
||||||
| s3PageCacheSize | S3 page cache 缓存页数目,单位:页。最小值:4;最大值:1024*1024*1024。 ,默认值 4096|
|
| s3PageCacheSize | S3 page cache 缓存页数目,单位:页。最小值:4;最大值:1024*1024*1024。 ,默认值 4096|
|
||||||
| s3MigrateIntervalSec | 本地数据文件自动上传 S3 的触发周期,单位为秒。最小值:600;最大值:100000。默认值 3600 |
|
| s3MigrateIntervalSec | 本地数据文件自动上传 S3 的触发周期,单位为秒。最小值:600;最大值:100000。默认值 3600 |
|
||||||
| s3MigrateEnabled | 是否自动进行 S3 迁移,默认值为 0,表示关闭自动 S3 迁移,可配置为 1。 |
|
| s3MigrateEnabled | 是否自动进行 S3 迁移,默认值为 0,表示关闭自动 S3 迁移,可配置为 1 |
|
||||||
|
|
||||||
#### 检查配置参数可用性
|
#### 检查配置参数可用性
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ alter_user_clause: {
|
||||||
- pass:修改用户密码。
|
- pass:修改用户密码。
|
||||||
- enable:是否启用用户。1 表示启用此用户,0 表示禁用此用户。
|
- enable:是否启用用户。1 表示启用此用户,0 表示禁用此用户。
|
||||||
- sysinfo :用户是否可查看系统信息。1 表示可以查看系统信息,0 表示不可以查看系统信息
|
- sysinfo :用户是否可查看系统信息。1 表示可以查看系统信息,0 表示不可以查看系统信息
|
||||||
- createdb:用户是否可创建数据库。1 表示可以创建数据库,0 表示不可以创建数据库。// 从 TDengine 企业版 3.3.2.0 开始支持
|
- createdb:用户是否可创建数据库。1 表示可以创建数据库,0 表示不可以创建数据库。从 TDengine 企业版 3.3.2.0 开始支持。
|
||||||
|
|
||||||
如下 SQL 禁用 test 用户。
|
如下 SQL 禁用 test 用户。
|
||||||
```sql
|
```sql
|
||||||
|
@ -76,7 +76,7 @@ drop user user_name
|
||||||
|
|
||||||
### 库和表的授权
|
### 库和表的授权
|
||||||
|
|
||||||
在 TDengine 中,库和表的权限分为 read (读)和 write (写)两种。这些权限可以单独授予,也可以同时授予用户。
|
在 TDengine 中,库和表的权限分为 read 和 write 两种。这些权限可以单独授予,也可以同时授予用户。
|
||||||
|
|
||||||
- read 权限:拥有 read 权限的用户仅能查询库或表中的数据,而无法对数据进行修改或删除。这种权限适用于需要访问数据但不需要对数据进行写入操作的场景,如数据分析师、报表生成器等。
|
- read 权限:拥有 read 权限的用户仅能查询库或表中的数据,而无法对数据进行修改或删除。这种权限适用于需要访问数据但不需要对数据进行写入操作的场景,如数据分析师、报表生成器等。
|
||||||
- write 权限:拥有 write 权限的用户可以向库或表中写入数据。这种权限适用于需要对数据进行写入操作的场景,如数据采集器、数据处理器等。如果只拥有 write 权限而没有 read 权限,则只能写入数据但不能查询数据。
|
- write 权限:拥有 write 权限的用户可以向库或表中写入数据。这种权限适用于需要对数据进行写入操作的场景,如数据采集器、数据处理器等。如果只拥有 write 权限而没有 read 权限,则只能写入数据但不能查询数据。
|
||||||
|
@ -101,10 +101,11 @@ resources :{
|
||||||
```
|
```
|
||||||
|
|
||||||
相关参数说明如下。
|
相关参数说明如下。
|
||||||
- resources :可以访问的库或表。. 之前为数据库名称,. 之后为表名称。dbname.tbname 的意思是名为 dbname 的数据库中的 tbname 表必须为普通表或超级表。dbname.* 的意思是名为 dbname 的数据库中的所有表。*.* 的意思是所有数据库中的所有表。
|
- resources:可以访问的库或表。`.` 之前为数据库名称,`.` 之后为表名称。`dbname.tbname` 的意思是名为 dbname 的数据库中的 tbname 表必须为普通表或超级表。`dbname.*` 的意思是名为 dbname 的数据库中的所有表。`*.*` 的意思是所有数据库中的所有表。
|
||||||
- tag_filter:超级表的过滤条件。
|
- tag_filter:超级表的过滤条件。
|
||||||
|
|
||||||
上述 SQL 既可以授权一个库、所有库,也可以授权一个库下的普通表或超级表,还可以通过 dbname.tbname 和 with 子句的组合授权符合过滤条件的一张超级表下的所有子表。
|
上述 SQL 既可以授权一个库、所有库,也可以授权一个库下的普通表或超级表,还可以通过 `dbname.tbname` 和 `with` 子句的组合授权符合过滤条件的一张超级表下的所有子表。
|
||||||
|
|
||||||
如下 SQL 将数据库 power 的 read 权限授权给用户 test。
|
如下 SQL 将数据库 power 的 read 权限授权给用户 test。
|
||||||
```sql
|
```sql
|
||||||
grant read on power to test
|
grant read on power to test
|
||||||
|
|
|
@ -28,20 +28,20 @@ ALTER USER TEST DROP HOST HOST_NAME1
|
||||||
```
|
```
|
||||||
说明
|
说明
|
||||||
- 开源版和企业版本都能添加成功,且可以查询到,但是开源版本不会对 IP 做任何限制。
|
- 开源版和企业版本都能添加成功,且可以查询到,但是开源版本不会对 IP 做任何限制。
|
||||||
- create user u_write pass 'taosdata1' host 'iprange1','iprange2', 可以一次添加多个 iprange, 服务端会做去重,去重的逻辑是需要 iprange 完全一样
|
- `create user u_write pass 'taosdata1' host 'iprange1','iprange2'`,可以一次添加多个 ip range,服务端会做去重,去重的逻辑是需要 ip range 完全一样
|
||||||
- 默认会把 127.0.0.1 添加到白名单列表,且在白名单列表可以查询
|
- 默认会把 `127.0.0.1` 添加到白名单列表,且在白名单列表可以查询
|
||||||
- 集群的节点 IP 集合会自动添加到白名单列表,但是查询不到。
|
- 集群的节点 IP 集合会自动添加到白名单列表,但是查询不到。
|
||||||
- taosadaper 和 taosd 不在一个机器的时候,需要把 taosadaper IP 手动添加到 taosd 白名单列表中
|
- taosadaper 和 taosd 不在一个机器的时候,需要把 taosadaper IP 手动添加到 taosd 白名单列表中
|
||||||
- 集群情况下,各个节点 enableWhiteList 成一样,或者全为 false,或者全为 true, 要不然集群无法启动
|
- 集群情况下,各个节点 enableWhiteList 成一样,或者全为 false,或者全为 true,要不然集群无法启动
|
||||||
- 白名单变更生效时间 1s,不超过 2s, 每次变更对收发性能有些微影响(多一次判断,可以忽略),变更完之后、影响忽略不计, 变更过程中对集群没有影响,对正在访问客户端也没有影响(假设这些客户端的 IP 包含在 white list 内)
|
- 白名单变更生效时间 1s,不超过 2s,每次变更对收发性能有些微影响(多一次判断,可以忽略),变更完之后、影响忽略不计,变更过程中对集群没有影响,对正在访问客户端也没有影响(假设这些客户端的 IP 包含在 white list 内)
|
||||||
- 如果添加两个 ip range, 192.168.1.1/16(假设为 A), 192.168.1.1/24(假设为 B), 严格来说,A 包含了 B,但是考虑情况太复杂,并不会对 A 和 B 做合并
|
- 如果添加两个 ip range,192.168.1.1/16(假设为 A),192.168.1.1/24(假设为 B),严格来说,A 包含了 B,但是考虑情况太复杂,并不会对 A 和 B 做合并
|
||||||
- 要删除的时候,必须严格匹配。 也就是如果添加的是 192.168.1.1/24, 要删除也是 192.168.1.1/24
|
- 要删除的时候,必须严格匹配。 也就是如果添加的是 192.168.1.1/24,要删除也是 192.168.1.1/24
|
||||||
- 只有 root 才有权限对其他用户增删 ip white list
|
- 只有 root 才有权限对其他用户增删 ip white list
|
||||||
- 兼容之前的版本,但是不支持从当前版本回退到之前版本
|
- 兼容之前的版本,但是不支持从当前版本回退到之前版本
|
||||||
- x.x.x.x/32 和 x.x.x.x 属于同一个 iprange, 显示为 x.x.x.x
|
- x.x.x.x/32 和 x.x.x.x 属于同一个 iprange,显示为 x.x.x.x
|
||||||
- 如果客户端拿到的 0.0.0.0/0, 说明没有开启白名单
|
- 如果客户端拿到的 0.0.0.0/0,说明没有开启白名单
|
||||||
- 如果白名单发生了改变, 客户端会在 heartbeat 里检测到。
|
- 如果白名单发生了改变, 客户端会在 heartbeat 里检测到。
|
||||||
- 针对一个 user, 添加的 IP 个数上限是 2048
|
- 针对一个 user,添加的 IP 个数上限是 2048
|
||||||
|
|
||||||
## 审计日志
|
## 审计日志
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ TDengine 先对用户操作进行记录和管理,然后将这些作为审计
|
||||||
|
|
||||||
| 参数名称 | 参数含义 |
|
| 参数名称 | 参数含义 |
|
||||||
|:-------------:|:--------------------------------------------------------:|
|
|:-------------:|:--------------------------------------------------------:|
|
||||||
|audit | 是否打开审计日志,默认值为 0。1 为开启,0 为关闭 |
|
|audit | 是否打开审计日志,1 为开启,0 为关闭,默认值为 0。 |
|
||||||
|monitorFqdn | 接收审计日志的 taosKeeper 所在服务器的 FQDN |
|
|monitorFqdn | 接收审计日志的 taosKeeper 所在服务器的 FQDN |
|
||||||
|monitorPort | 接收审计日志的 taosKeeper 服务所用端口 |
|
|monitorPort | 接收审计日志的 taosKeeper 服务所用端口 |
|
||||||
|monitorCompaction | 上报数据时是否进行压缩 |
|
|monitorCompaction | 上报数据时是否进行压缩 |
|
||||||
|
@ -64,7 +64,7 @@ TDengine 先对用户操作进行记录和管理,然后将这些作为审计
|
||||||
|
|
||||||
| 参数名称 | 参数含义 |
|
| 参数名称 | 参数含义 |
|
||||||
|:-------------:|:--------------------------------------------------------:|
|
|:-------------:|:--------------------------------------------------------:|
|
||||||
|auditDB | 用于存放审计日志的数据库的名字,默认值为 "audit" ,taosKeeper 在收到上报的审计日志后会判断该数据库是否存在,如果不存在会自动创建它 |
|
|auditDB | 用于存放审计日志的数据库的名字,默认值为 "audit",taosKeeper 在收到上报的审计日志后会判断该数据库是否存在,如果不存在会自动创建 |
|
||||||
|
|
||||||
### 数据格式
|
### 数据格式
|
||||||
|
|
||||||
|
@ -88,19 +88,19 @@ TDengine 先对用户操作进行记录和管理,然后将这些作为审计
|
||||||
taosKeeper 会依据上报的审计数据在相应的数据库中自动建立超级表用于存储数据。该超级表的定义如下
|
taosKeeper 会依据上报的审计数据在相应的数据库中自动建立超级表用于存储数据。该超级表的定义如下
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
CREATE STABLE operations(ts timestamp, details VARCHAR(64000), User VARCHAR(25), Operation VARCHAR(20), db VARCHAR(65), resource VARCHAR(193), client_add(25)) TAGS (clusterID VARCHAR(64) );
|
create stable operations(ts timestamp, details varchar(64000), user varchar(25), operation varchar(20), db varchar(65), resource varchar(193), client_add(25)) tags (clusterID varchar(64) );
|
||||||
```
|
```
|
||||||
|
|
||||||
其中:
|
其中
|
||||||
1. db 为操作涉及的 database,resource 为操作涉及的资源。
|
1. db 为操作涉及的 database,resource 为操作涉及的资源。
|
||||||
2. User 和 Operation 为数据列,表示哪个用户在该对象上进行了什么操作
|
2. user 和 operation 为数据列,表示哪个用户在该对象上进行了什么操作
|
||||||
3. timestamp 为时间戳列,表示操作发生时的时间
|
3. timestamp 为时间戳列,表示操作发生时的时间
|
||||||
4. details 为该操作的一些补充细节,在大多数操作下是所执行的操作的 SQL 语句。
|
4. details 为该操作的一些补充细节,在大多数操作下是所执行的操作的 SQL 语句。
|
||||||
5. client_add 为客户端地址,包括 ip 和端口
|
5. client_add 为客户端地址,包括 ip 和端口
|
||||||
|
|
||||||
### 操作列表
|
### 操作列表
|
||||||
|
|
||||||
目前审计日志中所记录的操作列表以及每个操作中各字段的含义如下表(注:因为每个操作的实加者即 user 字段、时间戳字段和client_add在所有操作中的含义相同,下表不包含)
|
目前审计日志中所记录的操作列表以及每个操作中各字段的含义(因为每个操作的施加者,即 user、client_add、时间戳字段在所有操作中的含义相同,下表不再描述)
|
||||||
|
|
||||||
| 操作 | Operation | DB | Resource | Details |
|
| 操作 | Operation | DB | Resource | Details |
|
||||||
| ----------------| ----------| ---------| ---------| --------|
|
| ----------------| ----------| ---------| ---------| --------|
|
||||||
|
@ -110,8 +110,8 @@ CREATE STABLE operations(ts timestamp, details VARCHAR(64000), User VARCHAR(25
|
||||||
| create stable | createStb | db name | stable name | SQL |
|
| create stable | createStb | db name | stable name | SQL |
|
||||||
| alter stable | alterStb | db name | stable name | SQL |
|
| alter stable | alterStb | db name | stable name | SQL |
|
||||||
| drop stable | dropStb | db name | stable name | SQL |
|
| drop stable | dropStb | db name | stable name | SQL |
|
||||||
| create user | createUser | NULL | 被创建的用户名 | 用户属性参数, (password除外) |
|
| create user | createUser | NULL | 被创建的用户名 | 用户属性参数, (password 除外) |
|
||||||
| alter user | alterUser | NULL | 被修改的用户名 | 修改密码操作记录的是被修改的参数和新值 (password除外) ;其他操作记录SQL |
|
| alter user | alterUser | NULL | 被修改的用户名 | 修改密码记录被修改的参数和新值 (password 除外),其他操作记录 SQL |
|
||||||
| drop user | dropUser | NULL | 被删除的用户名 | SQL |
|
| drop user | dropUser | NULL | 被删除的用户名 | SQL |
|
||||||
| create topic | createTopic | topic 所在 DB | 创建的 topic 名字 | SQL |
|
| create topic | createTopic | topic 所在 DB | 创建的 topic 名字 | SQL |
|
||||||
| drop topic | cropTopic | topic 所在 DB | 删除的 topic 名字 | SQL |
|
| drop topic | cropTopic | topic 所在 DB | 删除的 topic 名字 | SQL |
|
||||||
|
@ -123,7 +123,7 @@ CREATE STABLE operations(ts timestamp, details VARCHAR(64000), User VARCHAR(25
|
||||||
| create qnode | createQnode | NULL | dnodeId | SQL |
|
| create qnode | createQnode | NULL | dnodeId | SQL |
|
||||||
| drop qnode | dropQnode | NULL | dnodeId | SQL |
|
| drop qnode | dropQnode | NULL | dnodeId | SQL |
|
||||||
| login | login | NULL | NULL | appName |
|
| login | login | NULL | NULL | appName |
|
||||||
| create stream | createStream | NULL | 所创建的 strem 名 | SQL |
|
| create stream | createStream | NULL | 所创建的 stream 名 | SQL |
|
||||||
| drop stream | dropStream | NULL | 所删除的 stream 名 | SQL |
|
| drop stream | dropStream | NULL | 所删除的 stream 名 | SQL |
|
||||||
| grant privileges| grantPrivileges | NULL | 所授予的用户 | SQL |
|
| grant privileges| grantPrivileges | NULL | 所授予的用户 | SQL |
|
||||||
| remove privileges | revokePrivileges | NULL | 被收回权限的用户 | SQL |
|
| remove privileges | revokePrivileges | NULL | 被收回权限的用户 | SQL |
|
||||||
|
@ -171,7 +171,7 @@ database_option: {
|
||||||
```
|
```
|
||||||
|
|
||||||
主要参数说明如下。
|
主要参数说明如下。
|
||||||
encrypt_algorithm:指定数据采用的加密算法。默认是 none,即不采用加密。sm4 表示采用 SM4 加密算法
|
- encrypt_algorithm:指定数据采用的加密算法。默认是 none,即不采用加密。sm4 表示采用 SM4 加密算法
|
||||||
|
|
||||||
### 查看加密配置
|
### 查看加密配置
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ select name, `encrypt_algorithm` from ins_databases;
|
||||||
|
|
||||||
### 查看节点密钥状态
|
### 查看节点密钥状态
|
||||||
|
|
||||||
通过以下的SQL命令参看节点密钥状态:
|
通过以下的 SQL 命令参看节点密钥状态。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
show encryptions;
|
show encryptions;
|
||||||
|
@ -200,12 +200,12 @@ select * from information_schema.ins_encryptions;
|
||||||
```
|
```
|
||||||
key_status 有三种取值:
|
key_status 有三种取值:
|
||||||
- 当节点未设置密钥时,状态列显示 unset。
|
- 当节点未设置密钥时,状态列显示 unset。
|
||||||
- 当密钥被检验成功并且加载后,状态列显示 loaded.
|
- 当密钥被检验成功并且加载后,状态列显示 loaded。
|
||||||
- 当节点未启动,key的状态无法被探知时,状态列显示 unknown
|
- 当节点未启动,key 的状态无法被探知时,状态列显示 unknown。
|
||||||
|
|
||||||
### 更新密钥配置
|
### 更新密钥配置
|
||||||
|
|
||||||
当节点的硬件配置发生变更时,需要通过以下命令更新密钥,与离线配置密钥的命令相同:
|
当节点的硬件配置发生变更时,需要通过以下命令更新密钥,与离线配置密钥的命令相同。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
taosd -y {encryptKey}
|
taosd -y {encryptKey}
|
||||||
|
|
|
@ -81,7 +81,12 @@ taosx replica start -f source_endpoint -t sink_endpoint [database...]
|
||||||
taosx replica start -f td1:6030 -t td2:6030
|
taosx replica start -f td1:6030 -t td2:6030
|
||||||
```
|
```
|
||||||
|
|
||||||
该示例命令会自动创建除 information_schema、performance_schema、log、audit 库之外的同步任务。可以使用 `http://td2:6041` 指定该 endpoint 使用 websocket 接口(默认是原生接口)。也可以指定数据库同步:taosx replica start -f td1:6030 -t td2:6030 db1 仅创建指定的数据库同步任务。
|
该示例命令会自动创建除 information_schema、performance_schema、log、audit 库之外的同步任务,并持续监听新增的数据库,当 td1 和 td2 中新增同名数据库时可自动启动新增数据库的数据复制任务。需要说明的是:
|
||||||
|
|
||||||
|
- 可以使用 `http://td2:6041` 指定该 endpoint 使用 websocket 接口(默认是原生接口)。
|
||||||
|
- 可以使用 `--new-database-checking-interval <SECONDS>` 指定新增数据库的检查间隔,默认为 30 分钟。
|
||||||
|
- 可以使用 `--no-new-databases` 禁用监听行为。
|
||||||
|
- 也可以指定数据库同步:taosx replica start -f td1:6030 -t td2:6030 db1 仅创建指定的数据库同步任务。此时相当于配置了 `--no-new-databases`,不会开启新增数据库自动同步。
|
||||||
|
|
||||||
2. 方法二
|
2. 方法二
|
||||||
|
|
||||||
|
@ -121,6 +126,7 @@ taosx replica stop id [db...]
|
||||||
该命令作用如下:
|
该命令作用如下:
|
||||||
1. 停止指定 Replica ID 下所有或指定数据库的双副本同步任务。
|
1. 停止指定 Replica ID 下所有或指定数据库的双副本同步任务。
|
||||||
2. 使用 `taosx replica stop id1 db1` 表示停止 id1 replica 下 db1的同步任务。
|
2. 使用 `taosx replica stop id1 db1` 表示停止 id1 replica 下 db1的同步任务。
|
||||||
|
3. `--no-new-databases` 选项启用时,不停止新增数据库监听任务,仅停止当前同步中的数据库。
|
||||||
|
|
||||||
### 重启双活任务
|
### 重启双活任务
|
||||||
|
|
||||||
|
@ -145,7 +151,7 @@ taosx replica diff id [db....]
|
||||||
| replica | database | source | sink | vgroup_id | current | latest | diff |
|
| replica | database | source | sink | vgroup_id | current | latest | diff |
|
||||||
+---------+----------+----------+----------+-----------+---------+---------+------+
|
+---------+----------+----------+----------+-----------+---------+---------+------+
|
||||||
| a | opc | td1:6030 | td2:6030 | 2 | 17600 | 17600 | 0 |
|
| a | opc | td1:6030 | td2:6030 | 2 | 17600 | 17600 | 0 |
|
||||||
| ad | opc | td2:6030 | td2:6030 | 3 | 17600 | 17600 | 0 |
|
| a | opc | td2:6030 | td2:6030 | 3 | 17600 | 17600 | 0 |
|
||||||
```
|
```
|
||||||
|
|
||||||
### 删除双活任务
|
### 删除双活任务
|
||||||
|
@ -156,6 +162,16 @@ taosx replica remove id [--force]
|
||||||
|
|
||||||
删除当前所有双活同步任务。正常情况下要想删除同步任务,需要先 stop 该任务;但当 --force 启用时,会强制停止并清除任务。
|
删除当前所有双活同步任务。正常情况下要想删除同步任务,需要先 stop 该任务;但当 --force 启用时,会强制停止并清除任务。
|
||||||
|
|
||||||
|
`--no-new-databases` 选项启用时,不会删除新增数据库同步任务,仅删除当前数据库的同步任务。当 taosx 重启后,如果删除的数据库任务对应的数据库仍然存在,则会继续创建同步任务;不重启 taosx 或者不更新双活监听任务时,也不会再新建这些数据库的同步任务。
|
||||||
|
|
||||||
|
### 更新双活新增数据库检查间隔
|
||||||
|
|
||||||
|
```shell
|
||||||
|
taosx replica update id --new-database-checking-interval <SECONDS>
|
||||||
|
```
|
||||||
|
|
||||||
|
更新双活新增数据库的检查间隔,单位为秒。
|
||||||
|
|
||||||
### 推荐使用步骤
|
### 推荐使用步骤
|
||||||
|
|
||||||
1. 假定在机器 A 上运行,需要首先使用 taosx replica start 来配置 taosX,其输入参数是待同步的源端和目标端服务器地址 ,在完成配置后会自动启动同步服务和任务。此处假定 taosx 服务使用标准端口,同步任务使用原生连接。
|
1. 假定在机器 A 上运行,需要首先使用 taosx replica start 来配置 taosX,其输入参数是待同步的源端和目标端服务器地址 ,在完成配置后会自动启动同步服务和任务。此处假定 taosx 服务使用标准端口,同步任务使用原生连接。
|
||||||
|
|
|
@ -4,7 +4,7 @@ title: TDengine Kafka Connector
|
||||||
description: 使用 TDengine Kafka Connector 的详细指南
|
description: 使用 TDengine Kafka Connector 的详细指南
|
||||||
---
|
---
|
||||||
|
|
||||||
TDengine Kafka Connector 包含两个插件: TDengine Source Connector 和 TDengine Sink Connector。用户只需提供简单的配置文件,就可以将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine, 或将 TDengine 中指定数据库的数据(批量或实时)同步到 Kafka。
|
TDengine Kafka Connector 包含 TDengine Source Connector 和 TDengine Sink Connector 两个插件。用户只需提供简单的配置文件,就可以将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine,或将 TDengine 中指定数据库的数据(批量或实时)同步到 Kafka。
|
||||||
|
|
||||||
## 什么是 Kafka Connect?
|
## 什么是 Kafka Connect?
|
||||||
|
|
||||||
|
@ -346,16 +346,16 @@ curl -X DELETE http://localhost:8083/connectors/TDengineSourceConnector
|
||||||
|
|
||||||
以下配置项对 TDengine Sink Connector 和 TDengine Source Connector 均适用。
|
以下配置项对 TDengine Sink Connector 和 TDengine Source Connector 均适用。
|
||||||
|
|
||||||
1. `name`: connector 名称。
|
1. `name`:connector 名称。
|
||||||
1. `connector.class`: connector 的完整类名, 如: com.taosdata.kafka.connect.sink.TDengineSinkConnector。
|
1. `connector.class`:connector 的完整类名,例如如 com.taosdata.kafka.connect.sink.TDengineSinkConnector。
|
||||||
1. `tasks.max`: 最大任务数, 默认 1。
|
1. `tasks.max`:最大任务数, 默认 1。
|
||||||
1. `topics`: 需要同步的 topic 列表, 多个用逗号分隔, 如 `topic1,topic2`。
|
1. `topics`:需要同步的 topic 列表,多个用逗号分隔, 如 `topic1,topic2`。
|
||||||
1. `connection.url`: TDengine JDBC 连接字符串, 如 `jdbc:TAOS://127.0.0.1:6030`。
|
1. `connection.url`:TDengine JDBC 连接字符串,如 `jdbc:TAOS://127.0.0.1:6030`。
|
||||||
1. `connection.user`:TDengine 用户名,默认 root。
|
1. `connection.user`:TDengine 用户名,默认 root。
|
||||||
1. `connection.password`:TDengine 用户密码,默认 taosdata。
|
1. `connection.password`:TDengine 用户密码,默认 taosdata。
|
||||||
1. `connection.attempts`:最大尝试连接次数。默认 3。
|
1. `connection.attempts`:最大尝试连接次数。默认 3。
|
||||||
1. `connection.backoff.ms`:创建连接失败重试时间隔时间,单位为 ms。默认 5000。
|
1. `connection.backoff.ms`:创建连接失败重试时间隔时间,单位为 ms。默认 5000。
|
||||||
1. `data.precision`: 使用 InfluxDB 行协议格式时,时间戳的精度。可选值为:
|
1. `data.precision`:使用 InfluxDB 行协议格式时,时间戳的精度。可选值为:
|
||||||
1. ms:表示毫秒
|
1. ms:表示毫秒
|
||||||
1. us:表示微秒
|
1. us:表示微秒
|
||||||
1. ns:表示纳秒
|
1. ns:表示纳秒
|
||||||
|
@ -364,29 +364,29 @@ curl -X DELETE http://localhost:8083/connectors/TDengineSourceConnector
|
||||||
|
|
||||||
1. `connection.database`:目标数据库名。如果指定的数据库不存在会则自动创建。自动建库使用的时间精度为纳秒。默认值为 null。为 null 时目标数据库命名规则参考 `connection.database.prefix` 参数的说明
|
1. `connection.database`:目标数据库名。如果指定的数据库不存在会则自动创建。自动建库使用的时间精度为纳秒。默认值为 null。为 null 时目标数据库命名规则参考 `connection.database.prefix` 参数的说明
|
||||||
2. `connection.database.prefix`:当 connection.database 为 null 时, 目标数据库的前缀。可以包含占位符 '$\{topic}'。比如 kafka_$\{topic}, 对于主题 'orders' 将写入数据库 'kafka_orders'。默认 null。当为 null 时,目标数据库的名字和主题的名字是一致的。
|
2. `connection.database.prefix`:当 connection.database 为 null 时, 目标数据库的前缀。可以包含占位符 '$\{topic}'。比如 kafka_$\{topic}, 对于主题 'orders' 将写入数据库 'kafka_orders'。默认 null。当为 null 时,目标数据库的名字和主题的名字是一致的。
|
||||||
3. `batch.size`: 分批写入每批记录数。当 Sink Connector 一次接收到的数据大于这个值时将分批写入。
|
3. `batch.size`:分批写入每批记录数。当 Sink Connector 一次接收到的数据大于这个值时将分批写入。
|
||||||
4. `max.retries`: 发生错误时的最大重试次数。默认为 1。
|
4. `max.retries`:发生错误时的最大重试次数。默认为 1。
|
||||||
5. `retry.backoff.ms`: 发送错误时重试的时间间隔。单位毫秒,默认为 3000。
|
5. `retry.backoff.ms`:发送错误时重试的时间间隔。单位毫秒,默认为 3000。
|
||||||
6. `db.schemaless`: 数据格式,可选值为:
|
6. `db.schemaless`:数据格式,可选值为:
|
||||||
1. line:代表 InfluxDB 行协议格式
|
1. line:代表 InfluxDB 行协议格式
|
||||||
2. json : 代表 OpenTSDB JSON 格式
|
2. json:代表 OpenTSDB JSON 格式
|
||||||
3. telnet:代表 OpenTSDB Telnet 行协议格式
|
3. telnet:代表 OpenTSDB Telnet 行协议格式
|
||||||
|
|
||||||
### TDengine Source Connector 特有的配置
|
### TDengine Source Connector 特有的配置
|
||||||
|
|
||||||
1. `connection.database`: 源数据库名称,无缺省值。
|
1. `connection.database`:源数据库名称,无缺省值。
|
||||||
1. `topic.prefix`:数据导入 kafka 时使用的 topic 名称的前缀。默认为空字符串 ""。
|
1. `topic.prefix`:数据导入 kafka 时使用的 topic 名称的前缀。默认为空字符串 ""。
|
||||||
1. `timestamp.initial`: 数据同步起始时间。格式为'yyyy-MM-dd HH:mm:ss',若未指定则从指定 DB 中最早的一条记录开始。
|
1. `timestamp.initial`:数据同步起始时间。格式为'yyyy-MM-dd HH:mm:ss',若未指定则从指定 DB 中最早的一条记录开始。
|
||||||
1. `poll.interval.ms`: 检查是否有新建或删除的表的时间间隔,单位为 ms。默认为 1000。
|
1. `poll.interval.ms`:检查是否有新建或删除的表的时间间隔,单位为 ms。默认为 1000。
|
||||||
1. `fetch.max.rows` : 检索数据库时最大检索条数。 默认为 100。
|
1. `fetch.max.rows`:检索数据库时最大检索条数。默认为 100。
|
||||||
1. `query.interval.ms`: 从 TDengine 一次读取数据的时间跨度,需要根据表中的数据特征合理配置,避免一次查询的数据量过大或过小;在具体的环境中建议通过测试设置一个较优值,默认值为 0,即获取到当前最新时间的所有数据。
|
1. `query.interval.ms`:从 TDengine 一次读取数据的时间跨度,需要根据表中的数据特征合理配置,避免一次查询的数据量过大或过小;在具体的环境中建议通过测试设置一个较优值,默认值为 0,即获取到当前最新时间的所有数据。
|
||||||
1. `out.format` : 结果集输出格式。`line` 表示输出格式为 InfluxDB Line 协议格式,`json` 表示输出格式是 json。默认为 line。
|
1. `out.format`:结果集输出格式。`line` 表示输出格式为 InfluxDB Line 协议格式,`json` 表示输出格式是 json。默认为 line。
|
||||||
1. `topic.per.stable`: 如果设置为 true,表示一个超级表对应一个 Kafka topic,topic的命名规则 `<topic.prefix><topic.delimiter><connection.database><topic.delimiter><stable.name>`;如果设置为 false,则指定的 DB 中的所有数据进入一个 Kafka topic,topic 的命名规则为 `<topic.prefix><topic.delimiter><connection.database>`
|
1. `topic.per.stable`:如果设置为 true,表示一个超级表对应一个 Kafka topic,topic的命名规则 `<topic.prefix><topic.delimiter><connection.database><topic.delimiter><stable.name>`;如果设置为 false,则指定的 DB 中的所有数据进入一个 Kafka topic,topic 的命名规则为 `<topic.prefix><topic.delimiter><connection.database>`
|
||||||
1. `topic.ignore.db`: topic 命名规则是否包含 database 名称,true 表示规则为 `<topic.prefix><topic.delimiter><stable.name>`,false 表示规则为 `<topic.prefix><topic.delimiter><connection.database><topic.delimiter><stable.name>`,默认 false。此配置项在 `topic.per.stable` 设置为 false 时不生效。
|
1. `topic.ignore.db`:topic 命名规则是否包含 database 名称,true 表示规则为 `<topic.prefix><topic.delimiter><stable.name>`,false 表示规则为 `<topic.prefix><topic.delimiter><connection.database><topic.delimiter><stable.name>`,默认 false。此配置项在 `topic.per.stable` 设置为 false 时不生效。
|
||||||
1. `topic.delimiter`: topic 名称分割符,默认为 `-`。
|
1. `topic.delimiter`:topic 名称分割符,默认为 `-`。
|
||||||
1. `read.method`: 从 TDengine 读取数据方式,query 或是 subscription。默认为 subscription。
|
1. `read.method`:从 TDengine 读取数据方式,query 或是 subscription。默认为 subscription。
|
||||||
1. `subscription.group.id`: 指定 TDengine 数据订阅的组 id,当 `read.method` 为 subscription 时,此项为必填项。
|
1. `subscription.group.id`:指定 TDengine 数据订阅的组 id,当 `read.method` 为 subscription 时,此项为必填项。
|
||||||
1. `subscription.from`: 指定 TDengine 数据订阅起始位置,latest 或是 earliest。默认为 latest。
|
1. `subscription.from`:指定 TDengine 数据订阅起始位置,latest 或是 earliest。默认为 latest。
|
||||||
|
|
||||||
## 其他说明
|
## 其他说明
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,11 @@ TDengine连接器兼容TDengine Cloud和TDengine Server两种类型的数据源
|
||||||
- URL 和 TDengine Cloud Token,可以从 TDengine Cloud 的实例列表中获取。
|
- URL 和 TDengine Cloud Token,可以从 TDengine Cloud 的实例列表中获取。
|
||||||
- 数据库名称和超级表名称。
|
- 数据库名称和超级表名称。
|
||||||
- 查询数据的开始时间和结束时间。
|
- 查询数据的开始时间和结束时间。
|
||||||
|
|
||||||
第 2 步,Looker Studio 会根据配置自动加载所配置的 TDengine 数据库下的超级表的字段和标签。
|
第 2 步,Looker Studio 会根据配置自动加载所配置的 TDengine 数据库下的超级表的字段和标签。
|
||||||
|
|
||||||
第 3 步,点击页面右上角的 Explore 按钮,即查看从 TDengine 数据库中加载的数据。
|
第 3 步,点击页面右上角的 Explore 按钮,即查看从 TDengine 数据库中加载的数据。
|
||||||
|
|
||||||
第 4 步,根据需求,利用 Looker Studio 提供的图表,进行数据可视化的配置。
|
第 4 步,根据需求,利用 Looker Studio 提供的图表,进行数据可视化的配置。
|
||||||
|
|
||||||
**注意** 在第一次使用时,请根据页面提示,对 Looker Studio 的 TDengine 连接器进行访问授权。
|
**注意** 在第一次使用时,请根据页面提示,对 Looker Studio 的 TDengine 连接器进行访问授权。
|
|
@ -8,8 +8,8 @@ Tableau 是一款知名的商业智能工具,它支持多种数据源,可方
|
||||||
## 前置条件
|
## 前置条件
|
||||||
|
|
||||||
准备以下环境:
|
准备以下环境:
|
||||||
- TDengine 3.3.5.4 以上版本集群已部署并正常运行(企业及社区版均可)
|
- TDengine 3.3.5.8 以上版本集群已部署并正常运行(企业及社区版均可)。
|
||||||
- taosAdapter 能够正常运行。详细参考 [taosAdapter 参考手册](../../../reference/components/taosadapter)
|
- taosAdapter 能够正常运行。详细参考 [taosAdapter 参考手册](../../../reference/components/taosadapter)。
|
||||||
- Tableau 桌面版安装并运行(如未安装,请下载并安装 Windows 操作系统 64 位 [Tableau 桌面版](https://www.tableau.com/products/desktop/download) )。安装 Tableau 桌面版请参考 [官方文档](https://www.tableau.com)。
|
- Tableau 桌面版安装并运行(如未安装,请下载并安装 Windows 操作系统 64 位 [Tableau 桌面版](https://www.tableau.com/products/desktop/download) )。安装 Tableau 桌面版请参考 [官方文档](https://www.tableau.com)。
|
||||||
- 从 TDengine 官网下载最新的 Windows 操作系统 X64 客户端驱动程序,并进行安装。详细参考 [安装 ODBC 驱动](../../../reference/connector/odbc/#安装)。
|
- 从 TDengine 官网下载最新的 Windows 操作系统 X64 客户端驱动程序,并进行安装。详细参考 [安装 ODBC 驱动](../../../reference/connector/odbc/#安装)。
|
||||||
|
|
||||||
|
@ -18,7 +18,11 @@ Tableau 是一款知名的商业智能工具,它支持多种数据源,可方
|
||||||
|
|
||||||
**第 1 步**,在 Windows 操作系统的开始菜单中搜索并打开“ODBC数据源(64位)”管理工具并进行配置。详细参考 [配置ODBC数据源](../../../reference/connector/odbc/#配置数据源)。
|
**第 1 步**,在 Windows 操作系统的开始菜单中搜索并打开“ODBC数据源(64位)”管理工具并进行配置。详细参考 [配置ODBC数据源](../../../reference/connector/odbc/#配置数据源)。
|
||||||
|
|
||||||
**第 2 步**,在 Windows 系统环境下启动 Tableau,之后在其连接页面中搜索 “ODBC”,并选择 “其他数据库 (ODBC)”。
|
:::tip
|
||||||
|
需要注意的是,在为 Tableau 配置 ODBC 数据源时,TDengine ODBC 数据源配置页面中的【数据库】配置项为必填项,需选择一个可成功连接的数据库。
|
||||||
|
:::
|
||||||
|
|
||||||
|
**第 2 步**,在 Windows 系统环境下启动 Tableau,之后在其连接页面中搜索 “ODBC”,并选择 “其他数据库 (ODBC)”。 对于 Tableau 的使用的ODBC数据源,在其 TDengine ODBC 数据源配置页面的【数据库】的配置项为必填,需要选择可以连接的数据库。
|
||||||
|
|
||||||
**第 3 步**,点击 `DSN` 单选框,接着选择已配置好的数据源(MyTDengine),然后点击`连接`按钮。待连接成功后,删除字符串附加部分的内容,最后点击`登录`按钮即可。
|
**第 3 步**,点击 `DSN` 单选框,接着选择已配置好的数据源(MyTDengine),然后点击`连接`按钮。待连接成功后,删除字符串附加部分的内容,最后点击`登录`按钮即可。
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: 与 Excel 集成
|
||||||
## 前置条件
|
## 前置条件
|
||||||
|
|
||||||
准备以下环境:
|
准备以下环境:
|
||||||
- TDengine 3.3.5.7 以上版本集群已部署并正常运行(企业及社区版均可)。
|
- TDengine 3.3.5.8 以上版本集群已部署并正常运行(企业及社区版均可)。
|
||||||
- taosAdapter 能够正常运行,详细参考 [taosAdapter 参考手册](../../../reference/components/taosadapter)。
|
- taosAdapter 能够正常运行,详细参考 [taosAdapter 参考手册](../../../reference/components/taosadapter)。
|
||||||
- Excel 安装并运行, 如未安装,请下载并安装, 具体操作请参考 Microsoft 官方文档。
|
- Excel 安装并运行, 如未安装,请下载并安装, 具体操作请参考 Microsoft 官方文档。
|
||||||
- 从 TDengine 官网下载最新的 Windows 操作系统 X64 客户端驱动程序并进行安装,详细参考 [安装 ODBC 驱动](../../../reference/connector/odbc/#安装)。
|
- 从 TDengine 官网下载最新的 Windows 操作系统 X64 客户端驱动程序并进行安装,详细参考 [安装 ODBC 驱动](../../../reference/connector/odbc/#安装)。
|
||||||
|
|
|
@ -19,8 +19,7 @@ qStudio 是一款免费的多平台 SQL 数据分析工具,可以轻松浏览
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
2. 配置 TDengine 连接,填入主机地址、端口号、用户名和密码。如果 TDengine 部署在本机,可以只填用户名和密码,默认用户名为 root,默认密码为 taosdata。点击“Test”可以对连接是否可用进行测试。如果本机没有安装 TDengine Java
|
2. 配置 TDengine 连接,填入主机地址、端口号、用户名和密码。如果 TDengine 部署在本机,可以只填用户名和密码,默认用户名为 root,默认密码为 taosdata。点击 “Test” 可以对连接是否可用进行测试。如果本机没有安装 TDengine Java 连接器,qStudio 会提示下载安装。
|
||||||
连接器,qStudio 会提示下载安装。
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -42,17 +42,17 @@ tmq+ws://root:taosdata@localhost:6030/db1?timeout=never
|
||||||
- taos:使用查询接口从 TDengine 获取数据
|
- taos:使用查询接口从 TDengine 获取数据
|
||||||
- tmq:启用数据订阅从 TDengine 获取数据
|
- tmq:启用数据订阅从 TDengine 获取数据
|
||||||
- local:数据备份或恢复
|
- local:数据备份或恢复
|
||||||
- pi: 启用 pi-connector从 pi 数据库中获取数据
|
- pi:启用 pi-connector从 pi 数据库中获取数据
|
||||||
- opc:启用 opc-connector 从 opc-server 中获取数据
|
- opc:启用 opc-connector 从 opc-server 中获取数据
|
||||||
- mqtt: 启用 mqtt-connector 获取 mqtt-broker 中的数据
|
- mqtt:启用 mqtt-connector 获取 mqtt-broker 中的数据
|
||||||
- kafka: 启用 Kafka 连接器从 Kafka Topics 中订阅消息写入
|
- kafka:启用 Kafka 连接器从 Kafka Topics 中订阅消息写入
|
||||||
- influxdb: 启用 influxdb 连接器从 InfluxDB 获取数据
|
- influxdb: 启用 influxdb 连接器从 InfluxDB 获取数据
|
||||||
- csv:从 CSV 文件解析数据
|
- csv:从 CSV 文件解析数据
|
||||||
|
|
||||||
2. +protocol 包含如下选项:
|
2. +protocol 包含如下选项:
|
||||||
- +ws: 当 driver 取值为 taos 或 tmq 时使用,表示使用 rest 获取数据。不使用 +ws 则表示使用原生连接获取数据,此时需要 taosx 所在的服务器安装 taosc。
|
- +ws:当 driver 取值为 taos 或 tmq 时使用,表示使用 rest 获取数据。不使用 +ws 则表示使用原生连接获取数据,此时需要 taosx 所在的服务器安装 taosc。
|
||||||
- +ua: 当 driver 取值为 opc 时使用,表示采集的数据的 opc-server 为 opc-ua
|
- +ua:当 driver 取值为 opc 时使用,表示采集的数据的 opc-server 为 opc-ua
|
||||||
- +da: 当 driver 取值为 opc 时使用,表示采集的数据的 opc-server 为 opc-da
|
- +da:当 driver 取值为 opc 时使用,表示采集的数据的 opc-server 为 opc-da
|
||||||
|
|
||||||
3. host:port 表示数据源的地址和端口。
|
3. host:port 表示数据源的地址和端口。
|
||||||
4. object 表示具体的数据源,可以是TDengine的数据库、超级表、表,也可以是本地备份文件的路径,也可以是对应数据源服务器中的数据库。
|
4. object 表示具体的数据源,可以是TDengine的数据库、超级表、表,也可以是本地备份文件的路径,也可以是对应数据源服务器中的数据库。
|
||||||
|
@ -251,7 +251,7 @@ d4,2017-07-14T10:40:00.006+08:00,-2.740636,10,-0.893545,7,California.LosAngles
|
||||||
- `monitor.port`:`taosKeeper` 服务的端口,默认`6043`。
|
- `monitor.port`:`taosKeeper` 服务的端口,默认`6043`。
|
||||||
- `monitor.interval`:向 `taosKeeper` 发送指标的频率,默认为每 10 秒一次,只有 1 到 10 之间的值才有效。
|
- `monitor.interval`:向 `taosKeeper` 发送指标的频率,默认为每 10 秒一次,只有 1 到 10 之间的值才有效。
|
||||||
- `log.path`:日志文件存放的目录。
|
- `log.path`:日志文件存放的目录。
|
||||||
- `log.level`:日志级别,可选值为 "error", "warn", "info", "debug", "trace"。
|
- `log.level`:日志级别,可选值为 "error"、"warn"、"info"、"debug"、"trace"。
|
||||||
- `log.compress`:日志文件滚动后的文件是否进行压缩。
|
- `log.compress`:日志文件滚动后的文件是否进行压缩。
|
||||||
- `log.rotationCount`:日志文件目录下最多保留的文件数,超出数量的旧文件被删除。
|
- `log.rotationCount`:日志文件目录下最多保留的文件数,超出数量的旧文件被删除。
|
||||||
- `log.rotationSize`:触发日志文件滚动的文件大小(单位为字节),当日志文件超出此大小后会生成一个新文件,新的日志会写入新文件。
|
- `log.rotationSize`:触发日志文件滚动的文件大小(单位为字节),当日志文件超出此大小后会生成一个新文件,新的日志会写入新文件。
|
||||||
|
@ -401,8 +401,8 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep
|
||||||
| -------------------------- | ----------------------------------------------------------------------------- |
|
| -------------------------- | ----------------------------------------------------------------------------- |
|
||||||
| sys_cpu_cores | 系统 CPU 核数 |
|
| sys_cpu_cores | 系统 CPU 核数 |
|
||||||
| sys_total_memory | 系统总内存,单位:字节 |
|
| sys_total_memory | 系统总内存,单位:字节 |
|
||||||
| sys_used_memory | 系统已用内存, 单位:字节 |
|
| sys_used_memory | 系统已用内存,单位:字节 |
|
||||||
| sys_available_memory | 系统可用内存, 单位:字节 |
|
| sys_available_memory | 系统可用内存,单位:字节 |
|
||||||
| process_uptime | taosX 运行时长,单位:秒 |
|
| process_uptime | taosX 运行时长,单位:秒 |
|
||||||
| process_id | taosX 进程 ID |
|
| process_id | taosX 进程 ID |
|
||||||
| running_tasks | taosX 当前执行任务数 |
|
| running_tasks | taosX 当前执行任务数 |
|
||||||
|
@ -420,8 +420,8 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep
|
||||||
| -------------------------- | ----------------------------------------------------------------------------- |
|
| -------------------------- | ----------------------------------------------------------------------------- |
|
||||||
| sys_cpu_cores | 系统 CPU 核数 |
|
| sys_cpu_cores | 系统 CPU 核数 |
|
||||||
| sys_total_memory | 系统总内存,单位:字节 |
|
| sys_total_memory | 系统总内存,单位:字节 |
|
||||||
| sys_used_memory | 系统已用内存, 单位:字节 |
|
| sys_used_memory | 系统已用内存,单位:字节 |
|
||||||
| sys_available_memory | 系统可用内存, 单位:字节 |
|
| sys_available_memory | 系统可用内存,单位:字节 |
|
||||||
| process_uptime | agent 运行时长,单位:秒 |
|
| process_uptime | agent 运行时长,单位:秒 |
|
||||||
| process_id | agent 进程 id |
|
| process_id | agent 进程 id |
|
||||||
| process_cpu_percent | agent 进程占用 CPU 百分比 |
|
| process_cpu_percent | agent 进程占用 CPU 百分比 |
|
||||||
|
@ -457,7 +457,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep
|
||||||
|
|
||||||
| 字段 | 描述 |
|
| 字段 | 描述 |
|
||||||
| --------------------- | -------------------------------------------------------------------- |
|
| --------------------- | -------------------------------------------------------------------- |
|
||||||
| read_concurrency | 并发读取数据源的数据 worker 数, 也等于并发写入 TDengine 的 worker 数 |
|
| read_concurrency | 并发读取数据源的数据 worker 数,也等于并发写入 TDengine 的 worker 数 |
|
||||||
| total_stables | 需要迁移的超级表数据数量 |
|
| total_stables | 需要迁移的超级表数据数量 |
|
||||||
| total_updated_tags | 累计更新 tag 数 |
|
| total_updated_tags | 累计更新 tag 数 |
|
||||||
| total_created_tables | 累计创建子表数 |
|
| total_created_tables | 累计创建子表数 |
|
||||||
|
@ -566,9 +566,9 @@ taosX Parser 插件是一个要求用 C/Rust 语言开发的 C ABI 兼容动态
|
||||||
|
|
||||||
**函数签名**:parser_resp_t parser_new(char* ctx, uint32_t len);
|
**函数签名**:parser_resp_t parser_new(char* ctx, uint32_t len);
|
||||||
|
|
||||||
char* ctx: 用户自定义配置字符串。
|
char* ctx:用户自定义配置字符串。
|
||||||
|
|
||||||
uint32_t len: 该字符串的二进制长度(不含 `\0`)。
|
uint32_t len:该字符串的二进制长度(不含 `\0`)。
|
||||||
|
|
||||||
**返回值**:
|
**返回值**:
|
||||||
|
|
||||||
|
@ -597,11 +597,11 @@ const char* parser_mutate(
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
`void* parser`: parser_new 生成的对象指针;
|
`void* parser`:parser_new 生成的对象指针;
|
||||||
|
|
||||||
`const uint8_t* in_ptr`:输入 Payload 的指针;
|
`const uint8_t* in_ptr`:输入 Payload 的指针;
|
||||||
|
|
||||||
`uint32_t in_len`: 输入 Payload 的 bytes 长度(不含 `\0`);
|
`uint32_t in_len`:输入 Payload 的 bytes 长度(不含 `\0`);
|
||||||
|
|
||||||
`const void* uint8_t* out_ptr`:输出 JSON 字符串的指针(不含 \0)。当 out_ptr 指向为空时,表示输出为空。
|
`const void* uint8_t* out_ptr`:输出 JSON 字符串的指针(不含 \0)。当 out_ptr 指向为空时,表示输出为空。
|
||||||
|
|
||||||
|
@ -615,4 +615,4 @@ const char* parser_mutate(
|
||||||
|
|
||||||
**函数签名**: void parser_free(void* parser);
|
**函数签名**: void parser_free(void* parser);
|
||||||
|
|
||||||
void* parser: parser_new 生成的对象指针。
|
void* parser:parser_new 生成的对象指针。
|
||||||
|
|
|
@ -3,23 +3,23 @@ title: taosX-Agent 参考手册
|
||||||
sidebar_label: taosX-Agent
|
sidebar_label: taosX-Agent
|
||||||
---
|
---
|
||||||
|
|
||||||
本节讲述如何部署 `Agent` (for `taosX`)。使用之前需要安装 TDengine Enterprise 安装包之后,taosX-Agent 用于在部分数据接入场景,如 Pi, OPC UA, OPC DA 等对访问数据源有一定限制或者网络环境特殊的场景下,可以将 taosX-Agent 部署在靠近数据源的环境中甚至与数据源在相同的服务器上,由 taosX-Agent 负责从数据源读取数据并发送给 taosX。
|
本节讲述如何部署 `Agent` (for `taosX`)。使用之前需要安装 TDengine Enterprise 安装包之后,taosX-Agent 用于在部分数据接入场景,如 Pi、OPC UA、OPC DA 等对访问数据源有一定限制或者网络环境特殊的场景下,可以将 taosX-Agent 部署在靠近数据源的环境中甚至与数据源在相同的服务器上,由 taosX-Agent 负责从数据源读取数据并发送给 taosX。
|
||||||
|
|
||||||
## 配置
|
## 配置
|
||||||
|
|
||||||
`Agent` 默认的配置文件位于 `/etc/taos/agent.toml`, 包含以下配置项:
|
`Agent` 默认的配置文件位于 `/etc/taos/agent.toml`,包含以下配置项:
|
||||||
|
|
||||||
- `endpoint`: 必填,`taosX` 的 GRPC 服务地址。
|
- `endpoint`:必填,`taosX` 的 GRPC 服务地址。
|
||||||
- `token`: 必填,在 `Explorer` 上创建 `Agent` 时,产生的 Token。
|
- `token`:必填,在 `Explorer` 上创建 `Agent` 时,产生的 Token。
|
||||||
- `instanceId`:当前 taosx-agent 服务的实例 ID,如果同一台机器上启动了多个 taosx-agent 实例,必须保证各个实例的实例 ID 互不相同。
|
- `instanceId`:当前 taosx-agent 服务的实例 ID,如果同一台机器上启动了多个 taosx-agent 实例,必须保证各个实例的实例 ID 互不相同。
|
||||||
- `compression`: 非必填,可配置为 `true` 或 `false`, 默认为 `false`。配置为`true`, 则开启 `Agent` 和 `taosX` 通信数据压缩。
|
- `compression`:非必填,可配置为 `true` 或 `false`,默认为 `false`。配置为`true`,则开启 `Agent` 和 `taosX` 通信数据压缩。
|
||||||
- `in_memory_cache_capacity`: 非必填,表示可在内存中缓存的最大消息批次数,可配置为大于 0 的整数。默认为 `64`。
|
- `in_memory_cache_capacity`:非必填,表示可在内存中缓存的最大消息批次数,可配置为大于 0 的整数。默认为 `64`。
|
||||||
- `client_port_range.min`:非必填,取值范围 `[49152-65535]`,默认为 `49152`,当 agent 向 taosx 创建 socket 连接时,socket 客户端会随机监听一个端口,此配置限制了端口范围的最小值。
|
- `client_port_range.min`:非必填,取值范围 `[49152-65535]`,默认为 `49152`,当 agent 向 taosx 创建 socket 连接时,socket 客户端会随机监听一个端口,此配置限制了端口范围的最小值。
|
||||||
- `client_port_range.max`:非必填,取值范围 `[49152-65535]`,默认为 `65535`,此配置限制了端口范围的最大值。
|
- `client_port_range.max`:非必填,取值范围 `[49152-65535]`,默认为 `65535`,此配置限制了端口范围的最大值。
|
||||||
- `log_level`: 非必填,日志级别,默认为 `info`, 同 `taosX` 一样,支持 `error`,`warn`,`info`,`debug`,`trace` 五级。已弃用,请使用 `log.level` 代替。
|
- `log_level`:非必填,日志级别,默认为 `info`,同 `taosX` 一样,支持 `error`、`warn`、`info`、`debug`、`trace` 五级。已弃用,请使用 `log.level` 代替。
|
||||||
- `log_keep_days`:非必填,日志保存天数,默认为 `30` 天。已弃用,请使用 `log.keepDays` 代替。
|
- `log_keep_days`:非必填,日志保存天数,默认为 `30` 天。已弃用,请使用 `log.keepDays` 代替。
|
||||||
- `log.path`:日志文件存放的目录。
|
- `log.path`:日志文件存放的目录。
|
||||||
- `log.level`:日志级别,可选值为 "error", "warn", "info", "debug", "trace"。
|
- `log.level`:日志级别,可选值为 "error"、"warn"、"info"、"debug"、"trace"。
|
||||||
- `log.compress`:日志文件滚动后的文件是否进行压缩。
|
- `log.compress`:日志文件滚动后的文件是否进行压缩。
|
||||||
- `log.rotationCount`:日志文件目录下最多保留的文件数,超出数量的旧文件被删除。
|
- `log.rotationCount`:日志文件目录下最多保留的文件数,超出数量的旧文件被删除。
|
||||||
- `log.rotationSize`:触发日志文件滚动的文件大小(单位为字节),当日志文件超出此大小后会生成一个新文件,新的日志会写入新文件。
|
- `log.rotationSize`:触发日志文件滚动的文件大小(单位为字节),当日志文件超出此大小后会生成一个新文件,新的日志会写入新文件。
|
||||||
|
|
|
@ -13,7 +13,7 @@ taosKeeper 是 TDengine 3.0 版本监控指标的导出工具,通过简单的
|
||||||
|
|
||||||
taosKeeper 有两种安装方式:
|
taosKeeper 有两种安装方式:
|
||||||
|
|
||||||
- 安装 TDengine 官方安装包的同时会自动安装 taosKeeper, 详情请参考[TDengine 安装](../../../get-started/)。
|
- 安装 TDengine 官方安装包的同时会自动安装 taosKeeper,详情请参考 [TDengine 安装](../../../get-started/)。
|
||||||
|
|
||||||
- 单独编译 taosKeeper 并安装,详情请参考 [taosKeeper](https://github.com/taosdata/taoskeeper) 仓库。
|
- 单独编译 taosKeeper 并安装,详情请参考 [taosKeeper](https://github.com/taosdata/taoskeeper) 仓库。
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ taos_cluster_info_first_ep_dnode_id{cluster_id="554014120921134497"} 1
|
||||||
|
|
||||||
| 指标名称 | 类型 | 含义 |
|
| 指标名称 | 类型 | 含义 |
|
||||||
| ------------------------------ | ------- | ---------------------------------------------------------------------------------------- |
|
| ------------------------------ | ------- | ---------------------------------------------------------------------------------------- |
|
||||||
| taos_d_info_status | gauge | dnode 状态,标签 value 表示状态, ready 表示正常, offline 表示下线, unknown 表示未知。 |
|
| taos_d_info_status | gauge | dnode 状态,标签 value 表示状态、ready 表示正常、offline 表示下线、unknown 表示未知。 |
|
||||||
| taos_dnodes_info_cpu_cores | gauge | CPU 核心数 |
|
| taos_dnodes_info_cpu_cores | gauge | CPU 核心数 |
|
||||||
| taos_dnodes_info_cpu_engine | gauge | 该 dnode 的进程所使用的 CPU 百分比(取值范围 0~100) |
|
| taos_dnodes_info_cpu_engine | gauge | 该 dnode 的进程所使用的 CPU 百分比(取值范围 0~100) |
|
||||||
| taos_dnodes_info_cpu_system | gauge | 该 dnode 所在节点的系统使用的 CPU 百分比(取值范围 0~100) |
|
| taos_dnodes_info_cpu_system | gauge | 该 dnode 所在节点的系统使用的 CPU 百分比(取值范围 0~100) |
|
||||||
|
@ -474,64 +474,64 @@ taos_cluster_info_first_ep_dnode_id{cluster_id="554014120921134497"} 1
|
||||||
##### taos_m_info_role
|
##### taos_m_info_role
|
||||||
|
|
||||||
- **标签**:
|
- **标签**:
|
||||||
- `cluster_id`: 集群 id
|
- `cluster_id`:集群 id
|
||||||
- `mnode_ep`: mnode 端点
|
- `mnode_ep`:mnode 端点
|
||||||
- `mnode_id`: mnode id
|
- `mnode_id`:mnode id
|
||||||
- `value`: 角色值(该 mnode 的状态,取值范围:offline, follower, candidate, leader, error, learner)
|
- `value`:角色值(该 mnode 的状态,取值范围:offline、follower、candidate、leader、error、learner)
|
||||||
- **类型**: gauge
|
- **类型**:gauge
|
||||||
- **含义**: mnode 角色
|
- **含义**:mnode 角色
|
||||||
|
|
||||||
##### taos_taos_sql_req_count
|
##### taos_taos_sql_req_count
|
||||||
|
|
||||||
- **标签**:
|
- **标签**:
|
||||||
- `cluster_id`: 集群 id
|
- `cluster_id`:集群 id
|
||||||
- `result`: 请求结果(取值范围: Success, Failed)
|
- `result`:请求结果(取值范围:Success、Failed)
|
||||||
- `sql_type`: SQL 类型(取值范围:select, insert,inserted_rows, delete)
|
- `sql_type`:SQL 类型(取值范围:select、insert、inserted_rows、delete)
|
||||||
- `username`: 用户名
|
- `username`:用户名
|
||||||
- **类型**: gauge
|
- **类型**:gauge
|
||||||
- **含义**: SQL 请求数量
|
- **含义**:SQL 请求数量
|
||||||
|
|
||||||
##### taos_taosd_sql_req_count
|
##### taos_taosd_sql_req_count
|
||||||
|
|
||||||
- **标签**:
|
- **标签**:
|
||||||
- `cluster_id`: 集群 id
|
- `cluster_id`:集群 id
|
||||||
- `dnode_ep`: dnode 端点
|
- `dnode_ep`:dnode 端点
|
||||||
- `dnode_id`: dnode id
|
- `dnode_id`:dnode id
|
||||||
- `result`: 请求结果(取值范围: Success, Failed)
|
- `result`:请求结果(取值范围:Success、Failed)
|
||||||
- `sql_type`: SQL 类型(取值范围:select, insert,inserted_rows, delete)
|
- `sql_type`:SQL 类型(取值范围:select、insert、inserted_rows、delete)
|
||||||
- `username`: 用户名
|
- `username`:用户名
|
||||||
- `vgroup_id`: 虚拟组 id
|
- `vgroup_id`:虚拟组 id
|
||||||
- **类型**: gauge
|
- **类型**:gauge
|
||||||
- **含义**: SQL 请求数量
|
- **含义**:SQL 请求数量
|
||||||
|
|
||||||
##### taos_taosd_vgroups_info_status
|
##### taos_taosd_vgroups_info_status
|
||||||
|
|
||||||
- **标签**:
|
- **标签**:
|
||||||
- `cluster_id`: 集群 id
|
- `cluster_id`:集群 id
|
||||||
- `database_name`: 数据库名称
|
- `database_name`:数据库名称
|
||||||
- `vgroup_id`: 虚拟组 id
|
- `vgroup_id`:虚拟组 id
|
||||||
- **类型**: gauge
|
- **类型**:gauge
|
||||||
- **含义**: 虚拟组状态。 0 为 unsynced,表示没有 leader 选出;1 为 ready。
|
- **含义**:虚拟组状态。 0 为 unsynced,表示没有 leader 选出;1 为 ready。
|
||||||
|
|
||||||
##### taos_taosd_vgroups_info_tables_num
|
##### taos_taosd_vgroups_info_tables_num
|
||||||
|
|
||||||
- **标签**:
|
- **标签**:
|
||||||
- `cluster_id`: 集群 id
|
- `cluster_id`:集群 id
|
||||||
- `database_name`: 数据库名称
|
- `database_name`:数据库名称
|
||||||
- `vgroup_id`: 虚拟组 id
|
- `vgroup_id`:虚拟组 id
|
||||||
- **类型**: gauge
|
- **类型**:gauge
|
||||||
- **含义**: 虚拟组表数量
|
- **含义**:虚拟组表数量
|
||||||
|
|
||||||
##### taos_taosd_vnodes_info_role
|
##### taos_taosd_vnodes_info_role
|
||||||
|
|
||||||
- **标签**:
|
- **标签**:
|
||||||
- `cluster_id`: 集群 id
|
- `cluster_id`:集群 id
|
||||||
- `database_name`: 数据库名称
|
- `database_name`:数据库名称
|
||||||
- `dnode_id`: dnode id
|
- `dnode_id`:dnode id
|
||||||
- `value`: 角色值(取值范围:offline, follower, candidate, leader, error, learner)
|
- `value`:角色值(取值范围:offline、follower、candidate、leader、error、learner)
|
||||||
- `vgroup_id`: 虚拟组 id
|
- `vgroup_id`:虚拟组 id
|
||||||
- **类型**: gauge
|
- **类型**:gauge
|
||||||
- **含义**: 虚拟节点角色
|
- **含义**:虚拟节点角色
|
||||||
|
|
||||||
### 抽取配置
|
### 抽取配置
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ cors = true
|
||||||
- `addr`:taosExplorer 服务绑定的 IPv4 地址,默认为 `0.0.0.0`。如需修改,请配置为 `localhost` 之外的地址以对外提供服务。
|
- `addr`:taosExplorer 服务绑定的 IPv4 地址,默认为 `0.0.0.0`。如需修改,请配置为 `localhost` 之外的地址以对外提供服务。
|
||||||
- `ipv6`:taosExplorer 服务绑定的 IPv6 地址,默认不绑定 IPv6 地址。
|
- `ipv6`:taosExplorer 服务绑定的 IPv6 地址,默认不绑定 IPv6 地址。
|
||||||
- `instanceId`:当前 explorer 服务的实例 ID,如果同一台机器上启动了多个 explorer 实例,必须保证各个实例的实例 ID 互不相同。
|
- `instanceId`:当前 explorer 服务的实例 ID,如果同一台机器上启动了多个 explorer 实例,必须保证各个实例的实例 ID 互不相同。
|
||||||
- `log_level`:日志级别,可选值为 "error", "warn", "info", "debug", "trace"。此参数已弃用,请使用 `log.level` 代替。
|
- `log_level`:日志级别,可选值为 "error"、"warn"、"info"、"debug"、"trace"。此参数已弃用,请使用 `log.level` 代替。
|
||||||
- `cluster`:TDengine 集群的 taosAdapter 地址。
|
- `cluster`:TDengine 集群的 taosAdapter 地址。
|
||||||
- `cluster_native`:TDengine 集群的原生连接地址,默认关闭。
|
- `cluster_native`:TDengine 集群的原生连接地址,默认关闭。
|
||||||
- `x_api`:taosX 的 gRPC 地址。
|
- `x_api`:taosX 的 gRPC 地址。
|
||||||
|
@ -137,7 +137,7 @@ cors = true
|
||||||
- `ssl.certificate`:SSL 证书(如果同时设置了 certificate 与 certificate_key 两个参数,则启用 HTTPS 服务,否则不启用)。
|
- `ssl.certificate`:SSL 证书(如果同时设置了 certificate 与 certificate_key 两个参数,则启用 HTTPS 服务,否则不启用)。
|
||||||
- `ssl.certificate_key`:SSL 证书密钥。
|
- `ssl.certificate_key`:SSL 证书密钥。
|
||||||
- `log.path`:日志文件存放的目录。
|
- `log.path`:日志文件存放的目录。
|
||||||
- `log.level`:日志级别,可选值为 "error", "warn", "info", "debug", "trace"。
|
- `log.level`:日志级别,可选值为 "error"、"warn"、"info"、"debug"、"trace"。
|
||||||
- `log.compress`:日志文件滚动后的文件是否进行压缩。
|
- `log.compress`:日志文件滚动后的文件是否进行压缩。
|
||||||
- `log.rotationCount`:日志文件目录下最多保留的文件数,超出数量的旧文件被删除。
|
- `log.rotationCount`:日志文件目录下最多保留的文件数,超出数量的旧文件被删除。
|
||||||
- `log.rotationSize`:触发日志文件滚动的文件大小(单位为字节),当日志文件超出此大小后会生成一个新文件,新的日志会写入新文件。
|
- `log.rotationSize`:触发日志文件滚动的文件大小(单位为字节),当日志文件超出此大小后会生成一个新文件,新的日志会写入新文件。
|
||||||
|
@ -226,4 +226,4 @@ sc.exe stop taos-explorer # Windows
|
||||||
|
|
||||||
其他功能页面,如 `数据写入-数据源` 等页面,为企业版特有功能,您可以点击查看和简单体验,并不能实际使用。
|
其他功能页面,如 `数据写入-数据源` 等页面,为企业版特有功能,您可以点击查看和简单体验,并不能实际使用。
|
||||||
|
|
||||||
如果由于网络原因无法完成注册环节,则需要在有外网的环境注册完毕,然后把注册好的 /etc/taos/explorer-register.cfg 替换到内网环境。
|
如果由于网络原因无法完成注册环节,则需要在有外网的环境注册完毕,然后把注册好的 `/etc/taos/explorer-register.cfg` 替换到内网环境。
|
||||||
|
|
|
@ -37,20 +37,20 @@ taos> quit
|
||||||
### 基础参数
|
### 基础参数
|
||||||
可通过配置命令行参数来改变 TDengine CLI 的行为。以下为常用的几个命令行参数:
|
可通过配置命令行参数来改变 TDengine CLI 的行为。以下为常用的几个命令行参数:
|
||||||
|
|
||||||
- -h HOST: 要连接的 TDengine 服务端所在服务器的 FQDN, 默认值: 127.0.0.1 。
|
- -h HOST:要连接的 TDengine 服务端所在服务器的 FQDN, 默认值:127.0.0.1。
|
||||||
- -P PORT: 指定服务端所用端口号,默认值:6030 。
|
- -P PORT:指定服务端所用端口号,默认值:6030。
|
||||||
- -u USER: 连接时使用的用户名,默认值:root 。
|
- -u USER:连接时使用的用户名,默认值:root。
|
||||||
- -p PASSWORD: 连接服务端时使用的密码,特殊字符如 `! & ( ) < > ; |` 需使用字符 `\` 进行转义处理, 默认值:taosdata 。
|
- -p PASSWORD:连接服务端时使用的密码,特殊字符如 `! & ( ) < > ; |` 需使用字符 `\` 进行转义处理, 默认值:taosdata。
|
||||||
- -?, --help: 打印出所有命令行参数。
|
- -?, --help:打印出所有命令行参数。
|
||||||
- -s COMMAND: 以非交互模式执行的 SQL 命令。
|
- -s COMMAND:以非交互模式执行的 SQL 命令。
|
||||||
|
|
||||||
使用 `-s` 参数可进行非交互式执行 SQL,执行完成后退出,此模式适合在自动化脚本中使用。
|
使用 `-s` 参数可进行非交互式执行 SQL,执行完成后退出,此模式适合在自动化脚本中使用。
|
||||||
如以下命令连接到服务器 h1.taos.com, 执行 -s 指定的 SQL:
|
如以下命令连接到服务器 h1.taos.com, 执行 -s 指定的 SQL:
|
||||||
```bash
|
```bash
|
||||||
taos -h my-server -s "use db; show tables;"
|
taos -h my-server -s "use db; show tables;"
|
||||||
```
|
```
|
||||||
|
|
||||||
- -c CONFIGDIR: 指定配置文件目录。
|
- -c CONFIGDIR:指定配置文件目录。
|
||||||
|
|
||||||
Linux 环境下默认为 `/etc/taos`,该目录下的配置文件默认名称为 `taos.cfg`。
|
Linux 环境下默认为 `/etc/taos`,该目录下的配置文件默认名称为 `taos.cfg`。
|
||||||
使用 `-c` 参数改变 `taosc` 客户端加载配置文件的位置,客户端配置参数参考 [客户端配置](../../components/taosc)。
|
使用 `-c` 参数改变 `taosc` 客户端加载配置文件的位置,客户端配置参数参考 [客户端配置](../../components/taosc)。
|
||||||
|
@ -61,23 +61,23 @@ taos> quit
|
||||||
|
|
||||||
### 高级参数
|
### 高级参数
|
||||||
|
|
||||||
- -a AUTHSTR: 连接服务端的授权信息。
|
- -a AUTHSTR:连接服务端的授权信息。
|
||||||
- -A: 通过用户名和密码计算授权信息。
|
- -A:通过用户名和密码计算授权信息。
|
||||||
- -B: 设置 BI 工具显示模式,设置后所有输出都遵循 BI 工具的格式进行输出。
|
- -B:设置 BI 工具显示模式,设置后所有输出都遵循 BI 工具的格式进行输出。
|
||||||
- -C: 打印 -c 指定的目录中 `taos.cfg` 的配置参数。
|
- -C:打印 -c 指定的目录中 `taos.cfg` 的配置参数。
|
||||||
- -d DATABASE: 指定连接到服务端时使用的数据库。
|
- -d DATABASE:指定连接到服务端时使用的数据库。
|
||||||
- -E dsn: 使用 WebSocket DSN 连接云服务或者提供 WebSocket 连接的服务端。
|
- -E dsn:使用 WebSocket DSN 连接云服务或者提供 WebSocket 连接的服务端。
|
||||||
- -f FILE: 以非交互模式执行 SQL 脚本文件。文件中一个 SQL 语句只能占一行。
|
- -f FILE:以非交互模式执行 SQL 脚本文件。文件中一个 SQL 语句只能占一行。
|
||||||
- -k: 测试服务端运行状态,0: unavailable,1: network ok,2: service ok,3: service degraded,4: exiting 。
|
- -k:测试服务端运行状态,0:unavailable、1:network ok、2:service ok、3:service degraded、4:exiting。
|
||||||
- -l PKTLEN: 网络测试时使用的测试包大小。
|
- -l PKTLEN:网络测试时使用的测试包大小。
|
||||||
- -n NETROLE: 网络连接测试时的测试范围,默认为 `client`, 可选值为 `client`、`server` 。
|
- -n NETROLE:网络连接测试时的测试范围,默认为 `client`,可选值为 `client`、`server`。
|
||||||
- -N PKTNUM: 网络测试时使用的测试包数量。
|
- -N PKTNUM:网络测试时使用的测试包数量。
|
||||||
- -r: 将时间列转化为无符号 64 位整数类型输出(即 C 语言中 uint64_t) 。
|
- -r:将时间列转化为无符号 64 位整数类型输出(即 C 语言中 uint64_t)。
|
||||||
- -R: 使用 RESTful 模式连接服务端。
|
- -R:使用 RESTful 模式连接服务端。
|
||||||
- -t: 测试服务端启动状态,状态同 -k 。
|
- -t:测试服务端启动状态,状态同 -k。
|
||||||
- -w DISPLAYWIDTH: 客户端列显示宽度。
|
- -w DISPLAYWIDTH:客户端列显示宽度。
|
||||||
- -z TIMEZONE: 指定时区,默认为本地时区。
|
- -z TIMEZONE:指定时区,默认为本地时区。
|
||||||
- -V: 打印出当前版本号。
|
- -V:打印出当前版本号。
|
||||||
|
|
||||||
|
|
||||||
## 数据导出/导入
|
## 数据导出/导入
|
||||||
|
@ -123,7 +123,7 @@ taos> SET MAX_BINARY_DISPLAY_WIDTH 120;
|
||||||
- 在 TDengine CLI 中使用 `alter user` 命令可以修改用户密码,缺省密码为 `taosdata`。
|
- 在 TDengine CLI 中使用 `alter user` 命令可以修改用户密码,缺省密码为 `taosdata`。
|
||||||
- Ctrl+C 中止正在进行中的查询。
|
- Ctrl+C 中止正在进行中的查询。
|
||||||
- 执行 `RESET QUERY CACHE` 可清除本地表 Schema 的缓存。
|
- 执行 `RESET QUERY CACHE` 可清除本地表 Schema 的缓存。
|
||||||
- 批量执行 SQL 语句。可以将一系列的 TDengine CLI 命令(以英文 ; 结尾,每个 SQL 语句为一行)按行存放在文件里,在 TDengine CLI 里执行命令 `source <file-name>` 自动执行该文件里所有的 SQL 语句。
|
- 批量执行 SQL 语句。可以将一系列的 TDengine CLI 命令(以英文 `;` 结尾,每个 SQL 语句为一行)按行存放在文件里,在 TDengine CLI 里执行命令 `source <file-name>` 自动执行该文件里所有的 SQL 语句。
|
||||||
|
|
||||||
## 错误代码表
|
## 错误代码表
|
||||||
在 TDengine 3.3.4.8 版本后 TDengine CLI 在返回错误信息中返回了具体错误码,用户可到 TDengine 官网错误码页面查找具体原因及解决措施,见:[错误码参考表](https://docs.taosdata.com/reference/error-code/)
|
在 TDengine 3.3.4.8 版本后 TDengine CLI 在返回错误信息中返回了具体错误码,用户可到 TDengine 官网错误码页面查找具体原因及解决措施,见:[错误码参考表](https://docs.taosdata.com/reference/error-code/)
|
||||||
|
|
|
@ -25,7 +25,7 @@ taosBenchmark
|
||||||
```
|
```
|
||||||
|
|
||||||
在无参数运行时,taosBenchmark 默认连接 `/etc/taos/taos.cfg` 中指定的 TDengine 集群。
|
在无参数运行时,taosBenchmark 默认连接 `/etc/taos/taos.cfg` 中指定的 TDengine 集群。
|
||||||
连接成功后,会默认创建智能电表示例数据库 test,创建超级表 meters, 创建子表 1 万,每子写入数据 1 万条,若 test 库已存在,默认会先删再建。
|
连接成功后,会默认创建智能电表示例数据库 test,创建超级表 meters,创建子表 1 万,每子写入数据 1 万条,若 test 库已存在,默认会先删再建。
|
||||||
|
|
||||||
### 命令行模式
|
### 命令行模式
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ taosBenchmark -f <json file>
|
||||||
| -c/--config-dir \<dir> | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos |
|
| -c/--config-dir \<dir> | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos |
|
||||||
| -h/--host \<host> | 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost |
|
| -h/--host \<host> | 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost |
|
||||||
| -P/--port \<port> | 要连接的 TDengine 服务器的端口号,默认值为 6030 |
|
| -P/--port \<port> | 要连接的 TDengine 服务器的端口号,默认值为 6030 |
|
||||||
| -I/--interface \<insertMode> | 插入模式,可选项有 taosc, rest, stmt, sml, sml-rest, 分别对应普通写入、restful 接口写入、参数绑定接口写入、schemaless 接口写入、restful schemaless 接口写入 (由 taosAdapter 提供)。默认值为 taosc |
|
| -I/--interface \<insertMode> | 插入模式,可选项有 taosc、rest、stmt、sml、sml-rest,分别对应普通写入、restful 接口写入、参数绑定接口写入、schemaless 接口写入、restful schemaless 接口写入 (由 taosAdapter 提供)。默认值为 taosc |
|
||||||
| -u/--user \<user> | 用于连接 TDengine 服务端的用户名,默认为 root |
|
| -u/--user \<user> | 用于连接 TDengine 服务端的用户名,默认为 root |
|
||||||
| -U/--supplement-insert | 写入数据而不提前建数据库和表,默认关闭 |
|
| -U/--supplement-insert | 写入数据而不提前建数据库和表,默认关闭 |
|
||||||
| -p/--password \<passwd> | 用于连接 TDengine 服务端的密码,默认值为 taosdata |
|
| -p/--password \<passwd> | 用于连接 TDengine 服务端的密码,默认值为 taosdata |
|
||||||
|
@ -65,15 +65,15 @@ taosBenchmark -f <json file>
|
||||||
| -S/--timestampstep \<stepLength> | 每个子表中插入数据的时间戳步长,单位是 ms,默认值是 1 |
|
| -S/--timestampstep \<stepLength> | 每个子表中插入数据的时间戳步长,单位是 ms,默认值是 1 |
|
||||||
| -n/--records \<recordNum> | 每个子表插入的记录数,默认值为 10000 |
|
| -n/--records \<recordNum> | 每个子表插入的记录数,默认值为 10000 |
|
||||||
| -d/--database \<dbName> | 所使用的数据库的名称,默认值为 test |
|
| -d/--database \<dbName> | 所使用的数据库的名称,默认值为 test |
|
||||||
| -b/--data-type \<colType> | 指定超级表普通列数据类型, 多个使用逗号分隔,默认值: "FLOAT,INT,FLOAT" 如:`taosBenchmark -b "FLOAT,BINARY(8),NCHAR(16)"`|
|
| -b/--data-type \<colType> | 指定超级表普通列数据类型,多个使用逗号分隔,默认值:"FLOAT,INT,FLOAT" 如:`taosBenchmark -b "FLOAT,BINARY(8),NCHAR(16)"`|
|
||||||
| -A/--tag-type \<tagType> | 指定超级表标签列数据类型,多个使用逗号分隔,默认值:"INT,BINARY(24)" 如:`taosBenchmark -A "INT,BINARY(8),NCHAR(8)"`|
|
| -A/--tag-type \<tagType> | 指定超级表标签列数据类型,多个使用逗号分隔,默认值:"INT,BINARY(24)" 如:`taosBenchmark -A "INT,BINARY(8),NCHAR(8)"`|
|
||||||
| -l/--columns \<colNum> | 超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT, 例如: `-l 5 -b float,double`, 那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如: `-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` |
|
| -l/--columns \<colNum> | 超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT,例如 `-l 5 -b float,double`,那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如:`-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` |
|
||||||
| -L/--partial-col-num \<colNum> | 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据 |
|
| -L/--partial-col-num \<colNum> | 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据 |
|
||||||
| -w/--binwidth \<length> | nchar 和 binary 类型的默认长度,默认值为 64 |
|
| -w/--binwidth \<length> | nchar 和 binary 类型的默认长度,默认值为 64 |
|
||||||
| -m/--table-prefix \<tablePrefix> | 子表名称的前缀,默认值为 "d" |
|
| -m/--table-prefix \<tablePrefix> | 子表名称的前缀,默认值为 "d" |
|
||||||
| -E/--escape-character | 开关参数,指定在超级表和子表名称中是否使用转义字符。默认值为不使用 |
|
| -E/--escape-character | 开关参数,指定在超级表和子表名称中是否使用转义字符。默认值为不使用 |
|
||||||
| -C/--chinese | 开关参数,指定 nchar 和 binary 是否使用 Unicode 中文字符。默认值为不使用 |
|
| -C/--chinese | 开关参数,指定 nchar 和 binary 是否使用 Unicode 中文字符。默认值为不使用 |
|
||||||
| -N/--normal-table | 开关参数,指定只创建普通表,不创建超级表。默认值为 false。仅当插入模式为 taosc, stmt, rest 模式下可以使用 |
|
| -N/--normal-table | 开关参数,指定只创建普通表,不创建超级表。默认值为 false。仅当插入模式为 taosc、stmt、rest 模式下可以使用 |
|
||||||
| -M/--random | 开关参数,插入数据为生成的随机值。默认值为 false。若配置此参数,则随机生成要插入的数据。对于数值类型的 标签列/数据列,其值为该类型取值范围内的随机值。对于 NCHAR 和 BINARY 类型的 标签列/数据列,其值为指定长度范围内的随机字符串 |
|
| -M/--random | 开关参数,插入数据为生成的随机值。默认值为 false。若配置此参数,则随机生成要插入的数据。对于数值类型的 标签列/数据列,其值为该类型取值范围内的随机值。对于 NCHAR 和 BINARY 类型的 标签列/数据列,其值为指定长度范围内的随机字符串 |
|
||||||
| -x/--aggr-func | 开关参数,指示插入后查询聚合函数。默认值为 false |
|
| -x/--aggr-func | 开关参数,指示插入后查询聚合函数。默认值为 false |
|
||||||
| -y/--answer-yes | 开关参数,要求用户在提示后确认才能继续 |默认值为 false 。
|
| -y/--answer-yes | 开关参数,要求用户在提示后确认才能继续 |默认值为 false 。
|
||||||
|
@ -93,162 +93,162 @@ taosBenchmark -f <json file>
|
||||||
|
|
||||||
本节所列参数适用于所有功能模式。
|
本节所列参数适用于所有功能模式。
|
||||||
|
|
||||||
- **filetype** : 功能分类,可选值为 `insert`, `query` 和 `subscribe`。分别对应插入、查询和订阅功能。每个配置文件中只能指定其中之一。
|
- **filetype**:功能分类,可选值为 `insert`、`query` 和 `subscribe`。分别对应插入、查询和订阅功能。每个配置文件中只能指定其中之一。
|
||||||
- **cfgdir** : TDengine 客户端配置文件所在的目录,默认路径是 /etc/taos 。
|
- **cfgdir**:TDengine 客户端配置文件所在的目录,默认路径是 /etc/taos 。
|
||||||
|
|
||||||
- **host** : 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost 。
|
- **host**:指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost 。
|
||||||
|
|
||||||
- **port** : 要连接的 TDengine 服务器的端口号,默认值为 6030 。
|
- **port**:要连接的 TDengine 服务器的端口号,默认值为 6030 。
|
||||||
|
|
||||||
- **user** : 用于连接 TDengine 服务端的用户名,默认为 root 。
|
- **user**:用于连接 TDengine 服务端的用户名,默认为 root 。
|
||||||
|
|
||||||
- **password** : 用于连接 TDengine 服务端的密码,默认值为 taosdata。
|
- **password**:用于连接 TDengine 服务端的密码,默认值为 taosdata。
|
||||||
|
|
||||||
### 写入配置参数
|
### 写入配置参数
|
||||||
|
|
||||||
写入场景下 `filetype` 必须设置为 `insert`,该参数及其它通用参数详见 [通用配置参数](#通用配置参数)
|
写入场景下 `filetype` 必须设置为 `insert`,该参数及其它通用参数详见 [通用配置参数](#通用配置参数)
|
||||||
|
|
||||||
- **keep_trying** : 失败后进行重试的次数,默认不重试。需使用 v3.0.9 以上版本。
|
- **keep_trying**:失败后进行重试的次数,默认不重试。需使用 v3.0.9 以上版本。
|
||||||
|
|
||||||
- **trying_interval** : 失败重试间隔时间,单位为毫秒,仅在 keep_trying 指定重试后有效。需使用 v3.0.9 以上版本。
|
- **trying_interval**:失败重试间隔时间,单位为毫秒,仅在 keep_trying 指定重试后有效。需使用 v3.0.9 以上版本。
|
||||||
- **childtable_from 和 childtable_to** : 指定写入子表范围,开闭区间为 [childtable_from, childtable_to) 。
|
- **childtable_from 和 childtable_to**:指定写入子表范围,开闭区间为 [childtable_from, childtable_to) 。
|
||||||
|
|
||||||
- **continue_if_fail** : 允许用户定义失败后行为。
|
- **continue_if_fail**:允许用户定义失败后行为。
|
||||||
|
|
||||||
"continue_if_fail": "no", 失败 taosBenchmark 自动退出,默认行为。
|
“continue_if_fail”:“no”,失败 taosBenchmark 自动退出,默认行为。
|
||||||
"continue_if_fail": "yes", 失败 taosBenchmark 警告用户,并继续写入。
|
“continue_if_fail”:“yes”,失败 taosBenchmark 警告用户,并继续写入。
|
||||||
"continue_if_fail": "smart", 如果子表不存在失败,taosBenchmark 会建立子表并继续写入。
|
“continue_if_fail”:“smart”,如果子表不存在失败,taosBenchmark 会建立子表并继续写入。
|
||||||
|
|
||||||
#### 数据库相关
|
#### 数据库相关
|
||||||
|
|
||||||
创建数据库时的相关参数在 json 配置文件中的 `dbinfo` 中配置,个别具体参数如下。其余参数均与 TDengine 中 `create database` 时所指定的数据库参数相对应,详见[../../taos-sql/database]
|
创建数据库时的相关参数在 json 配置文件中的 `dbinfo` 中配置,个别具体参数如下。其余参数均与 TDengine 中 `create database` 时所指定的数据库参数相对应,详见[../../taos-sql/database]
|
||||||
|
|
||||||
- **name** : 数据库名。
|
- **name**:数据库名。
|
||||||
|
|
||||||
- **drop** : 数据库已存在时是否删除,可选项为 "yes" 或 "no", 默认为 "yes" 。
|
- **drop**:数据库已存在时是否删除,可选项为 "yes" 或 "no",默认为 “yes” 。
|
||||||
|
|
||||||
#### 超级表相关
|
#### 超级表相关
|
||||||
|
|
||||||
创建超级表时的相关参数在 json 配置文件中的 `super_tables` 中配置,具体参数如下。
|
创建超级表时的相关参数在 json 配置文件中的 `super_tables` 中配置,具体参数如下。
|
||||||
|
|
||||||
- **name**: 超级表名,必须配置,没有默认值。
|
- **name**:超级表名,必须配置,没有默认值。
|
||||||
|
|
||||||
- **child_table_exists** : 子表是否已经存在,默认值为 "no",可选值为 "yes" 或 "no" 。
|
- **child_table_exists**:子表是否已经存在,默认值为 "no",可选值为 "yes" 或 "no" 。
|
||||||
|
|
||||||
- **childtable_count** : 子表的数量,默认值为 10。
|
- **childtable_count**:子表的数量,默认值为 10。
|
||||||
|
|
||||||
- **childtable_prefix** : 子表名称的前缀,必选配置项,没有默认值。
|
- **childtable_prefix**:子表名称的前缀,必选配置项,没有默认值。
|
||||||
|
|
||||||
- **escape_character** : 超级表和子表名称中是否包含转义字符,默认值为 "no",可选值为 "yes" 或 "no" 。
|
- **escape_character**:超级表和子表名称中是否包含转义字符,默认值为 "no",可选值为 "yes" 或 "no" 。
|
||||||
|
|
||||||
- **auto_create_table** : 仅当 insert_mode 为 taosc, rest, stmt 并且 child_table_exists 为 "no" 时生效,该参数为 "yes" 表示 taosBenchmark 在插入数据时会自动创建不存在的表;为 "no" 则表示先提前建好所有表再进行插入。
|
- **auto_create_table**:仅当 insert_mode 为 taosc、rest、stmt 并且 child_table_exists 为 "no" 时生效,该参数为 "yes" 表示 taosBenchmark 在插入数据时会自动创建不存在的表;为 "no" 则表示先提前建好所有表再进行插入。
|
||||||
|
|
||||||
- **batch_create_tbl_num** : 创建子表时每批次的建表数量,默认为 10。注:实际的批数不一定与该值相同,当执行的 SQL 语句大于支持的最大长度时,会自动截断再执行,继续创建。
|
- **batch_create_tbl_num**:创建子表时每批次的建表数量,默认为 10。注:实际的批数不一定与该值相同,当执行的 SQL 语句大于支持的最大长度时,会自动截断再执行,继续创建。
|
||||||
|
|
||||||
- **data_source** : 数据的来源,默认为 taosBenchmark 随机产生,可以配置为 "rand" 和 "sample"。为 "sample" 时使用 sample_file 参数指定的文件内的数据。
|
- **data_source**:数据的来源,默认为 taosBenchmark 随机产生,可以配置为 "rand" 和 "sample"。为 "sample" 时使用 sample_file 参数指定的文件内的数据。
|
||||||
|
|
||||||
- **insert_mode** : 插入模式,可选项有 taosc, rest, stmt, sml, sml-rest, 分别对应普通写入、restful 接口写入、参数绑定接口写入、schemaless 接口写入、restful schemaless 接口写入 (由 taosAdapter 提供)。默认值为 taosc 。
|
- **insert_mode**:插入模式,可选项有 taosc、rest、stmt、sml、sml-rest,分别对应普通写入、restful 接口写入、参数绑定接口写入、schemaless 接口写入、restful schemaless 接口写入 (由 taosAdapter 提供)。默认值为 taosc 。
|
||||||
|
|
||||||
- **non_stop_mode** : 指定是否持续写入,若为 "yes" 则 insert_rows 失效,直到 Ctrl + C 停止程序,写入才会停止。默认值为 "no",即写入指定数量的记录后停止。注:即使在持续写入模式下 insert_rows 失效,但其也必须被配置为一个非零正整数。
|
- **non_stop_mode**:指定是否持续写入,若为 "yes" 则 insert_rows 失效,直到 Ctrl + C 停止程序,写入才会停止。默认值为 "no",即写入指定数量的记录后停止。注:即使在持续写入模式下 insert_rows 失效,但其也必须被配置为一个非零正整数。
|
||||||
|
|
||||||
- **line_protocol** : 使用行协议插入数据,仅当 insert_mode 为 sml 或 sml-rest 时生效,可选项为 line, telnet, json 。
|
- **line_protocol**:使用行协议插入数据,仅当 insert_mode 为 sml 或 sml-rest 时生效,可选项为 line、telnet、json 。
|
||||||
|
|
||||||
- **tcp_transfer** : telnet 模式下的通信协议,仅当 insert_mode 为 sml-rest 并且 line_protocol 为 telnet 时生效。如果不配置,则默认为 http 协议。
|
- **tcp_transfer**:telnet 模式下的通信协议,仅当 insert_mode 为 sml-rest 并且 line_protocol 为 telnet 时生效。如果不配置,则默认为 http 协议。
|
||||||
|
|
||||||
- **insert_rows** : 每个子表插入的记录数,默认为 0 。
|
- **insert_rows**:每个子表插入的记录数,默认为 0 。
|
||||||
|
|
||||||
- **childtable_offset** : 仅当 child_table_exists 为 yes 时生效,指定从超级表获取子表列表时的偏移量,即从第几个子表开始。
|
- **childtable_offset**:仅当 child_table_exists 为 yes 时生效,指定从超级表获取子表列表时的偏移量,即从第几个子表开始。
|
||||||
|
|
||||||
- **childtable_limit** : 仅当 child_table_exists 为 yes 时生效,指定从超级表获取子表列表的上限。
|
- **childtable_limit**:仅当 child_table_exists 为 yes 时生效,指定从超级表获取子表列表的上限。
|
||||||
|
|
||||||
- **interlace_rows** : 启用交错插入模式并同时指定向每个子表每次插入的数据行数。交错插入模式是指依次向每张子表插入由本参数所指定的行数并重复这个过程,直到所有子表的数据都插入完成。默认值为 0, 即向一张子表完成数据插入后才会向下一张子表进行数据插入。
|
- **interlace_rows**:启用交错插入模式并同时指定向每个子表每次插入的数据行数。交错插入模式是指依次向每张子表插入由本参数所指定的行数并重复这个过程,直到所有子表的数据都插入完成。默认值为 0,即向一张子表完成数据插入后才会向下一张子表进行数据插入。
|
||||||
|
|
||||||
- **insert_interval** : 指定交错插入模式的插入间隔,单位为 ms,默认值为 0。 只有当 `-B/--interlace-rows` 大于 0 时才起作用。意味着数据插入线程在为每个子表插入隔行扫描记录后,会等待该值指定的时间间隔后再进行下一轮写入。
|
- **insert_interval**:指定交错插入模式的插入间隔,单位为 ms,默认值为 0。只有当 `-B/--interlace-rows` 大于 0 时才起作用。意味着数据插入线程在为每个子表插入隔行扫描记录后,会等待该值指定的时间间隔后再进行下一轮写入。
|
||||||
|
|
||||||
- **partial_col_num** : 若该值为正数 n 时, 则仅向前 n 列写入,仅当 insert_mode 为 taosc 和 rest 时生效,如果 n 为 0 则是向全部列写入。
|
- **partial_col_num**:若该值为正数 n 时,则仅向前 n 列写入,仅当 insert_mode 为 taosc 和 rest 时生效,如果 n 为 0 则是向全部列写入。
|
||||||
|
|
||||||
- **disorder_ratio** : 指定乱序数据的百分比概率,其值域为 [0,50]。默认为 0,即没有乱序数据。
|
- **disorder_ratio**:指定乱序数据的百分比概率,其值域为 [0,50]。默认为 0,即没有乱序数据。
|
||||||
|
|
||||||
- **disorder_range** : 指定乱序数据的时间戳回退范围。所生成的乱序时间戳为非乱序情况下应该使用的时间戳减去这个范围内的一个随机值。仅在 `-O/--disorder` 指定的乱序数据百分比大于 0 时有效。
|
- **disorder_range**:指定乱序数据的时间戳回退范围。所生成的乱序时间戳为非乱序情况下应该使用的时间戳减去这个范围内的一个随机值。仅在 `-O/--disorder` 指定的乱序数据百分比大于 0 时有效。
|
||||||
|
|
||||||
- **timestamp_step** : 每个子表中插入数据的时间戳步长,单位与数据库的 `precision` 一致,默认值是 1 。
|
- **timestamp_step**:每个子表中插入数据的时间戳步长,单位与数据库的 `precision` 一致,默认值是 1 。
|
||||||
|
|
||||||
- **start_timestamp** : 每个子表的时间戳起始值,默认值是 now 。
|
- **start_timestamp**:每个子表的时间戳起始值,默认值是 now 。
|
||||||
|
|
||||||
- **sample_format** : 样本数据文件的类型,现在只支持 "csv" 。
|
- **sample_format**:样本数据文件的类型,现在只支持 "csv" 。
|
||||||
|
|
||||||
- **sample_file** : 指定 csv 格式的文件作为数据源,仅当 data_source 为 sample 时生效。若 csv 文件内的数据行数小于等于 prepared_rand,那么会循环读取 csv 文件数据直到与 prepared_rand 相同;否则则会只读取 prepared_rand 个数的行的数据。也即最终生成的数据行数为二者取小。
|
- **sample_file**:指定 csv 格式的文件作为数据源,仅当 data_source 为 sample 时生效。若 csv 文件内的数据行数小于等于 prepared_rand,那么会循环读取 csv 文件数据直到与 prepared_rand 相同;否则则会只读取 prepared_rand 个数的行的数据。也即最终生成的数据行数为二者取小。
|
||||||
|
|
||||||
- **use_sample_ts** : 仅当 data_source 为 sample 时生效,表示 sample_file 指定的 csv 文件内是否包含第一列时间戳,默认为 no。 若设置为 yes, 则使用 csv 文件第一列作为时间戳,由于同一子表时间戳不能重复,生成的数据量取决于 csv 文件内的数据行数相同,此时 insert_rows 失效。
|
- **use_sample_ts**:仅当 data_source 为 sample 时生效,表示 sample_file 指定的 csv 文件内是否包含第一列时间戳,默认为 no。若设置为 yes,则使用 csv 文件第一列作为时间戳,由于同一子表时间戳不能重复,生成的数据量取决于 csv 文件内的数据行数相同,此时 insert_rows 失效。
|
||||||
|
|
||||||
- **tags_file** : 仅当 insert_mode 为 taosc, rest 的模式下生效。 最终的 tag 的数值与 childtable_count 有关,如果 csv 文件内的 tag 数据行小于给定的子表数量,那么会循环读取 csv 文件数据直到生成 childtable_count 指定的子表数量;否则则只会读取 childtable_count 行 tag 数据。也即最终生成的子表数量为二者取小。
|
- **tags_file**:仅当 insert_mode 为 taosc,rest 的模式下生效。最终的 tag 的数值与 childtable_count 有关,如果 csv 文件内的 tag 数据行小于给定的子表数量,那么会循环读取 csv 文件数据直到生成 childtable_count 指定的子表数量;否则则只会读取 childtable_count 行 tag 数据。也即最终生成的子表数量为二者取小。
|
||||||
|
|
||||||
- **primary_key** : 指定超级表是否有复合主键,取值 1 和 0, 复合主键列只能是超级表的第二列,指定生成复合主键后要确保第二列符合复合主键的数据类型,否则会报错。
|
- **primary_key**:指定超级表是否有复合主键,取值 1 和 0,复合主键列只能是超级表的第二列,指定生成复合主键后要确保第二列符合复合主键的数据类型,否则会报错。
|
||||||
- **repeat_ts_min** : 数值类型,复合主键开启情况下指定生成相同时间戳记录的最小个数,生成相同时间戳记录的个数是在范围[repeat_ts_min, repeat_ts_max] 内的随机值, 最小值等于最大值时为固定个数。
|
- **repeat_ts_min**:数值类型,复合主键开启情况下指定生成相同时间戳记录的最小个数,生成相同时间戳记录的个数是在范围[repeat_ts_min, repeat_ts_max] 内的随机值,最小值等于最大值时为固定个数。
|
||||||
- **repeat_ts_max** : 数值类型,复合主键开启情况下指定生成相同时间戳记录的最大个数。
|
- **repeat_ts_max**:数值类型,复合主键开启情况下指定生成相同时间戳记录的最大个数。
|
||||||
- **sqls** : 字符串数组类型,指定超级表创建成功后要执行的 sql 数组,sql 中指定表名前面要带数据库名,否则会报未指定数据库错误。
|
- **sqls**:字符串数组类型,指定超级表创建成功后要执行的 sql 数组,sql 中指定表名前面要带数据库名,否则会报未指定数据库错误。
|
||||||
|
|
||||||
|
|
||||||
#### 标签列与数据列
|
#### 标签列与数据列
|
||||||
|
|
||||||
指定超级表标签列与数据列的配置参数分别在 `super_tables` 中的 `columns` 和 `tag` 中。
|
指定超级表标签列与数据列的配置参数分别在 `super_tables` 中的 `columns` 和 `tag` 中。
|
||||||
|
|
||||||
- **type** : 指定列类型,可选值请参考 TDengine 支持的数据类型。
|
- **type**:指定列类型,可选值请参考 TDengine 支持的数据类型。
|
||||||
注:JSON 数据类型比较特殊,只能用于标签,当使用 JSON 类型作为 tag 时有且只能有这一个标签,此时 count 和 len 代表的意义分别是 JSON tag 内的 key-value pair 的个数和每个 KV pair 的 value 的值的长度,value 默认为 string。
|
注:JSON 数据类型比较特殊,只能用于标签,当使用 JSON 类型作为 tag 时有且只能有这一个标签,此时 count 和 len 代表的意义分别是 JSON tag 内的 key-value pair 的个数和每个 KV pair 的 value 的值的长度,value 默认为 string。
|
||||||
|
|
||||||
- **len** : 指定该数据类型的长度,对 NCHAR,BINARY 和 JSON 数据类型有效。如果对其他数据类型配置了该参数,若为 0 , 则代表该列始终都是以 null 值写入;如果不为 0 则被忽略。
|
- **len**:指定该数据类型的长度,对 NCHAR,BINARY 和 JSON 数据类型有效。如果对其他数据类型配置了该参数,若为 0,则代表该列始终都是以 null 值写入;如果不为 0 则被忽略。
|
||||||
|
|
||||||
- **count** : 指定该类型列连续出现的数量,例如 "count": 4096 即可生成 4096 个指定类型的列。
|
- **count**:指定该类型列连续出现的数量,例如 "count":4096 即可生成 4096 个指定类型的列。
|
||||||
|
|
||||||
- **name** : 列的名字,若与 count 同时使用,比如 "name":"current", "count":3, 则 3 个列的名字分别为 current, current_2. current_3。
|
- **name**:列的名字,若与 count 同时使用,比如 "name":"current","count":3,则 3 个列的名字分别为 current、current_2、current_3。
|
||||||
|
|
||||||
- **min** : 数据类型的 列/标签 的最小值。生成的值将大于或等于最小值。
|
- **min**:数据类型的 列/标签 的最小值。生成的值将大于或等于最小值。
|
||||||
|
|
||||||
- **max** : 数据类型的 列/标签 的最大值。生成的值将小于最大值。
|
- **max**:数据类型的 列/标签 的最大值。生成的值将小于最大值。
|
||||||
|
|
||||||
- **scalingFactor** : 浮点数精度增强因子,仅当数据类型是 float/double 时生效,有效值范围为 1 至 1000000 的正整数。用于增强生成浮点数的精度,特别是在 min 或 max 值较小的情况下。此属性按 10 的幂次增强小数点后的精度:scalingFactor 为 10 表示增强 1 位小数精度,100 表示增强 2 位,依此类推。
|
- **scalingFactor**:浮点数精度增强因子,仅当数据类型是 float/double 时生效,有效值范围为 1 至 1000000 的正整数。用于增强生成浮点数的精度,特别是在 min 或 max 值较小的情况下。此属性按 10 的幂次增强小数点后的精度:scalingFactor 为 10 表示增强 1 位小数精度,100 表示增强 2 位,依此类推。
|
||||||
|
|
||||||
- **fun** : 此列数据以函数填充,目前只支持 sin 和 cos 两函数,输入参数为时间戳换算成角度值,换算公式: 角度 x = 输入的时间列ts值 % 360。同时支持系数调节,随机波动因子调节,以固定格式的表达式展现,如 fun="10\*sin(x)+100\*random(5)" , x 表示角度,取值 0 ~ 360度,增长步长与时间列步长一致。10 表示乘的系数,100 表示加或减的系数,5 表示波动幅度在 5% 的随机范围内。目前支持的数据类型为 int, bigint, float, double 四种数据类型。注意:表达式为固定模式,不可前后颠倒。
|
- **fun**:此列数据以函数填充,目前只支持 sin 和 cos 两函数,输入参数为时间戳换算成角度值,换算公式:角度 x = 输入的时间列ts值 % 360。同时支持系数调节,随机波动因子调节,以固定格式的表达式展现,如 fun=“10\*sin(x)+100\*random(5)” , x 表示角度,取值 0 ~ 360度,增长步长与时间列步长一致。10 表示乘的系数,100 表示加或减的系数,5 表示波动幅度在 5% 的随机范围内。目前支持的数据类型为 int、bigint、float、double 四种数据类型。注意:表达式为固定模式,不可前后颠倒。
|
||||||
|
|
||||||
- **values** : nchar/binary 列/标签的值域,将从值中随机选择。
|
- **values**:nchar/binary 列/标签的值域,将从值中随机选择。
|
||||||
|
|
||||||
- **sma**: 将该列加入 SMA 中,值为 "yes" 或者 "no",默认为 "no" 。
|
- **sma**:将该列加入 SMA 中,值为 "yes" 或者 "no",默认为 "no" 。
|
||||||
|
|
||||||
- **encode**: 字符串类型,指定此列两级压缩中的第一级编码算法,详细参见创建超级表。
|
- **encode**:字符串类型,指定此列两级压缩中的第一级编码算法,详细参见创建超级表。
|
||||||
|
|
||||||
- **compress**: 字符串类型,指定此列两级压缩中的第二级加密算法,详细参见创建超级表。
|
- **compress**:字符串类型,指定此列两级压缩中的第二级加密算法,详细参见创建超级表。
|
||||||
|
|
||||||
- **level**: 字符串类型,指定此列两级压缩中的第二级加密算法的压缩率高低,详细参见创建超级表。
|
- **level**:字符串类型,指定此列两级压缩中的第二级加密算法的压缩率高低,详细参见创建超级表。
|
||||||
|
|
||||||
- **gen**: 字符串类型,指定此列生成数据的方式,不指定为随机,若指定为 "order", 会按自然数顺序增长。
|
- **gen**:字符串类型,指定此列生成数据的方式,不指定为随机,若指定为 “order”,会按自然数顺序增长。
|
||||||
|
|
||||||
- **fillNull**: 字符串类型,指定此列是否随机插入 NULL 值,可指定为 "true" 或 "false", 只有当 generate_row_rule 为 2 时有效。
|
- **fillNull**:字符串类型,指定此列是否随机插入 NULL 值,可指定为 “true” 或 "false",只有当 generate_row_rule 为 2 时有效。
|
||||||
|
|
||||||
#### 写入行为相关
|
#### 写入行为相关
|
||||||
|
|
||||||
- **thread_count** : 插入数据的线程数量,默认为 8。
|
- **thread_count**:插入数据的线程数量,默认为 8。
|
||||||
|
|
||||||
- **thread_bind_vgroup** : 写入时 vgroup 是否和写入线程绑定,绑定后可提升写入速度, 取值为 "yes" 或 "no",默认值为 "no", 设置为 "no" 后与原来行为一致。 当设为 "yes" 时,如果 thread_count 大于写入数据库 vgroups 数量, thread_count 自动调整为 vgroups 数量;如果 thread_count 小于 vgroups 数量,写入线程数量不做调整,一个线程写完一个 vgroup 数据后再写下一个,同时保持一个 vgroup 同时只能由一个线程写入的规则。
|
- **thread_bind_vgroup**:写入时 vgroup 是否和写入线程绑定,绑定后可提升写入速度,取值为 "yes" 或 "no",默认值为 “no”,设置为 “no” 后与原来行为一致。当设为 “yes” 时,如果 thread_count 大于写入数据库 vgroups 数量,thread_count 自动调整为 vgroups 数量;如果 thread_count 小于 vgroups 数量,写入线程数量不做调整,一个线程写完一个 vgroup 数据后再写下一个,同时保持一个 vgroup 同时只能由一个线程写入的规则。
|
||||||
|
|
||||||
- **create_table_thread_count** : 建表的线程数量,默认为 8。
|
- **create_table_thread_count**:建表的线程数量,默认为 8。
|
||||||
|
|
||||||
- **result_file** : 结果输出文件的路径,默认值为 ./output.txt 。
|
- **result_file**:结果输出文件的路径,默认值为 ./output.txt 。
|
||||||
|
|
||||||
- **confirm_parameter_prompt** : 开关参数,要求用户在提示后确认才能继续, 可取值 "yes" or "no"。默认值为 "no" 。
|
- **confirm_parameter_prompt**:开关参数,要求用户在提示后确认才能继续,可取值 "yes" or "no"。默认值为 "no" 。
|
||||||
|
|
||||||
- **interlace_rows** : 启用交错插入模式并同时指定向每个子表每次插入的数据行数。交错插入模式是指依次向每张子表插入由本参数所指定的行数并重复这个过程,直到所有子表的数据都插入完成。默认值为 0, 即向一张子表完成数据插入后才会向下一张子表进行数据插入。
|
- **interlace_rows**:启用交错插入模式并同时指定向每个子表每次插入的数据行数。交错插入模式是指依次向每张子表插入由本参数所指定的行数并重复这个过程,直到所有子表的数据都插入完成。默认值为 0,即向一张子表完成数据插入后才会向下一张子表进行数据插入。
|
||||||
在 `super_tables` 中也可以配置该参数,若配置则以 `super_tables` 中的配置为高优先级,覆盖全局设置。
|
在 `super_tables` 中也可以配置该参数,若配置则以 `super_tables` 中的配置为高优先级,覆盖全局设置。
|
||||||
|
|
||||||
- **insert_interval** :
|
- **insert_interval**:
|
||||||
指定交错插入模式的插入间隔,单位为 ms,默认值为 0。只有当 `-B/--interlace-rows` 大于 0 时才起作用。意味着数据插入线程在为每个子表插入隔行扫描记录后,会等待该值指定的时间间隔后再进行下一轮写入。
|
指定交错插入模式的插入间隔,单位为 ms,默认值为 0。只有当 `-B/--interlace-rows` 大于 0 时才起作用。意味着数据插入线程在为每个子表插入隔行扫描记录后,会等待该值指定的时间间隔后再进行下一轮写入。
|
||||||
在 `super_tables` 中也可以配置该参数,若配置则以 `super_tables` 中的配置为高优先级,覆盖全局设置。
|
在 `super_tables` 中也可以配置该参数,若配置则以 `super_tables` 中的配置为高优先级,覆盖全局设置。
|
||||||
|
|
||||||
- **num_of_records_per_req** :
|
- **num_of_records_per_req**:
|
||||||
每次向 TDengine 请求写入的数据行数,默认值为 30000 。当其设置过大时,TDengine 客户端驱动会返回相应的错误信息,此时需要调低这个参数的设置以满足写入要求。
|
每次向 TDengine 请求写入的数据行数,默认值为 30000 。当其设置过大时,TDengine 客户端驱动会返回相应的错误信息,此时需要调低这个参数的设置以满足写入要求。
|
||||||
|
|
||||||
- **prepare_rand** : 生成的随机数据中唯一值的数量。若为 1 则表示所有数据都相同。默认值为 10000 。
|
- **prepare_rand**:生成的随机数据中唯一值的数量。若为 1 则表示所有数据都相同。默认值为 10000 。
|
||||||
|
|
||||||
- **pre_load_tb_meta** :是否提前加载子表的 meta 数据,取值为 "yes" or "no"。当子表数量非常多时,打开此选项可提高写入速度。
|
- **pre_load_tb_meta**:是否提前加载子表的 meta 数据,取值为 “yes” or "no"。当子表数量非常多时,打开此选项可提高写入速度。
|
||||||
|
|
||||||
### 查询配置参数
|
### 查询配置参数
|
||||||
|
|
||||||
|
@ -264,38 +264,38 @@ interval 控制休眠时间,避免持续查询慢查询消耗 CPU ,单位为
|
||||||
|
|
||||||
查询指定表(可以指定超级表、子表或普通表)的配置参数在 `specified_table_query` 中设置。
|
查询指定表(可以指定超级表、子表或普通表)的配置参数在 `specified_table_query` 中设置。
|
||||||
|
|
||||||
- **mixed_query** : 查询模式
|
- **mixed_query**:查询模式
|
||||||
"yes" :`混合查询`
|
“yes”:`混合查询`
|
||||||
"no"(默认值) :`普通查询`
|
"no"(默认值):`普通查询`
|
||||||
`普通查询`:`sqls` 中每个 sql 启动 `threads` 个线程查询此 sql, 执行完 `query_times` 次查询后退出,执行此 sql 的所有线程都完成后进入下一个 sql
|
`普通查询`:`sqls` 中每个 sql 启动 `threads` 个线程查询此 sql,执行完 `query_times` 次查询后退出,执行此 sql 的所有线程都完成后进入下一个 sql
|
||||||
`查询总次数` = `sqls` 个数 * `query_times` * `threads`
|
`查询总次数` = `sqls` 个数 * `query_times` * `threads`
|
||||||
|
|
||||||
`混合查询`:`sqls` 中所有 sql 分成 `threads` 个组,每个线程执行一组,每个 sql 都需执行 `query_times` 次查询
|
`混合查询`:`sqls` 中所有 sql 分成 `threads` 个组,每个线程执行一组,每个 sql 都需执行 `query_times` 次查询
|
||||||
`查询总次数` = `sqls` 个数 * `query_times`
|
`查询总次数` = `sqls` 个数 * `query_times`
|
||||||
|
|
||||||
- **query_interval** : 查询时间间隔,单位: millisecond,默认值为 0。
|
- **query_interval**:查询时间间隔,单位:millisecond,默认值为 0。
|
||||||
|
|
||||||
- **threads** : 执行查询 SQL 的线程数,默认值为 1。
|
- **threads**:执行查询 SQL 的线程数,默认值为 1。
|
||||||
|
|
||||||
- **sqls**:
|
- **sqls**:
|
||||||
- **sql**: 执行的 SQL 命令,必填。
|
- **sql**:执行的 SQL 命令,必填。
|
||||||
- **result**: 保存查询结果的文件,未指定则不保存。
|
- **result**:保存查询结果的文件,未指定则不保存。
|
||||||
|
|
||||||
#### 查询超级表
|
#### 查询超级表
|
||||||
|
|
||||||
查询超级表的配置参数在 `super_table_query` 中设置。
|
查询超级表的配置参数在 `super_table_query` 中设置。
|
||||||
超级表查询的线程模式与上面介绍的指定查询语句查询的 `正常查询` 模式相同,不同之处是本 `sqls` 使用所有子表填充。
|
超级表查询的线程模式与上面介绍的指定查询语句查询的 `正常查询` 模式相同,不同之处是本 `sqls` 使用所有子表填充。
|
||||||
|
|
||||||
- **stblname** : 指定要查询的超级表的名称,必填。
|
- **stblname**:指定要查询的超级表的名称,必填。
|
||||||
|
|
||||||
- **query_interval** : 查询时间间隔,单位是秒,默认值为 0。
|
- **query_interval**:查询时间间隔,单位是秒,默认值为 0。
|
||||||
|
|
||||||
- **threads** : 执行查询 SQL 的线程数,默认值为 1。
|
- **threads**:执行查询 SQL 的线程数,默认值为 1。
|
||||||
|
|
||||||
- **sqls**:
|
- **sqls**:
|
||||||
- **sql** : 执行的 SQL 命令,必填;对于超级表的查询 SQL,在 SQL 命令中必须保留 "xxxx",会替换为超级下所有子表名后再执行。
|
- **sql**:执行的 SQL 命令,必填;对于超级表的查询 SQL,在 SQL 命令中必须保留 "xxxx",会替换为超级下所有子表名后再执行。
|
||||||
- **result** : 保存查询结果的文件,未指定则不保存。
|
- **result**:保存查询结果的文件,未指定则不保存。
|
||||||
- **限制项** : sqls 下配置 sql 数组最大为 100 个。
|
- **限制项**:sqls 下配置 sql 数组最大为 100 个。
|
||||||
|
|
||||||
### 订阅配置参数
|
### 订阅配置参数
|
||||||
|
|
||||||
|
@ -303,14 +303,14 @@ interval 控制休眠时间,避免持续查询慢查询消耗 CPU ,单位为
|
||||||
|
|
||||||
订阅配置参数在 `tmq_info` 项下设置,参数如下:
|
订阅配置参数在 `tmq_info` 项下设置,参数如下:
|
||||||
|
|
||||||
- **concurrent** : 消费订阅的消费者数量,或称并发消费数量,默认值:1。
|
- **concurrent**:消费订阅的消费者数量,或称并发消费数量,默认值:1。
|
||||||
- **create_mode** : 创建消费者模式,可取值 sequential:顺序创建, parallel:并发同时创建,必填项,无默认值。
|
- **create_mode**:创建消费者模式,可取值 sequential:顺序创建,parallel:并发同时创建,必填项,无默认值。
|
||||||
- **group_mode** : 生成消费者 groupId 模式,可取值 share:所有消费者只生成一个 groupId, independent:每个消费者生成一个独立的 groupId,如果 `group.id` 未设置,此项为必填项,无默认值。
|
- **group_mode**:生成消费者 groupId 模式,可取值 share:所有消费者只生成一个 groupId,independent:每个消费者生成一个独立的 groupId,如果 `group.id` 未设置,此项为必填项,无默认值。
|
||||||
- **poll_delay** : 调用 tmq_consumer_poll 传入的轮询超时时间,单位为毫秒,负数表示默认超时 1 秒。
|
- **poll_delay**:调用 tmq_consumer_poll 传入的轮询超时时间,单位为毫秒,负数表示默认超时 1 秒。
|
||||||
- **enable.manual.commit** : 是否允许手动提交,可取值 true:允许手动提交,每次消费完消息后手动调用 tmq_commit_sync 完成提交, false:不进行提交,默认值: false。
|
- **enable.manual.commit**:是否允许手动提交,可取值 true:允许手动提交,每次消费完消息后手动调用 tmq_commit_sync 完成提交,false:不进行提交,默认值:false。
|
||||||
- **rows_file** : 存储消费数据的文件,可以为全路径或相对路径,带文件名。实际保存的文件会在后面加上消费者序号,如 rows_file 为 result, 实际文件名为 result_1(消费者 1) result_2(消费者 2) ...
|
- **rows_file**:存储消费数据的文件,可以为全路径或相对路径,带文件名。实际保存的文件会在后面加上消费者序号,如 rows_file 为 result,实际文件名为 result_1(消费者 1) result_2(消费者 2) ...
|
||||||
- **expect_rows** : 期望每个消费者消费的行数,数据类型,当消费达到这个数,消费会退出,不设置会一直消费。
|
- **expect_rows**:期望每个消费者消费的行数,数据类型,当消费达到这个数,消费会退出,不设置会一直消费。
|
||||||
- **topic_list** : 指定消费的 topic 列表,数组类型。topic 列表格式示例: `{"name": "topic1", "sql": "select * from test.meters;"}` ,name:指定 topic 名,sql:指定创建 topic 的 sql 语句,需保证 sql 正确,框架会自动创建出 topic。
|
- **topic_list**:指定消费的 topic 列表,数组类型。topic 列表格式示例:`{"name": "topic1", "sql": "select * from test.meters;"}`,name:指定 topic 名,sql:指定创建 topic 的 sql 语句,需保证 sql 正确,框架会自动创建出 topic。
|
||||||
|
|
||||||
以下参数透传订阅属性,参见 [订阅创建参数](../../../develop/tmq/#创建参数) 说明:
|
以下参数透传订阅属性,参见 [订阅创建参数](../../../develop/tmq/#创建参数) 说明:
|
||||||
- **client.id**
|
- **client.id**
|
||||||
|
@ -319,7 +319,7 @@ interval 控制休眠时间,避免持续查询慢查询消耗 CPU ,单位为
|
||||||
- **enable.auto.commit**
|
- **enable.auto.commit**
|
||||||
- **msg.with.table.name**
|
- **msg.with.table.name**
|
||||||
- **auto.commit.interval.ms**
|
- **auto.commit.interval.ms**
|
||||||
- **group.id** : 若此值不指定,将由 `group_mode` 指定规则生成 groupId,若指定此值,`group_mode` 参数不再有效。
|
- **group.id**:若此值不指定,将由 `group_mode` 指定规则生成 groupId,若指定此值,`group_mode` 参数不再有效。
|
||||||
|
|
||||||
### 数据类型对照表
|
### 数据类型对照表
|
||||||
|
|
||||||
|
@ -395,23 +395,23 @@ SUCC: Spent 8.527298 (real 8.117379) seconds to insert rows: 10000000 with 8 thr
|
||||||
SUCC: insert delay, min: 19.6780ms, avg: 64.9390ms, p90: 94.6900ms, p95: 105.1870ms, p99: 130.6660ms, max: 157.0830ms
|
SUCC: insert delay, min: 19.6780ms, avg: 64.9390ms, p90: 94.6900ms, p95: 105.1870ms, p99: 130.6660ms, max: 157.0830ms
|
||||||
```
|
```
|
||||||
第一行写入速度统计:
|
第一行写入速度统计:
|
||||||
- Spent: 写入总耗时,单位秒,从开始写入第一个数据开始计时到最后一条数据结束,这里表示共花了 8.527298 秒。
|
- Spent:写入总耗时,单位秒,从开始写入第一个数据开始计时到最后一条数据结束,这里表示共花了 8.527298 秒。
|
||||||
- real : 写入总耗时(调用引擎),此耗时已抛去测试框架准备数据时间,纯统计在引擎调用上花费的时间,示例为 8.117379 秒,8.527298 - 8.117379 = 0.409919 秒则为测试框架准备数据消耗时间
|
- real:写入总耗时(调用引擎),此耗时已抛去测试框架准备数据时间,纯统计在引擎调用上花费的时间,示例为 8.117379 秒,8.527298 - 8.117379 = 0.409919 秒则为测试框架准备数据消耗时间
|
||||||
- rows : 写入总行数,为 1000 万条数据。
|
- rows:写入总行数,为 1000 万条数据。
|
||||||
- threads: 写入线程数,这里是 8 个线程同时写入。
|
- threads:写入线程数,这里是 8 个线程同时写入。
|
||||||
- records/second 写入速度 = `写入总耗时`/ `写入总行数`,括号中 `real` 同前,表示纯引擎写入速度。
|
- records/second 写入速度 = `写入总耗时`/ `写入总行数`,括号中 `real` 同前,表示纯引擎写入速度。
|
||||||
第二行单个写入延时统计:
|
第二行单个写入延时统计:
|
||||||
- min : 写入最小延时。
|
- min:写入最小延时。
|
||||||
- avg : 写入平时延时。
|
- avg:写入平时延时。
|
||||||
- p90 : 写入延时 p90 百分位上的延时数。
|
- p90:写入延时 p90 百分位上的延时数。
|
||||||
- p95 : 写入延时 p95 百分位上的延时数。
|
- p95:写入延时 p95 百分位上的延时数。
|
||||||
- p99 : 写入延时 p99 百分位上的延时数。
|
- p99:写入延时 p99 百分位上的延时数。
|
||||||
- max : 写入最大延时。
|
- max:写入最大延时。
|
||||||
通过此系列指标,可观察到写入请求延时分布情况。
|
通过此系列指标,可观察到写入请求延时分布情况。
|
||||||
|
|
||||||
#### 查询指标
|
#### 查询指标
|
||||||
|
|
||||||
查询性能测试主要输出查询请求速度 QPS 指标, 输出格式如下:
|
查询性能测试主要输出查询请求速度 QPS 指标,输出格式如下:
|
||||||
``` bash
|
``` bash
|
||||||
complete query with 3 threads and 10000 query delay avg: 0.002686s min: 0.001182s max: 0.012189s p90: 0.002977s p95: 0.003493s p99: 0.004645s SQL command: select ...
|
complete query with 3 threads and 10000 query delay avg: 0.002686s min: 0.001182s max: 0.012189s p90: 0.002977s p95: 0.003493s p99: 0.004645s SQL command: select ...
|
||||||
INFO: Spend 26.9530 second completed total queries: 30000, the QPS of all threads: 1113.049
|
INFO: Spend 26.9530 second completed total queries: 30000, the QPS of all threads: 1113.049
|
||||||
|
|
|
@ -25,7 +25,7 @@ CREATE DATABASE db_name PRECISION 'ns';
|
||||||
在 TDengine 中,普通表的数据模型中可使用以下数据类型。
|
在 TDengine 中,普通表的数据模型中可使用以下数据类型。
|
||||||
|
|
||||||
| # | **类型** | **Bytes** | **说明** |
|
| # | **类型** | **Bytes** | **说明** |
|
||||||
| --- | :---------------: | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| --- | :---------------: | --------- | ---------------------- |
|
||||||
| 1 | TIMESTAMP | 8 | 时间戳。缺省精度毫秒,可支持微秒和纳秒,详细说明见上节。|
|
| 1 | TIMESTAMP | 8 | 时间戳。缺省精度毫秒,可支持微秒和纳秒,详细说明见上节。|
|
||||||
| 2 | INT | 4 | 整型,范围 [-2^31, 2^31-1] |
|
| 2 | INT | 4 | 整型,范围 [-2^31, 2^31-1] |
|
||||||
| 3 | INT UNSIGNED | 4 | 无符号整数,[0, 2^32-1] |
|
| 3 | INT UNSIGNED | 4 | 无符号整数,[0, 2^32-1] |
|
||||||
|
@ -59,7 +59,7 @@ CREATE DATABASE db_name PRECISION 'ns';
|
||||||
| 3 | POLYGON((1.0 1.0, 2.0 2.0, 1.0 1.0)) | 13+3*16 | 13+4094*16 | +16 |
|
| 3 | POLYGON((1.0 1.0, 2.0 2.0, 1.0 1.0)) | 13+3*16 | 13+4094*16 | +16 |
|
||||||
|
|
||||||
- SQL 语句中的数值类型将依据是否存在小数点,或使用科学计数法表示,来判断数值类型是否为整型或者浮点型,因此在使用时要注意相应类型越界的情况。例如,9999999999999999999 会认为超过长整型的上边界而溢出,而 9999999999999999999.0 会被认为是有效的浮点数。
|
- SQL 语句中的数值类型将依据是否存在小数点,或使用科学计数法表示,来判断数值类型是否为整型或者浮点型,因此在使用时要注意相应类型越界的情况。例如,9999999999999999999 会认为超过长整型的上边界而溢出,而 9999999999999999999.0 会被认为是有效的浮点数。
|
||||||
- VARBINARY 是一种存储二进制数据的数据类型,最大长度为 65,517 字节,标签列最大长度为 16,382 字节。可以通过sql或schemaless方式写入二进制数据(需要转换为\x开头的字符串写入),也可以通过stmt方式写入(可以直接使用二进制)。显示时通过16进制\x开头。
|
- VARBINARY 是一种存储二进制数据的数据类型,最大长度为 65,517 字节,标签列最大长度为 16,382 字节。可以通过sql或schemaless方式写入二进制数据(需要转换为 `\x` 开头的字符串写入),也可以通过 stmt 方式写入(可以直接使用二进制)。显示时通过16进制\x开头。
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ CREATE DATABASE db_name PRECISION 'ns';
|
||||||
TDengine 支持多个类型的常量,细节如下表:
|
TDengine 支持多个类型的常量,细节如下表:
|
||||||
|
|
||||||
| # | **语法** | **类型** | **说明** |
|
| # | **语法** | **类型** | **说明** |
|
||||||
| --- | :-----------------------------------------------: | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| --- | :-----------------------------------------------: | --------- | -------------------------------------------------------------------------------- |
|
||||||
| 1 | [\{+ \| -}]123 | BIGINT | 整型数值的字面量的类型均为 BIGINT。如果用户输入超过了 BIGINT 的表示范围,TDengine 按 BIGINT 对数值进行截断。 |
|
| 1 | [\{+ \| -}]123 | BIGINT | 整型数值的字面量的类型均为 BIGINT。如果用户输入超过了 BIGINT 的表示范围,TDengine 按 BIGINT 对数值进行截断。 |
|
||||||
| 2 | 123.45 | DOUBLE | 浮点数值的字面量的类型均为 DOUBLE。TDengine 依据是否存在小数点,或使用科学计数法表示,来判断数值类型是否为整型或者浮点型。|
|
| 2 | 123.45 | DOUBLE | 浮点数值的字面量的类型均为 DOUBLE。TDengine 依据是否存在小数点,或使用科学计数法表示,来判断数值类型是否为整型或者浮点型。|
|
||||||
| 3 | 1.2E3 | DOUBLE | 科学计数法的字面量的类型为 DOUBLE。|
|
| 3 | 1.2E3 | DOUBLE | 科学计数法的字面量的类型为 DOUBLE。|
|
||||||
|
|
|
@ -46,13 +46,13 @@ database_option: {
|
||||||
### 参数说明
|
### 参数说明
|
||||||
|
|
||||||
- VGROUPS:数据库中初始 vgroup 的数目。
|
- VGROUPS:数据库中初始 vgroup 的数目。
|
||||||
- PRECISION:数据库的时间戳精度。ms 表示毫秒,us 表示微秒,ns 表示纳秒,默认 ms 毫秒。
|
- PRECISION:数据库的时间戳精度。ms 表示毫秒、us 表示微秒、ns 表示纳秒、默认 ms 毫秒。
|
||||||
- REPLICA:表示数据库副本数,取值为 1、2 或 3,默认为 1; 2 仅在企业版 3.3.0.0 及以后版本中可用。在集群中使用,副本数必须小于或等于 DNODE 的数目。且使用时存在以下限制:
|
- REPLICA:表示数据库副本数,取值为 1、2 或 3,默认为 1; 2 仅在企业版 3.3.0.0 及以后版本中可用。在集群中使用,副本数必须小于或等于 DNODE 的数目。且使用时存在以下限制:
|
||||||
- 暂不支持对双副本数据库相关 Vgroup 进行 SPLITE VGROUP 或 REDISTRIBUTE VGROUP 操作
|
- 暂不支持对双副本数据库相关 Vgroup 进行 SPLITE VGROUP 或 REDISTRIBUTE VGROUP 操作
|
||||||
- 单副本数据库可变更为双副本数据库,但不支持从双副本变更为其它副本数,也不支持从三副本变更为双副本
|
- 单副本数据库可变更为双副本数据库,但不支持从双副本变更为其它副本数,也不支持从三副本变更为双副本
|
||||||
- BUFFER: 一个 VNODE 写入内存池大小,单位为 MB,默认为 256,最小为 3,最大为 16384。
|
- BUFFER:一个 vnode 写入内存池大小,单位为 MB,默认为 256,最小为 3,最大为 16384。
|
||||||
- PAGES:一个 VNODE 中元数据存储引擎的缓存页个数,默认为 256,最小 64。一个 VNODE 元数据存储占用 PAGESIZE \* PAGES,默认情况下为 1MB 内存。
|
- PAGES:一个 vnode 中元数据存储引擎的缓存页个数,默认为 256,最小 64。一个 vnode 元数据存储占用 PAGESIZE \* PAGES,默认情况下为 1MB 内存。
|
||||||
- PAGESIZE:一个 VNODE 中元数据存储引擎的页大小,单位为 KB,默认为 4 KB。范围为 1 到 16384,即 1 KB 到 16 MB。
|
- PAGESIZE:一个 vnode 中元数据存储引擎的页大小,单位为 KB,默认为 4 KB。范围为 1 到 16384,即 1 KB 到 16 MB。
|
||||||
- CACHEMODEL:表示是否在内存中缓存子表的最近数据。默认为 none。
|
- CACHEMODEL:表示是否在内存中缓存子表的最近数据。默认为 none。
|
||||||
- none:表示不缓存。
|
- none:表示不缓存。
|
||||||
- last_row:表示缓存子表最近一行数据。这将显著改善 LAST_ROW 函数的性能表现。
|
- last_row:表示缓存子表最近一行数据。这将显著改善 LAST_ROW 函数的性能表现。
|
||||||
|
@ -67,7 +67,7 @@ database_option: {
|
||||||
- DURATION:数据文件存储数据的时间跨度。可以使用加单位的表示形式,如 DURATION 100h、DURATION 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。不加时间单位时默认单位为天,如 DURATION 50 表示 50 天。
|
- DURATION:数据文件存储数据的时间跨度。可以使用加单位的表示形式,如 DURATION 100h、DURATION 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。不加时间单位时默认单位为天,如 DURATION 50 表示 50 天。
|
||||||
- MAXROWS:文件块中记录的最大条数,默认为 4096 条。
|
- MAXROWS:文件块中记录的最大条数,默认为 4096 条。
|
||||||
- MINROWS:文件块中记录的最小条数,默认为 100 条。
|
- MINROWS:文件块中记录的最小条数,默认为 100 条。
|
||||||
- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于 3 倍的 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据从而释放存储空间。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。企业版支持[多级存储](../../operation/planning/#%E5%A4%9A%E7%BA%A7%E5%AD%98%E5%82%A8)功能, 因此, 可以设置多个保存时间(多个以英文逗号分隔,最多 3 个,满足 keep 0 \<= keep 1 \<= keep 2,如 KEEP 100h,100d,3650d); 社区版不支持多级存储功能(即使配置了多个保存时间, 也不会生效, KEEP 会取最大的保存时间)。了解更多,请点击 [关于主键时间戳](https://docs.taosdata.com/reference/taos-sql/insert/)
|
- KEEP:表示数据文件保存的天数,缺省值为 3650,取值范围 [1, 365000],且必须大于或等于 3 倍的 DURATION 参数值。数据库会自动删除保存时间超过 KEEP 值的数据从而释放存储空间。KEEP 可以使用加单位的表示形式,如 KEEP 100h、KEEP 10d 等,支持 m(分钟)、h(小时)和 d(天)三个单位。也可以不写单位,如 KEEP 50,此时默认单位为天。企业版支持[多级存储](https://docs.taosdata.com/operation/planning/#%E5%A4%9A%E7%BA%A7%E5%AD%98%E5%82%A8)功能, 因此, 可以设置多个保存时间(多个以英文逗号分隔,最多 3 个,满足 keep 0 \<= keep 1 \<= keep 2,如 KEEP 100h,100d,3650d); 社区版不支持多级存储功能(即使配置了多个保存时间, 也不会生效, KEEP 会取最大的保存时间)。了解更多,请点击 [关于主键时间戳](https://docs.taosdata.com/reference/taos-sql/insert/)
|
||||||
|
|
||||||
- KEEP_TIME_OFFSET:自 3.2.0.0 版本生效。删除或迁移保存时间超过 KEEP 值的数据的延迟执行时间,默认值为 0 (小时)。在数据文件保存时间超过 KEEP 后,删除或迁移操作不会立即执行,而会额外等待本参数指定的时间间隔,以实现与业务高峰期错开的目的。
|
- KEEP_TIME_OFFSET:自 3.2.0.0 版本生效。删除或迁移保存时间超过 KEEP 值的数据的延迟执行时间,默认值为 0 (小时)。在数据文件保存时间超过 KEEP 后,删除或迁移操作不会立即执行,而会额外等待本参数指定的时间间隔,以实现与业务高峰期错开的目的。
|
||||||
- STT_TRIGGER:表示落盘文件触发文件合并的个数。对于少表高频写入场景,此参数建议使用默认配置;而对于多表低频写入场景,此参数建议配置较大的值。
|
- STT_TRIGGER:表示落盘文件触发文件合并的个数。对于少表高频写入场景,此参数建议使用默认配置;而对于多表低频写入场景,此参数建议配置较大的值。
|
||||||
|
@ -76,17 +76,17 @@ database_option: {
|
||||||
- 1:表示只可以创建一张超级表。
|
- 1:表示只可以创建一张超级表。
|
||||||
- TABLE_PREFIX:当其为正值时,在决定把一个表分配到哪个 vgroup 时要忽略表名中指定长度的前缀;当其为负值时,在决定把一个表分配到哪个 vgroup 时只使用表名中指定长度的前缀;例如,假定表名为 "v30001",当 TSDB_PREFIX = 2 时 使用 "0001" 来决定分配到哪个 vgroup ,当 TSDB_PREFIX = -2 时使用 "v3" 来决定分配到哪个 vgroup
|
- TABLE_PREFIX:当其为正值时,在决定把一个表分配到哪个 vgroup 时要忽略表名中指定长度的前缀;当其为负值时,在决定把一个表分配到哪个 vgroup 时只使用表名中指定长度的前缀;例如,假定表名为 "v30001",当 TSDB_PREFIX = 2 时 使用 "0001" 来决定分配到哪个 vgroup ,当 TSDB_PREFIX = -2 时使用 "v3" 来决定分配到哪个 vgroup
|
||||||
- TABLE_SUFFIX:当其为正值时,在决定把一个表分配到哪个 vgroup 时要忽略表名中指定长度的后缀;当其为负值时,在决定把一个表分配到哪个 vgroup 时只使用表名中指定长度的后缀;例如,假定表名为 "v30001",当 TSDB_SUFFIX = 2 时 使用 "v300" 来决定分配到哪个 vgroup ,当 TSDB_SUFFIX = -2 时使用 "01" 来决定分配到哪个 vgroup。
|
- TABLE_SUFFIX:当其为正值时,在决定把一个表分配到哪个 vgroup 时要忽略表名中指定长度的后缀;当其为负值时,在决定把一个表分配到哪个 vgroup 时只使用表名中指定长度的后缀;例如,假定表名为 "v30001",当 TSDB_SUFFIX = 2 时 使用 "v300" 来决定分配到哪个 vgroup ,当 TSDB_SUFFIX = -2 时使用 "01" 来决定分配到哪个 vgroup。
|
||||||
- TSDB_PAGESIZE:一个 VNODE 中时序数据存储引擎的页大小,单位为 KB,默认为 4 KB。范围为 1 到 16384,即 1 KB到 16 MB。
|
- TSDB_PAGESIZE:一个 vnode 中时序数据存储引擎的页大小,单位为 KB,默认为 4 KB。范围为 1 到 16384,即 1 KB到 16 MB。
|
||||||
- DNODES:指定 VNODE 所在的 DNODE 列表,如 '1,2,3',以逗号区分且字符间不能有空格,仅企业版支持。
|
- DNODES:指定 vnode 所在的 DNODE 列表,如 '1,2,3',以逗号区分且字符间不能有空格,仅企业版支持。
|
||||||
- WAL_LEVEL:WAL 级别,默认为 1。
|
- WAL_LEVEL:WAL 级别,默认为 1。
|
||||||
- 1:写 WAL,但不执行 fsync。
|
- 1:写 WAL,但不执行 fsync。
|
||||||
- 2:写 WAL,而且执行 fsync。
|
- 2:写 WAL,而且执行 fsync。
|
||||||
- WAL_FSYNC_PERIOD:当 WAL_LEVEL 参数设置为 2 时,用于设置落盘的周期。默认为 3000,单位毫秒。最小为 0,表示每次写入立即落盘;最大为 180000,即三分钟。
|
- WAL_FSYNC_PERIOD:当 WAL_LEVEL 参数设置为 2 时,用于设置落盘的周期。默认为 3000,单位毫秒。最小为 0,表示每次写入立即落盘;最大为 180000,即三分钟。
|
||||||
- WAL_RETENTION_PERIOD: 为了数据订阅消费,需要 WAL 日志文件额外保留的最大时长策略。WAL 日志清理,不受订阅客户端消费状态影响。单位为 s。默认为 3600,表示在 WAL 保留最近 3600 秒的数据,请根据数据订阅的需要修改这个参数为适当值。
|
- WAL_RETENTION_PERIOD:为了数据订阅消费,需要 WAL 日志文件额外保留的最大时长策略。WAL 日志清理,不受订阅客户端消费状态影响。单位为 s。默认为 3600,表示在 WAL 保留最近 3600 秒的数据,请根据数据订阅的需要修改这个参数为适当值。
|
||||||
- WAL_RETENTION_SIZE:为了数据订阅消费,需要 WAL 日志文件额外保留的最大累计大小策略。单位为 KB。默认为 0,表示累计大小无上限。
|
- WAL_RETENTION_SIZE:为了数据订阅消费,需要 WAL 日志文件额外保留的最大累计大小策略。单位为 KB。默认为 0,表示累计大小无上限。
|
||||||
- COMPACT_INTERVAL:自动 compact 触发周期(从 1970-01-01T00:00:00Z 开始切分的时间周期)。取值范围:0 或 [10m, keep2],单位:m(分钟),h(小时),d(天)。不加时间单位默认单位为天,默认值为 0,即不触发自动 compact 功能。如果 db 中有未完成的 compact 任务,不重复下发 compact 任务。仅企业版 3.3.5.0 版本开始支持。
|
- COMPACT_INTERVAL:自动 compact 触发周期(从 1970-01-01T00:00:00Z 开始切分的时间周期)。取值范围:0 或 [10m, keep2],单位:m(分钟),h(小时),d(天)。不加时间单位默认单位为天,默认值为 0,即不触发自动 compact 功能。如果 db 中有未完成的 compact 任务,不重复下发 compact 任务。仅企业版 3.3.5.0 版本开始支持。
|
||||||
- COMPACT_TIME_RANGE:自动 compact 任务触发的 compact 时间范围,取值范围:[-keep2, -duration],单位:m(分钟),h(小时),d(天)。不加时间单位时默认单位为天,默认值为 [0, 0]。取默认值 [0, 0] 时,如果 COMPACT_INTERVAL 大于 0,会按照 [-keep2, -duration] 下发自动 compact。因此,要关闭自动 compact 功能,需要将 COMPACT_INTERVAL 设置为 0。仅企业版 3.3.5.0 版本开始支持。
|
- COMPACT_TIME_RANGE:自动 compact 任务触发的 compact 时间范围,取值范围:[-keep2, -duration],单位:m(分钟),h(小时),d(天)。不加时间单位时默认单位为天,默认值为 [0, 0]。取默认值 [0, 0] 时,如果 COMPACT_INTERVAL 大于 0,会按照 [-keep2, -duration] 下发自动 compact。因此,要关闭自动 compact 功能,需要将 COMPACT_INTERVAL 设置为 0。仅企业版 3.3.5.0 版本开始支持。
|
||||||
- COMPACT_TIME_OFFSET:自动 compact 任务触发的 compact 时间相对本地时间的偏移量。取值范围:[0,23],单位: h(小时),默认值为 0。以 UTC 0 时区为例,如果 COMPACT_INTERVAL 为 1d,当 COMPACT_TIME_OFFSET 为 0 时,在每天 0 点下发自动 compact,如果 COMPACT_TIME_OFFSET 为 2,在每天 2 点下发自动 compact。仅企业版 3.3.5.0 版本开始支持。
|
- COMPACT_TIME_OFFSET:自动 compact 任务触发的 compact 时间相对本地时间的偏移量。取值范围:[0, 23],单位:h(小时),默认值为 0。以 UTC 0 时区为例,如果 COMPACT_INTERVAL 为 1d,当 COMPACT_TIME_OFFSET 为 0 时,在每天 0 点下发自动 compact,如果 COMPACT_TIME_OFFSET 为 2,在每天 2 点下发自动 compact。仅企业版 3.3.5.0 版本开始支持。
|
||||||
-
|
-
|
||||||
|
|
||||||
### 创建数据库示例
|
### 创建数据库示例
|
||||||
|
|
|
@ -99,10 +99,10 @@ Hints 是用户控制单个语句查询优化的一种手段,当 Hint 不适
|
||||||
| :-----------: | -------------- | -------------------------- | -----------------------------|
|
| :-----------: | -------------- | -------------------------- | -----------------------------|
|
||||||
| BATCH_SCAN | 无 | 采用批量读表的方式 | 超级表 JOIN 语句 |
|
| BATCH_SCAN | 无 | 采用批量读表的方式 | 超级表 JOIN 语句 |
|
||||||
| NO_BATCH_SCAN | 无 | 采用顺序读表的方式 | 超级表 JOIN 语句 |
|
| NO_BATCH_SCAN | 无 | 采用顺序读表的方式 | 超级表 JOIN 语句 |
|
||||||
| SORT_FOR_GROUP| 无 | 采用sort方式进行分组, 与PARTITION_FIRST冲突 | partition by 列表有普通列时 |
|
| SORT_FOR_GROUP| 无 | 采用 sort 方式进行分组,与 PARTITION_FIRST 冲突 | partition by 列表有普通列时 |
|
||||||
| PARTITION_FIRST| 无 | 在聚合之前使用PARTITION计算分组, 与SORT_FOR_GROUP冲突 | partition by 列表有普通列时 |
|
| PARTITION_FIRST| 无 | 在聚合之前使用 PARTITION 计算分组,与 SORT_FOR_GROUP 冲突 | partition by 列表有普通列时 |
|
||||||
| PARA_TABLES_SORT| 无 | 超级表的数据按时间戳排序时, 不使用临时磁盘空间, 只使用内存。当子表数量多, 行长比较大时候, 会使用大量内存, 可能发生OOM | 超级表的数据按时间戳排序时 |
|
| PARA_TABLES_SORT| 无 | 超级表的数据按时间戳排序时,不使用临时磁盘空间,只使用内存。当子表数量多,行长比较大时候,会使用大量内存,可能发生 OOM | 超级表的数据按时间戳排序时 |
|
||||||
| SMALLDATA_TS_SORT| 无 | 超级表的数据按时间戳排序时, 查询列长度大于等于256, 但是行数不多, 使用这个提示, 可以提高性能 | 超级表的数据按时间戳排序时 |
|
| SMALLDATA_TS_SORT| 无 | 超级表的数据按时间戳排序时,查询列长度大于等于 256,但是行数不多,使用这个提示,可以提高性能 | 超级表的数据按时间戳排序时 |
|
||||||
| SKIP_TSMA | 无 | 用于显示的禁用 TSMA 查询优化 | 带 Agg 函数的查询语句 |
|
| SKIP_TSMA | 无 | 用于显示的禁用 TSMA 查询优化 | 带 Agg 函数的查询语句 |
|
||||||
|
|
||||||
举例:
|
举例:
|
||||||
|
@ -321,13 +321,13 @@ NULLS 语法用来指定 NULL 值在排序中输出的位置。NULLS LAST 是升
|
||||||
|
|
||||||
## LIMIT
|
## LIMIT
|
||||||
|
|
||||||
LIMIT 控制输出条数,OFFSET 指定从第几条之后开始输出。LIMIT/OFFSET 对结果集的执行顺序在 ORDER BY 之后。LIMIT 5 OFFSET 2 可以简写为 LIMIT 2, 5,都输出第 3 行到第 7 行数据。
|
LIMIT 控制输出条数,OFFSET 指定从第几条之后开始输出。LIMIT/OFFSET 对结果集的执行顺序在 ORDER BY 之后。`LIMIT 5 OFFSET 2` 可以简写为 `LIMIT 2, 5`,都输出第 3 行到第 7 行数据。
|
||||||
|
|
||||||
在有 PARTITION BY/GROUP BY 子句时,LIMIT 控制的是每个切分的分片中的输出,而不是总的结果集输出。
|
在有 PARTITION BY/GROUP BY 子句时,LIMIT 控制的是每个切分的分片中的输出,而不是总的结果集输出。
|
||||||
|
|
||||||
## SLIMIT
|
## SLIMIT
|
||||||
|
|
||||||
SLIMIT 和 PARTITION BY/GROUP BY 子句一起使用,用来控制输出的分片的数量。SLIMIT 5 SOFFSET 2 可以简写为 SLIMIT 2, 5,都表示输出第 3 个到第 7 个分片。
|
SLIMIT 和 PARTITION BY/GROUP BY 子句一起使用,用来控制输出的分片的数量。`SLIMIT 5 SOFFSET 2` 可以简写为 SLIMIT `2, 5`,都表示输出第 3 个到第 7 个分片。
|
||||||
|
|
||||||
需要注意,如果有 ORDER BY 子句,则输出只有一个分片。
|
需要注意,如果有 ORDER BY 子句,则输出只有一个分片。
|
||||||
|
|
||||||
|
@ -484,8 +484,8 @@ SELECT ... FROM (SELECT ... FROM ...) ...;
|
||||||
- 内层查询的 ORDER BY 子句一般没有意义,建议避免这样的写法以免无谓的资源消耗。
|
- 内层查询的 ORDER BY 子句一般没有意义,建议避免这样的写法以免无谓的资源消耗。
|
||||||
- 与非嵌套的查询语句相比,外层查询所能支持的功能特性存在如下限制:
|
- 与非嵌套的查询语句相比,外层查询所能支持的功能特性存在如下限制:
|
||||||
- 计算函数部分:
|
- 计算函数部分:
|
||||||
- 如果内层查询的结果数据未提供时间戳,那么计算过程隐式依赖时间戳的函数在外层会无法正常工作。例如:INTERP, DERIVATIVE, IRATE, LAST_ROW, FIRST, LAST, TWA, STATEDURATION, TAIL, UNIQUE。
|
- 如果内层查询的结果数据未提供时间戳,那么计算过程隐式依赖时间戳的函数在外层会无法正常工作。例如:INTERP、DERIVATIVE、IRATE、LAST_ROW、FIRST、LAST、TWA、STATEDURATION、TAIL、UNIQUE。
|
||||||
- 如果内层查询的结果数据不是按时间戳有序,那么计算过程依赖数据按时间有序的函数在外层会无法正常工作。例如:LEASTSQUARES, ELAPSED, INTERP, DERIVATIVE, IRATE, TWA, DIFF, STATECOUNT, STATEDURATION, CSUM, MAVG, TAIL, UNIQUE。
|
- 如果内层查询的结果数据不是按时间戳有序,那么计算过程依赖数据按时间有序的函数在外层会无法正常工作。例如:LEASTSQUARES、ELAPSED、INTERP、DERIVATIVE、IRATE、TWA、DIFF、STATECOUNT、STATEDURATION、CSUM、MAVG、TAIL、UNIQUE。
|
||||||
- 计算过程需要两遍扫描的函数,在外层查询中无法正常工作。例如:此类函数包括:PERCENTILE。
|
- 计算过程需要两遍扫描的函数,在外层查询中无法正常工作。例如:此类函数包括:PERCENTILE。
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
@ -520,7 +520,7 @@ SELECT * FROM tb1 WHERE ts >= NOW - 1h;
|
||||||
SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE '%nny' ORDER BY ts DESC;
|
SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE '%nny' ORDER BY ts DESC;
|
||||||
```
|
```
|
||||||
|
|
||||||
查询 col1 与 col2 的和,并取名 complex, 时间大于 2018-06-01 08:00:00.000, col2 大于 1.2,结果输出仅仅 10 条记录,从第 5 条开始:
|
查询 col1 与 col2 的和,并取名 complex,时间大于 2018-06-01 08:00:00.000,col2 大于 1.2,结果输出仅仅 10 条记录,从第 5 条开始:
|
||||||
|
|
||||||
```
|
```
|
||||||
SELECT (col1 + col2) AS 'complex' FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5;
|
SELECT (col1 + col2) AS 'complex' FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5;
|
||||||
|
|
|
@ -41,7 +41,7 @@ SHOW INDEXES FROM [db_name.]tbl_name;
|
||||||
|
|
||||||
## 使用说明
|
## 使用说明
|
||||||
|
|
||||||
1. 索引使用得当能够提升数据过滤的效率,目前支持的过滤算子有 `=`, `>`, `>=`, `<`, `<=`。如果查询过滤条件中使用了这些算子,则索引能够明显提升查询效率。但如果查询过滤条件中使用的是其它算子,则索引起不到作用,查询效率没有变化。未来会逐步添加更多的算子。
|
1. 索引使用得当能够提升数据过滤的效率,目前支持的过滤算子有 `=`、`>`、`>=`、`<`、`<=`。如果查询过滤条件中使用了这些算子,则索引能够明显提升查询效率。但如果查询过滤条件中使用的是其它算子,则索引起不到作用,查询效率没有变化。未来会逐步添加更多的算子。
|
||||||
|
|
||||||
2. 针对一个 tag 列只能建立一个索引,如果重复创建索引则会报错。
|
2. 针对一个 tag 列只能建立一个索引,如果重复创建索引则会报错。
|
||||||
|
|
||||||
|
@ -55,4 +55,4 @@ SHOW INDEXES FROM [db_name.]tbl_name;
|
||||||
|
|
||||||
7. 如果某个 tag 列的唯一值较少时,不建议对其建立索引,这种情况下收效甚微。
|
7. 如果某个 tag 列的唯一值较少时,不建议对其建立索引,这种情况下收效甚微。
|
||||||
|
|
||||||
8. 新建立的超级表,会给第一列tag,随机生成一个indexNewName, 生成规则是:tag0的name + 23个byte, 在系统表可以查,也可以按需要drop,行为和其他列tag 的索引一样
|
8. 新建立的超级表,会给第一列 tag,随机生成一个indexNewName,生成规则是:tag0的name + 23个byte,在系统表可以查,也可以按需要drop,行为和其他列 tag 的索引一样
|
||||||
|
|
|
@ -14,19 +14,19 @@ title: "删除数据"
|
||||||
DELETE FROM [ db_name. ] tb_name [WHERE condition];
|
DELETE FROM [ db_name. ] tb_name [WHERE condition];
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能:** 删除指定表或超级表中的数据记录
|
**功能**:删除指定表或超级表中的数据记录
|
||||||
|
|
||||||
**参数:**
|
**参数**:
|
||||||
|
|
||||||
- `db_name` :可选参数,指定要删除表所在的数据库名,不填写则在当前数据库中
|
- `db_name` :可选参数,指定要删除表所在的数据库名,不填写则在当前数据库中
|
||||||
- `tb_name` :必填参数,指定要删除数据的表名,可以是普通表、子表,也可以是超级表。
|
- `tb_name` :必填参数,指定要删除数据的表名,可以是普通表、子表,也可以是超级表。
|
||||||
- `condition`:可选参数,指定删除数据的过滤条件,不指定过滤条件则为表中所有数据,请慎重使用。特别说明,这里的 where 条件中只支持对第一列时间列的过滤。
|
- `condition`:可选参数,指定删除数据的过滤条件,不指定过滤条件则为表中所有数据,请慎重使用。特别说明,这里的 where 条件中只支持对第一列时间列的过滤。
|
||||||
|
|
||||||
**特别说明:**
|
**特别说明**:
|
||||||
|
|
||||||
数据删除后不可恢复,请慎重使用。为了确保删除的数据确实是自己要删除的,建议可以先使用 `select` 语句加 `where` 后的删除条件查看要删除的数据内容,确认无误后再执行 `delete` 命令。
|
数据删除后不可恢复,请慎重使用。为了确保删除的数据确实是自己要删除的,建议可以先使用 `select` 语句加 `where` 后的删除条件查看要删除的数据内容,确认无误后再执行 `delete` 命令。
|
||||||
|
|
||||||
**示例:**
|
**示例**:
|
||||||
|
|
||||||
`meters` 是一个超级表,`groupid` 是 int 类型的 tag 列,现在要删除 `meters` 表中时间小于 2021-10-01 10:40:00.100 的所有数据,sql 如下:
|
`meters` 是一个超级表,`groupid` 是 int 类型的 tag 列,现在要删除 `meters` 表中时间小于 2021-10-01 10:40:00.100 的所有数据,sql 如下:
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ ROUND(expr[, digits])
|
||||||
- `digits` 小于零表示丢掉小数位,并将数字四舍五入到小数点左侧 `digits` 位。若小数点左侧的位数小于 `digits`位,返回 0。
|
- `digits` 小于零表示丢掉小数位,并将数字四舍五入到小数点左侧 `digits` 位。若小数点左侧的位数小于 `digits`位,返回 0。
|
||||||
- 由于暂未支持 DECIMAL 类型,所以该函数会用 DOUBLE 和 FLOAT 来表示包含小数的结果,但是 DOUBLE 和 FLOAT 是有精度上限的,当位数太多时使用该函数可能没有意义。
|
- 由于暂未支持 DECIMAL 类型,所以该函数会用 DOUBLE 和 FLOAT 来表示包含小数的结果,但是 DOUBLE 和 FLOAT 是有精度上限的,当位数太多时使用该函数可能没有意义。
|
||||||
- 只能与普通列,选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
|
- 只能与普通列,选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
|
||||||
- `digits` 从 3.3.3.0 版本开始支持。
|
- `digits` 从 v3.3.3.0 开始支持。
|
||||||
|
|
||||||
**举例**:
|
**举例**:
|
||||||
```sql
|
```sql
|
||||||
|
@ -269,7 +269,7 @@ PI()
|
||||||
|
|
||||||
**功能说明**:返回圆周率 π 的值。
|
**功能说明**:返回圆周率 π 的值。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。
|
**返回结果类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ TRUNCATE(expr, digits)
|
||||||
|
|
||||||
**功能说明**:获得指定字段按照指定位数截断的值。
|
**功能说明**:获得指定字段按照指定位数截断的值。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:与 `expr` 字段的原始数据类型一致。
|
**返回结果类型**:与 `expr` 字段的原始数据类型一致。
|
||||||
|
|
||||||
|
@ -338,7 +338,7 @@ EXP(expr)
|
||||||
```
|
```
|
||||||
**功能说明**:返回 e(自然对数的底)的指定乘方后的值。
|
**功能说明**:返回 e(自然对数的底)的指定乘方后的值。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。
|
**返回结果类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -367,7 +367,7 @@ LN(expr)
|
||||||
|
|
||||||
**功能说明**:返回指定参数的自然对数。
|
**功能说明**:返回指定参数的自然对数。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。
|
**返回结果类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -397,7 +397,7 @@ MOD(expr1, expr2)
|
||||||
|
|
||||||
**功能说明**:计算 expr1 % expr2 的结果。
|
**功能说明**:计算 expr1 % expr2 的结果。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。
|
**返回结果类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ RAND([seed])
|
||||||
|
|
||||||
**功能说明**:返回一个从0到1均匀分布的随机数。
|
**功能说明**:返回一个从0到1均匀分布的随机数。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。
|
**返回结果类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -477,7 +477,7 @@ SIGN(expr)
|
||||||
|
|
||||||
**功能说明**:返回指定参数的符号。
|
**功能说明**:返回指定参数的符号。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:与指定字段的原始数据类型一致。
|
**返回结果类型**:与指定字段的原始数据类型一致。
|
||||||
|
|
||||||
|
@ -519,7 +519,7 @@ DEGREES(expr)
|
||||||
|
|
||||||
**功能说明**:计算指定参数由弧度值转为角度后的值。
|
**功能说明**:计算指定参数由弧度值转为角度后的值。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。
|
**返回结果类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -549,7 +549,7 @@ RADIANS(expr)
|
||||||
|
|
||||||
**功能说明**:计算指定参数由角度值转为弧度后的值。
|
**功能说明**:计算指定参数由角度值转为弧度后的值。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。
|
**返回结果类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -721,7 +721,7 @@ TRIM([remstr FROM] expr)
|
||||||
|
|
||||||
**功能说明**:返回去掉了所有 remstr 前缀或后缀的字符串 epxr。
|
**功能说明**:返回去掉了所有 remstr 前缀或后缀的字符串 epxr。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:与输入字段 epxr 的原始类型相同。
|
**返回结果类型**:与输入字段 epxr 的原始类型相同。
|
||||||
|
|
||||||
|
@ -794,8 +794,8 @@ SUBSTRING/SUBSTR(expr FROM pos [FOR len])
|
||||||
- 若 `len` 小于 1,返回空串。
|
- 若 `len` 小于 1,返回空串。
|
||||||
- `pos` 是 1-base 的,若 `pos` 为 0,返回空串。
|
- `pos` 是 1-base 的,若 `pos` 为 0,返回空串。
|
||||||
- 若 `pos` + `len` 大于 `len(expr)`,返回从 `pos` 开始到字符串结尾的子串,等同于执行 `substring(expr, pos)`。
|
- 若 `pos` + `len` 大于 `len(expr)`,返回从 `pos` 开始到字符串结尾的子串,等同于执行 `substring(expr, pos)`。
|
||||||
- `SUBSTRING` 函数等价于 `SUBSTR`,从 3.3.3.0 版本开始支持。
|
- `SUBSTRING` 函数等价于 `SUBSTR`,从 v3.3.3.0 开始支持。
|
||||||
- `SUBSTRING/SUBSTR(expr FROM pos [FOR len])` 语法从 3.3.3.0 版本开始支持。
|
- `SUBSTRING/SUBSTR(expr FROM pos [FOR len])` 语法从 v3.3.3.0 开始支持。
|
||||||
|
|
||||||
**举例**:
|
**举例**:
|
||||||
```sql
|
```sql
|
||||||
|
@ -832,12 +832,12 @@ SUBSTRING_INDEX(expr, delim, count)
|
||||||
|
|
||||||
**功能说明**:返回字符串 `expr` 在出现指定次数分隔符的位置截取的子串。
|
**功能说明**:返回字符串 `expr` 在出现指定次数分隔符的位置截取的子串。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:与输入字段 `expr` 的原始类型相同。
|
**返回结果类型**:与输入字段 `expr` 的原始类型相同。
|
||||||
|
|
||||||
**适用数据类型**:
|
**适用数据类型**:
|
||||||
- `expr`:VARCHA、 NCHAR。
|
- `expr`:VARCHAR、NCHAR。
|
||||||
- `delim`:VARCHAR、NCHAR。
|
- `delim`:VARCHAR、NCHAR。
|
||||||
- `count`:INTEGER。
|
- `count`:INTEGER。
|
||||||
|
|
||||||
|
@ -887,18 +887,18 @@ CHAR(expr1 [, expr2] [, epxr3] ...)
|
||||||
|
|
||||||
**功能说明**:将输入参数当作整数,并返回这些整数在 ASCII 编码中对应的字符。
|
**功能说明**:将输入参数当作整数,并返回这些整数在 ASCII 编码中对应的字符。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:VARCHAR。
|
**返回结果类型**:VARCHAR。
|
||||||
|
|
||||||
**适用数据类型**:整数类型,VARCHAR,NCHAR。
|
**适用数据类型**:整数类型,VARCHAR、NCHAR。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
**适用于**:表和超级表。
|
**适用于**:表和超级表。
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
- 输入的值超过 255 会被转化成多字节的结果,如 `CHAR(256)` 等同于 `CHAR(1,0)`,`CHAR(256 * 256)` 等同于 `CHAR(1,0,0)`。
|
- 输入的值超过 255 会被转化成多字节的结果,如 `CHAR(256)` 等同于 `CHAR(1,0)`、`CHAR(256 * 256)` 等同于 `CHAR(1,0,0)`。
|
||||||
- 输入参数的 NULL 值会被跳过。
|
- 输入参数的 NULL 值会被跳过。
|
||||||
- 输入参数若为字符串类型,会将其转换为数值类型处理。
|
- 输入参数若为字符串类型,会将其转换为数值类型处理。
|
||||||
- 若输入的参数对应的字符为不可打印字符,返回值中仍有该参数对应的字符,但是可能无法显示出来。
|
- 若输入的参数对应的字符为不可打印字符,返回值中仍有该参数对应的字符,但是可能无法显示出来。
|
||||||
|
@ -934,7 +934,7 @@ ASCII(expr)
|
||||||
|
|
||||||
**功能说明**:返回字符串第一个字符的 ASCII 码。
|
**功能说明**:返回字符串第一个字符的 ASCII 码。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果数据类型**:BIGINT。
|
**返回结果数据类型**:BIGINT。
|
||||||
|
|
||||||
|
@ -963,7 +963,7 @@ POSITION(expr1 IN expr2)
|
||||||
|
|
||||||
**功能说明**:计算字符串 `expr1` 在字符串 `expr2` 中的位置。
|
**功能说明**:计算字符串 `expr1` 在字符串 `expr2` 中的位置。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:BIGINT。
|
**返回结果类型**:BIGINT。
|
||||||
|
|
||||||
|
@ -1007,7 +1007,7 @@ REPLACE(expr, from_str, to_str)
|
||||||
```
|
```
|
||||||
**功能说明**:将字符串中的 `from_str` 全部替换为 `to_str`。
|
**功能说明**:将字符串中的 `from_str` 全部替换为 `to_str`。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:与输入字段 `expr` 的原始类型相同。
|
**返回结果类型**:与输入字段 `expr` 的原始类型相同。
|
||||||
|
|
||||||
|
@ -1039,7 +1039,7 @@ REPEAT(expr, count)
|
||||||
```
|
```
|
||||||
**功能说明**:返回将字符串重复指定次数得到的字符串。
|
**功能说明**:返回将字符串重复指定次数得到的字符串。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:与输入字段 `expr` 的原始类型相同。
|
**返回结果类型**:与输入字段 `expr` 的原始类型相同。
|
||||||
|
|
||||||
|
@ -1091,9 +1091,9 @@ CAST(expr AS type_name)
|
||||||
|
|
||||||
- 对于不能支持的类型转换会直接报错。
|
- 对于不能支持的类型转换会直接报错。
|
||||||
- 对于类型支持但某些值无法正确转换的情况,对应的转换后的值以转换函数输出为准。目前可能遇到的几种情况:
|
- 对于类型支持但某些值无法正确转换的情况,对应的转换后的值以转换函数输出为准。目前可能遇到的几种情况:
|
||||||
1)字符串类型转换数值类型时可能出现的无效字符情况,例如 "a" 可能转为 0,但不会报错。
|
- 字符串类型转换数值类型时可能出现的无效字符情况,例如 "a" 可能转为 0,但不会报错。
|
||||||
2)转换到数值类型时,数值大于 type_name 可表示的范围时,则会溢出,但不会报错。
|
- 转换到数值类型时,数值大于 type_name 可表示的范围时,则会溢出,但不会报错。
|
||||||
3)转换到字符串类型时,如果转换后长度超过 type_name 中指定的长度,则会截断,但不会报错。
|
- 转换到字符串类型时,如果转换后长度超过 type_name 中指定的长度,则会截断,但不会报错。
|
||||||
|
|
||||||
#### TO_ISO8601
|
#### TO_ISO8601
|
||||||
|
|
||||||
|
@ -1113,8 +1113,8 @@ TO_ISO8601(expr [, timezone])
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
|
|
||||||
- timezone 参数允许输入的时区格式为:[z/Z, +/-hhmm, +/-hh, +/-hh:mm]。例如 TO_ISO8601(1, "+00:00")。
|
- timezone 参数允许输入的时区格式为:[z/Z, +/-hhmm, +/-hh, +/-hh:mm]。例如,TO_ISO8601(1, "+00:00")。
|
||||||
- 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒。
|
- 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒.
|
||||||
|
|
||||||
|
|
||||||
#### TO_JSON
|
#### TO_JSON
|
||||||
|
@ -1169,7 +1169,7 @@ TO_CHAR(ts, format_str_literal)
|
||||||
|
|
||||||
**功能说明**:将 timestamp 类型按照指定格式转换为字符串。
|
**功能说明**:将 timestamp 类型按照指定格式转换为字符串。
|
||||||
|
|
||||||
**使用说明**:ver-3.2.2.0
|
**使用说明**:vv3.2.2.0
|
||||||
|
|
||||||
**返回结果数据类型**:VARCHAR。
|
**返回结果数据类型**:VARCHAR。
|
||||||
|
|
||||||
|
@ -1192,9 +1192,9 @@ TO_CHAR(ts, format_str_literal)
|
||||||
| MONTH | 月,全大写 | 2023-JANUARY-01 |
|
| MONTH | 月,全大写 | 2023-JANUARY-01 |
|
||||||
| Month | 月,首字母大写 | 2023-January-01 |
|
| Month | 月,首字母大写 | 2023-January-01 |
|
||||||
| month | 月,全小写 | 2023-january-01 |
|
| month | 月,全小写 | 2023-january-01 |
|
||||||
| MON | 月,缩写,全大写(三个字符) | JAN, SEP |
|
| MON | 月,缩写,全大写(三个字符) | JAN、SEP |
|
||||||
| Mon | 月,缩写,首字母大写 | Jan, Sep |
|
| Mon | 月,缩写,首字母大写 | Jan、Sep |
|
||||||
| mon | 月,缩写,全小写 | jan, sep |
|
| mon | 月,缩写,全小写 | jan、sep |
|
||||||
| MM,mm | 月,数字 01-12 | 2023-01-01 |
|
| MM,mm | 月,数字 01-12 | 2023-01-01 |
|
||||||
| DD,dd | 月日,01-31 | |
|
| DD,dd | 月日,01-31 | |
|
||||||
| DAY | 周日,全大写 | MONDAY |
|
| DAY | 周日,全大写 | MONDAY |
|
||||||
|
@ -1230,7 +1230,7 @@ TO_TIMESTAMP(ts_str_literal, format_str_literal)
|
||||||
|
|
||||||
**功能说明**:将字符串按照指定格式转化为时间戳。
|
**功能说明**:将字符串按照指定格式转化为时间戳。
|
||||||
|
|
||||||
**使用说明**:ver-3.2.2.0
|
**使用说明**:v3.2.2.0
|
||||||
|
|
||||||
**返回结果数据类型**:TIMESTAMP。
|
**返回结果数据类型**:TIMESTAMP。
|
||||||
|
|
||||||
|
@ -1293,10 +1293,10 @@ TIMEDIFF(expr1, expr2 [, time_unit])
|
||||||
**返回结果类型**:BIGINT。
|
**返回结果类型**:BIGINT。
|
||||||
|
|
||||||
**适用数据类型**:
|
**适用数据类型**:
|
||||||
- `expr1`:表示时间戳的 BIGIN、 TIMESTAMP 类型,或符合 ISO8601/RFC3339 标准的日期时间格式的 VARCHAR、NCHAR 类型。
|
- `expr1`:表示时间戳的 BIGINT、TIMESTAMP 类型,或符合 ISO8601/RFC3339 标准的日期时间格式的 VARCHAR、NCHAR 类型。
|
||||||
- `expr2`:表示时间戳的 BIGINT、TIMESTAMP 类型,或符合 ISO8601/RFC3339 标准的日期时间格式的 VARCHAR、NCHAR 类型。
|
- `expr2`:表示时间戳的 BIGINT、TIMESTAMP 类型,或符合 ISO8601/RFC3339 标准的日期时间格式的 VARCHAR、NCHAR 类型。
|
||||||
- `time_unit`:见使用说明。
|
- `time_unit`:见使用说明。
|
||||||
- 3.3.3.0 版本之前该函数结果为时间戳 `expr1` 和 `expr2` 的差值的绝对值,结果为正数。
|
- v3.3.3.0 之前该函数结果为时间戳 `expr1` 和 `expr2` 的差值的绝对值,结果为正数。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -1352,7 +1352,8 @@ use_current_timezone: {
|
||||||
例如客户端所配置时区为 UTC+0800,则 TIMETRUNCATE('2020-01-01 23:00:00', 1d, 0) 返回结果为东八区时间 '2020-01-01 08:00:00'。
|
例如客户端所配置时区为 UTC+0800,则 TIMETRUNCATE('2020-01-01 23:00:00', 1d, 0) 返回结果为东八区时间 '2020-01-01 08:00:00'。
|
||||||
而使用 TIMETRUNCATE('2020-01-01 23:00:00', 1d, 1) 时,返回结果为东八区时间 '2020-01-01 00:00:00'。
|
而使用 TIMETRUNCATE('2020-01-01 23:00:00', 1d, 1) 时,返回结果为东八区时间 '2020-01-01 00:00:00'。
|
||||||
当不指定 use_current_timezone 时,use_current_timezone 默认值为 1。
|
当不指定 use_current_timezone 时,use_current_timezone 默认值为 1。
|
||||||
- 当将时间值截断到一周(1w)时,timetruncate 的计算是基于 Unix 时间戳(1970年1月1日00:00:00 UTC)进行的。Unix 时间戳始于星期四,因此所有截断后的日期都是星期四。
|
- 当将时间值截断到一周(1w)时,timetruncate 的计算是基于 Unix 时间戳(1970年1月1日00:00:00 UTC)进行的。Unix 时间戳始于星期四,
|
||||||
|
因此所有截断后的日期都是星期四。
|
||||||
|
|
||||||
|
|
||||||
#### TIMEZONE
|
#### TIMEZONE
|
||||||
|
@ -1396,7 +1397,7 @@ WEEK(expr [, mode])
|
||||||
```
|
```
|
||||||
**功能说明**:返回输入日期的周数。
|
**功能说明**:返回输入日期的周数。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:BIGINT。
|
**返回结果类型**:BIGINT。
|
||||||
|
|
||||||
|
@ -1410,7 +1411,7 @@ WEEK(expr [, mode])
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
- 若 `expr` 为 NULL,返回 NULL。
|
- 若 `expr` 为 NULL,返回 NULL。
|
||||||
- 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒。
|
- 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒.
|
||||||
- `mode` 用来指定一周是从周日开始还是周一开始,以及指定返回值范围是 1 - 53 还是 0 - 53。下表详细描述不同的 mode 对应的计算方法:
|
- `mode` 用来指定一周是从周日开始还是周一开始,以及指定返回值范围是 1 - 53 还是 0 - 53。下表详细描述不同的 mode 对应的计算方法:
|
||||||
|
|
||||||
| Mode | 每周的第一天 | 返回值范围 | 第 1 周的计算方法 |
|
| Mode | 每周的第一天 | 返回值范围 | 第 1 周的计算方法 |
|
||||||
|
@ -1426,9 +1427,9 @@ WEEK(expr [, mode])
|
||||||
- 当返回值范围为 0 - 53 时,第 1 周之前的日期为第 0 周。
|
- 当返回值范围为 0 - 53 时,第 1 周之前的日期为第 0 周。
|
||||||
- 当返回值范围为 1 - 53 时,第 1 周之前的日期为上一年的最后一周。
|
- 当返回值范围为 1 - 53 时,第 1 周之前的日期为上一年的最后一周。
|
||||||
- 以`2000-01-01`为例,
|
- 以`2000-01-01`为例,
|
||||||
- 在 `mode=0`时返回值为 `0`,因为该年第一个周日为 `2000-01-02`,从 `2000-01-02` 起才是第一周,所以 `2000-01-01`为第 0 周,返回 0。
|
- 在 `mode=0` 时返回值为 `0`,因为该年第一个周日为 `2000-01-02`,从 `2000-01-02` 起才是第 1 周,所以 `2000-01-01` 为第 0 周,返回 0。
|
||||||
- 在 `mode=1` 时返回值为 `0`,因为 `2000-01-01` 所在的周只有两天,分别是 `2000-01-01(周六)` 和 `2000-01-02(周日)`,所以 `2000-01-03` 起才是第一周,`2000-01-01`为第 0 周,返回 0。
|
- 在 `mode=1` 时返回值为 `0`,因为 `2000-01-01` 所在的周只有两天,分别是 `2000-01-01(周六)` 和 `2000-01-02(周日)`,所以 `2000-01-03` 起才是第一周,`2000-01-01`为第 0 周,返回 0。
|
||||||
- 在 `mode=2`时返回值为 `52`,因为从 `2000-01-02` 起才是第一周,并且返回值范围为 1-53,所以 `2000-01-01` 算做上一年的最后一周,即 1999 年的第 52 周,返回 52。
|
- 在 `mode=2` 时返回值为 `52`,因为从 `2000-01-02` 起才是第 1 周,并且返回值范围为 1-53,所以 `2000-01-01` 算做上一年的最后一周,即 1999 年的第 52 周,返回 52。
|
||||||
|
|
||||||
**举例**:
|
**举例**:
|
||||||
```sql
|
```sql
|
||||||
|
@ -1459,7 +1460,7 @@ WEEKOFYEAR(expr)
|
||||||
```
|
```
|
||||||
**功能说明**:返回输入日期的周数。
|
**功能说明**:返回输入日期的周数。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:BIGINT。
|
**返回结果类型**:BIGINT。
|
||||||
|
|
||||||
|
@ -1472,7 +1473,7 @@ WEEKOFYEAR(expr)
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
- 等同于`WEEK(expr, 3)`,即在每周第一天是周一,返回值范围为 1-53,第一个包含四天及以上的周为第 1 周的条件下判断输入日期的周数。
|
- 等同于`WEEK(expr, 3)`,即在每周第一天是周一,返回值范围为 1-53,第一个包含四天及以上的周为第 1 周的条件下判断输入日期的周数。
|
||||||
- 若 `expr` 为 NULL,返回 NULL。
|
- 若 `expr` 为 NULL,返回 NULL。
|
||||||
- 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒。
|
- 输入时间戳的精度由所查询表的精度确定,未未指定表,则精度为毫秒。
|
||||||
|
|
||||||
**举例**:
|
**举例**:
|
||||||
```sql
|
```sql
|
||||||
|
@ -1488,11 +1489,11 @@ WEEKDAY(expr)
|
||||||
```
|
```
|
||||||
**功能说明**:返回输入日期是周几。
|
**功能说明**:返回输入日期是周几。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:BIGINT。
|
**返回结果类型**:BIGINT。
|
||||||
|
|
||||||
**适用数据类型**:表示 表示时间戳的 BIGINT、TIMESTAMP 类型,或符合 ISO8601/RFC3339 标准的日期时间格式的 VARCHAR、NCHAR 类型。
|
**适用数据类型**:表示时间戳的 BIGINT、TIMESTAMP 类型,或符合 ISO8601/RFC3339 标准的日期时间格式的 VARCHAR、NCHAR 类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -1517,7 +1518,7 @@ DAYOFWEEK(expr)
|
||||||
```
|
```
|
||||||
**功能说明**:返回输入日期是周几。
|
**功能说明**:返回输入日期是周几。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回结果类型**:BIGINT。
|
**返回结果类型**:BIGINT。
|
||||||
|
|
||||||
|
@ -1569,7 +1570,7 @@ algo_type: {
|
||||||
**说明**:
|
**说明**:
|
||||||
- p 值范围是 [0,100],当为 0 时等同 于 MIN,为 100 时等同于 MAX。
|
- p 值范围是 [0,100],当为 0 时等同 于 MIN,为 100 时等同于 MAX。
|
||||||
- algo_type 取值为 "default" 或 "t-digest"。输入为 "default" 时函数使用基于直方图算法进行计算。输入为 "t-digest" 时使用 t-digest 算法计算分位数的近似结果。如果不指定 algo_type 则使用 "default" 算法。
|
- algo_type 取值为 "default" 或 "t-digest"。输入为 "default" 时函数使用基于直方图算法进行计算。输入为 "t-digest" 时使用 t-digest 算法计算分位数的近似结果。如果不指定 algo_type 则使用 "default" 算法。
|
||||||
- "t-digest" 算法的近似结果对于输入数据顺序敏感,对超级表查询时不同的输入排序结果可能会有微小的误差。
|
- t-digest 算法的近似结果对于输入数据顺序敏感,对超级表查询时不同的输入排序结果可能会有微小的误差。
|
||||||
|
|
||||||
### AVG
|
### AVG
|
||||||
|
|
||||||
|
@ -1628,7 +1629,7 @@ ELAPSED(ts_primary_key [, time_unit])
|
||||||
- order by asc/desc 不影响差值的计算结果。
|
- order by asc/desc 不影响差值的计算结果。
|
||||||
- 对于超级表,需要和 group by tbname 子句组合使用,不可以直接使用。
|
- 对于超级表,需要和 group by tbname 子句组合使用,不可以直接使用。
|
||||||
- 对于普通表,不支持和 group by 子句组合使用。
|
- 对于普通表,不支持和 group by 子句组合使用。
|
||||||
- 对于嵌套查询,仅当内层查询会输出隐式时间戳列时有效。例如 select elapsed(ts) from (select diff(value) from sub1) 语句,diff 函数会让内层查询输出隐式时间戳列,此为主键列,可以用于 elapsed 函数的第一个参数。相反,例如 select elapsed(ts) from (select * from sub1) 语句,ts 列输出到外层时已经没有了主键列的含义,无法使用 elapsed 函数。此外,elapsed 函数作为一个与时间线强依赖的函数,形如 select elapsed(ts) from (select diff(value) from st group by tbname)尽 管会返回一条计算结果,但并无实际意义,这种用法后续也将被限制。
|
- 对于嵌套查询,仅当内层查询会输出隐式时间戳列时有效。例如 `select elapsed(ts) from (select diff(value) from sub1)` 语句,diff 函数会让内层查询输出隐式时间戳列,此为主键列,可以用于 elapsed 函数的第一个参数。相反,例如 `select elapsed(ts) from (select * from sub1)` 语句,ts 列输出到外层时已经没有了主键列的含义,无法使用 elapsed 函数。此外,elapsed 函数作为一个与时间线强依赖的函数,形如 `select elapsed(ts) from (select diff(value) from st group by tbname)` 尽管会返回一条计算结果,但并无实际意义,这种用法后续也将被限制。
|
||||||
- 不支持与 leastsquares、diff、derivative、top、bottom、last_row、interp 等函数混合使用。
|
- 不支持与 leastsquares、diff、derivative、top、bottom、last_row、interp 等函数混合使用。
|
||||||
|
|
||||||
|
|
||||||
|
@ -1677,7 +1678,7 @@ STDDEV/STDDEV_POP(expr)
|
||||||
**适用于**:表和超级表。
|
**适用于**:表和超级表。
|
||||||
|
|
||||||
**说明**:
|
**说明**:
|
||||||
- `STDDEV_POP` 函数等价于 `STDDEV` 函数,从 3.3.3.0 版本开始支持。
|
- `STDDEV_POP` 函数等价于 `STDDEV` 函数,从 v3.3.3.0 开始支持。
|
||||||
|
|
||||||
**举例**:
|
**举例**:
|
||||||
```sql
|
```sql
|
||||||
|
@ -1702,7 +1703,7 @@ VAR_POP(expr)
|
||||||
|
|
||||||
**功能说明**:统计表中某列的总体方差。
|
**功能说明**:统计表中某列的总体方差。
|
||||||
|
|
||||||
**使用说明**:ver-3.3.3.0
|
**版本**:v3.3.3.0
|
||||||
|
|
||||||
**返回数据类型**:DOUBLE。
|
**返回数据类型**:DOUBLE。
|
||||||
|
|
||||||
|
@ -1710,7 +1711,7 @@ VAR_POP(expr)
|
||||||
|
|
||||||
**适用于**:表和超级表。
|
**适用于**:表和超级表。
|
||||||
|
|
||||||
**举例**:
|
**举例**:
|
||||||
```sql
|
```sql
|
||||||
taos> select id from test_var;
|
taos> select id from test_var;
|
||||||
id |
|
id |
|
||||||
|
@ -1749,7 +1750,7 @@ HYPERLOGLOG(expr)
|
||||||
|
|
||||||
**功能说明**:
|
**功能说明**:
|
||||||
- 采用 hyperloglog 算法,返回某列的基数。该算法在数据量很大的情况下,可以明显降低内存的占用,求出来的基数是个估算值,标准误差(标准误差是多次实验,每次的平均数的标准差,不是与真实结果的误差)为 0.81%。
|
- 采用 hyperloglog 算法,返回某列的基数。该算法在数据量很大的情况下,可以明显降低内存的占用,求出来的基数是个估算值,标准误差(标准误差是多次实验,每次的平均数的标准差,不是与真实结果的误差)为 0.81%。
|
||||||
- 在数据量较少的时候该算法不是很准确,可以使用 select count(data) from (select unique(col) as data from table) 的方法。
|
- 在数据量较少的时候该算法不是很准确,可以使用 `select count(data) from (select unique(col) as data from table)` 的方法。
|
||||||
|
|
||||||
**返回结果类型**:INTEGER。
|
**返回结果类型**:INTEGER。
|
||||||
|
|
||||||
|
@ -1779,7 +1780,7 @@ HISTOGRAM(expr,bin_type, bin_description, normalized)
|
||||||
用户指定 bin 的具体数值。
|
用户指定 bin 的具体数值。
|
||||||
|
|
||||||
- "linear_bin": "\{"start": 0.0, "width": 5.0, "count": 5, "infinity": true}"
|
- "linear_bin": "\{"start": 0.0, "width": 5.0, "count": 5, "infinity": true}"
|
||||||
"start" 表示数据起始点,"width" 表示每次 bin 偏移量, "count" 为 bin 的总数,"infinity" 表示是否添加(-inf, inf)作为区间起点和终点,
|
"start" 表示数据起始点,"width" 表示每次 bin 偏移量,"count" 为 bin 的总数,"infinity" 表示是否添加(-inf, inf)作为区间起点和终点,
|
||||||
生成区间为[-inf, 0.0, 5.0, 10.0, 15.0, 20.0, +inf]。
|
生成区间为[-inf, 0.0, 5.0, 10.0, 15.0, 20.0, +inf]。
|
||||||
|
|
||||||
- "log_bin": "\{"start":1.0, "factor": 2.0, "count": 5, "infinity": true}"
|
- "log_bin": "\{"start":1.0, "factor": 2.0, "count": 5, "infinity": true}"
|
||||||
|
@ -1806,7 +1807,7 @@ PERCENTILE(expr, p [, p1] ... )
|
||||||
|
|
||||||
- *P* 值取值范围 0≤*P*≤100,为 0 的时候等同于 MIN,为 100 的时候等同于 MAX;
|
- *P* 值取值范围 0≤*P*≤100,为 0 的时候等同于 MIN,为 100 的时候等同于 MAX;
|
||||||
- 同时计算针对同一列的多个分位数时,建议使用一个 PERCENTILE 函数和多个参数的方式,能很大程度上降低查询的响应时间。
|
- 同时计算针对同一列的多个分位数时,建议使用一个 PERCENTILE 函数和多个参数的方式,能很大程度上降低查询的响应时间。
|
||||||
比如,使用查询SELECT percentile(col, 90, 95, 99) FROM table,性能会优于SELECT percentile(col, 90), percentile(col, 95), percentile(col, 99) from table。
|
比如,使用查询 `SELECT percentile(col, 90, 95, 99) FROM table`,性能会优于 `SELECT percentile(col, 90), percentile(col, 95), percentile(col, 99) from table`。
|
||||||
|
|
||||||
|
|
||||||
## 选择函数
|
## 选择函数
|
||||||
|
@ -1849,8 +1850,8 @@ FIRST(expr)
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
|
|
||||||
- 如果要返回各个列的首个(时间戳最小)非 NULL 值,可以使用 FIRST(\*);查询超级表,且multiResultFunctionStarReturnTags设置为 0 (默认值) 时,FIRST(\*) 只返回超级表的普通列;设置为 1 时,返回超级表的普通列和标签列。
|
- 如果要返回各个列的首个(时间戳最小)非 NULL 值,可以使用 FIRST(\*) 查询超级表,且 multiResultFunctionStarReturnTags 设置为 0 (默认值) 时,FIRST(\*) 只返回超级表的普通列;设置为 1 时,返回超级表的普通列和标签列。
|
||||||
- 如果结果集中的某列全部为 NULL 值,则该列的返回结果也是 NULL。
|
- 如果结果集中的某列全部为 NULL 值,则该列的返回结果也是 NULL;
|
||||||
- 如果结果集中所有列全部为 NULL 值,则不返回结果。
|
- 如果结果集中所有列全部为 NULL 值,则不返回结果。
|
||||||
- 对于存在复合主键的表的查询,若最小时间戳的数据有多条,则只有对应的复合主键最小的数据被返回。
|
- 对于存在复合主键的表的查询,若最小时间戳的数据有多条,则只有对应的复合主键最小的数据被返回。
|
||||||
|
|
||||||
|
@ -1877,18 +1878,18 @@ ignore_null_values: {
|
||||||
|
|
||||||
- INTERP 用于在指定时间断面获取指定列的记录值,如果该时间断面不存在符合条件的行数据,那么会根据 FILL 参数的设定进行插值。
|
- INTERP 用于在指定时间断面获取指定列的记录值,如果该时间断面不存在符合条件的行数据,那么会根据 FILL 参数的设定进行插值。
|
||||||
- INTERP 的输入数据为指定列的数据,可以通过条件语句(where 子句)来对原始列数据进行过滤,如果没有指定过滤条件则输入为全部数据。
|
- INTERP 的输入数据为指定列的数据,可以通过条件语句(where 子句)来对原始列数据进行过滤,如果没有指定过滤条件则输入为全部数据。
|
||||||
- INTERP SQL 查询需要同时与 RANGE,EVERY 和 FILL 关键字一起使用;流计算不能使用 RANGE,需要 EVERY 和 FILL 关键字一起使用。
|
- INTERP SQL 查询需要同时与 RANGE、EVERY 和 FILL 关键字一起使用;流计算不能使用 RANGE,需要 EVERY 和 FILL 关键字一起使用。
|
||||||
- INTERP 的输出时间范围根据 RANGE(timestamp1, timestamp2) 字段来指定,需满足 timestamp1 \<= timestamp2。其中 timestamp1 为输出时间范围的起始值,即如果 timestamp1 时刻符合插值条件则 timestamp1 为输出的第一条记录,timestamp2 为输出时间范围的结束值,即输出的最后一条记录的 timestamp 不能大于 timestamp2。
|
- INTERP 的输出时间范围根据 RANGE(timestamp1, timestamp2) 字段来指定,需满足 timestamp1 \<= timestamp2。其中 timestamp1 为输出时间范围的起始值,即如果 timestamp1 时刻符合插值条件则 timestamp1 为输出的第一条记录,timestamp2 为输出时间范围的结束值,即输出的最后一条记录的 timestamp 不能大于 timestamp2。
|
||||||
- INTERP 根据 EVERY(time_unit) 字段来确定输出时间范围内的结果条数,即从 timestamp1 开始每隔固定长度的时间(time_unit 值)进行插值,time_unit 可取值时间单位:1a(毫秒),1s(秒),1m(分),1h(小时),1d(天),1w(周)。例如 EVERY(500a) 将对于指定数据每500毫秒间隔进行一次插值。
|
- INTERP 根据 EVERY(time_unit) 字段来确定输出时间范围内的结果条数,即从 timestamp1 开始每隔固定长度的时间(time_unit 值)进行插值,time_unit 可取值时间单位:1a(毫秒),1s(秒),1m(分),1h(小时),1d(天),1w(周)。例如 EVERY(500a) 将对于指定数据每500毫秒间隔进行一次插值。
|
||||||
- INTERP 根据 FILL 字段来决定在每个符合输出条件的时刻如何进行插值。关于 FILL 子句如何使用请参考 [FILL 子句](../distinguished/#fill-子句)
|
- INTERP 根据 FILL 字段来决定在每个符合输出条件的时刻如何进行插值。关于 FILL 子句如何使用请参考 [FILL 子句](../distinguished/#fill-子句)
|
||||||
- INTERP 可以在 RANGE 字段中只指定唯一的时间戳对单个时间点进行插值,在这种情况下,EVERY 字段可以省略。例如 SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00') FILL(linear)。
|
- INTERP 可以在 RANGE 字段中只指定唯一的时间戳对单个时间点进行插值,在这种情况下,EVERY 字段可以省略。例如 SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00') FILL(linear)。
|
||||||
- INTERP 作用于超级表时,会将该超级表下的所有子表数据按照主键列排序后进行插值计算,也可以搭配 PARTITION BY tbname 使用,将结果强制规约到单个时间线。
|
- INTERP 作用于超级表时,会将该超级表下的所有子表数据按照主键列排序后进行插值计算,也可以搭配 PARTITION BY tbname 使用,将结果强制规约到单个时间线。
|
||||||
- INTERP 可以与伪列 _irowts 一起使用,返回插值点所对应的时间戳(3.0.2.0 版本以后支持)。
|
- INTERP 可以与伪列 _irowts 一起使用,返回插值点所对应的时间戳(v3.0.2.0 以后支持)。
|
||||||
- INTERP 可以与伪列 _isfilled 一起使用,显示返回结果是否为原始记录或插值算法产生的数据(3.0.3.0 版本以后支持)。
|
- INTERP 可以与伪列 _isfilled 一起使用,显示返回结果是否为原始记录或插值算法产生的数据(v3.0.3.0 以后支持)。
|
||||||
- INTERP 对于带复合主键的表的查询,若存在相同时间戳的数据,则只有对应的复合主键最小的数据参与运算。
|
- INTERP 对于带复合主键的表的查询,若存在相同时间戳的数据,则只有对应的复合主键最小的数据参与运算。
|
||||||
- INTERP 查询支持 NEAR FILL 模式,即当需要 FILL 时,使用距离当前时间点最近的数据进行插值,当前后时间戳与当前时间断面一样近时,FILL 前一行的值。此模式在流计算中和窗口查询中不支持。例如 SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', '2023-01-01 00:10:00') FILL(NEAR)(3.3.4.9 版本及以后支持)。
|
- INTERP 查询支持 NEAR FILL 模式,即当需要 FILL 时,使用距离当前时间点最近的数据进行插值,当前后时间戳与当前时间断面一样近时,FILL 前一行的值。此模式在流计算中和窗口查询中不支持。例如 SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', '2023-01-01 00:10:00') FILL(NEAR)(v3.3.4.9 及以后支持)。
|
||||||
- INTERP 只有在使用 FILL PREV/NEXT/NEAR 模式时才可以使用伪列 `_irowts_origin`。`_irowts_origin` 在 3.3.4.9 版本及以后支持。
|
- INTERP 只有在使用 FILL PREV/NEXT/NEAR 模式时才可以使用伪列 `_irowts_origin`。`_irowts_origin` 在 v3.3.4.9 以后支持。
|
||||||
- INTERP `RANGE`子句从 3.3.4.9 版本开始支持时间范围的扩展,如 `RANGE('2023-01-01 00:00:00', 10s)` 表示只能使用时间点 '2023-01-01 00:00:00' 周边 10s 内的数据进行插值,FILL PREV/NEXT/NEAR 分别表示从时间点开始向前/向后/前后在时间范围内查找数据,若时间点周边在指定时间范围内没有数据,则使用 FILL 指定的默认值进行插值,因此此时 FILL 子句必须同时指定默认值。例如 SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', 10s) FILL(PREV, 1)。从 3.3.6.0 版本开始支持时间区间和时间范围的组合,对于时间区间内的每个断面进行插值时都需要满足时间范围的要求,在此之前的版本仅支持时间点和时间范围的组合。时间范围的值域规则与 EVERY 类似,单位不能是年或月,值必须大于 0,不能带引号。使用该扩展时,不支持除 FILL PREV/NEXT/NEAR 外的其他 FILL 模式。
|
- INTERP `RANGE`子句从 v3.3.4.9 开始支持时间范围的扩展,如 `RANGE('2023-01-01 00:00:00', 10s)` 表示只能使用时间点 '2023-01-01 00:00:00' 周边 10s 内的数据进行插值,FILL PREV/NEXT/NEAR 分别表示从时间点开始向前/向后/前后在时间范围内查找数据,若时间点周边在指定时间范围内没有数据,则使用 FILL 指定的默认值进行插值,因此此时 FILL 子句必须同时指定默认值。例如 SELECT INTERP(col) FROM tb RANGE('2023-01-01 00:00:00', 10s) FILL(PREV, 1)。从 v3.3.6.0 开始支持时间区间和时间范围的组合,对于时间区间内的每个断面进行插值时都需要满足时间范围的要求,在此之前的版本仅支持时间点和时间范围的组合。时间范围的值域规则与 EVERY 类似,单位不能是年或月,值必须大于 0,不能带引号。使用该扩展时,不支持除 `FILL PREV/NEXT/NEAR` 外的其他 FILL 模式。
|
||||||
|
|
||||||
### LAST
|
### LAST
|
||||||
|
|
||||||
|
@ -1947,7 +1948,7 @@ MAX(expr)
|
||||||
**适用于**:表和超级表。
|
**适用于**:表和超级表。
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
- max 函数可以接受字符串作为输入参数,当输入参数为字符串类型时,返回最大的字符串值,从 3.3.3.0 版本开始支持,之前的版本不支持字符串参数。
|
- max 函数可以接受字符串作为输入参数,当输入参数为字符串类型时,返回最大的字符串值,从 v3.3.3.0 开始支持,之前的版本不支持字符串参数。
|
||||||
|
|
||||||
### MIN
|
### MIN
|
||||||
|
|
||||||
|
@ -1964,7 +1965,7 @@ MIN(expr)
|
||||||
**适用于**:表和超级表。
|
**适用于**:表和超级表。
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
- min 函数可以接受字符串作为输入参数,当输入参数为字符串类型时,返回最大的字符串值,从 3.3.3.0 版本开始支持,之前的版本不支持字符串参数。
|
- min 函数可以接受字符串作为输入参数,当输入参数为字符串类型时,返回最大的字符串值,从 v3.3.3.0 开始支持,之前的版本不支持字符串参数。
|
||||||
|
|
||||||
### MODE
|
### MODE
|
||||||
|
|
||||||
|
@ -2031,7 +2032,7 @@ TOP(expr, k)
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
|
|
||||||
- *k* 取值范围 1≤*k*≤100。
|
- *k* 值取值范围 1≤*k*≤100。
|
||||||
- 系统同时返回该记录关联的时间戳列。
|
- 系统同时返回该记录关联的时间戳列。
|
||||||
- 限制:TOP 函数不支持 FILL 子句。
|
- 限制:TOP 函数不支持 FILL 子句。
|
||||||
|
|
||||||
|
@ -2063,12 +2064,12 @@ COLS(func(expr), output_expr1, [, output_expr2] ... )
|
||||||
|
|
||||||
**适用于**:表和超级表。
|
**适用于**:表和超级表。
|
||||||
|
|
||||||
**使用说明:**
|
**使用说明**:
|
||||||
- func 函数类型:必须是单行选择函数(输出结果为一行的选择函数,例如 last 是单行选择函数,但 top 是多行选择函数)。
|
- func 函数类型:必须是单行选择函数(输出结果为一行的选择函数,例如 last 是单行选择函数,但 top 是多行选择函数)。
|
||||||
- 主要用于一个 sql 中获取多个选择函数结果关联列的场景,例如: select cols(max(c0), ts), cols(max(c1), ts) from ...可用于获取 c0, c1 列最大值的不同 ts 值。
|
- 主要用于一个 sql 中获取多个选择函数结果关联列的场景,例如 `select cols(max(c0), ts), cols(max(c1), ts) from ...` 可用于获取 c0、c1 列最大值的不同 ts 值。
|
||||||
- 注意, 函数 func 的结果并没有返回,如需输出 func 结果,可额外增加输出列,如: select fist(ts), cols(first(ts), c1) from ...
|
- 注意,函数 func 的结果并没有返回,如需输出 func 结果,可额外增加输出列,如 `select fist(ts), cols(first(ts), c1) from ...`
|
||||||
- 输出只有一列时,可以对 cols 函数设置别名。例如: "select cols(first(ts), c1) as c11 from ..."
|
- 输出只有一列时,可以对 cols 函数设置别名。例如 `select cols(first(ts), c1) as c11 from ...`
|
||||||
- 输出一列或者多列时,可以对 cols 函数的每个输出列设置命名。例如: "select cols(first(ts), c1 as c11, c2 as c22)"
|
- 输出一列或者多列时,可以对 cols 函数的每个输出列设置命名。例如 `select cols(first(ts), c1 as c11, c2 as c22)`
|
||||||
|
|
||||||
|
|
||||||
## 时序数据特有函数
|
## 时序数据特有函数
|
||||||
|
@ -2083,7 +2084,7 @@ CSUM(expr)
|
||||||
|
|
||||||
**功能说明**:累加和(Cumulative sum),忽略 NULL 值。
|
**功能说明**:累加和(Cumulative sum),忽略 NULL 值。
|
||||||
|
|
||||||
**返回结果类型**:输入列如果是整数类型返回值为长整型 (int64_t),浮点数返回值为双精度浮点数(Double)。无符号整数类型返回值为无符号长整型(uint64_t)。
|
**返回结果类型**:输入列如果是整数类型返回值为长整型(bigint),浮点数返回值为双精度浮点数(double)。无符号整数类型返回值为无符号长整型(unsigned bigint)。
|
||||||
|
|
||||||
**适用数据类型**:数值类型。
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
|
@ -2118,7 +2119,7 @@ ignore_negative: {
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
|
|
||||||
- 可以与选择相关联的列一起使用,例如 select \_rowts, DERIVATIVE(col1, 1s, 1) from tb1。
|
- 可以与选择相关联的列一起使用。例如 `select \_rowts, DERIVATIVE(col1, 1s, 1) from tb1`。
|
||||||
|
|
||||||
### DIFF
|
### DIFF
|
||||||
|
|
||||||
|
@ -2134,13 +2135,13 @@ ignore_option: {
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:统计表中特定列与之前行的当前列有效值之差。ignore_option 取值为 0|1|2|3,可以不填,默认值为 0。
|
**功能说明**:统计表中特定列与之前行的当前列有效值之差。ignore_option 取值为 0|1|2|3,可以不填,默认值为 0。
|
||||||
- `0` 表示不忽略(diff 结果)负值不忽略 null 值
|
- `0` 表示 diff 结果不忽略负值不忽略 null 值
|
||||||
- `1` 表示(diff 结果)负值作为 null 值
|
- `1` 表示 diff 结果的负值作为 null 值
|
||||||
- `2` 表示不忽略(diff 结果)负值但忽略 null 值
|
- `2` 表示 diff 结果不忽略负值但忽略 null 值
|
||||||
- `3` 表示忽略(diff 结果)负值且忽略 null 值
|
- `3` 表示 diff 结果忽略负值且忽略 null 值
|
||||||
- 对于存在复合主键的表的查询,若时间戳相同的数据存在多条,则只有对应的复合主键最小的数据参与运算。
|
- 对于存在复合主键的表的查询,若时间戳相同的数据存在多条,则只有对应的复合主键最小的数据参与运算。
|
||||||
|
|
||||||
**返回数据类型**:bool、时间戳及整型数值类型均返回 int64,浮点类型返回 double,若 diff 结果溢出则返回溢出后的值。
|
**返回数据类型**:bool、时间戳及整型数值类型均返回 bigint,浮点类型返回 double,若 diff 结果溢出则返回溢出后的值。
|
||||||
|
|
||||||
**适用数据类型**:数值类型、时间戳和 bool 类型。
|
**适用数据类型**:数值类型、时间戳和 bool 类型。
|
||||||
|
|
||||||
|
@ -2154,7 +2155,7 @@ ignore_option: {
|
||||||
- 忽略负值时(ignore_option 设置为 1 或 3 ),如果 diff 结果为负值,则结果设置为 null,然后根据 null 值过滤规则进行过滤。
|
- 忽略负值时(ignore_option 设置为 1 或 3 ),如果 diff 结果为负值,则结果设置为 null,然后根据 null 值过滤规则进行过滤。
|
||||||
- 当 diff 结果发生溢出时,结果是否是 `应该忽略的负值` 取决于逻辑运算结果是正数还是负数,例如 9223372036854775800 - (-9223372036854775806) 的值超出 BIGINT 的范围,diff 结果会显示溢出值 -10,但并不会被作为负值忽略。
|
- 当 diff 结果发生溢出时,结果是否是 `应该忽略的负值` 取决于逻辑运算结果是正数还是负数,例如 9223372036854775800 - (-9223372036854775806) 的值超出 BIGINT 的范围,diff 结果会显示溢出值 -10,但并不会被作为负值忽略。
|
||||||
- 单个语句中可以使用单个或者多个 diff,并且每个 diff 可以指定相同或不同的 ignore_option,当单个语句中存在多个 diff 时当且仅当某行所有 diff 的结果都为 null,并且 ignore_option 都设置为忽略 null 值,该行才从结果集中剔除。
|
- 单个语句中可以使用单个或者多个 diff,并且每个 diff 可以指定相同或不同的 ignore_option,当单个语句中存在多个 diff 时当且仅当某行所有 diff 的结果都为 null,并且 ignore_option 都设置为忽略 null 值,该行才从结果集中剔除。
|
||||||
- 可以选择与相关联的列一起使用。例如 select _rowts, DIFF() from。
|
- 可以选择与相关联的列一起使用。例如 `select _rowts, DIFF() from`。
|
||||||
- 当没有复合主键时,如果不同的子表有相同时间戳的数据,会提示 "Duplicate timestamps not allowed"。
|
- 当没有复合主键时,如果不同的子表有相同时间戳的数据,会提示 "Duplicate timestamps not allowed"。
|
||||||
- 当使用复合主键时,不同子表的时间戳和主键组合可能相同,使用哪一行取决于先找到哪一行,这意味着在这种情况下多次运行 diff() 的结果可能会不同。
|
- 当使用复合主键时,不同子表的时间戳和主键组合可能相同,使用哪一行取决于先找到哪一行,这意味着在这种情况下多次运行 diff() 的结果可能会不同。
|
||||||
|
|
||||||
|
@ -2218,7 +2219,7 @@ STATECOUNT(expr, oper, val)
|
||||||
|
|
||||||
**使用说明**:
|
**使用说明**:
|
||||||
|
|
||||||
- 不能和窗口操作一起使用,例如 interval/state_window/session_window。
|
- 不能和窗口操作一起使用,例如 `interval/state_window/session_window`。
|
||||||
|
|
||||||
|
|
||||||
### STATEDURATION
|
### STATEDURATION
|
||||||
|
@ -2296,7 +2297,7 @@ SELECT SERVER_VERSION();
|
||||||
SELECT SERVER_STATUS();
|
SELECT SERVER_STATUS();
|
||||||
```
|
```
|
||||||
|
|
||||||
**说明**:检测服务端是否所有 dnode 都在线,如果是则返回成功,否则返回无法建立连接的错误。如果想要查询集群的状态,推荐使用 `SHOW CLUSTER ALIVE;`,与 `SELECT SERVER_STATUS();` 不同,当集群中的部分节点不可用时,它不会返回错误,而是返回不同的状态码,详见:[SHOW CLUSTER ALIVE](https://docs.taosdata.com/reference/taos-sql/show/#show-cluster-alive)
|
**说明**:检测服务端是否所有 dnode 都在线,如果是则返回成功,否则返回无法建立连接的错误。如果想要查询集群的状态,推荐使用 `SHOW CLUSTER ALIVE` 与 `SELECT SERVER_STATUS()` 不同,当集群中的部分节点不可用时,它不会返回错误,而是返回不同的状态码,详见:[SHOW CLUSTER ALIVE](https://docs.taosdata.com/reference/taos-sql/show/#show-cluster-alive)
|
||||||
|
|
||||||
### CURRENT_USER
|
### CURRENT_USER
|
||||||
|
|
||||||
|
@ -2309,7 +2310,7 @@ SELECT CURRENT_USER();
|
||||||
|
|
||||||
## Geometry 函数
|
## Geometry 函数
|
||||||
|
|
||||||
### Geometry 输入函数:
|
### Geometry 输入函数
|
||||||
|
|
||||||
#### ST_GeomFromText
|
#### ST_GeomFromText
|
||||||
|
|
||||||
|
@ -2323,7 +2324,7 @@ ST_GeomFromText(VARCHAR WKT expr)
|
||||||
|
|
||||||
**适用数据类型**:VARCHAR。
|
**适用数据类型**:VARCHAR。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:输入可以是 WKT 字符串之一,例如点(POINT)、线串(LINESTRING)、多边形(POLYGON)、多点集(MULTIPOINT)、多线串(MULTILINESTRING)、多多边形(MULTIPOLYGON)、几何集合(GEOMETRYCOLLECTION)。输出是以二进制字符串形式定义的 GEOMETRY 数据类型。
|
**使用说明**:输入可以是 WKT 字符串之一,例如点(POINT)、线串(LINESTRING)、多边形(POLYGON)、多点集(MULTIPOINT)、多线串(MULTILINESTRING)、多多边形(MULTIPOLYGON)、几何集合(GEOMETRYCOLLECTION)。输出是以二进制字符串形式定义的 GEOMETRY 数据类型。
|
||||||
|
|
||||||
|
@ -2341,7 +2342,7 @@ ST_AsText(GEOMETRY geom)
|
||||||
|
|
||||||
**适用数据类型**:GEOMETRY。
|
**适用数据类型**:GEOMETRY。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:输出可以是 WKT 字符串之一,例如点(POINT)、线串(LINESTRING)、多边形(POLYGON)、多点集(MULTIPOINT)、多线串(MULTILINESTRING)、多多边形(MULTIPOLYGON)、几何集合(GEOMETRYCOLLECTION)。
|
**使用说明**:输出可以是 WKT 字符串之一,例如点(POINT)、线串(LINESTRING)、多边形(POLYGON)、多点集(MULTIPOINT)、多线串(MULTILINESTRING)、多多边形(MULTIPOLYGON)、几何集合(GEOMETRYCOLLECTION)。
|
||||||
|
|
||||||
|
@ -2359,7 +2360,7 @@ ST_Intersects(GEOMETRY geomA, GEOMETRY geomB)
|
||||||
|
|
||||||
**适用数据类型**:GEOMETRY、GEOMETRY。
|
**适用数据类型**:GEOMETRY、GEOMETRY。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:如果两个几何对象有任何一个共享点,则它们相交。
|
**使用说明**:如果两个几何对象有任何一个共享点,则它们相交。
|
||||||
|
|
||||||
|
@ -2375,7 +2376,7 @@ ST_Equals(GEOMETRY geomA, GEOMETRY geomB)
|
||||||
|
|
||||||
**适用数据类型**:GEOMETRY、GEOMETRY。
|
**适用数据类型**:GEOMETRY、GEOMETRY。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:"空间相等"意味着 ST_Contains(A,B) = true 和 ST_Contains(B,A) = true,并且点的顺序可能不同,但表示相同的几何结构。
|
**使用说明**:"空间相等"意味着 ST_Contains(A,B) = true 和 ST_Contains(B,A) = true,并且点的顺序可能不同,但表示相同的几何结构。
|
||||||
|
|
||||||
|
@ -2391,7 +2392,7 @@ ST_Touches(GEOMETRY geomA, GEOMETRY geomB)
|
||||||
|
|
||||||
**适用数据类型**:GEOMETRY、GEOMETRY。
|
**适用数据类型**:GEOMETRY、GEOMETRY。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:A 和 B 至少有一个公共点,并且这些公共点位于至少一个边界中。对于点/点输入,关系始终为 FALSE,因为点没有边界。
|
**使用说明**:A 和 B 至少有一个公共点,并且这些公共点位于至少一个边界中。对于点/点输入,关系始终为 FALSE,因为点没有边界。
|
||||||
|
|
||||||
|
@ -2407,7 +2408,7 @@ ST_Covers(GEOMETRY geomA, GEOMETRY geomB)
|
||||||
|
|
||||||
**适用数据类型**:GEOMETRY、GEOMETRY。
|
**适用数据类型**:GEOMETRY、GEOMETRY。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:A 包含 B 意味着 B 中的没有点位于 A 的外部(在外部)。
|
**使用说明**:A 包含 B 意味着 B 中的没有点位于 A 的外部(在外部)。
|
||||||
|
|
||||||
|
@ -2421,9 +2422,9 @@ ST_Contains(GEOMETRY geomA, GEOMETRY geomB)
|
||||||
|
|
||||||
**返回值类型**:BOOL。
|
**返回值类型**:BOOL。
|
||||||
|
|
||||||
**适用数据类型**:GEOMETRY,GEOMETRY。
|
**适用数据类型**:GEOMETRY、GEOMETRY。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:A 包含 B 当且仅当 B 的所有点位于 A 的内部(即位于内部或边界上)(或等效地,B 的没有点位于 A 的外部),并且 A 和 B 的内部至少有一个公共点。
|
**使用说明**:A 包含 B 当且仅当 B 的所有点位于 A 的内部(即位于内部或边界上)(或等效地,B 的没有点位于 A 的外部),并且 A 和 B 的内部至少有一个公共点。
|
||||||
|
|
||||||
|
@ -2439,6 +2440,6 @@ ST_ContainsProperly(GEOMETRY geomA, GEOMETRY geomB)
|
||||||
|
|
||||||
**适用数据类型**:GEOMETRY、GEOMETRY。
|
**适用数据类型**:GEOMETRY、GEOMETRY。
|
||||||
|
|
||||||
**适用表类型**:表和超级表。
|
**适用表类型**:标准表和超表。
|
||||||
|
|
||||||
**使用说明**:B 的没有点位于 A 的边界或外部。
|
**使用说明**:B 的没有点位于 A 的边界或外部。
|
||||||
|
|
|
@ -54,9 +54,9 @@ window_clause: {
|
||||||
```
|
```
|
||||||
|
|
||||||
其中,interval_val 和 sliding_val 都表示时间段,interval_offset 表示窗口偏移量,interval_offset 必须小于 interval_val,语法上支持三种方式,举例说明如下:
|
其中,interval_val 和 sliding_val 都表示时间段,interval_offset 表示窗口偏移量,interval_offset 必须小于 interval_val,语法上支持三种方式,举例说明如下:
|
||||||
- INTERVAL(1s, 500a) SLIDING(1s), 自带时间单位的形式,其中的时间单位是单字符表示, 分别为: a (毫秒), b (纳秒), d (天), h (小时), m (分钟), n (月), s (秒), u (微秒), w (周), y (年).
|
- `INTERVAL(1s, 500a) SLIDING(1s)` 自带时间单位的形式,其中的时间单位是单字符表示,分别为: a (毫秒)、b (纳秒)、d (天)、h (小时)、m (分钟)、n (月)、s (秒)、u (微秒)、w (周)、y (年)。
|
||||||
- INTERVAL(1000, 500) SLIDING(1000), 不带时间单位的形式,将使用查询库的时间精度作为默认时间单位,当存在多个库时默认采用精度更高的库.
|
- `INTERVAL(1000, 500) SLIDING(1000)` 不带时间单位的形式,将使用查询库的时间精度作为默认时间单位,当存在多个库时默认采用精度更高的库。
|
||||||
- INTERVAL('1s', '500a') SLIDING('1s'), 自带时间单位的字符串形式,字符串内部不能有任何空格等其它字符.
|
- `INTERVAL('1s', '500a') SLIDING('1s')` 自带时间单位的字符串形式,字符串内部不能有任何空格等其它字符。
|
||||||
|
|
||||||
|
|
||||||
### 窗口子句的规则
|
### 窗口子句的规则
|
||||||
|
@ -76,19 +76,19 @@ window_clause: {
|
||||||
FILL 语句指定某一窗口区间数据缺失的情况下的填充模式。填充模式包括以下几种:
|
FILL 语句指定某一窗口区间数据缺失的情况下的填充模式。填充模式包括以下几种:
|
||||||
|
|
||||||
1. 不进行填充:NONE(默认填充模式)。
|
1. 不进行填充:NONE(默认填充模式)。
|
||||||
2. VALUE 填充:固定值填充,此时需要指定填充的数值。例如:FILL(VALUE, 1.23)。这里需要注意,最终填充的值受由相应列的类型决定,如 FILL(VALUE, 1.23),相应列为 INT 类型,则填充值为 1, 若查询列表中有多列需要 FILL, 则需要给每一个 FILL 列指定 VALUE, 如 `SELECT _wstart, min(c1), max(c1) FROM ... FILL(VALUE, 0, 0)`, 注意, SELECT 表达式中只有包含普通列时才需要指定 FILL VALUE, 如 `_wstart`, `_wstart+1a`, `now`, `1+1` 以及使用 partition by 时的 partition key (如 tbname)都不需要指定 VALUE, 如 `timediff(last(ts), _wstart)` 则需要指定VALUE。
|
2. VALUE 填充:固定值填充,此时需要指定填充的数值。例如 `FILL(VALUE, 1.23)`。这里需要注意,最终填充的值受由相应列的类型决定,如 `FILL(VALUE, 1.23)`,相应列为 INT 类型,则填充值为 1,若查询列表中有多列需要 FILL,则需要给每一个 FILL 列指定 VALUE,如 `SELECT _wstart, min(c1), max(c1) FROM ... FILL(VALUE, 0, 0)`,注意,SELECT 表达式中只有包含普通列时才需要指定 FILL VALUE,如 `_wstart`、`_wstart+1a`、`now`、`1+1` 以及使用 `partition by` 时的 `partition key` (如 tbname)都不需要指定 VALUE,如 `timediff(last(ts), _wstart)` 则需要指定 VALUE。
|
||||||
3. PREV 填充:使用前一个非 NULL 值填充数据。例如:FILL(PREV)。
|
3. PREV 填充:使用前一个非 NULL 值填充数据。例如 FILL(PREV)。
|
||||||
4. NULL 填充:使用 NULL 填充数据。例如:FILL(NULL)。
|
4. NULL 填充:使用 NULL 填充数据。例如 FILL(NULL)。
|
||||||
5. LINEAR 填充:根据前后距离最近的非 NULL 值做线性插值填充。例如:FILL(LINEAR)。
|
5. LINEAR 填充:根据前后距离最近的非 NULL 值做线性插值填充。例如 FILL(LINEAR)。
|
||||||
6. NEXT 填充:使用下一个非 NULL 值填充数据。例如:FILL(NEXT)。
|
6. NEXT 填充:使用下一个非 NULL 值填充数据。例如 FILL(NEXT)。
|
||||||
|
|
||||||
以上填充模式中,除了 NONE 模式默认不填充值之外,其他模式在查询的整个时间范围内如果没有数据 FILL 子句将被忽略,即不产生填充数据,查询结果为空。这种行为在部分模式(PREV、NEXT、LINEAR)下具有合理性,因为在这些模式下没有数据意味着无法产生填充数值。而对另外一些模式(NULL、VALUE)来说,理论上是可以产生填充数值的,至于需不需要输出填充数值,取决于应用的需求。所以为了满足这类需要强制填充数据或 NULL 的应用的需求,同时不破坏现有填充模式的行为兼容性,从 3.0.3.0 版本开始,增加了两种新的填充模式:
|
以上填充模式中,除了 NONE 模式默认不填充值之外,其他模式在查询的整个时间范围内如果没有数据 FILL 子句将被忽略,即不产生填充数据,查询结果为空。这种行为在部分模式(PREV、NEXT、LINEAR)下具有合理性,因为在这些模式下没有数据意味着无法产生填充数值。而对另外一些模式(NULL、VALUE)来说,理论上是可以产生填充数值的,至于需不需要输出填充数值,取决于应用的需求。所以为了满足这类需要强制填充数据或 NULL 的应用的需求,同时不破坏现有填充模式的行为兼容性,从 v3.0.3.0 开始,增加了两种新的填充模式:
|
||||||
|
|
||||||
7. NULL_F: 强制填充 NULL 值
|
7. NULL_F:强制填充 NULL 值
|
||||||
8. VALUE_F: 强制填充 VALUE 值
|
8. VALUE_F:强制填充 VALUE 值
|
||||||
|
|
||||||
NULL, NULL_F, VALUE, VALUE_F 这几种填充模式针对不同场景区别如下:
|
NULL、NULL_F、VALUE、 VALUE_F 这几种填充模式针对不同场景区别如下:
|
||||||
- INTERVAL 子句: NULL_F, VALUE_F 为强制填充模式;NULL, VALUE 为非强制模式。在这种模式下下各自的语义与名称相符
|
- INTERVAL 子句:NULL_F、VALUE_F 为强制填充模式;NULL、VALUE 为非强制模式。在这种模式下下各自的语义与名称相符
|
||||||
- 流计算中的 INTERVAL 子句:NULL_F 与 NULL 行为相同,均为非强制模式;VALUE_F 与 VALUE 行为相同,均为非强制模式。即流计算中的 INTERVAL 没有强制模式
|
- 流计算中的 INTERVAL 子句:NULL_F 与 NULL 行为相同,均为非强制模式;VALUE_F 与 VALUE 行为相同,均为非强制模式。即流计算中的 INTERVAL 没有强制模式
|
||||||
- INTERP 子句:NULL 与 NULL_F 行为相同,均为强制模式;VALUE 与 VALUE_F 行为相同,均为强制模式。即 INTERP 中没有非强制模式。
|
- INTERP 子句:NULL 与 NULL_F 行为相同,均为强制模式;VALUE 与 VALUE_F 行为相同,均为强制模式。即 INTERP 中没有非强制模式。
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ SELECT COUNT(*) FROM meters WHERE _rowts - voltage > 1000000;
|
||||||
- 使用 INTERVAL 语句时,除非极特殊的情况,都要求把客户端和服务端的 taos.cfg 配置文件中的 timezone 参数配置为相同的取值,以避免时间处理函数频繁进行跨时区转换而导致的严重性能影响。
|
- 使用 INTERVAL 语句时,除非极特殊的情况,都要求把客户端和服务端的 taos.cfg 配置文件中的 timezone 参数配置为相同的取值,以避免时间处理函数频繁进行跨时区转换而导致的严重性能影响。
|
||||||
- 返回的结果中时间序列严格单调递增。
|
- 返回的结果中时间序列严格单调递增。
|
||||||
- 使用 AUTO 作为窗口偏移量时,如果 WHERE 时间条件比较复杂,比如多个 AND/OR/IN 互相组合,那么 AUTO 可能不生效,这种情况可以通过手动指定窗口偏移量进行解决。
|
- 使用 AUTO 作为窗口偏移量时,如果 WHERE 时间条件比较复杂,比如多个 AND/OR/IN 互相组合,那么 AUTO 可能不生效,这种情况可以通过手动指定窗口偏移量进行解决。
|
||||||
- 使用 AUTO 作为窗口偏移量时,如果窗口宽度的单位是 d (天), n (月), w (周), y (年),比如: INTERVAL(1d, AUTO), INTERVAL(3w, AUTO),此时 TSMA 优化无法生效。如果目标表上手动创建了TSMA,语句会报错退出;这种情况下,可以显式指定 Hint SKIP_TSMA 或者不使用 AUTO 作为窗口偏移量。
|
- 使用 AUTO 作为窗口偏移量时,如果窗口宽度的单位是 d (天)、n (月)、w (周)、y (年),比如 `INTERVAL(1d, AUTO)`、`INTERVAL(3w, AUTO)`,此时 TSMA 优化无法生效。如果目标表上手动创建了 TSMA,语句会报错退出;这种情况下,可以显式指定 Hint SKIP_TSMA 或者不使用 AUTO 作为窗口偏移量。
|
||||||
|
|
||||||
### 状态窗口
|
### 状态窗口
|
||||||
|
|
||||||
|
@ -147,13 +147,13 @@ SELECT COUNT(*) FROM meters WHERE _rowts - voltage > 1000000;
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
使用 STATE_WINDOW 来确定状态窗口划分的列。例如:
|
使用 STATE_WINDOW 来确定状态窗口划分的列。例如
|
||||||
|
|
||||||
```
|
```
|
||||||
SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status);
|
SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status);
|
||||||
```
|
```
|
||||||
|
|
||||||
仅关心 status 为 2 时的状态窗口的信息。例如:
|
仅关心 status 为 2 时的状态窗口的信息。例如
|
||||||
|
|
||||||
```
|
```
|
||||||
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
|
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
|
||||||
|
@ -165,7 +165,7 @@ TDengine 还支持将 CASE 表达式用在状态量,可以表达某个状态
|
||||||
SELECT tbname, _wstart, CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END status FROM meters PARTITION BY tbname STATE_WINDOW(CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END);
|
SELECT tbname, _wstart, CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END status FROM meters PARTITION BY tbname STATE_WINDOW(CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END);
|
||||||
```
|
```
|
||||||
|
|
||||||
状态窗口支持使用 TRUE_FOR 参数来设定窗口的最小持续时长。如果某个状态窗口的宽度低于该设定值,则会自动舍弃,不返回任何计算结果。例如,设置最短持续时长为 3s:
|
状态窗口支持使用 TRUE_FOR 参数来设定窗口的最小持续时长。如果某个状态窗口的宽度低于该设定值,则会自动舍弃,不返回任何计算结果。例如,设置最短持续时长为 3s。
|
||||||
|
|
||||||
```
|
```
|
||||||
SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status) TRUE_FOR (3s);
|
SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status) TRUE_FOR (3s);
|
||||||
|
@ -173,7 +173,7 @@ SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status) TRUE_FOR
|
||||||
|
|
||||||
### 会话窗口
|
### 会话窗口
|
||||||
|
|
||||||
会话窗口根据记录的时间戳主键的值来确定是否属于同一个会话。如下图所示,如果设置时间戳的连续的间隔小于等于 12 秒,则以下 6 条记录构成 2 个会话窗口,分别是:[2019-04-28 14:22:10,2019-04-28 14:22:30]和[2019-04-28 14:23:10,2019-04-28 14:23:30]。因为 2019-04-28 14:22:30 与 2019-04-28 14:23:10 之间的时间间隔是 40 秒,超过了连续时间间隔(12 秒)。
|
会话窗口根据记录的时间戳主键的值来确定是否属于同一个会话。如下图所示,如果设置时间戳的连续的间隔小于等于 12 秒,则以下 6 条记录构成 2 个会话窗口,分别是 [2019-04-28 14:22:10,2019-04-28 14:22:30] 和 [2019-04-28 14:23:10,2019-04-28 14:23:30]。因为 2019-04-28 14:22:30 与 2019-04-28 14:23:10 之间的时间间隔是 40 秒,超过了连续时间间隔(12 秒)。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ select _wstart, _wend, count(*) from t event_window start with c1 > 0 end with c
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
事件窗口支持使用 TRUE_FOR 参数来设定窗口的最小持续时长。如果某个事件窗口的宽度低于该设定值,则会自动舍弃,不返回任何计算结果。例如,设置最短持续时长为 3s:
|
事件窗口支持使用 TRUE_FOR 参数来设定窗口的最小持续时长。如果某个事件窗口的宽度低于该设定值,则会自动舍弃,不返回任何计算结果。例如,设置最短持续时长为 3s。
|
||||||
|
|
||||||
```
|
```
|
||||||
select _wstart, _wend, count(*) from t event_window start with c1 > 0 end with c2 < 10 true_for (3s);
|
select _wstart, _wend, count(*) from t event_window start with c1 > 0 end with c2 < 10 true_for (3s);
|
||||||
|
@ -223,7 +223,7 @@ select _wstart, _wend, count(*) from t count_window(4);
|
||||||
|
|
||||||
### 时间戳伪列
|
### 时间戳伪列
|
||||||
|
|
||||||
窗口聚合查询结果中,如果 SQL 语句中没有指定输出查询结果中的时间戳列,那么最终结果中不会自动包含窗口的时间列信息。如果需要在结果中输出聚合结果所对应的时间窗口信息,需要在 SELECT 子句中使用时间戳相关的伪列: 时间窗口起始时间 (\_WSTART), 时间窗口结束时间 (\_WEND), 时间窗口持续时间 (\_WDURATION), 以及查询整体窗口相关的伪列: 查询窗口起始时间(\_QSTART) 和查询窗口结束时间(\_QEND)。需要注意的是时间窗口起始时间和结束时间均是闭区间,时间窗口持续时间是数据当前时间分辨率下的数值。例如,如果当前数据库的时间分辨率是毫秒,那么结果中 500 就表示当前时间窗口的持续时间是 500毫秒 (500 ms)。
|
窗口聚合查询结果中,如果 SQL 语句中没有指定输出查询结果中的时间戳列,那么最终结果中不会自动包含窗口的时间列信息。如果需要在结果中输出聚合结果所对应的时间窗口信息,需要在 SELECT 子句中使用时间戳相关的伪列:时间窗口起始时间 (\_WSTART),时间窗口结束时间 (\_WEND),时间窗口持续时间 (\_WDURATION),以及查询整体窗口相关的伪列:查询窗口起始时间(\_QSTART) 和查询窗口结束时间(\_QEND)。需要注意的是时间窗口起始时间和结束时间均是闭区间,时间窗口持续时间是数据当前时间分辨率下的数值。例如,如果当前数据库的时间分辨率是毫秒,那么结果中 500 就表示当前时间窗口的持续时间是 500毫秒 (500 ms)。
|
||||||
|
|
||||||
### 示例
|
### 示例
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ TDengine 3.0.0.0 开始对消息队列做了大幅的优化和增强以简化用
|
||||||
|
|
||||||
TDengine 创建 topic 的个数上限通过参数 tmqMaxTopicNum 控制,默认 20 个。
|
TDengine 创建 topic 的个数上限通过参数 tmqMaxTopicNum 控制,默认 20 个。
|
||||||
|
|
||||||
TDengine 使用 SQL 创建一个 topic,共有三种类型的 topic:
|
TDengine 使用 SQL 创建一个 topic,共有三种类型的 topic。
|
||||||
|
|
||||||
### 查询 topic
|
### 查询 topic
|
||||||
|
|
||||||
|
@ -20,12 +20,13 @@ TDengine 使用 SQL 创建一个 topic,共有三种类型的 topic:
|
||||||
CREATE TOPIC [IF NOT EXISTS] topic_name as subquery
|
CREATE TOPIC [IF NOT EXISTS] topic_name as subquery
|
||||||
```
|
```
|
||||||
|
|
||||||
通过 `SELECT` 语句订阅(包括 `SELECT *`,或 `SELECT ts, c1` 等指定查询订阅,可以带条件过滤、标量函数计算,但不支持聚合函数、不支持时间窗口聚合)。需要注意的是:
|
通过 `SELECT` 语句订阅(包括 `SELECT *` 或 `SELECT ts, c1` 等指定查询订阅,可以带条件过滤、标量函数计算,但不支持聚合函数、不支持时间窗口聚合)。需要注意的是:
|
||||||
|
|
||||||
- 该类型 TOPIC 一旦创建则订阅数据的结构确定。
|
- 该类型 TOPIC 一旦创建则订阅数据的结构确定。
|
||||||
- 被订阅或用于计算的列或标签不可被删除(`ALTER table DROP`)、修改(`ALTER table MODIFY`)。
|
- 被订阅或用于计算的列或标签不可被删除(`ALTER table DROP`)、修改(`ALTER table MODIFY`)。
|
||||||
- 若发生表结构变更,新增的列不出现在结果中。
|
- 若发生表结构变更,新增的列不出现在结果中。
|
||||||
- 对于 select \*,则订阅展开为创建时所有的列(子表、普通表为数据列,超级表为数据列加标签列)
|
- 对于 select \*,则订阅展开为创建时所有的列(子表、普通表为数据列,超级表为数据列加标签列)。
|
||||||
|
|
||||||
### 超级表 topic
|
### 超级表 topic
|
||||||
|
|
||||||
语法:
|
语法:
|
||||||
|
@ -38,7 +39,7 @@ CREATE TOPIC [IF NOT EXISTS] topic_name [with meta] AS STABLE stb_name [where_co
|
||||||
|
|
||||||
- 不会限制用户的表结构变更。
|
- 不会限制用户的表结构变更。
|
||||||
- 返回的是非结构化的数据:返回数据的结构会随之超级表的表结构变化而变化。
|
- 返回的是非结构化的数据:返回数据的结构会随之超级表的表结构变化而变化。
|
||||||
- with meta 参数可选,选择时将返回创建超级表,子表等语句,主要用于taosx做超级表迁移
|
- with meta 参数可选,选择时将返回创建超级表,子表等语句,主要用于 taosX 做超级表迁移。
|
||||||
- where_condition 参数可选,选择时将用来过滤符合条件的子表,订阅这些子表。where 条件里不能有普通列,只能是 tag 或 tbname,where 条件里可以用函数,用来过滤 tag,但是不能是聚合函数,因为子表 tag 值无法做聚合。也可以是常量表达式,比如 2 > 1(订阅全部子表),或者 false(订阅 0 个子表)
|
- where_condition 参数可选,选择时将用来过滤符合条件的子表,订阅这些子表。where 条件里不能有普通列,只能是 tag 或 tbname,where 条件里可以用函数,用来过滤 tag,但是不能是聚合函数,因为子表 tag 值无法做聚合。也可以是常量表达式,比如 2 > 1(订阅全部子表),或者 false(订阅 0 个子表)
|
||||||
- 返回数据不包含标签。
|
- 返回数据不包含标签。
|
||||||
|
|
||||||
|
@ -52,9 +53,9 @@ CREATE TOPIC [IF NOT EXISTS] topic_name [with meta] AS DATABASE db_name;
|
||||||
|
|
||||||
通过该语句可创建一个包含数据库所有表数据的订阅
|
通过该语句可创建一个包含数据库所有表数据的订阅
|
||||||
|
|
||||||
- with meta 参数可选,选择时将返回创建数据库里所有超级表,子表的语句,主要用于taosx做数据库迁移
|
- with meta 参数可选,选择时将返回创建数据库里所有超级表,子表的语句,主要用于 taosX 做数据库迁移。
|
||||||
|
|
||||||
说明: 超级表订阅和库订阅属于高级订阅模式,容易出错,如确实要使用,请咨询专业人员。
|
说明:超级表订阅和库订阅属于高级订阅模式,容易出错,如确实要使用,请咨询 TDengine 运维团队。
|
||||||
|
|
||||||
## 删除 topic
|
## 删除 topic
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ stream_options: {
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
其中 subquery 是 select 普通查询语法的子集:
|
其中 subquery 是 select 普通查询语法的子集。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
subquery: SELECT select_list
|
subquery: SELECT select_list
|
||||||
|
@ -101,7 +101,7 @@ notification_definition 子句定义了窗口计算过程中,在窗口打开/
|
||||||
CREATE STREAM avg_vol_s INTO avg_vol SUBTABLE(CONCAT('new-', tname)) AS SELECT _wstart, count(*), avg(voltage) FROM meters PARTITION BY tbname tname INTERVAL(1m);
|
CREATE STREAM avg_vol_s INTO avg_vol SUBTABLE(CONCAT('new-', tname)) AS SELECT _wstart, count(*), avg(voltage) FROM meters PARTITION BY tbname tname INTERVAL(1m);
|
||||||
```
|
```
|
||||||
|
|
||||||
PARTITION 子句中,为 tbname 定义了一个别名 tname, 在 PARTITION 子句中的别名可以用于 SUBTABLE 子句中的表达式计算,在上述示例中,流新创建的子表将以前缀 'new-' 连接原表名作为表名(从 3.2.3.0 版本开始,为了避免 SUBTABLE 中的表达式无法区分各个子表,即误将多个相同时间线写入一个子表,在指定的子表名后面加上 _stableName_groupId)。
|
PARTITION 子句中,为 tbname 定义了一个别名 tname, 在 PARTITION 子句中的别名可以用于 SUBTABLE 子句中的表达式计算,在上述示例中,流新创建的子表将以前缀 'new-' 连接原表名作为表名(从 v3.2.3.0 开始,为了避免 SUBTABLE 中的表达式无法区分各个子表,即误将多个相同时间线写入一个子表,在指定的子表名后面加上 _stableName_groupId)。
|
||||||
|
|
||||||
注意,子表名的长度若超过 TDengine 的限制,将被截断。若要生成的子表名已经存在于另一超级表,由于 TDengine 的子表名是唯一的,因此对应新子表的创建以及数据的写入将会失败。
|
注意,子表名的长度若超过 TDengine 的限制,将被截断。若要生成的子表名已经存在于另一超级表,由于 TDengine 的子表名是唯一的,因此对应新子表的创建以及数据的写入将会失败。
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ SELECT * from information_schema.`ins_streams`;
|
||||||
|
|
||||||
在创建流时,可以通过 TRIGGER 指令指定流式计算的触发模式。
|
在创建流时,可以通过 TRIGGER 指令指定流式计算的触发模式。
|
||||||
|
|
||||||
对于非窗口计算,流式计算的触发是实时的;对于窗口计算,目前提供 4 种触发模式,默认为 WINDOW_CLOSE:
|
对于非窗口计算,流式计算的触发是实时的;对于窗口计算,目前提供 4 种触发模式,默认为 WINDOW_CLOSE。
|
||||||
|
|
||||||
1. AT_ONCE:写入立即触发
|
1. AT_ONCE:写入立即触发
|
||||||
|
|
||||||
|
@ -283,7 +283,7 @@ RESUME STREAM [IF EXISTS] [IGNORE UNTREATED] stream_name;
|
||||||
没有指定 IF EXISTS,如果该 stream 不存在,则报错,如果存在,则恢复流计算;指定了 IF EXISTS,如果 stream 不存在,则返回成功;如果存在,则恢复流计算。如果指定 IGNORE UNTREATED,则恢复流计算时,忽略流计算暂停期间写入的数据。
|
没有指定 IF EXISTS,如果该 stream 不存在,则报错,如果存在,则恢复流计算;指定了 IF EXISTS,如果 stream 不存在,则返回成功;如果存在,则恢复流计算。如果指定 IGNORE UNTREATED,则恢复流计算时,忽略流计算暂停期间写入的数据。
|
||||||
|
|
||||||
## 状态数据备份与同步
|
## 状态数据备份与同步
|
||||||
流计算的中间结果成为计算的状态数据,需要在流计算整个生命周期中进行持久化保存。为了确保流计算中间状态能够在集群环境下在不同的节点间可靠地同步和迁移,从 3.3.2.1 版本开始,需要在运行环境中部署 rsync 软件,还需要增加以下的步骤:
|
流计算的中间结果成为计算的状态数据,需要在流计算整个生命周期中进行持久化保存。为了确保流计算中间状态能够在集群环境下在不同的节点间可靠地同步和迁移,从 v3.3.2.1 开始,需要在运行环境中部署 rsync 软件,还需要增加以下的步骤:
|
||||||
1. 在配置文件中配置 snode 的地址(IP + 端口)和状态数据备份目录(该目录系 snode 所在的物理节点的目录)。
|
1. 在配置文件中配置 snode 的地址(IP + 端口)和状态数据备份目录(该目录系 snode 所在的物理节点的目录)。
|
||||||
2. 然后创建 snode。
|
2. 然后创建 snode。
|
||||||
完成上述两个步骤以后才能创建流。
|
完成上述两个步骤以后才能创建流。
|
||||||
|
@ -300,7 +300,7 @@ RESUME STREAM [IF EXISTS] [IGNORE UNTREATED] stream_name;
|
||||||
CREATE SNODE ON DNODE [id]
|
CREATE SNODE ON DNODE [id]
|
||||||
```
|
```
|
||||||
其中的 id 是集群中的 dnode 的序号。请注意选择的dnode,流计算的中间状态将自动在其上进行备份。
|
其中的 id 是集群中的 dnode 的序号。请注意选择的dnode,流计算的中间状态将自动在其上进行备份。
|
||||||
从 3.3.4.0 版本开始,在多副本环境中创建流会进行 snode 的**存在性检查**,要求首先创建 snode。如果 snode 不存在,无法创建流。
|
从 v3.3.4.0 开始,在多副本环境中创建流会进行 snode 的**存在性检查**,要求首先创建 snode。如果 snode 不存在,无法创建流。
|
||||||
|
|
||||||
## 流式计算的事件通知
|
## 流式计算的事件通知
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ LIKE 条件使用通配符字符串进行匹配检查,规则如下:
|
||||||
MATCH/REGEXP 条件和 NMATCH/NOT REGEXP 条件使用正则表达式进行匹配,规则如下:
|
MATCH/REGEXP 条件和 NMATCH/NOT REGEXP 条件使用正则表达式进行匹配,规则如下:
|
||||||
|
|
||||||
- 支持符合 POSIX 规范的正则表达式,具体规范内容可参见 Regular Expressions。
|
- 支持符合 POSIX 规范的正则表达式,具体规范内容可参见 Regular Expressions。
|
||||||
- MATCH 和正则表达式匹配时, 返回 TURE. NMATCH 和正则表达式不匹配时, 返回 TRUE.
|
- MATCH 和正则表达式匹配时,返回 TURE。NMATCH 和正则表达式不匹配时,返回 TRUE.
|
||||||
- 只能针对子表名(即 tbname)、字符串类型的标签值进行正则表达式过滤,不支持普通列的过滤。
|
- 只能针对子表名(即 tbname)、字符串类型的标签值进行正则表达式过滤,不支持普通列的过滤。
|
||||||
- 正则匹配字符串长度不能超过 128 字节。可以通过参数 maxRegexStringLen 设置和调整最大允许的正则匹配字符串,该参数是客户端配置参数,需要重启客户端才能生效
|
- 正则匹配字符串长度不能超过 128 字节。可以通过参数 maxRegexStringLen 设置和调整最大允许的正则匹配字符串,该参数是客户端配置参数,需要重启客户端才能生效
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ description: 对 JSON 类型如何使用的详细说明
|
||||||
|
|
||||||
## 支持的操作
|
## 支持的操作
|
||||||
|
|
||||||
1. 在 where 条件中时,支持函数 match/nmatch/between and/like/and/or/is null/is not null,不支持 in
|
1. 在 where 条件中时,支持函数 `match`、`nmatch`、`between and`、`like`、`and`、`or`、`is null`、`is not null`,不支持 `in`
|
||||||
|
|
||||||
```
|
```
|
||||||
select * from s1 where info->'k1' match 'v*';
|
select * from s1 where info->'k1' match 'v*';
|
||||||
|
@ -47,7 +47,7 @@ description: 对 JSON 类型如何使用的详细说明
|
||||||
|
|
||||||
2. 支持 json tag 放在 group by、order by、join 子句、union all 以及子查询中,比如 group by json->'key'
|
2. 支持 json tag 放在 group by、order by、join 子句、union all 以及子查询中,比如 group by json->'key'
|
||||||
|
|
||||||
3. 支持 distinct 操作.
|
3. 支持 distinct 操作
|
||||||
|
|
||||||
```
|
```
|
||||||
select distinct info->'k1' from s1
|
select distinct info->'k1' from s1
|
||||||
|
@ -69,7 +69,7 @@ description: 对 JSON 类型如何使用的详细说明
|
||||||
|
|
||||||
3. json 格式限制:
|
3. json 格式限制:
|
||||||
|
|
||||||
1. json 输入字符串可以为空("","\t"," "或 null)或 object,不能为非空的字符串,布尔型和数组。
|
1. json 输入字符串可以为空(""、"\t"、" " 或 null)或 object,不能为非空的字符串,布尔型和数组。
|
||||||
2. object 可为 {},如果 object 为 {},则整个 json 串记为空。key 可为 "",若 key 为 "",则 json 串中忽略该 k-v 对。
|
2. object 可为 {},如果 object 为 {},则整个 json 串记为空。key 可为 "",若 key 为 "",则 json 串中忽略该 k-v 对。
|
||||||
3. value 可以为数字(int/double)或字符串或 bool 或 null,暂不可以为数组。不允许嵌套。
|
3. value 可以为数字(int/double)或字符串或 bool 或 null,暂不可以为数组。不允许嵌套。
|
||||||
4. 若 json 字符串中出现两个相同的 key,则第一个生效。
|
4. 若 json 字符串中出现两个相同的 key,则第一个生效。
|
||||||
|
|
|
@ -12,7 +12,7 @@ description: 合法字符集和命名中的限制规则
|
||||||
1. 不能是 [保留关键字](./20-keywords.md)。
|
1. 不能是 [保留关键字](./20-keywords.md)。
|
||||||
1. 转义后表(列)名规则:
|
1. 转义后表(列)名规则:
|
||||||
为了兼容支持更多形式的表(列)名,TDengine 引入新的转义符 "`"。使用转义字符以后:
|
为了兼容支持更多形式的表(列)名,TDengine 引入新的转义符 "`"。使用转义字符以后:
|
||||||
- 不再对转义字符中的内容进行大小写统一,即可以保留用户指定表名中的大小写属性,例如:\`aBc\` 和 \`abc\` 是不同的表(列)名,但是 abc 和 aBc 是相同的表(列)名。
|
- 不再对转义字符中的内容进行大小写统一,即可以保留用户指定表名中的大小写属性,例如 \`aBc\` 和 \`abc\` 是不同的表(列)名,但是 abc 和 aBc 是相同的表(列)名。
|
||||||
- 可以创建包含字母、数字和下划线以外字符的表(列)名,例如:\`abc@TD\`,但是转义后名称中仍然不能包含`.`,否则会提示`The table name cannot contain '.'`。
|
- 可以创建包含字母、数字和下划线以外字符的表(列)名,例如:\`abc@TD\`,但是转义后名称中仍然不能包含`.`,否则会提示`The table name cannot contain '.'`。
|
||||||
- 可以创建以数字开头的表(列)名,例如 \`1970\`。
|
- 可以创建以数字开头的表(列)名,例如 \`1970\`。
|
||||||
- 可以创建以 [保留关键字](./20-keywords.md) 命名的表(列)名,例如 \`select\`。
|
- 可以创建以 [保留关键字](./20-keywords.md) 命名的表(列)名,例如 \`select\`。
|
||||||
|
@ -27,7 +27,7 @@ description: 合法字符集和命名中的限制规则
|
||||||
|
|
||||||
- 数据库名最大长度为 64 字节
|
- 数据库名最大长度为 64 字节
|
||||||
- 表名最大长度为 192 字节,不包括数据库名前缀和分隔符
|
- 表名最大长度为 192 字节,不包括数据库名前缀和分隔符
|
||||||
- 每行数据最大长度 48KB(从 3.0.5.0 版本开始为 64KB) (注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
|
- 每行数据最大长度 48KB(从 v3.0.5.0 开始为 64KB)(注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
|
||||||
- 列名最大长度为 64 字节
|
- 列名最大长度为 64 字节
|
||||||
- 最多允许 4096 列,最少需要 2 列,第一列必须是时间戳。
|
- 最多允许 4096 列,最少需要 2 列,第一列必须是时间戳。
|
||||||
- 标签名最大长度为 64 字节
|
- 标签名最大长度为 64 字节
|
||||||
|
|
|
@ -44,27 +44,27 @@ ALTER DNODE dnode_id dnode_option
|
||||||
ALTER ALL DNODES dnode_option
|
ALTER ALL DNODES dnode_option
|
||||||
```
|
```
|
||||||
|
|
||||||
对于支持动态修改的配置参数,您可以使用 ALTER DNODE 或 ALTER ALL DNODES 语法修改 dnode 中配置参数的值,自 3.3.4.0 后,修改的配置参数将自动持久化,即便数据库服务重启后仍然生效。
|
对于支持动态修改的配置参数,您可以使用 ALTER DNODE 或 ALTER ALL DNODES 语法修改 dnode 中配置参数的值,自 v3.3.4.0 后,修改的配置参数将自动持久化,即便数据库服务重启后仍然生效。
|
||||||
|
|
||||||
对于一个配置参数是否支持动态修改,请您参考以下页面:[taosd 参考手册](../01-components/01-taosd.md)
|
对于一个配置参数是否支持动态修改,请您参考 [taosd 参考手册](../01-components/01-taosd.md)
|
||||||
|
|
||||||
value 是参数的值,需要是字符格式。如修改 dnode 1 的日志输出级别为 debug:
|
value 是参数的值,需要是字符格式。如修改 dnode 1 的日志输出级别为 debug。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
ALTER DNODE 1 'debugFlag' '143';
|
ALTER DNODE 1 'debugFlag' '143';
|
||||||
```
|
```
|
||||||
|
|
||||||
### 补充说明:
|
### 补充说明:
|
||||||
配置参数在 dnode 中被分为全局配置参数与局部配置参数,您可以查看 SHOW VARIABLES 或 SHOW DNODE dnode_id VARIABLE 中的 category 字段来确认配置参数属于全局配置参数还是局部配置参数:
|
配置参数在 dnode 中被分为全局配置参数与局部配置参数,您可以查看 SHOW VARIABLES 或 SHOW DNODE dnode_id VARIABLE 中的 category 字段来确认配置参数属于全局配置参数还是局部配置参数。
|
||||||
1. 局部配置参数:您可以使用 ALTER DNODE 或 ALTER ALL DNODES 来更新某一个 dnode 或全部 dnodes 的局部配置参数。
|
1. 局部配置参数:您可以使用 ALTER DNODE 或 ALTER ALL DNODES 来更新某一个 dnode 或全部 dnodes 的局部配置参数。
|
||||||
2. 全局配置参数:全局配置参数要求各个 dnode 保持一致,所以您只可以使用 ALTER ALL DNODES 来更新全部 dnodes 的全局配置参数。
|
2. 全局配置参数:全局配置参数要求各个 dnode 保持一致,所以您只可以使用 ALTER ALL DNODES 来更新全部 dnodes 的全局配置参数。
|
||||||
|
|
||||||
配置参数是否可以动态修改,有以下三种情况:
|
配置参数是否可以动态修改,有以下三种情况:
|
||||||
1. 支持动态修改 立即生效
|
1. 支持动态修改,立即生效
|
||||||
2. 支持动态修改 重启生效
|
2. 支持动态修改,重启生效
|
||||||
3. 不支持动态修改
|
3. 不支持动态修改
|
||||||
|
|
||||||
对于重启后生效的配置参数,您可以通过 SHOW VARIABLES 或 SHOW DNODE dnode_id VARIABLE 看到修改后的值,但是需要重启数据库服务才使其生效。
|
对于重启后生效的配置参数,您可以通过 `SHOW VARIABLES` 或 `SHOW DNODE dnode_id VARIABLE` 看到修改后的值,但是需要重启数据库服务才使其生效。
|
||||||
|
|
||||||
## 添加管理节点
|
## 添加管理节点
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ DROP MNODE ON DNODE dnode_id;
|
||||||
CREATE QNODE ON DNODE dnode_id;
|
CREATE QNODE ON DNODE dnode_id;
|
||||||
```
|
```
|
||||||
|
|
||||||
系统启动默认没有 QNODE,用户可以创建 QNODE 来实现计算和存储的分离。一个 DNODE 上只能创建一个 QNODE。一个 DNODE 的 `supportVnodes` 参数如果不为 0,同时又在其上创建上 QNODE,则在该 dnode 中既有负责存储管理的 vnode 又有负责查询计算的 qnode,如果还在该 dnode 上创建了 mnode,则一个 dnode 上最多三种逻辑节点都可以存在。但通过配置也可以使其彻底分离。将一个 dnode 的`supportVnodes`配置为 0,可以选择在其上创建 mnode 或者 qnode 中的一种,这样可以实现三种逻辑节点在物理上的彻底分离。
|
系统启动默认没有 QNODE,用户可以创建 QNODE 来实现计算和存储的分离。一个 dnode 上只能创建一个 QNODE。一个 dnode 的 `supportVnodes` 参数如果不为 0,同时又在其上创建上 QNODE,则在该 dnode 中既有负责存储管理的 vnode 又有负责查询计算的 qnode,如果还在该 dnode 上创建了 mnode,则一个 dnode 上最多三种逻辑节点都可以存在。但通过配置也可以使其彻底分离。将一个 dnode 的`supportVnodes`配置为 0,可以选择在其上创建 mnode 或者 qnode 中的一种,这样可以实现三种逻辑节点在物理上的彻底分离。
|
||||||
|
|
||||||
## 查看查询节点
|
## 查看查询节点
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ CREATE QNODE ON DNODE dnode_id;
|
||||||
SHOW QNODES;
|
SHOW QNODES;
|
||||||
```
|
```
|
||||||
|
|
||||||
列出集群中所有查询节点,包括 ID,及所在 DNODE。
|
列出集群中所有查询节点,包括 ID,及所在 dnode
|
||||||
|
|
||||||
## 删除查询节点
|
## 删除查询节点
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ SHOW QNODES;
|
||||||
DROP QNODE ON DNODE dnode_id;
|
DROP QNODE ON DNODE dnode_id;
|
||||||
```
|
```
|
||||||
|
|
||||||
删除 ID 为 dnode_id 的 DNODE 上的 QNODE,但并不会影响该 dnode 的状态。
|
删除 ID 为 dnode_id 的 dnode 上的 qnode,但并不会影响该 dnode 的状态。
|
||||||
|
|
||||||
## 查询集群状态
|
## 查询集群状态
|
||||||
|
|
||||||
|
@ -120,7 +120,10 @@ DROP QNODE ON DNODE dnode_id;
|
||||||
SHOW CLUSTER ALIVE;
|
SHOW CLUSTER ALIVE;
|
||||||
```
|
```
|
||||||
|
|
||||||
查询当前集群的状态是否可用,返回值: 0:不可用 1:完全可用 2:部分可用(集群中部分节点下线,但其它节点仍可以正常使用)
|
查询当前集群的状态是否可用,返回值
|
||||||
|
- 0:不可用
|
||||||
|
- 1:完全可用
|
||||||
|
- 2:部分可用(集群中部分节点下线,但其它节点仍可以正常使用)
|
||||||
|
|
||||||
## 修改客户端配置
|
## 修改客户端配置
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ title: 元数据
|
||||||
description: Information_Schema 数据库中存储了系统中所有的元数据信息
|
description: Information_Schema 数据库中存储了系统中所有的元数据信息
|
||||||
---
|
---
|
||||||
|
|
||||||
TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数据库元数据、数据库系统信息和状态的访问,例如数据库或表的名称,当前执行的 SQL 语句等。该数据库存储有关 TDengine 维护的所有其他数据库的信息。它包含多个只读表。实际上,这些表都是视图,而不是基表,因此没有与它们关联的文件。所以对这些表只能查询,不能进行 INSERT 等写入操作。`INFORMATION_SCHEMA` 数据库旨在以一种更一致的方式来提供对 TDengine 支持的各种 SHOW 语句(如 SHOW TABLES、SHOW DATABASES)所提供的信息的访问。与 SHOW 语句相比,使用 SELECT ... FROM INFORMATION_SCHEMA.tablename 具有以下优点:
|
TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数据库元数据、数据库系统信息和状态的访问,例如数据库或表的名称,当前执行的 SQL 语句等。该数据库存储有关 TDengine 维护的所有其他数据库的信息。它包含多个只读表。实际上,这些表都是视图,而不是基表,因此没有与它们关联的文件。所以对这些表只能查询,不能进行 INSERT 等写入操作。`INFORMATION_SCHEMA` 数据库旨在以一种更一致的方式来提供对 TDengine 支持的各种 SHOW 语句(如 SHOW TABLES、SHOW DATABASES)所提供的信息的访问。与 SHOW 语句相比,使用 `SELECT ... FROM INFORMATION_SCHEMA.tablename` 具有以下优点。
|
||||||
|
|
||||||
1. 可以使用 USE 语句将 INFORMATION_SCHEMA 设为默认数据库
|
1. 可以使用 USE 语句将 INFORMATION_SCHEMA 设为默认数据库
|
||||||
2. 可以使用 SELECT 语句熟悉的语法,只需要学习一些表名和列名
|
2. 可以使用 SELECT 语句熟悉的语法,只需要学习一些表名和列名
|
||||||
|
@ -15,7 +15,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数
|
||||||
:::info
|
:::info
|
||||||
|
|
||||||
- 由于 SHOW 语句已经被开发者熟悉和广泛使用,所以它们仍然被保留。
|
- 由于 SHOW 语句已经被开发者熟悉和广泛使用,所以它们仍然被保留。
|
||||||
- 系统表中的一些列可能是关键字,在查询时需要使用转义符'\`',例如查询数据库 test 有几个 VGROUP:
|
- 系统表中的一些列可能是关键字,在查询时需要使用转义符 '\`',例如查询数据库 test 有几个 VGROUP。
|
||||||
```sql
|
```sql
|
||||||
select `vgroups` from ins_databases where name = 'test';
|
select `vgroups` from ins_databases where name = 'test';
|
||||||
```
|
```
|
||||||
|
@ -177,7 +177,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数
|
||||||
| 5 | stable_name | VARCHAR(192) | 所属的超级表表名 |
|
| 5 | stable_name | VARCHAR(192) | 所属的超级表表名 |
|
||||||
| 6 | uid | BIGINT | 表 id |
|
| 6 | uid | BIGINT | 表 id |
|
||||||
| 7 | vgroup_id | INT | vgroup id |
|
| 7 | vgroup_id | INT | vgroup id |
|
||||||
| 8 | ttl | INT | 表的生命周期。需要注意,`ttl` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 |
|
| 8 | ttl | INT | 表的生命周期。需要注意 `ttl` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。|
|
||||||
| 9 | table_comment | VARCHAR(1024) | 表注释 |
|
| 9 | table_comment | VARCHAR(1024) | 表注释 |
|
||||||
| 10 | type | VARCHAR(21) | 表类型 |
|
| 10 | type | VARCHAR(21) | 表类型 |
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数
|
||||||
| 1 | name | VARCHAR(24) | 用户名 |
|
| 1 | name | VARCHAR(24) | 用户名 |
|
||||||
| 2 | super | TINYINT | 用户是否为超级用户,1:是,0:否 |
|
| 2 | super | TINYINT | 用户是否为超级用户,1:是,0:否 |
|
||||||
| 3 | enable | TINYINT | 用户是否启用,1:是,0:否 |
|
| 3 | enable | TINYINT | 用户是否启用,1:是,0:否 |
|
||||||
| 4 | sysinfo | TINYINT | 用户是否可查看系统信息,1:是, 0:否 |
|
| 4 | sysinfo | TINYINT | 用户是否可查看系统信息,1:是,0:否 |
|
||||||
| 5 | create_time | TIMESTAMP | 创建时间 |
|
| 5 | create_time | TIMESTAMP | 创建时间 |
|
||||||
| 6 | allowed_host | VARCHAR(49152)| IP 白名单 |
|
| 6 | allowed_host | VARCHAR(49152)| IP 白名单 |
|
||||||
|
|
||||||
|
@ -258,7 +258,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数
|
||||||
| 10 | v3_status | VARCHAR(10) | 第三个成员的状态 |
|
| 10 | v3_status | VARCHAR(10) | 第三个成员的状态 |
|
||||||
| 11 | nfiles | INT | 此 vgroup 中数据/元数据文件的数量 |
|
| 11 | nfiles | INT | 此 vgroup 中数据/元数据文件的数量 |
|
||||||
| 12 | file_size | INT | 此 vgroup 中数据/元数据文件的大小 |
|
| 12 | file_size | INT | 此 vgroup 中数据/元数据文件的大小 |
|
||||||
| 13 | tsma | TINYINT | 此 vgroup 是否专用于 Time-range-wise SMA,1: 是, 0: 否 |
|
| 13 | tsma | TINYINT | 此 vgroup 是否专用于 Time-range-wise SMA,1: 是,0: 否 |
|
||||||
|
|
||||||
## INS_CONFIGS
|
## INS_CONFIGS
|
||||||
|
|
||||||
|
@ -333,14 +333,14 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数
|
||||||
|:----|:-----------|:------------|:--------|
|
|:----|:-----------|:------------|:--------|
|
||||||
| 1 | db_name | VARCHAR(32) | 数据库名称 |
|
| 1 | db_name | VARCHAR(32) | 数据库名称 |
|
||||||
| 2 | vgroup_id | INT | vgroup 的 ID |
|
| 2 | vgroup_id | INT | vgroup 的 ID |
|
||||||
| 3 | wal | BIGINT | wal 文件大小, 单位为 K |
|
| 3 | wal | BIGINT | wal 文件大小,单位为 KB |
|
||||||
| 4 | data1 | BIGINT | 一级存储上数据文件的大小,单位为KB |
|
| 4 | data1 | BIGINT | 一级存储上数据文件的大小,单位为 KB |
|
||||||
| 5 | data2 | BIGINT | 二级存储上数据文件的大小,单位为 KB |
|
| 5 | data2 | BIGINT | 二级存储上数据文件的大小,单位为 KB |
|
||||||
| 6 | data3 | BIGINT | 三级存储上数据文件的大小, 单位为KB |
|
| 6 | data3 | BIGINT | 三级存储上数据文件的大小,单位为 KB |
|
||||||
| 7 | cache_rdb | BIGINT | last/last_row 文件的大小,单位为KB |
|
| 7 | cache_rdb | BIGINT | last/last_row 文件的大小,单位为 KB |
|
||||||
| 8 | table_meta | BIGINT | meta 文件的大小, 单位为KB |
|
| 8 | table_meta | BIGINT | meta 文件的大小,单位为 KB |
|
||||||
| 9 | s3 | BIGINT | s3 上占用的大小, 单位为KB |
|
| 9 | s3 | BIGINT | s3 上占用的大小,单位为 KB |
|
||||||
| 10 | raw_data | BIGINT | 预估的原始数据的大小, 单位为KB |
|
| 10 | raw_data | BIGINT | 预估的原始数据的大小,单位为 KB |
|
||||||
|
|
||||||
|
|
||||||
## INS_FILESETS
|
## INS_FILESETS
|
||||||
|
|
|
@ -20,7 +20,7 @@ SHOW APPS;
|
||||||
SHOW CLUSTER;
|
SHOW CLUSTER;
|
||||||
```
|
```
|
||||||
|
|
||||||
显示当前集群的信息
|
显示当前集群的信息。
|
||||||
|
|
||||||
## SHOW CLUSTER ALIVE
|
## SHOW CLUSTER ALIVE
|
||||||
|
|
||||||
|
@ -28,17 +28,22 @@ SHOW CLUSTER;
|
||||||
SHOW CLUSTER ALIVE;
|
SHOW CLUSTER ALIVE;
|
||||||
```
|
```
|
||||||
|
|
||||||
查询当前集群的状态是否可用,返回值: 0:不可用 1:完全可用 2:部分可用(集群中部分节点下线,但其它节点仍可以正常使用)
|
查询当前集群的状态是否可用,返回值如下
|
||||||
|
- 0:不可用
|
||||||
|
- 1:完全可用
|
||||||
|
- 2:部分可用(集群中部分节点下线,但其它节点仍可以正常使用)
|
||||||
|
|
||||||
## SHOW CLUSTER MACHINES
|
## SHOW CLUSTER MACHINES
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SHOW CLUSTER MACHINES; // 从 TDengine 3.2.3.0 版本开始支持
|
SHOW CLUSTER MACHINES;
|
||||||
```
|
```
|
||||||
|
|
||||||
显示集群的机器码等信息。
|
显示集群的机器码等信息。
|
||||||
|
|
||||||
注:企业版独有
|
备注
|
||||||
|
- 企业版功能
|
||||||
|
- v3.2.3.0 开始支持
|
||||||
|
|
||||||
## SHOW CONNECTIONS
|
## SHOW CONNECTIONS
|
||||||
|
|
||||||
|
@ -70,7 +75,7 @@ SHOW CREATE DATABASE db_name;
|
||||||
SHOW CREATE STABLE [db_name.]stb_name;
|
SHOW CREATE STABLE [db_name.]stb_name;
|
||||||
```
|
```
|
||||||
|
|
||||||
显示 tb_name 指定的超级表的创建语句
|
显示 tb_name 指定的超级表的创建语句。
|
||||||
|
|
||||||
## SHOW CREATE TABLE
|
## SHOW CREATE TABLE
|
||||||
|
|
||||||
|
@ -114,7 +119,8 @@ SHOW GRANTS FULL; // 从 TDengine 3.2.3.0 版本开始支持
|
||||||
|
|
||||||
显示企业版许可授权的信息。
|
显示企业版许可授权的信息。
|
||||||
|
|
||||||
注:企业版独有
|
备注
|
||||||
|
- 企业版功能
|
||||||
|
|
||||||
## SHOW INDEXES
|
## SHOW INDEXES
|
||||||
|
|
||||||
|
@ -155,7 +161,7 @@ SHOW QNODES;
|
||||||
SHOW QUERIES;
|
SHOW QUERIES;
|
||||||
```
|
```
|
||||||
|
|
||||||
显示当前系统中正在进行的写入(更新)/查询/删除。(由于内部 API 命名原因,所以统称 QUERIES)
|
显示当前系统中正在进行的写入(更新)、查询、删除。(由于内部 API 命名原因,所以统称 QUERIES)
|
||||||
|
|
||||||
## SHOW SCORES
|
## SHOW SCORES
|
||||||
|
|
||||||
|
@ -165,7 +171,8 @@ SHOW SCORES;
|
||||||
|
|
||||||
显示系统被许可授权的容量的信息。
|
显示系统被许可授权的容量的信息。
|
||||||
|
|
||||||
注:企业版独有。
|
备注
|
||||||
|
- 企业版功能
|
||||||
|
|
||||||
## SHOW STABLES
|
## SHOW STABLES
|
||||||
|
|
||||||
|
@ -219,11 +226,11 @@ SHOW TABLE DISTRIBUTED table_name;
|
||||||
|
|
||||||
_block_dist: Total_Blocks=[5] Total_Size=[93.65 KB] Average_size=[18.73 KB] Compression_Ratio=[23.98 %]
|
_block_dist: Total_Blocks=[5] Total_Size=[93.65 KB] Average_size=[18.73 KB] Compression_Ratio=[23.98 %]
|
||||||
|
|
||||||
Total_Blocks: 表 d0 占用的 block 个数为 5 个
|
Total_Blocks:表 d0 占用的 block 个数为 5 个
|
||||||
|
|
||||||
Total_Size: 表 d0 所有 block 在文件中占用的大小为 93.65 KB
|
Total_Size: 表 d0 所有 block 在文件中占用的大小为 93.65 KB
|
||||||
|
|
||||||
Average_size: 平均每个 block 在文件中占用的空间大小为 18.73 KB
|
Average_size:平均每个 block 在文件中占用的空间大小为 18.73 KB
|
||||||
|
|
||||||
Compression_Ratio: 数据压缩率 23.98%
|
Compression_Ratio: 数据压缩率 23.98%
|
||||||
|
|
||||||
|
@ -232,7 +239,7 @@ Compression_Ratio: 数据压缩率 23.98%
|
||||||
|
|
||||||
_block_dist: Total_Rows=[20000] Inmem_Rows=[0] MinRows=[3616] MaxRows=[4096] Average_Rows=[4000]
|
_block_dist: Total_Rows=[20000] Inmem_Rows=[0] MinRows=[3616] MaxRows=[4096] Average_Rows=[4000]
|
||||||
|
|
||||||
Total_Rows: 统计表 d0 的存储在磁盘上行数 20000 行(该数值仅供参考,不是精确的行数。获得精确的行数需要使用 count 函数)
|
Total_Rows:统计表 d0 的存储在磁盘上行数 20000 行(该数值仅供参考,不是精确的行数。获得精确的行数需要使用 count 函数)
|
||||||
|
|
||||||
Inmem_Rows: 存储在写缓存中的数据行数(没有落盘),0 行表示内存缓存中没有数据
|
Inmem_Rows: 存储在写缓存中的数据行数(没有落盘),0 行表示内存缓存中没有数据
|
||||||
|
|
||||||
|
@ -247,7 +254,7 @@ Average_Rows: 每个 BLOCK 中的平均行数,此时为 4000 行
|
||||||
|
|
||||||
_block_dist: Total_Tables=[1] Total_Files=[2] Total_Vgroups=[1]
|
_block_dist: Total_Tables=[1] Total_Files=[2] Total_Vgroups=[1]
|
||||||
|
|
||||||
Total_Tables: 子表的个数,这里为 1
|
Total_Tables: 子表的个数,这里为 1
|
||||||
|
|
||||||
Total_Files: 表数据被分别保存的数据文件数量,这里是 2 个文件
|
Total_Files: 表数据被分别保存的数据文件数量,这里是 2 个文件
|
||||||
|
|
||||||
|
@ -281,7 +288,7 @@ Query OK, 24 row(s) in set (0.002444s)
|
||||||
</code></pre>
|
</code></pre>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
上面是块中包含数据行数的块儿分布情况图,这里的 0100 0299 0498 … 表示的是每个块中包含的数据行数,上面的意思就是这个表的 5 个块,分布在 3483 ~3681 行的块有 1 个,占整个块的 20%,分布在 3881 ~ 4096(最大行数)的块数为 4 个,占整个块的 80%, 其它区域内分布块数为 0。
|
上面是块中包含数据行数的块儿分布情况图,这里的 `0100 0299 0498 …` 表示的是每个块中包含的数据行数,上面的意思就是这个表的 5 个块,分布在 `3483 ~ 3681` 行的块有 1 个,占整个块的 20%,分布在 `3881 ~ 4096`(最大行数)的块数为 4 个,占整个块的 80%, 其它区域内分布块数为 0。
|
||||||
|
|
||||||
需要注意,这里只会显示 data 文件中数据块的信息,stt 文件中的数据的信息不会被显示。
|
需要注意,这里只会显示 data 文件中数据块的信息,stt 文件中的数据的信息不会被显示。
|
||||||
|
|
||||||
|
@ -309,7 +316,7 @@ SHOW TRANSACTIONS;
|
||||||
SHOW TRANSACTION [tranaction_id];
|
SHOW TRANSACTION [tranaction_id];
|
||||||
```
|
```
|
||||||
|
|
||||||
显示当前系统中正在执行的所有或者某一个事务的信息(该事务仅针对除普通表以外的元数据级别)
|
显示当前系统中正在执行的所有或者某一个事务的信息(该事务仅针对除普通表以外的元数据级别)。
|
||||||
|
|
||||||
## SHOW USERS
|
## SHOW USERS
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ CREATE USER user_name PASS 'password' [SYSINFO {1|0}] [CREATEDB {1|0}];
|
||||||
|
|
||||||
`SYSINFO` 表示该用户是否能够查看系统信息。`1` 表示可以查看,`0` 表示无权查看。系统信息包括服务配置、dnode、vnode、存储等信息。缺省值为 `1`。
|
`SYSINFO` 表示该用户是否能够查看系统信息。`1` 表示可以查看,`0` 表示无权查看。系统信息包括服务配置、dnode、vnode、存储等信息。缺省值为 `1`。
|
||||||
|
|
||||||
`CREATEDB` 表示该用户是否能够创建数据库。`1` 表示可以创建,`0` 表示无权创建。缺省值为 `0`。// 从 TDengine 企业版 3.3.2.0 开始支持
|
`CREATEDB` 表示该用户是否能够创建数据库。`1` 表示可以创建,`0` 表示无权创建。缺省值为 `0`。从企业版 v3.3.2.0 开始支持。
|
||||||
|
|
||||||
在下面的示例中,我们创建一个密码为 `abc123!@#` 且可以查看系统信息的用户。
|
在下面的示例中,我们创建一个密码为 `abc123!@#` 且可以查看系统信息的用户。
|
||||||
|
|
||||||
|
@ -76,12 +76,12 @@ alter_user_clause: {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- PASS: 修改密码,后跟新密码
|
- PASS:修改密码,后跟新密码
|
||||||
- ENABLE: 启用或禁用该用户,`1` 表示启用,`0` 表示禁用
|
- ENABLE:启用或禁用该用户,`1` 表示启用,`0` 表示禁用
|
||||||
- SYSINFO: 允许或禁止查看系统信息,`1` 表示允许,`0` 表示禁止
|
- SYSINFO:允许或禁止查看系统信息,`1` 表示允许,`0` 表示禁止
|
||||||
- CREATEDB: 允许或禁止创建数据库,`1` 表示允许,`0` 表示禁止。// 从 TDengine 企业版 3.3.2.0 开始支持
|
- CREATEDB:允许或禁止创建数据库,`1` 表示允许,`0` 表示禁止。从企业版 v3.3.2.0 开始支持。
|
||||||
|
|
||||||
下面的示例禁用了名为 `test` 的用户:
|
下面的示例禁用了名为 `test` 的用户。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
taos> alter user test enable 0;
|
taos> alter user test enable 0;
|
||||||
|
|
|
@ -33,7 +33,6 @@ priv_level : {
|
||||||
对数据库的访问权限包含读和写两种权限,它们可以被分别授予,也可以被同时授予。
|
对数据库的访问权限包含读和写两种权限,它们可以被分别授予,也可以被同时授予。
|
||||||
|
|
||||||
说明
|
说明
|
||||||
|
|
||||||
- priv_level 格式中 "." 之前为数据库名称,"." 之后为表名称,意思为表级别的授权控制。如果 "." 之后为 "\*",意为 "." 前所指定的数据库中的所有表
|
- priv_level 格式中 "." 之前为数据库名称,"." 之后为表名称,意思为表级别的授权控制。如果 "." 之后为 "\*",意为 "." 前所指定的数据库中的所有表
|
||||||
- "dbname.\*" 意思是名为 "dbname" 的数据库中的所有表
|
- "dbname.\*" 意思是名为 "dbname" 的数据库中的所有表
|
||||||
- "\*.\*" 意思是所有数据库名中的所有表
|
- "\*.\*" 意思是所有数据库名中的所有表
|
||||||
|
@ -43,9 +42,9 @@ priv_level : {
|
||||||
对 root 用户和普通用户的权限的说明如下表
|
对 root 用户和普通用户的权限的说明如下表
|
||||||
|
|
||||||
| 用户 | 描述 | 权限说明 |
|
| 用户 | 描述 | 权限说明 |
|
||||||
| -------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| -------- | --------------------------------- | -- |
|
||||||
| 超级用户 | 只有 root 是超级用户 | DB 外部 所有操作权限,例如user、dnode、udf、qnode等的CRUD DB 权限,包括 创建 删除 更新,例如修改 Option,移动 Vgruop等 读 写 Enable/Disable 用户 |
|
| 超级用户 | 只有 root 是超级用户 |<br/>DB 外部:所有操作权限,例如 user、dnode、udf、qnode 等的 CRUD <br/>DB 权限:包括创建、删除、修改 Option、移动 Vgruop、读、写、Enable/Disable 用户 |
|
||||||
| 普通用户 | 除 root 以外的其它用户均为普通用户 | 在可读的 DB 中,普通用户可以进行读操作 select describe show subscribe 在可写 DB 的内部,用户可以进行写操作: 创建、删除、修改 超级表 创建、删除、修改 子表 创建、删除、修改 topic 写入数据 被限制系统信息时,不可进行如下操作 show dnode、mnode、vgroups、qnode、snode 修改用户包括自身密码 show db时只能看到自己的db,并且不能看到vgroups、副本、cache等信息 无论是否被限制系统信息,都可以 管理 udf 可以创建 DB 自己创建的 DB 具备所有权限 非自己创建的 DB ,参照读、写列表中的权限 |
|
| 普通用户 | 除 root 以外的其它用户均为普通用户 | <br/>在可读的 DB 中:普通用户可以进行读操作 select、describe、show、subscribe <br/>在可写 DB 的内部,用户可以进行写操作,创建、删除、修改超级表,创建、删除、修改子表,创建、删除、修改 topic。写入数据 <br/>被限制系统信息时,不可进行如下操作 show dnode、mnode、vgroups、qnode、snode、修改用户包括自身密码、`show db` 时只能看到自己的 db,并且不能看到 vgroups、副本、cache等信息 <br/>无论是否被限制系统信息,都可以管理 udf,可以创建 DB、自己创建的 DB 具备所有权限、非自己创建的 DB,参照读、写列表中的权限 |
|
||||||
|
|
||||||
## 消息订阅授权
|
## 消息订阅授权
|
||||||
|
|
||||||
|
@ -61,7 +60,7 @@ REVOKE SUBSCRIBE ON topic_name FROM user_name
|
||||||
|
|
||||||
## 基于标签的授权(表级授权)
|
## 基于标签的授权(表级授权)
|
||||||
|
|
||||||
从 TDengine 3.0.5.0 开始,我们支持按标签授权某个超级表中部分特定的子表。具体的 SQL 语法如下。
|
从 v3.0.5.0 开始,我们支持按标签授权某个超级表中部分特定的子表。具体的 SQL 语法如下。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
GRANT privileges ON priv_level [WITH tag_condition] TO user_name
|
GRANT privileges ON priv_level [WITH tag_condition] TO user_name
|
||||||
|
@ -111,7 +110,7 @@ priv_level : {
|
||||||
下表列出了在不同的数据库授权和表级授权的组合下产生的实际权限。
|
下表列出了在不同的数据库授权和表级授权的组合下产生的实际权限。
|
||||||
|
|
||||||
| | **表无授权** | **表读授权** | **表读授权有标签条件** | **表写授权** | **表写授权有标签条件** |
|
| | **表无授权** | **表读授权** | **表读授权有标签条件** | **表写授权** | **表写授权有标签条件** |
|
||||||
| ---------------- | ---------------- | ---------------------------------------- | ------------------------------------------------------------ | ---------------------------------------- | ---------------------------------------------------------- |
|
| -------------- | ------------- | --------------------------------- | ------------------------------------------------- | ---------------------------------- | -------------------- |
|
||||||
| **数据库无授权** | 无授权 | 对此表有读权限,对数据库下的其他表无权限 | 对此表符合标签权限的子表有读权限,对数据库下的其他表无权限 | 对此表有写权限,对数据库下的其他表无权限 | 对此表符合标签权限的子表有写权限,对数据库下的其他表无权限 |
|
| **数据库无授权** | 无授权 | 对此表有读权限,对数据库下的其他表无权限 | 对此表符合标签权限的子表有读权限,对数据库下的其他表无权限 | 对此表有写权限,对数据库下的其他表无权限 | 对此表符合标签权限的子表有写权限,对数据库下的其他表无权限 |
|
||||||
| **数据库读授权** | 对所有表有读权限 | 对所有表有读权限 | 对此表符合标签权限的子表有读权限,对数据库下的其他表有读权限 | 对此表有写权限,对所有表有读权限 | 对此表符合标签权限的子表有写权限,所有表有读权限 |
|
| **数据库读授权** | 对所有表有读权限 | 对所有表有读权限 | 对此表符合标签权限的子表有读权限,对数据库下的其他表有读权限 | 对此表有写权限,对所有表有读权限 | 对此表符合标签权限的子表有写权限,所有表有读权限 |
|
||||||
| **数据库写授权** | 对所有表有写权限 | 对此表有读权限,对所有表有写权限 | 对此表符合标签权限的子表有读权限,对所有表有写权限 | 对所有表有写权限 | 对此表符合标签权限的子表有写权限,数据库下的其他表有写权限 |
|
| **数据库写授权** | 对所有表有写权限 | 对此表有读权限,对所有表有写权限 | 对此表符合标签权限的子表有读权限,对所有表有写权限 | 对所有表有写权限 | 对此表符合标签权限的子表有写权限,数据库下的其他表有写权限 |
|
||||||
|
|
|
@ -7,7 +7,7 @@ description: 使用 UDF 的详细指南
|
||||||
除了 TDengine 的内置函数以外,用户还可以编写自己的函数逻辑并加入 TDengine 系统中。
|
除了 TDengine 的内置函数以外,用户还可以编写自己的函数逻辑并加入 TDengine 系统中。
|
||||||
## 创建 UDF
|
## 创建 UDF
|
||||||
|
|
||||||
用户可以通过 SQL 指令在系统中加载客户端所在主机上的 UDF 函数库(不能通过 RESTful 接口或 HTTP 管理界面来进行这一过程)。一旦创建成功,则当前 TDengine 集群的所有用户都可以在 SQL 指令中使用这些函数。UDF 存储在系统的 MNode 节点上,因此即使重启 TDengine 系统,已经创建的 UDF 也仍然可用。
|
用户可以通过 SQL 指令在系统中加载客户端所在主机上的 UDF 函数库(不能通过 RESTful 接口或 HTTP 管理界面来进行这一过程)。一旦创建成功,则当前 TDengine 集群的所有用户都可以在 SQL 指令中使用这些函数。UDF 存储在系统的 mnode 节点上,因此即使重启 TDengine 系统,已经创建的 UDF 也仍然可用。
|
||||||
|
|
||||||
在创建 UDF 时,需要区分标量函数和聚合函数。如果创建时声明了错误的函数类别,则可能导致通过 SQL 指令调用函数时出错。此外,用户需要保证输入数据类型与 UDF 程序匹配,UDF 输出数据类型与 OUTPUTTYPE 匹配。
|
在创建 UDF 时,需要区分标量函数和聚合函数。如果创建时声明了错误的函数类别,则可能导致通过 SQL 指令调用函数时出错。此外,用户需要保证输入数据类型与 UDF 程序匹配,UDF 输出数据类型与 OUTPUTTYPE 匹配。
|
||||||
|
|
||||||
|
@ -15,11 +15,11 @@ description: 使用 UDF 的详细指南
|
||||||
```sql
|
```sql
|
||||||
CREATE [OR REPLACE] FUNCTION function_name AS library_path OUTPUTTYPE output_type [LANGUAGE 'C|Python'];
|
CREATE [OR REPLACE] FUNCTION function_name AS library_path OUTPUTTYPE output_type [LANGUAGE 'C|Python'];
|
||||||
```
|
```
|
||||||
- OR REPLACE: 如果函数已经存在,会修改已有的函数属性。
|
- OR REPLACE:如果函数已经存在,会修改已有的函数属性。
|
||||||
- function_name:标量函数未来在 SQL 中被调用时的函数名;
|
- function_name:标量函数未来在 SQL 中被调用时的函数名。
|
||||||
- LANGUAGE 'C|Python':函数编程语言,目前支持C语言和Python语言。 如果这个从句忽略,编程语言是C语言
|
- LANGUAGE 'C|Python':函数编程语言,目前支持 C 语言和 Python 语言。如果这个从句忽略,编程语言是 C 语言。
|
||||||
- library_path:如果编程语言是C,路径是包含 UDF 函数实现的动态链接库的库文件绝对路径(指的是库文件在当前客户端所在主机上的保存路径,通常是指向一个 .so 文件)。如果编程语言是 Python,路径是包含 UDF 函数实现的 Python 文件路径。这个路径需要用英文单引号或英文双引号括起来;
|
- library_path:如果编程语言是C,路径是包含 UDF 函数实现的动态链接库的库文件绝对路径(指的是库文件在当前客户端所在主机上的保存路径,通常是指向一个 .so 文件)。如果编程语言是 Python,路径是包含 UDF 函数实现的 Python 文件路径。这个路径需要用英文单引号或英文双引号括起来;
|
||||||
- output_type:此函数计算结果的数据类型名称;
|
- output_type:此函数计算结果的数据类型名称。
|
||||||
|
|
||||||
例如,如下语句可以把 libbitand.so 创建为系统中可用的 UDF:
|
例如,如下语句可以把 libbitand.so 创建为系统中可用的 UDF:
|
||||||
|
|
||||||
|
@ -36,14 +36,14 @@ CREATE [OR REPLACE] FUNCTION function_name AS library_path OUTPUTTYPE output_typ
|
||||||
```sql
|
```sql
|
||||||
CREATE [OR REPLACE] AGGREGATE FUNCTION function_name AS library_path OUTPUTTYPE output_type [ BUFSIZE buffer_size ] [LANGUAGE 'C|Python'];
|
CREATE [OR REPLACE] AGGREGATE FUNCTION function_name AS library_path OUTPUTTYPE output_type [ BUFSIZE buffer_size ] [LANGUAGE 'C|Python'];
|
||||||
```
|
```
|
||||||
- OR REPLACE: 如果函数已经存在,会修改已有的函数属性。
|
- OR REPLACE:如果函数已经存在,会修改已有的函数属性。
|
||||||
- function_name:聚合函数未来在 SQL 中被调用时的函数名,必须与函数实现中 udfNormalFunc 的实际名称一致;
|
- function_name:聚合函数未来在 SQL 中被调用时的函数名,必须与函数实现中 udfNormalFunc 的实际名称一致;
|
||||||
- LANGUAGE 'C|Python':函数编程语言,目前支持 C 语言和 Python 语言(v3.7+)。
|
- LANGUAGE 'C|Python':函数编程语言,目前支持 C 语言和 Python 语言(v3.7+)。
|
||||||
- library_path:如果编程语言是C,路径是包含 UDF 函数实现的动态链接库的库文件绝对路径(指的是库文件在当前客户端所在主机上的保存路径,通常是指向一个 .so 文件)。如果编程语言是Python,路径是包含 UDF 函数实现的Python文件路径。这个路径需要用英文单引号或英文双引号括起来;;
|
- library_path:如果编程语言是C,路径是包含 UDF 函数实现的动态链接库的库文件绝对路径(指的是库文件在当前客户端所在主机上的保存路径,通常是指向一个 `.so` 文件)。如果编程语言是 Python,路径是包含 UDF 函数实现的 Python 文件路径。这个路径需要用英文单引号或英文双引号括起来;
|
||||||
- output_type:此函数计算结果的数据类型名称;
|
- output_type:此函数计算结果的数据类型名称;
|
||||||
- buffer_size:中间计算结果的缓冲区大小,单位是字节。如果不使用可以不设置。
|
- buffer_size:中间计算结果的缓冲区大小,单位是字节。如果不使用可以不设置。
|
||||||
|
|
||||||
例如,如下语句可以把 libl2norm.so 创建为系统中可用的 UDF:
|
例如,如下语句可以把 libl2norm.so 创建为系统中可用的 UDF。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
CREATE AGGREGATE FUNCTION l2norm AS "/home/taos/udf_example/libl2norm.so" OUTPUTTYPE DOUBLE bufsize 8;
|
CREATE AGGREGATE FUNCTION l2norm AS "/home/taos/udf_example/libl2norm.so" OUTPUTTYPE DOUBLE bufsize 8;
|
||||||
|
@ -57,25 +57,26 @@ CREATE [OR REPLACE] AGGREGATE FUNCTION function_name AS library_path OUTPUTTYPE
|
||||||
|
|
||||||
## 管理 UDF
|
## 管理 UDF
|
||||||
|
|
||||||
- 删除指定名称的用户定义函数:
|
- 删除指定名称的用户定义函数。
|
||||||
```
|
```
|
||||||
DROP FUNCTION function_name;
|
DROP FUNCTION function_name;
|
||||||
```
|
```
|
||||||
|
|
||||||
- function_name:此参数的含义与 CREATE 指令中的 function_name 参数一致,也即要删除的函数的名字,例如bit_and, l2norm
|
- function_name:此参数的含义与 CREATE 指令中的 function_name 参数一致,也即要删除的函数的名字,例如 bit_and、l2norm
|
||||||
```sql
|
```sql
|
||||||
DROP FUNCTION bit_and;
|
DROP FUNCTION bit_and;
|
||||||
```
|
```
|
||||||
- 显示系统中当前可用的所有 UDF:
|
|
||||||
|
- 显示系统中当前可用的所有 UDF。
|
||||||
```sql
|
```sql
|
||||||
SHOW FUNCTIONS;
|
SHOW FUNCTIONS;
|
||||||
```
|
```
|
||||||
|
|
||||||
## 调用 UDF
|
## 调用 UDF
|
||||||
|
|
||||||
在 SQL 指令中,可以直接以在系统中创建 UDF 时赋予的函数名来调用用户定义函数。例如:
|
在 SQL 指令中,可以直接以在系统中创建 UDF 时赋予的函数名来调用用户定义函数。
|
||||||
```sql
|
```sql
|
||||||
SELECT bit_and(c1,c2) FROM table;
|
SELECT bit_and(c1,c2) FROM table;
|
||||||
```
|
```
|
||||||
|
|
||||||
表示对表 table 上名为 c1, c2 的数据列调用名为 bit_and 的用户定义函数。SQL 指令中用户定义函数可以配合 WHERE 等查询特性来使用。
|
表示对表 table 上名为 c1、c2 的数据列调用名为 bit_and 的用户定义函数。SQL 指令中用户定义函数可以配合 WHERE 等查询特性来使用。
|
||||||
|
|
|
@ -4,8 +4,9 @@ title: 窗口预聚集
|
||||||
description: 窗口预聚集使用说明
|
description: 窗口预聚集使用说明
|
||||||
---
|
---
|
||||||
|
|
||||||
在大数据量场景下, 经常需要查询某段时间内的汇总结果, 当历史数据变多或者时间范围变大时, 查询时间也会相应增加. 通过预聚集的方式可以将计算结果提前存储下来, 后续查询可以直接读取聚集结果, 而不需要扫描原始数据, 如当前Block内的SMA (Small Materialized Aggregates)信息.
|
在大数据量场景下,经常需要查询某段时间内的汇总结果,当历史数据变多或者时间范围变大时,查询时间也会相应增加。通过预聚集的方式可以将计算结果提前存储下来,后续查询可以直接读取聚集结果,而不需要扫描原始数据,如当前 Block 内的 SMA (Small Materialized Aggregates)信息。
|
||||||
Block内的SMA信息粒度较小, 若查询时间范围是日,月甚至年时, Block的数量将会很多, 因此TSMA (Time-Range Small Materialized Aggregates)支持用户指定时间窗口进行预聚集. 通过对固定时间窗口内的数据进行预计算, 并将计算结果存储下来, 查询时通过查询预计算结果以提高查询性能。
|
|
||||||
|
Block 内的 SMA 信息粒度较小,若查询时间范围是日,月甚至年时,Block 的数量将会很多,因此 TSMA (Time-Range Small Materialized Aggregates)支持用户指定时间窗口进行预聚集。通过对固定时间窗口内的数据进行预计算,并将计算结果存储下来,查询时通过查询预计算结果以提高查询性能。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@ -14,6 +15,7 @@ Block内的SMA信息粒度较小, 若查询时间范围是日,月甚至年时, B
|
||||||
```sql
|
```sql
|
||||||
-- 创建基于超级表或普通表的 tsma
|
-- 创建基于超级表或普通表的 tsma
|
||||||
CREATE TSMA tsma_name ON [dbname.]table_name FUNCTION (func_name(func_param) [, ...] ) INTERVAL(time_duration);
|
CREATE TSMA tsma_name ON [dbname.]table_name FUNCTION (func_name(func_param) [, ...] ) INTERVAL(time_duration);
|
||||||
|
|
||||||
-- 创建基于小窗口 tsma 的大窗口 tsma
|
-- 创建基于小窗口 tsma 的大窗口 tsma
|
||||||
CREATE RECURSIVE TSMA tsma_name ON [db_name.]tsma_name1 INTERVAL(time_duration);
|
CREATE RECURSIVE TSMA tsma_name ON [db_name.]tsma_name1 INTERVAL(time_duration);
|
||||||
|
|
||||||
|
@ -21,19 +23,19 @@ time_duration:
|
||||||
number unit
|
number unit
|
||||||
```
|
```
|
||||||
|
|
||||||
创建 TSMA 时需要指定 TSMA 名字, 表名字, 函数列表以及窗口大小. 当基于一个已经存在的 TSMA 创建新的 TSMA 时, 需要使用 `RECURSIVE` 关键字但不能指定 `FUNCTION()`, 新创建的 TSMA 已有 TSMA 拥有相同的函数列表, 且此种情况下所指定的 INTERVAL 必须至少为所基于的 TSMA 窗口长度的整数倍, 并且天不能基于2h或3h建立, 只能基于1h建立, 月也只能基于1d而非2d,3d建立。
|
创建 TSMA 时需要指定 TSMA 名字,表名字,函数列表以及窗口大小。当基于一个已经存在的 TSMA 创建新的 TSMA 时,需要使用 `RECURSIVE` 关键字但不能指定 `FUNCTION()`,新创建的 TSMA 已有 TSMA 拥有相同的函数列表,且此种情况下所指定的 INTERVAL 必须至少为所基于的 TSMA 窗口长度的整数倍,并且天不能基于 2h 或 3h 建立,只能基于 1h 建立,月也只能基于 1d 而非 2d、3d 建立。
|
||||||
|
|
||||||
其中 TSMA 命名规则与表名字类似, 长度最大限制为表名长度限制减去输出表后缀长度, 表名长度限制为193, 输出表后缀为`_tsma_res_stb_`, TSMA 名字最大长度为178.
|
其中 TSMA 命名规则与表名字类似,长度最大限制为表名长度限制减去输出表后缀长度,表名长度限制为 193,输出表后缀为`_tsma_res_stb_`,TSMA 名字最大长度为 178。
|
||||||
|
|
||||||
TSMA只能基于超级表和普通表创建, 不能基于子表创建.
|
TSMA 只能基于超级表和普通表创建,不能基于子表创建。
|
||||||
|
|
||||||
函数列表中只能指定支持的聚集函数(见下文), 并且函数参数必须为1个, 即使当前函数支持多个参数, 函数参数内必须为普通列名, 不能为标签列. 函数列表中完全相同的函数和列会被去重, 如同时创建两个avg(c1), 则只会计算一个输出. TSMA 计算时将会把所有`函数中间结果`都输出到另一张超级表中, 输出超级表还包含了原始表的所有tag列. 函数列表中函数个数最多支持创建表最大列个数(包括tag列)减去 TSMA 计算附加的四列, 分别为`_wstart`, `_wend`, `_wduration`, 以及一个新增tag列 `tbname`, 再减去原始表的tag列数. 若列个数超出限制, 会报`Too many columns`错误.
|
函数列表中只能指定支持的聚集函数(见下文),并且函数参数必须为 1 个,即使当前函数支持多个参数,函数参数内必须为普通列名,不能为标签列。函数列表中完全相同的函数和列会被去重,如同时创建两个 avg(c1),则只会计算一个输出。TSMA 计算时将会把所有 `函数中间结果` 都输出到另一张超级表中,输出超级表还包含了原始表的所有 tag 列。函数列表中函数个数最多支持创建表最大列个数(包括 tag 列)减去 TSMA 计算附加的四列,分别为 `_wstart`、`_wend`、`_wduration`,以及一个新增 tag 列 `tbname`,再减去原始表的 tag 列数。若列个数超出限制,会报 `Too many columns` 错误。
|
||||||
|
|
||||||
由于TSMA输出为一张超级表, 因此输出表的行长度受最大行长度限制, 不同函数的`中间结果`大小各异, 一般都大于原始数据大小, 若输出表的行长度大于最大行长度限制, 将会报`Row length exceeds max length`错误. 此时需要减少函数个数或者将常用的函数进行分组拆分到多个TSMA中.
|
由于 TSMA 输出为一张超级表,因此输出表的行长度受最大行长度限制,不同函数的 `中间结果` 大小各异,一般都大于原始数据大小,若输出表的行长度大于最大行长度限制,将会报 `Row length exceeds max length` 错误。此时需要减少函数个数或者将常用的函数进行分组拆分到多个 TSMA 中。
|
||||||
|
|
||||||
窗口大小的限制为[1m ~ 1y/12n]. INTERVAL 的单位与查询中INTERVAL子句相同, 如 a (毫秒), b (纳秒), h (小时), m (分钟), s (秒), u (微秒), d (天), w(周), n(月), y(年).
|
窗口大小的限制为 [1m ~ 1y/12n]。INTERVAL 的单位与查询中 INTERVAL 子句相同,如 a(毫秒)、b(纳秒)、h(小时)、m(分钟)、s(秒)、u(微秒)、d(天)、w(周)、n(月)、y(年)。
|
||||||
|
|
||||||
TSMA为库内对象, 但名字全局唯一. 集群内一共可创建TSMA个数受参数`maxTsmaNum`限制, 参数默认值为3, 范围: [0-3]. 注意, 由于TSMA后台计算使用流计算, 因此每创建一条TSMA, 将会创建一条流, 因此能够创建的TSMA条数也受当前已经存在的流条数和最大可创建流条数限制.
|
TSMA 为库内对象,但名字全局唯一。集群内一共可创建 TSMA 个数受参数 `maxTsmaNum` 限制,参数默认值为 3,范围:[0-3]。注意,由于 TSMA 后台计算使用流计算,因此每创建一条 TSMA,将会创建一条流,因此能够创建的 TSMA 条数也受当前已经存在的流条数和最大可创建流条数限制。
|
||||||
|
|
||||||
## 支持的函数列表
|
## 支持的函数列表
|
||||||
| 函数| 备注 |
|
| 函数| 备注 |
|
||||||
|
@ -44,7 +46,7 @@ TSMA为库内对象, 但名字全局唯一. 集群内一共可创建TSMA个数
|
||||||
|first||
|
|first||
|
||||||
|last||
|
|last||
|
||||||
|avg||
|
|avg||
|
||||||
|count| 若想使用count(*), 则应创建count(ts)函数|
|
|count| 若想使用 count(*),则应创建 count(ts) 函数|
|
||||||
|spread||
|
|spread||
|
||||||
|stddev||
|
|stddev||
|
||||||
|||
|
|||
|
||||||
|
@ -53,52 +55,51 @@ TSMA为库内对象, 但名字全局唯一. 集群内一共可创建TSMA个数
|
||||||
```sql
|
```sql
|
||||||
DROP TSMA [db_name.]tsma_name;
|
DROP TSMA [db_name.]tsma_name;
|
||||||
```
|
```
|
||||||
若存在其他TSMA基于当前被删除TSMA创建, 则删除操作报`Invalid drop base tsma, drop recursive tsma first`错误. 因此需先删除 所有Recursive TSMA.
|
若存在其他 TSMA 基于当前被删除 TSMA 创建,则删除操作报 `Invalid drop base tsma, drop recursive tsma first` 错误。因此需先删除 所有 Recursive TSMA。
|
||||||
|
|
||||||
## TSMA 的计算
|
## TSMA 的计算
|
||||||
TSMA的计算结果为与原始表相同库下的一张超级表, 此表用户不可见. 不可删除, 在`DROP TSMA`时自动删除. TSMA的计算是通过流计算完成的, 此过程为后台异步过程, TSMA的计算结果不保证实时性, 但可以保证最终正确性.
|
TSMA 的计算结果为与原始表相同库下的一张超级表,此表用户不可见。不可删除,在 `DROP TSMA` 时自动删除。TSMA 的计算是通过流计算完成的,此过程为后台异步过程,TSMA 的计算结果不保证实时性,但可以保证最终正确性。
|
||||||
|
|
||||||
TSMA计算时若原始子表内没有数据, 则可能不会创建对应的输出子表, 因此在count查询中, 即使配置了`countAlwaysReturnValue`, 也不会返回该表的结果.
|
TSMA 计算时若原始子表内没有数据,则可能不会创建对应的输出子表,因此在 count 查询中,即使配置了 `countAlwaysReturnValue`,也不会返回该表的结果。
|
||||||
|
|
||||||
当存在大量历史数据时, 创建TSMA之后, 流计算将会首先计算历史数据, 此期间新创建的TSMA不会被使用. 数据更新删除或者过期数据到来时自动重新计算影响部分数据。 在重新计算期间 TSMA 查询结果不保证实时性。若希望查询实时数据, 可以通过在 SQL 中添加 hint `/*+ skip_tsma() */` 或者关闭参数`querySmaOptimize`从原始数据查询。
|
当存在大量历史数据时,创建 TSMA 之后,流计算将会首先计算历史数据,此期间新创建的 TSMA 不会被使用。数据更新删除或者过期数据到来时自动重新计算影响部分数据。在重新计算期间 TSMA 查询结果不保证实时性。若希望查询实时数据,可以通过在 SQL 中添加 hint `/*+ skip_tsma() */` 或者关闭参数 `querySmaOptimize` 从原始数据查询。
|
||||||
|
|
||||||
## TSMA 的使用与限制
|
## TSMA 的使用与限制
|
||||||
|
|
||||||
客户端配置参数: `querySmaOptimize`, 用于控制查询时是否使用TSMA, `True`为使用, `False`为不使用即从原始数据查询.
|
- 客户端配置参数:`querySmaOptimize`,用于控制查询时是否使用TSMA,`True`为使用,`False` 为不使用即从原始数据查询。
|
||||||
|
- 客户端配置参数:`maxTsmaCalcDelay`,单位为秒,用于控制用户可以接受的 TSMA 计算延迟,若 TSMA 的计算进度与最新时间差距在此范围内,则该 TSMA 将会被使用,若超出该范围,则不使用,默认值:600(10 分钟),最小值:600(10 分钟),最大值:86400(1 天)。
|
||||||
客户端配置参数:`maxTsmaCalcDelay`,单位 s,用于控制用户可以接受的 TSMA 计算延迟,若 TSMA 的计算进度与最新时间差距在此范围内, 则该 TSMA 将会被使用, 若超出该范围, 则不使用, 默认值: 600(10 分钟), 最小值: 600(10 分钟), 最大值: 86400(1 天).
|
- 客户端配置参数:`tsmaDataDeleteMark`,单位毫秒,与流计算参数 `deleteMark` 一致,用于控制流计算中间结果的保存时间,默认值为 1d,最小值为 1h。因此那些距最后一条数据时间大于配置参数的历史数据将不保存流计算中间结果,因此若修改这些时间窗口内的数据,TSMA 的计算结果中将不包含更新的结果。即与查询原始数据结果将不一致。
|
||||||
|
|
||||||
客户端配置参数: `tsmaDataDeleteMark`, 单位毫秒, 与流计算参数`deleteMark`一致, 用于控制流计算中间结果的保存时间, 默认值为: 1d, 最小值为1h. 因此那些距最后一条数据时间大于配置参数的历史数据将不保存流计算中间结果, 因此若修改这些时间窗口内的数据, TSMA的计算结果中将不包含更新的结果. 即与查询原始数据结果将不一致.
|
|
||||||
|
|
||||||
### 查询时使用 TSMA
|
### 查询时使用 TSMA
|
||||||
|
|
||||||
已在 TSMA 中定义的 agg 函数在大部分查询场景下都可直接使用,若存在多个可用的 TSMA,优先使用大窗口的 TSMA,未闭合窗口通过查询小窗口 TSMA 或者原始数据计算。同时也有某些场景不能使用 TSMA(见下文)。不可用时整个查询将使用原始数据进行计算。
|
已在 TSMA 中定义的 agg 函数在大部分查询场景下都可直接使用,若存在多个可用的 TSMA,优先使用大窗口的 TSMA,未闭合窗口通过查询小窗口 TSMA 或者原始数据计算。同时也有某些场景不能使用 TSMA(见下文)。不可用时整个查询将使用原始数据进行计算。
|
||||||
|
|
||||||
未指定窗口大小的查询语句默认优先使用包含所有查询聚合函数的最大窗口 TSMA 进行数据的计算。 如`SELECT COUNT(*) FROM stable GROUP BY tbname`将会使用包含count(ts)且窗口最大的TSMA。因此若使用聚合查询频率高时, 应当尽可能创建大窗口的TSMA.
|
未指定窗口大小的查询语句默认优先使用包含所有查询聚合函数的最大窗口 TSMA 进行数据的计算。如 `SELECT COUNT(*) FROM stable GROUP BY tbname` 将会使用包含 count(ts) 且窗口最大的 TSMA。因此若使用聚合查询频率高时,应当尽可能创建大窗口的 TSMA。
|
||||||
|
|
||||||
指定窗口大小时即 `INTERVAL` 语句,使用最大的可整除窗口 TSMA。 窗口查询中, `INTERVAL` 的窗口大小, `OFFSET` 以及 `SLIDING` 都影响能使用的 TSMA 窗口大小, 可整 除窗口 TSMA 即 TSMA 窗口大小可被查询语句的 `INTERVAL, OFFSET, SLIDING` 整除的窗口。因此若使用窗口查询较多时, 需要考虑经常查询的窗口大小, 以及 offset, sliding大小来创建TSMA.
|
指定窗口大小时即 `INTERVAL` 语句,使用最大的可整除窗口 TSMA。窗口查询中,`INTERVAL` 的窗口大小、`OFFSET` 以及 `SLIDING` 都影响能使用的 TSMA 窗口大小。因此若使用窗口查询较多时,需要考虑经常查询的窗口大小,以及 offset、sliding 大小来创建 TSMA。
|
||||||
|
|
||||||
例 1. 如 创建 TSMA 窗口大小 `5m` 一条, `10m` 一条, 查询时 `INTERVAL(30m)`, 那么优先使用 `10m` 的 TSMA, 若查询为 `INTERVAL(30m, 10m) SLIDING(5m)`, 那么仅可使用 `5m` 的 TSMA 查询。
|
例如 创建 TSMA 窗口大小 `5m` 一条,`10m` 一条,查询时 `INTERVAL(30m)`,那么优先使用 `10m` 的 TSMA,若查询为 `INTERVAL(30m, 10m) SLIDING(5m)`,那么仅可使用 `5m` 的 TSMA 查询。
|
||||||
|
|
||||||
|
|
||||||
### 查询限制
|
### 查询限制
|
||||||
|
|
||||||
在开启了参数`querySmaOptimize`并且无`skip_tsma()` hint时, 以下查询场景无法使用TSMA:
|
在开启了参数 `querySmaOptimize` 并且无 `skip_tsma()` hint 时,以下查询场景无法使用 TSMA。
|
||||||
|
|
||||||
- 某个 TSMA 中定义的 agg 函数不能覆盖当前查询的函数列表时
|
- 某个 TSMA 中定义的 agg 函数不能覆盖当前查询的函数列表时
|
||||||
- 非 `INTERVAL` 的其他窗口,或者 `INTERVAL` 查询窗口大小(包括 `INTERVAL,SLIDING,OFFSET`)不是定义窗口的整数倍,如定义窗口为 2m,查询使用 5 分钟窗口,但若存在 1m 的窗口,则可以使用。
|
- 非 `INTERVAL` 的其他窗口,或者 `INTERVAL` 查询窗口大小(包括 `INTERVAL,SLIDING,OFFSET`)不是定义窗口的整数倍,如定义窗口为 2m,查询使用 5 分钟窗口,但若存在 1m 的窗口,则可以使用。
|
||||||
- 查询 `WHERE` 条件中包含任意普通列(非主键时间列)的过滤。
|
- 查询 `WHERE` 条件中包含任意普通列(非主键时间列)的过滤。
|
||||||
- `PARTITION` 或者 `GROUY BY` 包含任意普通列或其表达式时
|
- `PARTITION` 或者 `GROUY BY` 包含任意普通列或其表达式时
|
||||||
- 可以使用其他更快的优化逻辑时, 如last cache优化, 若符合last优化的条件, 则先走last 优化, 无法走last时, 再判断是否可以走tsma优化
|
- 可以使用其他更快的优化逻辑时,如 last cache 优化,若符合 last 优化的条件,则先走 last 优化,无法走 last 时,再判断是否可以走 tsma 优化
|
||||||
- 当前 TSMA 计算进度延迟大于配置参数 `maxTsmaCalcDelay`时
|
- 当前 TSMA 计算进度延迟大于配置参数 `maxTsmaCalcDelay`时
|
||||||
|
|
||||||
下面是一些例子:
|
下面是一些例子:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT agg_func_list [, pesudo_col_list] FROM stable WHERE exprs [GROUP/PARTITION BY [tbname] [, tag_list]] [HAVING ...] [INTERVAL(time_duration, offset) SLIDING(duration)]...;
|
SELECT agg_func_list [, pesudo_col_list] FROM stable WHERE exprs [GROUP/PARTITION BY [tbname] [, tag_list]] [HAVING ...] [INTERVAL(time_duration, offset) SLIDING(duration)]...;
|
||||||
|
|
||||||
-- 创建
|
-- 创建
|
||||||
CREATE TSMA tsma1 ON stable FUNCTION(COUNT(ts), SUM(c1), SUM(c3), MIN(c1), MIN(c3), AVG(c1)) INTERVAL(1m);
|
CREATE TSMA tsma1 ON stable FUNCTION(COUNT(ts), SUM(c1), SUM(c3), MIN(c1), MIN(c3), AVG(c1)) INTERVAL(1m);
|
||||||
|
|
||||||
-- 查询
|
-- 查询
|
||||||
SELECT COUNT(*), SUM(c1) + SUM(c3) FROM stable; ---- use tsma1
|
SELECT COUNT(*), SUM(c1) + SUM(c3) FROM stable; ---- use tsma1
|
||||||
SELECT COUNT(*), AVG(c1) FROM stable GROUP/PARTITION BY tbname, tag1, tag2; --- use tsma1
|
SELECT COUNT(*), AVG(c1) FROM stable GROUP/PARTITION BY tbname, tag1, tag2; --- use tsma1
|
||||||
|
@ -124,15 +125,15 @@ SELECT COUNT(*), MIN(c1) FROM stable where c2 > 0; ---- can't use tsma1 or tsam2
|
||||||
|
|
||||||
### 使用限制
|
### 使用限制
|
||||||
|
|
||||||
创建TSMA之后, 对原始超级表的操作有以下限制:
|
创建 TSMA 之后,对原始超级表的操作有以下限制:
|
||||||
|
|
||||||
- 必须删除该表上的所有TSMA才能删除该表.
|
- 必须删除该表上的所有 TSMA 才能删除该表。
|
||||||
- 原始表所有tag列不能删除, 也不能修改tag列名或子表的tag值, 必须先删除TSMA, 才能删除tag列.
|
- 原始表所有 tag 列不能删除,也不能修改 tag 列名或子表的 tag 值,必须先删除 TSMA,才能删除 tag 列。
|
||||||
- 若某些列被TSMA使用了, 则这些列不能被删除, 必须先删除TSMA. 添加列不受影响, 但是新添加的列不在任何TSMA中, 因此若要计算新增列, 需要新创建其他的TSMA.
|
- 若某些列被 TSMA 使用了,则这些列不能被删除,必须先删除 TSMA。添加列不受影响,但是新添加的列不在任何 TSMA 中,因此若要计算新增列,需要新创建其他的 TSMA。
|
||||||
|
|
||||||
## 查看TSMA
|
## 查看TSMA
|
||||||
```sql
|
```sql
|
||||||
SHOW [db_name.]TSMAS;
|
SHOW [db_name.]TSMAS;
|
||||||
SELECT * FROM information_schema.ins_tsma;
|
SELECT * FROM information_schema.ins_tsma;
|
||||||
```
|
```
|
||||||
若创建时指定的较多的函数, 且列名较长, 在显示函数列表时可能会被截断(目前最大支持输出256KB).
|
若创建时指定的较多的函数,且列名较长,在显示函数列表时可能会被截断(目前最大支持输出 256KB)。
|
||||||
|
|
|
@ -26,15 +26,15 @@ description: "TDengine 3.0 版本的语法变更说明"
|
||||||
|
|
||||||
| # | **语句** | **<div style={{width: 60}}>差异性</div>** | **说明** |
|
| # | **语句** | **<div style={{width: 60}}>差异性</div>** | **说明** |
|
||||||
| - | :------- | :-------- | :------- |
|
| - | :------- | :-------- | :------- |
|
||||||
| 1 | ALTER ACCOUNT | 废除 | 2.x中为企业版功能,3.0不再支持。语法暂时保留了,执行报“This statement is no longer supported”错误。
|
| 1 | ALTER ACCOUNT | 废除 | 2.x 中为企业版功能,3.0 不再支持。语法暂时保留,执行报 “This statement is no longer supported” 错误。
|
||||||
| 2 | ALTER ALL DNODES | 新增 | 修改所有 DNODE 的参数。
|
| 2 | ALTER ALL DNODES | 新增 | 修改所有 DNODE 的参数。
|
||||||
| 3 | ALTER DATABASE | 调整 | <p>废除</p><ul><li>QUORUM:写入需要的副本确认数。3.0 版本默认行为是强一致性,且不支持修改为弱一致性。</li><li>BLOCKS:VNODE使用的内存块数。3.0版本使用BUFFER来表示VNODE写入内存池的大小。</li><li>UPDATE:更新操作的支持模式。3.0版本所有数据库都支持部分列更新。</li><li>CACHELAST:缓存最新一行数据的模式。3.0版本用CACHEMODEL代替。</li><li>COMP:3.0版本暂不支持修改。</li></ul><p>新增</p><ul><li>CACHEMODEL:表示是否在内存中缓存子表的最近数据。</li><li>CACHESIZE:表示缓存子表最近数据的内存大小。</li><li>WAL_FSYNC_PERIOD:代替原FSYNC参数。</li><li>WAL_LEVEL:代替原WAL参数。</li><li>WAL_RETENTION_PERIOD:3.0.4.0版本新增,wal文件的额外保留策略,用于数据订阅。</li><li>WAL_RETENTION_SIZE:3.0.4.0版本新增,wal文件的额外保留策略,用于数据订阅。</li></ul><p>调整</p><ul><li>KEEP:3.0版本新增支持带单位的设置方式。</li></ul>
|
| 3 | ALTER DATABASE | 调整 | <p>废除</p><ul><li>QUORUM:写入需要的副本确认数。3.0 版本默认行为是强一致性,且不支持修改为弱一致性。</li><li>BLOCKS:VNODE使用的内存块数。3.0 版本使用 BUFFER 来表示 VNODE 写入内存池的大小。</li><li>UPDATE:更新操作的支持模式。3.0 版本所有数据库都支持部分列更新。</li><li>CACHELAST:缓存最新一行数据的模式。3.0 版本用 CACHEMODEL 代替。</li><li>COMP:3.0 版本暂不支持修改。</li></ul><p>新增</p><ul><li>CACHEMODEL:表示是否在内存中缓存子表的最近数据。</li><li>CACHESIZE:表示缓存子表最近数据的内存大小。</li><li>WAL_FSYNC_PERIOD:代替原 FSYNC 参数。</li><li>WAL_LEVEL:代替原 WAL 参数。</li><li>WAL_RETENTION_PERIOD:v3.0.4.0 新增,WAL 文件的额外保留策略,用于数据订阅。</li><li>WAL_RETENTION_SIZE:v3.0.4.0 新增,WAL 文件的额外保留策略,用于数据订阅。</li></ul><p>调整</p><ul><li>KEEP:3.0 版本新增支持带单位的设置方式。</li></ul>
|
||||||
| 4 | ALTER STABLE | 调整 | 废除<ul><li>CHANGE TAG:修改标签列的名称。3.0 版本使用 RENAME TAG 代替。<br/>新增</li><li>RENAME TAG:代替原 CHANGE TAG 子句。</li><li>COMMENT:修改超级表的注释。</li></ul>
|
| 4 | ALTER STABLE | 调整 | 废除<ul><li>CHANGE TAG:修改标签列的名称。3.0 版本使用 RENAME TAG 代替。<br/>新增</li><li>RENAME TAG:代替原 CHANGE TAG 子句。</li><li>COMMENT:修改超级表的注释。</li></ul>
|
||||||
| 5 | ALTER TABLE | 调整 | 废除<ul><li>CHANGE TAG:修改标签列的名称。3.0 版本使用 RENAME TAG 代替。<br/>新增</li><li>RENAME TAG:代替原 CHANGE TAG 子句。</li><li>COMMENT:修改表的注释。</li><li>TTL:修改表的生命周期。</li></ul>
|
| 5 | ALTER TABLE | 调整 | 废除<ul><li>CHANGE TAG:修改标签列的名称。3.0 版本使用 RENAME TAG 代替。<br/>新增</li><li>RENAME TAG:代替原 CHANGE TAG 子句。</li><li>COMMENT:修改表的注释。</li><li>TTL:修改表的生命周期。</li></ul>
|
||||||
| 6 | ALTER USER | 调整 | 废除<ul><li>PRIVILEGE:修改用户权限。3.0 版本使用 GRANT 和 REVOKE 来授予和回收权限。<br/>新增</li><li>ENABLE:启用或停用此用户。</li><li>SYSINFO:修改用户是否可查看系统信息。</li></ul>
|
| 6 | ALTER USER | 调整 | 废除<ul><li>PRIVILEGE:修改用户权限。3.0 版本使用 GRANT 和 REVOKE 来授予和回收权限。<br/>新增</li><li>ENABLE:启用或停用此用户。</li><li>SYSINFO:修改用户是否可查看系统信息。</li></ul>
|
||||||
| 7 | COMPACT VNODES | 暂不支持 | 整理指定VNODE的数据。3.0.0版本暂不支持。
|
| 7 | COMPACT VNODES | 暂不支持 | 整理指定 VNODE 的数据。
|
||||||
| 8 | CREATE ACCOUNT | 废除 | 2.x中为企业版功能,3.0不再支持。语法暂时保留了,执行报“This statement is no longer supported”错误。
|
| 8 | CREATE ACCOUNT | 废除 | 2.x 中为企业版功能,3.0 不再支持。语法暂时保留,执行报 “This statement is no longer supported” 错误。
|
||||||
| 9 | CREATE DATABASE | 调整 | <p>废除</p><ul><li>BLOCKS:VNODE使用的内存块数。3.0版本使用BUFFER来表示VNODE写入内存池的大小。</li><li>CACHE:VNODE使用的内存块的大小。3.0版本使用BUFFER来表示VNODE写入内存池的大小。</li><li>CACHELAST:缓存最新一行数据的模式。3.0版本用CACHEMODEL代替。</li><li>DAYS:数据文件存储数据的时间跨度。3.0版本使用DURATION代替。</li><li>FSYNC:当 WAL 设置为 2 时,执行 fsync 的周期。3.0版本使用WAL_FSYNC_PERIOD代替。</li><li>QUORUM:写入需要的副本确认数。3.0版本使用STRICT来指定强一致还是弱一致。</li><li>UPDATE:更新操作的支持模式。3.0版本所有数据库都支持部分列更新。</li><li>WAL:WAL 级别。3.0版本使用WAL_LEVEL代替。</li></ul><p>新增</p><ul><li>BUFFER:一个 VNODE 写入内存池大小。</li><li>CACHEMODEL:表示是否在内存中缓存子表的最近数据。</li><li>CACHESIZE:表示缓存子表最近数据的内存大小。</li><li>DURATION:代替原DAYS参数。新增支持带单位的设置方式。</li><li>PAGES:一个 VNODE 中元数据存储引擎的缓存页个数。</li><li>PAGESIZE:一个 VNODE 中元数据存储引擎的页大小。</li><li>RETENTIONS:表示数据的聚合周期和保存时长。</li><li>STRICT:表示数据同步的一致性要求。</li><li>SINGLE_STABLE:表示此数据库中是否只可以创建一个超级表。</li><li>VGROUPS:数据库中初始VGROUP的数目。</li><li>WAL_FSYNC_PERIOD:代替原FSYNC参数。</li><li>WAL_LEVEL:代替原WAL参数。</li><li>WAL_RETENTION_PERIOD:wal文件的额外保留策略,用于数据订阅。</li><li>WAL_RETENTION_SIZE:wal文件的额外保留策略,用于数据订阅。</li></ul><p>调整</p><ul><li>KEEP:3.0版本新增支持带单位的设置方式。</li></ul>
|
| 9 | CREATE DATABASE | 调整 | <p>废除</p><ul><li>BLOCKS:VNODE 使用的内存块数。3.0 版本使用 BUFFER 来表示 VNODE 写入内存池的大小。</li><li>CACHE:VNODE 使用的内存块的大小。3.0 版本使用 BUFFER 来表示 VNODE 写入内存池的大小。</li><li>CACHELAST:缓存最新一行数据的模式。3.0 版本用 CACHEMODEL 代替。</li><li>DAYS:数据文件存储数据的时间跨度。3.0 版本使用 DURATION 代替。</li><li>FSYNC:当 WAL 设置为 2 时,执行 fsync 的周期。3.0 版本使用 WAL_FSYNC_PERIOD 代替。</li><li>QUORUM:写入需要的副本确认数。3.0 版本使用 STRICT 来指定强一致还是弱一致。</li><li>UPDATE:更新操作的支持模式。3.0 版本所有数据库都支持部分列更新。</li><li>WAL:WAL 级别。3.0 版本使用 WAL_LEVEL 代替。</li></ul><p>新增</p><ul><li>BUFFER:一个 VNODE 写入内存池大小。</li><li>CACHEMODEL:表示是否在内存中缓存子表的最近数据。</li><li>CACHESIZE:表示缓存子表最近数据的内存大小。</li><li>DURATION:代替原 DAYS 参数。新增支持带单位的设置方式。</li><li>PAGES:一个 VNODE 中元数据存储引擎的缓存页个数。</li><li>PAGESIZE:一个 VNODE 中元数据存储引擎的页大小。</li><li>RETENTIONS:表示数据的聚合周期和保存时长。</li><li>STRICT:表示数据同步的一致性要求。</li><li>SINGLE_STABLE:表示此数据库中是否只可以创建一个超级表。</li><li>VGROUPS:数据库中初始 VGROUP 的数目。</li><li>WAL_FSYNC_PERIOD:代替原 FSYNC 参数。</li><li>WAL_LEVEL:代替原 WAL 参数。</li><li>WAL_RETENTION_PERIOD:WAL 文件的额外保留策略,用于数据订阅。</li><li>WAL_RETENTION_SIZE:WAL 文件的额外保留策略,用于数据订阅。</li></ul><p>调整</p><ul><li>KEEP:3.0 版本新增支持带单位的设置方式。</li></ul>
|
||||||
| 10 | CREATE DNODE | 调整 | 新增主机名和端口号分开指定语法<ul><li>CREATE DNODE dnode_host_name PORT port_val</li></ul>
|
| 10 | CREATE DNODE | 调整 | 新增主机名和端口号分开指定语法<ul><li>CREATE DNODE dnode_host_name PORT port_val</li></ul>
|
||||||
| 11 | CREATE INDEX | 新增 | 创建SMA索引。
|
| 11 | CREATE INDEX | 新增 | 创建SMA索引。
|
||||||
| 12 | CREATE MNODE | 新增 | 创建管理节点。
|
| 12 | CREATE MNODE | 新增 | 创建管理节点。
|
||||||
|
@ -43,7 +43,7 @@ description: "TDengine 3.0 版本的语法变更说明"
|
||||||
| 15 | CREATE STREAM | 新增 | 创建流。
|
| 15 | CREATE STREAM | 新增 | 创建流。
|
||||||
| 16 | CREATE TABLE | 调整 | 新增表参数语法<ul><li>COMMENT:表注释。</li><li>WATERMARK:指定窗口的关闭时间。</li><li>MAX_DELAY:用于控制推送计算结果的最大延迟。</li><li>ROLLUP:指定的聚合函数,提供基于多层级的降采样聚合结果。</li><li>SMA:提供基于数据块的自定义预计算功能。</li><li>TTL:用来指定表的生命周期的参数。</li></ul>
|
| 16 | CREATE TABLE | 调整 | 新增表参数语法<ul><li>COMMENT:表注释。</li><li>WATERMARK:指定窗口的关闭时间。</li><li>MAX_DELAY:用于控制推送计算结果的最大延迟。</li><li>ROLLUP:指定的聚合函数,提供基于多层级的降采样聚合结果。</li><li>SMA:提供基于数据块的自定义预计算功能。</li><li>TTL:用来指定表的生命周期的参数。</li></ul>
|
||||||
| 17 | CREATE TOPIC | 新增 | 创建订阅主题。
|
| 17 | CREATE TOPIC | 新增 | 创建订阅主题。
|
||||||
| 18 | DROP ACCOUNT | 废除 | 2.x中为企业版功能,3.0不再支持。语法暂时保留了,执行报“This statement is no longer supported”错误。
|
| 18 | DROP ACCOUNT | 废除 | 2.x 中为企业版功能,3.0 不再支持。语法暂时保留,执行报 “This statement is no longer supported” 错误。
|
||||||
| 19 | DROP CONSUMER GROUP | 新增 | 删除消费组。
|
| 19 | DROP CONSUMER GROUP | 新增 | 删除消费组。
|
||||||
| 20 | DROP INDEX | 新增 | 删除索引。
|
| 20 | DROP INDEX | 新增 | 删除索引。
|
||||||
| 21 | DROP MNODE | 新增 | 创建管理节点。
|
| 21 | DROP MNODE | 新增 | 创建管理节点。
|
||||||
|
@ -56,8 +56,8 @@ description: "TDengine 3.0 版本的语法变更说明"
|
||||||
| 28 | KILL TRANSACTION | 新增 | 终止管理节点的事务。
|
| 28 | KILL TRANSACTION | 新增 | 终止管理节点的事务。
|
||||||
| 29 | KILL STREAM | 废除 | 终止连续查询。3.0 版本不再支持连续查询,而是用更通用的流计算来代替。
|
| 29 | KILL STREAM | 废除 | 终止连续查询。3.0 版本不再支持连续查询,而是用更通用的流计算来代替。
|
||||||
| 31 | REVOKE | 新增 | 回收用户权限。
|
| 31 | REVOKE | 新增 | 回收用户权限。
|
||||||
| 32 | SELECT | 调整 | <ul><li>SELECT关闭隐式结果列,输出列均需要由SELECT子句来指定。</li><li>DISTINCT功能全面支持。2.x版本只支持对标签列去重,并且不可以和JOIN、GROUP BY等子句混用。</li><li>JOIN功能增强。增加支持:JOIN后WHERE条件中有OR条件;JOIN后的多表运算;JOIN后的多表GROUP BY。</li><li>FROM后子查询功能大幅增强。不限制子查询嵌套层数;支持子查询和UNION ALL混合使用;移除其他一些之前版本的语法限制。</li><li>WHERE后可以使用任意的标量表达式。</li><li>GROUP BY功能增强。支持任意标量表达式及其组合的分组。</li><li>SESSION可以用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。</li><li>STATE_WINDOW可以用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。</li><li>ORDER BY功能大幅增强。不再必须和GROUP BY子句一起使用;不再有排序表达式个数的限制;增加支持NULLS FIRST/LAST语法功能;支持符合语法语义的任意表达式。</li><li>新增PARTITION BY语法。替代原来的GROUP BY tags。</li></ul>
|
| 32 | SELECT | 调整 | <ul><li>SELECT 关闭隐式结果列,输出列均需要由 SELECT 子句来指定。</li><li>DISTINCT 功能全面支持。2.x 版本只支持对标签列去重,并且不可以和 JOIN、GROUP BY 等子句混用。</li><li>JOIN 功能增强。增加支持:JOIN 后 WHERE 条件中有 OR 条件;JOIN 后的多表运算;JOIN 后的多表 GROUP BY。</li><li>FROM 后子查询功能大幅增强。不限制子查询嵌套层数;支持子查询和 UNION ALL 混合使用;移除其他一些之前版本的语法限制。</li><li>WHERE 后可以使用任意的标量表达式。</li><li>GROUP BY 功能增强。支持任意标量表达式及其组合的分组。</li><li>SESSION 可以用于超级表。之前版本,超级表的数据会被合并成一条时间线。</li><li>STATE_WINDOW 可以用于超级表。之前版本,超级表的数据会被合并成一条时间线。</li><li>ORDER BY 功能大幅增强。不再必须和 GROUP BY 子句一起使用;不再有排序表达式个数的限制;增加支持 NULLS FIRST/LAST 语法功能;支持符合语法语义的任意表达式。</li><li>新增 PARTITION BY 语法。替代原来的 GROUP BY tags。</li></ul>
|
||||||
| 33 | SHOW ACCOUNTS | 废除 | 2.x中为企业版功能,3.0不再支持。语法暂时保留了,执行报“This statement is no longer supported”错误。
|
| 33 | SHOW ACCOUNTS | 废除 | 2.x 中为企业版功能,3.0 不再支持。语法暂时保留,执行报 “This statement is no longer supported” 错误。
|
||||||
| 34 | SHOW APPS |新增 | 显示接入集群的应用(客户端)信息。
|
| 34 | SHOW APPS |新增 | 显示接入集群的应用(客户端)信息。
|
||||||
| 35 | SHOW CONSUMERS | 新增 | 显示当前数据库下所有活跃的消费者的信息。
|
| 35 | SHOW CONSUMERS | 新增 | 显示当前数据库下所有活跃的消费者的信息。
|
||||||
| 36 | SHOW DATABASES | 调整 | 3.0 版本只显示数据库名。
|
| 36 | SHOW DATABASES | 调整 | 3.0 版本只显示数据库名。
|
||||||
|
@ -71,11 +71,11 @@ description: "TDengine 3.0 版本的语法变更说明"
|
||||||
| 44 | SHOW STREAMS | 调整 | 2.x 版本此命令显示系统中已创建的连续查询的信息。3.0 版本废除了连续查询,用流代替。此命令显示已创建的流。
|
| 44 | SHOW STREAMS | 调整 | 2.x 版本此命令显示系统中已创建的连续查询的信息。3.0 版本废除了连续查询,用流代替。此命令显示已创建的流。
|
||||||
| 45 | SHOW SUBSCRIPTIONS | 新增 | 显示当前数据库下的所有的订阅关系
|
| 45 | SHOW SUBSCRIPTIONS | 新增 | 显示当前数据库下的所有的订阅关系
|
||||||
| 46 | SHOW TABLES | 调整 | 3.0 版本只显示表名。
|
| 46 | SHOW TABLES | 调整 | 3.0 版本只显示表名。
|
||||||
| 47 | SHOW TABLE DISTRIBUTED | 新增 | 显示表的数据分布信息。代替2.x版本中的SELECT _block_dist() FROM \{ tb_name | stb_name }方式。
|
| 47 | SHOW TABLE DISTRIBUTED | 新增 | 显示表的数据分布信息。代替 2.x 版本中的 `SELECT _block_dist() FROM tb_name` 方式。
|
||||||
| 48 | SHOW TOPICS | 新增 | 显示当前数据库下的所有订阅主题。
|
| 48 | SHOW TOPICS | 新增 | 显示当前数据库下的所有订阅主题。
|
||||||
| 49 | SHOW TRANSACTIONS | 新增 | 显示当前系统中正在执行的事务的信息。
|
| 49 | SHOW TRANSACTIONS | 新增 | 显示当前系统中正在执行的事务的信息。
|
||||||
| 50 | SHOW DNODE VARIABLES | 新增 |显示指定 DNODE 的配置参数。
|
| 50 | SHOW DNODE VARIABLES | 新增 |显示指定 DNODE 的配置参数。
|
||||||
| 51 | SHOW VNODES | 暂不支持 | 显示当前系统中VNODE的信息。3.0.0版本暂不支持。
|
| 51 | SHOW VNODES | 暂不支持 | 显示当前系统中 VNODE 的信息。
|
||||||
| 52 | TRIM DATABASE | 新增 | 删除过期数据,并根据多级存储的配置归整数据。
|
| 52 | TRIM DATABASE | 新增 | 删除过期数据,并根据多级存储的配置归整数据。
|
||||||
| 53 | REDISTRIBUTE VGROUP | 新增 | 调整 VGROUP 中 VNODE 的分布。
|
| 53 | REDISTRIBUTE VGROUP | 新增 | 调整 VGROUP 中 VNODE 的分布。
|
||||||
| 54 | BALANCE VGROUP | 新增 | 自动调整 VGROUP中 VNODE 的分布。
|
| 54 | BALANCE VGROUP | 新增 | 自动调整 VGROUP中 VNODE 的分布。
|
||||||
|
@ -84,22 +84,22 @@ description: "TDengine 3.0 版本的语法变更说明"
|
||||||
|
|
||||||
| # | **函数** | ** <div style={{width: 60}}>差异性</div> ** | **说明** |
|
| # | **函数** | ** <div style={{width: 60}}>差异性</div> ** | **说明** |
|
||||||
| - | :------- | :-------- | :------- |
|
| - | :------- | :-------- | :------- |
|
||||||
| 1 | TWA | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 1 | TWA | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 2 | IRATE | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 2 | IRATE | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 3 | LEASTSQUARES | 增强 | 可以用于超级表了。
|
| 3 | LEASTSQUARES | 增强 | 可以用于超级表。
|
||||||
| 4 | ELAPSED | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 4 | ELAPSED | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 5 | DIFF | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 5 | DIFF | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 6 | DERIVATIVE | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 6 | DERIVATIVE | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 7 | CSUM | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 7 | CSUM | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 8 | MAVG | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 8 | MAVG | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 9 | SAMPLE | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 9 | SAMPLE | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 10 | STATECOUNT | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 10 | STATECOUNT | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 11 | STATEDURATION | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 11 | STATEDURATION | 增强 | 可以直接用于超级表。之前版本,超级表的数据会被合并成一条时间线。
|
||||||
| 12 | TIMETRUNCATE | 增强 | 增加ignore_timezone参数,可选是否使用,默认值为1.
|
| 12 | TIMETRUNCATE | 增强 | 增加 ignore_timezone 参数,可选是否使用,默认值为 1。
|
||||||
|
|
||||||
|
|
||||||
## SCHEMALESS 变更
|
## SCHEMALESS 变更
|
||||||
|
|
||||||
| # | **元素** | **<div style={{width: 60}}>差异性</div>** | **说明** |
|
| # | **元素** | **<div style={{width: 60}}>差异性</div>** | **说明** |
|
||||||
| - | :------- | :-------- | :------- |
|
| - | :------- | :-------- | :------- |
|
||||||
| 1 | 主键ts 变更为 _ts | 变更 | schemaless自动建的列名用 _ 开头,不同于2.x。
|
| 1 | 主键 ts 变更为 _ts | 变更 | schemaless 自动建的列名用 `_` 开头,不同于2.x。
|
||||||
|
|
|
@ -4,7 +4,7 @@ sidebar_label: 可配置压缩
|
||||||
description: 可配置压缩算法
|
description: 可配置压缩算法
|
||||||
---
|
---
|
||||||
|
|
||||||
从 TDengine 3.3.0.0 版本开始,TDengine 提供了更高级的压缩功能,用户可以在建表时针对每一列配置是否进行压缩、以及使用的压缩算法和压缩级别。
|
从 v3.3.0.0 开始,TDengine 提供了更高级的压缩功能,用户可以在建表时针对每一列配置是否进行压缩、以及使用的压缩算法和压缩级别。
|
||||||
|
|
||||||
## 压缩术语定义
|
## 压缩术语定义
|
||||||
|
|
||||||
|
@ -23,9 +23,9 @@ description: 可配置压缩算法
|
||||||
|
|
||||||
### 压缩算法列表
|
### 压缩算法列表
|
||||||
|
|
||||||
- 编码算法列表(一级压缩):simple8b, bit-packing,delta-i, delta-d, disabled
|
- 编码算法列表(一级压缩):simple8b、bit-packing、delta-i、delta-d、disabled
|
||||||
|
|
||||||
- 压缩算法列表(二级压缩): lz4、zlib、zstd、tsz、xz、disabled
|
- 压缩算法列表(二级压缩):lz4、zlib、zstd、tsz、xz、disabled
|
||||||
|
|
||||||
- 各个数据类型的默认压缩算法列表和适用范围
|
- 各个数据类型的默认压缩算法列表和适用范围
|
||||||
|
|
||||||
|
@ -50,9 +50,9 @@ CREATE [dbname.]tabname (colName colType [ENCODE 'encode_type'] [COMPRESS 'compr
|
||||||
**参数说明**
|
**参数说明**
|
||||||
|
|
||||||
- tabname:超级表或者普通表名称
|
- tabname:超级表或者普通表名称
|
||||||
- encode_type: 一级压缩,具体参数见上面列表
|
- encode_type:一级压缩,具体参数见上面列表
|
||||||
- compress_type: 二级压缩,具体参数见上面列表
|
- compress_type:二级压缩,具体参数见上面列表
|
||||||
- level: 特指二级压缩的级别,默认值为medium, 支持简写为 'h'/'l'/'m'
|
- level:特指二级压缩的级别,默认值为 medium,支持简写为 'h'、'l'、'm'
|
||||||
|
|
||||||
**功能说明**
|
**功能说明**
|
||||||
|
|
||||||
|
@ -67,8 +67,8 @@ ALTER TABLE [db_name.]tabName MODIFY COLUMN colName [ENCODE 'ecode_type'] [COMPR
|
||||||
|
|
||||||
**参数说明**
|
**参数说明**
|
||||||
|
|
||||||
- tabName: 表名,可以为超级表、普通表
|
- tabName:表名,可以为超级表、普通表
|
||||||
- colName: 待更改压缩算法的列, 只能为普通列
|
- colName:待更改压缩算法的列,只能为普通列
|
||||||
|
|
||||||
**功能说明**
|
**功能说明**
|
||||||
|
|
||||||
|
@ -87,4 +87,4 @@ DESCRIBE [dbname.]tabName
|
||||||
## 兼容性
|
## 兼容性
|
||||||
|
|
||||||
- 完全兼容已经存在的数据
|
- 完全兼容已经存在的数据
|
||||||
- 从更低版本升级到 3.3.0.0 后不能回退
|
- 从更低版本升级到 v3.3.0.0 后不能回退
|
||||||
|
|
|
@ -4,14 +4,13 @@ title: "视图"
|
||||||
sidebar_label: "视图"
|
sidebar_label: "视图"
|
||||||
---
|
---
|
||||||
|
|
||||||
从 TDengine 3.2.1.0 开始,TDengine 企业版提供视图功能,便于用户简化操作,提升用户间的分享能力。
|
从 v3.2.1.0 开始,TDengine 企业版提供视图功能,便于用户简化操作,提升用户间的分享能力。
|
||||||
|
|
||||||
视图(View)本质上是一个存储在数据库中的查询语句。视图(非物化视图)本身不包含数据,只有在从视图读取数据时才动态执行视图所指定的查询语句。我们在创建视图时指定一个名称,然后可以像使用普通表一样对其进行查询等操作。视图的使用需遵循以下规则:
|
视图(View)本质上是一个存储在数据库中的查询语句。视图(非物化视图)本身不包含数据,只有在从视图读取数据时才动态执行视图所指定的查询语句。我们在创建视图时指定一个名称,然后可以像使用普通表一样对其进行查询等操作。视图的使用需遵循以下规则:
|
||||||
- 视图可以嵌套定义和使用,视图与创建时指定的或当前数据库绑定使用。
|
- 视图可以嵌套定义和使用,视图与创建时指定的或当前数据库绑定使用。
|
||||||
- 在同一个数据库内,视图名称不允许重名,视图名跟表名也推荐不重名(不强制)。当出现视图与表名重名时,写入、查询、授权、回收权限等操作优先使用同名表。
|
- 在同一个数据库内,视图名称不允许重名,视图名跟表名也推荐不重名(不强制)。当出现视图与表名重名时,写入、查询、授权、回收权限等操作优先使用同名表。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 语法
|
## 语法
|
||||||
|
|
||||||
### 创建(更新)视图
|
### 创建(更新)视图
|
||||||
|
|
|
@ -16,7 +16,7 @@ TDengine SQL 是用户对 TDengine 进行数据写入和查询的主要工具。
|
||||||
- | 表示多选一,选择其中一个即可,但不能输入 | 本身
|
- | 表示多选一,选择其中一个即可,但不能输入 | 本身
|
||||||
- … 表示前面的项可重复多个
|
- … 表示前面的项可重复多个
|
||||||
|
|
||||||
为更好地说明 SQL 语法的规则及其特点,本文假设存在一个数据集。以智能电表(meters)为例,假设每个智能电表采集电流、电压、相位三个量。其建模如下:
|
为更好地说明 SQL 语法的规则及其特点,本文假设存在一个数据集。以智能电表(meters)为例,假设每个智能电表采集电流、电压、相位三个量。其建模如下:
|
||||||
|
|
||||||
```
|
```
|
||||||
taos> DESCRIBE meters;
|
taos> DESCRIBE meters;
|
||||||
|
@ -30,7 +30,7 @@ taos> DESCRIBE meters;
|
||||||
groupid | INT | 4 | TAG |
|
groupid | INT | 4 | TAG |
|
||||||
```
|
```
|
||||||
|
|
||||||
数据集包含 4 个智能电表的数据,按照 TDengine 的建模规则,对应 4 个子表,其名称分别是 d1001, d1002, d1003, d1004。
|
数据集包含 4 个智能电表的数据,按照 TDengine 的建模规则,对应 4 个子表,其名称分别是 d1001、d1002、d1003、d1004。
|
||||||
|
|
||||||
```mdx-code-block
|
```mdx-code-block
|
||||||
import DocCardList from '@theme/DocCardList';
|
import DocCardList from '@theme/DocCardList';
|
||||||
|
|
|
@ -93,16 +93,16 @@ DSN 描述字符串基本结构如下:
|
||||||
|
|
||||||
各部分意义见下表:
|
各部分意义见下表:
|
||||||
|
|
||||||
- **driver**: 必须指定驱动名以便连接器选择何种方式创建连接,支持如下驱动名:
|
- **driver**:必须指定驱动名以便连接器选择何种方式创建连接,支持如下驱动名:
|
||||||
- **taos**: 默认驱动,支持 SQL 执行,参数绑定,无模式写入。
|
- **taos**:默认驱动,支持 SQL 执行,参数绑定,无模式写入。
|
||||||
- **tmq**: 使用 TMQ 订阅数据。
|
- **tmq**:使用 TMQ 订阅数据。
|
||||||
- **protocol**: 显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 WebSocket 方式建立连接。
|
- **protocol**:显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 WebSocket 方式建立连接。
|
||||||
- **http/ws**: 使用 WebSocket 协议。
|
- **http/ws**:使用 WebSocket 协议。
|
||||||
- **https/wss**: 在 WebSocket 连接方式下显示启用 SSL/TLS 协议。
|
- **https/wss**:在 WebSocket 连接方式下显示启用 SSL/TLS 协议。
|
||||||
|
|
||||||
- **username/password**: 用于创建连接的用户名及密码。
|
- **username/password**:用于创建连接的用户名及密码。
|
||||||
- **host/port**: 指定创建连接的服务器及端口,当不指定服务器地址及端口时 WebSocket 连接默认为 `localhost:6041` 。
|
- **host/port**:指定创建连接的服务器及端口,当不指定服务器地址及端口时 WebSocket 连接默认为 `localhost:6041` 。
|
||||||
- **database**: 指定默认连接的数据库名,可选参数。
|
- **database**:指定默认连接的数据库名,可选参数。
|
||||||
- **params**:其他可选参数。
|
- **params**:其他可选参数。
|
||||||
|
|
||||||
一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 WebSocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。
|
一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 WebSocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。
|
||||||
|
@ -280,7 +280,7 @@ TDengine 推荐数据库应用的每个线程都建立一个独立的连接,
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- stmt:[入参] 指向一个有效的预编译的 SQL 语句对象指针。
|
- stmt:[入参] 指向一个有效的预编译的 SQL 语句对象指针。
|
||||||
- bind:[入参] 指向一个有效的 WS_MULTI_BIND 结构体指针,该结构体包含了要批量绑定到 SQL 语句中的参数列表。
|
- bind:[入参] 指向一个有效的 WS_MULTI_BIND 结构体指针,该结构体包含了要批量绑定到 SQL 语句中的参数列表。
|
||||||
- len: [入参] bind 数组的元素个数。
|
- len:[入参] bind 数组的元素个数。
|
||||||
- **返回值**:`0`:成功。非 `0`:失败,详情请参考错误码页面。
|
- **返回值**:`0`:成功。非 `0`:失败,详情请参考错误码页面。
|
||||||
|
|
||||||
- `int ws_stmt_set_tbname(WS_STMT *stmt, const char *name)`
|
- `int ws_stmt_set_tbname(WS_STMT *stmt, const char *name)`
|
||||||
|
@ -356,8 +356,8 @@ TDengine 推荐数据库应用的每个线程都建立一个独立的连接,
|
||||||
协议类型是枚举类型,包含以下三种格式:
|
协议类型是枚举类型,包含以下三种格式:
|
||||||
|
|
||||||
- WS_TSDB_SML_LINE_PROTOCOL:InfluxDB 行协议(Line Protocol)
|
- WS_TSDB_SML_LINE_PROTOCOL:InfluxDB 行协议(Line Protocol)
|
||||||
- WS_TSDB_SML_TELNET_PROTOCOL: OpenTSDB Telnet 文本行协议
|
- WS_TSDB_SML_TELNET_PROTOCOL:OpenTSDB Telnet 文本行协议
|
||||||
- WS_TSDB_SML_JSON_PROTOCOL: OpenTSDB Json 协议格式
|
- WS_TSDB_SML_JSON_PROTOCOL:OpenTSDB Json 协议格式
|
||||||
|
|
||||||
时间戳分辨率的定义,定义在 `taosws.h` 文件中,具体内容如下:
|
时间戳分辨率的定义,定义在 `taosws.h` 文件中,具体内容如下:
|
||||||
|
|
||||||
|
@ -625,9 +625,9 @@ TDengine 服务端或客户端安装后,`taos.h` 位于:
|
||||||
|
|
||||||
TDengine 客户端驱动的动态库位于:
|
TDengine 客户端驱动的动态库位于:
|
||||||
|
|
||||||
- Linux: `/usr/local/taos/driver/libtaos.so`
|
- Linux:`/usr/local/taos/driver/libtaos.so`
|
||||||
- Windows: `C:\TDengine\driver\taos.dll`
|
- Windows:`C:\TDengine\driver\taos.dll`
|
||||||
- macOS: `/usr/local/lib/libtaos.dylib`
|
- macOS:`/usr/local/lib/libtaos.dylib`
|
||||||
|
|
||||||
### 支持的平台
|
### 支持的平台
|
||||||
|
|
||||||
|
@ -689,7 +689,7 @@ TDengine 客户端驱动的版本号与 TDengine 服务端的版本号是一一
|
||||||
- `int taos_options_connection(TAOS *taos, TSDB_OPTION_CONNECTION option, const void *arg, ...)`
|
- `int taos_options_connection(TAOS *taos, TSDB_OPTION_CONNECTION option, const void *arg, ...)`
|
||||||
- **接口说明**:设置客户端连接选项,目前支持字符集设置(`TSDB_OPTION_CONNECTION_CHARSET`)、时区设置(`TSDB_OPTION_CONNECTION_TIMEZONE`)、用户 IP 设置(`TSDB_OPTION_CONNECTION_USER_IP`)、用户 APP 设置(`TSDB_OPTION_CONNECTION_USER_APP`)。
|
- **接口说明**:设置客户端连接选项,目前支持字符集设置(`TSDB_OPTION_CONNECTION_CHARSET`)、时区设置(`TSDB_OPTION_CONNECTION_TIMEZONE`)、用户 IP 设置(`TSDB_OPTION_CONNECTION_USER_IP`)、用户 APP 设置(`TSDB_OPTION_CONNECTION_USER_APP`)。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `taos`: [入参] taos_connect 返回的连接句柄。
|
- `taos`:[入参] taos_connect 返回的连接句柄。
|
||||||
- `option`:[入参] 设置项类型。
|
- `option`:[入参] 设置项类型。
|
||||||
- `arg`:[入参] 设置项值。
|
- `arg`:[入参] 设置项值。
|
||||||
- **返回值**:`0`:成功,`非0`:失败。
|
- **返回值**:`0`:成功,`非0`:失败。
|
||||||
|
@ -727,7 +727,7 @@ TDengine 客户端驱动的版本号与 TDengine 服务端的版本号是一一
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- ip:[入参] TDengine 集群中任一节点的 FQDN。
|
- ip:[入参] TDengine 集群中任一节点的 FQDN。
|
||||||
- user:[入参] 用户名。
|
- user:[入参] 用户名。
|
||||||
- auth: [入参] 原始密码取 32 位小写 md5。
|
- auth:[入参] 原始密码取 32 位小写 md5。
|
||||||
- db:[入参] 数据库名称,如果用户没有提供,也可以正常连接,用户可以通过该连接创建新的数据库,如果用户提供了数据库名字,则说明该数据库用户已经创建好,缺省使用该数据库。
|
- db:[入参] 数据库名称,如果用户没有提供,也可以正常连接,用户可以通过该连接创建新的数据库,如果用户提供了数据库名字,则说明该数据库用户已经创建好,缺省使用该数据库。
|
||||||
- port:[入参] taosd 程序监听的端口。
|
- port:[入参] taosd 程序监听的端口。
|
||||||
- **返回值**:返回数据库连接,返回值为空表示失败。应用程序需要保存返回的参数,以便后续使用。
|
- **返回值**:返回数据库连接,返回值为空表示失败。应用程序需要保存返回的参数,以便后续使用。
|
||||||
|
@ -866,7 +866,7 @@ TDengine 还提供性能更高的异步 API 处理数据插入、查询操作。
|
||||||
- **接口说明**:异步执行 SQL 语句。
|
- **接口说明**:异步执行 SQL 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- taos:[入参] 指向数据库连接的指针,数据库连接是通过 `taos_connect()` 函数建立。
|
- taos:[入参] 指向数据库连接的指针,数据库连接是通过 `taos_connect()` 函数建立。
|
||||||
- sql: [入参] 需要执行的 SQL 语句。
|
- sql:[入参] 需要执行的 SQL 语句。
|
||||||
- fp:用户定义的回调函数,其第三个参数 `code` 用于指示操作是否成功,`0` 表示成功,负数表示失败(调用 `taos_errstr()` 可获取失败原因)。应用在定义回调函数的时候,主要处理第二个参数 `TAOS_RES *`,该参数是查询返回的结果集。
|
- fp:用户定义的回调函数,其第三个参数 `code` 用于指示操作是否成功,`0` 表示成功,负数表示失败(调用 `taos_errstr()` 可获取失败原因)。应用在定义回调函数的时候,主要处理第二个参数 `TAOS_RES *`,该参数是查询返回的结果集。
|
||||||
- param:应用提供的用于回调的参数。
|
- param:应用提供的用于回调的参数。
|
||||||
|
|
||||||
|
@ -995,8 +995,8 @@ TDengine 的异步 API 均采用非阻塞调用模式。应用程序可以用多
|
||||||
协议类型是枚举类型,包含以下三种格式:
|
协议类型是枚举类型,包含以下三种格式:
|
||||||
|
|
||||||
- TSDB_SML_LINE_PROTOCOL:InfluxDB 行协议(Line Protocol)
|
- TSDB_SML_LINE_PROTOCOL:InfluxDB 行协议(Line Protocol)
|
||||||
- TSDB_SML_TELNET_PROTOCOL: OpenTSDB Telnet 文本行协议
|
- TSDB_SML_TELNET_PROTOCOL:OpenTSDB Telnet 文本行协议
|
||||||
- TSDB_SML_JSON_PROTOCOL: OpenTSDB Json 协议格式
|
- TSDB_SML_JSON_PROTOCOL:OpenTSDB Json 协议格式
|
||||||
|
|
||||||
时间戳分辨率的定义,定义在 `taos.h` 文件中,具体内容如下:
|
时间戳分辨率的定义,定义在 `taos.h` 文件中,具体内容如下:
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,8 @@ TDengine 的 JDBC 驱动实现尽可能与关系型数据库驱动保持一致
|
||||||
|
|
||||||
## JDBC 和 JRE 版本兼容性
|
## JDBC 和 JRE 版本兼容性
|
||||||
|
|
||||||
- JDBC: 支持 JDBC 4.2 及以上版本。
|
- JDBC:支持 JDBC 4.2 及以上版本。
|
||||||
- JRE: 支持 JRE 8 及以上版本。
|
- JRE:支持 JRE 8 及以上版本。
|
||||||
|
|
||||||
## 支持的平台
|
## 支持的平台
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ JDBC 连接器可能报错的错误码包括 4 种:
|
||||||
| 0x2318 | | REST 连接中出现了数据传输异常,请检查网络情况并重试。 |
|
| 0x2318 | | REST 连接中出现了数据传输异常,请检查网络情况并重试。 |
|
||||||
| 0x2319 | user is required | 创建连接时缺少用户名信息 |
|
| 0x2319 | user is required | 创建连接时缺少用户名信息 |
|
||||||
| 0x231a | password is required | 创建连接时缺少密码信息 |
|
| 0x231a | password is required | 创建连接时缺少密码信息 |
|
||||||
| 0x231c | httpEntity is null, sql: | REST 连接中执行出现异常 |
|
| 0x231c | httpEntity is null, sql | REST 连接中执行出现异常 |
|
||||||
| 0x231d | can't create connection with server within | 通过增加参数 httpConnectTimeout 增加连接耗时,或是请检查与 taosAdapter 之间的连接情况。 |
|
| 0x231d | can't create connection with server within | 通过增加参数 httpConnectTimeout 增加连接耗时,或是请检查与 taosAdapter 之间的连接情况。 |
|
||||||
| 0x231e | failed to complete the task within the specified time | 通过增加参数 messageWaitTimeout 增加执行耗时,或是请检查与 taosAdapter 之间的连接情况。 |
|
| 0x231e | failed to complete the task within the specified time | 通过增加参数 messageWaitTimeout 增加执行耗时,或是请检查与 taosAdapter 之间的连接情况。 |
|
||||||
| 0x2350 | unknown error | 未知异常,请在 github 反馈给开发人员。 |
|
| 0x2350 | unknown error | 未知异常,请在 github 反馈给开发人员。 |
|
||||||
|
@ -162,7 +162,7 @@ WKB规范请参考[Well-Known Binary (WKB)](https://libgeos.org/specifications/w
|
||||||
- connectionPools:HikariCP, Druid, dbcp, c3p0 等连接池中使用 taos-jdbcdriver。
|
- connectionPools:HikariCP, Druid, dbcp, c3p0 等连接池中使用 taos-jdbcdriver。
|
||||||
- SpringJdbcTemplate:Spring JdbcTemplate 中使用 taos-jdbcdriver。
|
- SpringJdbcTemplate:Spring JdbcTemplate 中使用 taos-jdbcdriver。
|
||||||
- mybatisplus-demo:Springboot + Mybatis 中使用 taos-jdbcdriver。
|
- mybatisplus-demo:Springboot + Mybatis 中使用 taos-jdbcdriver。
|
||||||
- springbootdemo: Springboot 中使用 taos-jdbcdriver。
|
- springbootdemo:Springboot 中使用 taos-jdbcdriver。
|
||||||
- consumer-demo:Consumer 消费 TDengine 数据示例,可通过参数控制消费速度。
|
- consumer-demo:Consumer 消费 TDengine 数据示例,可通过参数控制消费速度。
|
||||||
|
|
||||||
请参考:[JDBC example](https://github.com/taosdata/TDengine/tree/main/docs/examples/JDBC)
|
请参考:[JDBC example](https://github.com/taosdata/TDengine/tree/main/docs/examples/JDBC)
|
||||||
|
@ -226,7 +226,7 @@ TDengine 的 JDBC URL 规范格式为:
|
||||||
- charset:客户端使用的字符集,默认值为系统字符集。
|
- charset:客户端使用的字符集,默认值为系统字符集。
|
||||||
- locale:客户端语言环境,默认值系统当前 locale。
|
- locale:客户端语言环境,默认值系统当前 locale。
|
||||||
- timezone:客户端使用的时区,默认值为系统当前时区。
|
- timezone:客户端使用的时区,默认值为系统当前时区。
|
||||||
- batchfetch: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:true。开启批量拉取同时获取一批数据在查询数据量较大时批量拉取可以有效的提升查询性能。
|
- batchfetch:true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:true。开启批量拉取同时获取一批数据在查询数据量较大时批量拉取可以有效的提升查询性能。
|
||||||
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败将继续执行下面的 SQL。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败将继续执行下面的 SQL。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
||||||
|
|
||||||
JDBC 原生连接的使用请参见[视频教程](https://www.taosdata.com/blog/2020/11/11/1955.html)。
|
JDBC 原生连接的使用请参见[视频教程](https://www.taosdata.com/blog/2020/11/11/1955.html)。
|
||||||
|
@ -251,9 +251,9 @@ TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可
|
||||||
- user:登录 TDengine 用户名,默认值 'root'。
|
- user:登录 TDengine 用户名,默认值 'root'。
|
||||||
- password:用户登录密码,默认值 'taosdata'。
|
- password:用户登录密码,默认值 'taosdata'。
|
||||||
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
||||||
- httpConnectTimeout: 连接超时时间,单位 ms, 默认值为 60000。
|
- httpConnectTimeout:连接超时时间,单位 ms, 默认值为 60000。
|
||||||
- messageWaitTimeout: 消息超时时间, 单位 ms, 默认值为 60000。
|
- messageWaitTimeout:消息超时时间, 单位 ms, 默认值为 60000。
|
||||||
- useSSL: 连接中是否使用 SSL。
|
- useSSL:连接中是否使用 SSL。
|
||||||
- timezone:客户端使用的时区,连接上生效,默认值为系统时区。推荐不设置,使用系统时区性能更好。
|
- timezone:客户端使用的时区,连接上生效,默认值为系统时区。推荐不设置,使用系统时区性能更好。
|
||||||
|
|
||||||
**注意**:部分配置项(比如:locale、charset)在 WebSocket 连接中不生效。
|
**注意**:部分配置项(比如:locale、charset)在 WebSocket 连接中不生效。
|
||||||
|
@ -269,10 +269,10 @@ TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可
|
||||||
- user:登录 TDengine 用户名,默认值 'root'。
|
- user:登录 TDengine 用户名,默认值 'root'。
|
||||||
- password:用户登录密码,默认值 'taosdata'。
|
- password:用户登录密码,默认值 'taosdata'。
|
||||||
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
- batchErrorIgnore:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 SQL 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
||||||
- httpConnectTimeout: 连接超时时间,单位 ms, 默认值为 60000。
|
- httpConnectTimeout:连接超时时间,单位 ms, 默认值为 60000。
|
||||||
- httpSocketTimeout: socket 超时时间,单位 ms,默认值为 60000。
|
- httpSocketTimeout:socket 超时时间,单位 ms,默认值为 60000。
|
||||||
- useSSL: 连接中是否使用 SSL。
|
- useSSL:连接中是否使用 SSL。
|
||||||
- httpPoolSize: REST 并发请求大小,默认 20。
|
- httpPoolSize:REST 并发请求大小,默认 20。
|
||||||
|
|
||||||
**注意**:部分配置项(比如:locale、charset 和 timezone)在 REST 连接中不生效。
|
**注意**:部分配置项(比如:locale、charset 和 timezone)在 REST 连接中不生效。
|
||||||
|
|
||||||
|
@ -292,7 +292,7 @@ TDengine 中,只要保证 firstEp 和 secondEp 中一个节点有效,就可
|
||||||
properties 中的配置参数如下:
|
properties 中的配置参数如下:
|
||||||
- TSDBDriver.PROPERTY_KEY_USER:登录 TDengine 用户名,默认值 'root'。
|
- TSDBDriver.PROPERTY_KEY_USER:登录 TDengine 用户名,默认值 'root'。
|
||||||
- TSDBDriver.PROPERTY_KEY_PASSWORD:用户登录密码,默认值 'taosdata'。
|
- TSDBDriver.PROPERTY_KEY_PASSWORD:用户登录密码,默认值 'taosdata'。
|
||||||
- TSDBDriver.PROPERTY_KEY_BATCH_LOAD: true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。因历史原因使用 REST 连接时,若设置此参数为 true 会变成 WebSocket 连接。
|
- TSDBDriver.PROPERTY_KEY_BATCH_LOAD:true:在执行查询时批量拉取结果集;false:逐行拉取结果集。默认值为:false。因历史原因使用 REST 连接时,若设置此参数为 true 会变成 WebSocket 连接。
|
||||||
- TSDBDriver.PROPERTY_KEY_BATCH_ERROR_IGNORE:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 sq 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
- TSDBDriver.PROPERTY_KEY_BATCH_ERROR_IGNORE:true:在执行 Statement 的 executeBatch 时,如果中间有一条 SQL 执行失败,继续执行下面的 sq 了。false:不再执行失败 SQL 后的任何语句。默认值为:false。
|
||||||
- TSDBDriver.PROPERTY_KEY_CONFIG_DIR:仅在使用 JDBC 原生连接时生效。客户端配置文件目录路径,Linux OS 上默认值 `/etc/taos`,Windows OS 上默认值 `C:/TDengine/cfg`。
|
- TSDBDriver.PROPERTY_KEY_CONFIG_DIR:仅在使用 JDBC 原生连接时生效。客户端配置文件目录路径,Linux OS 上默认值 `/etc/taos`,Windows OS 上默认值 `C:/TDengine/cfg`。
|
||||||
- TSDBDriver.PROPERTY_KEY_CHARSET:客户端使用的字符集,默认值为系统字符集。
|
- TSDBDriver.PROPERTY_KEY_CHARSET:客户端使用的字符集,默认值为系统字符集。
|
||||||
|
@ -300,21 +300,21 @@ properties 中的配置参数如下:
|
||||||
- TSDBDriver.PROPERTY_KEY_TIME_ZONE:
|
- TSDBDriver.PROPERTY_KEY_TIME_ZONE:
|
||||||
- 原生连接:客户端使用的时区,默认值为系统当前时区,全局生效。因为历史的原因,我们只支持POSIX标准的部分规范,如UTC-8(代表中国上上海), GMT-8,Asia/Shanghai 这几种形式。
|
- 原生连接:客户端使用的时区,默认值为系统当前时区,全局生效。因为历史的原因,我们只支持POSIX标准的部分规范,如UTC-8(代表中国上上海), GMT-8,Asia/Shanghai 这几种形式。
|
||||||
- WebSocket 连接:客户端使用的时区,连接上生效,默认值为系统时区。仅支持 IANA 时区,即 Asia/Shanghai 这种形式。推荐不设置,使用系统时区性能更好。
|
- WebSocket 连接:客户端使用的时区,连接上生效,默认值为系统时区。仅支持 IANA 时区,即 Asia/Shanghai 这种形式。推荐不设置,使用系统时区性能更好。
|
||||||
- TSDBDriver.HTTP_CONNECT_TIMEOUT: 连接超时时间,单位 ms, 默认值为 60000。仅在 REST 连接时生效。
|
- TSDBDriver.HTTP_CONNECT_TIMEOUT:连接超时时间,单位 ms, 默认值为 60000。仅在 REST 连接时生效。
|
||||||
- TSDBDriver.HTTP_SOCKET_TIMEOUT: socket 超时时间,单位 ms,默认值为 60000。仅在 REST 连接且 batchfetch 设置为 false 时生效。
|
- TSDBDriver.HTTP_SOCKET_TIMEOUT:socket 超时时间,单位 ms,默认值为 60000。仅在 REST 连接且 batchfetch 设置为 false 时生效。
|
||||||
- TSDBDriver.PROPERTY_KEY_MESSAGE_WAIT_TIMEOUT: 消息超时时间, 单位 ms, 默认值为 60000。 仅 WebSocket 连接下有效。
|
- TSDBDriver.PROPERTY_KEY_MESSAGE_WAIT_TIMEOUT:消息超时时间, 单位 ms, 默认值为 60000。 仅 WebSocket 连接下有效。
|
||||||
- TSDBDriver.PROPERTY_KEY_USE_SSL: 连接中是否使用 SSL。仅在 WebSocket/REST 连接时生效。
|
- TSDBDriver.PROPERTY_KEY_USE_SSL:连接中是否使用 SSL。仅在 WebSocket/REST 连接时生效。
|
||||||
- TSDBDriver.HTTP_POOL_SIZE: REST 并发请求大小,默认 20。
|
- TSDBDriver.HTTP_POOL_SIZE:REST 并发请求大小,默认 20。
|
||||||
- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION: 传输过程是否启用压缩。仅在使用 REST/WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。
|
- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION:传输过程是否启用压缩。仅在使用 REST/WebSocket 连接时生效。true:启用,false:不启用。默认为 false。
|
||||||
- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT: 是否启用自动重连。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。
|
- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT:是否启用自动重连。仅在使用 WebSocket 连接时生效。true:启用,false:不启用。默认为 false。
|
||||||
> **注意**:启用自动重连仅对简单执行 SQL 语句以及 无模式写入、数据订阅有效。对于参数绑定无效。自动重连仅对连接建立时通过参数指定数据库有效,对后面的 `use db` 语句切换数据库无效。
|
> **注意**:启用自动重连仅对简单执行 SQL 语句以及 无模式写入、数据订阅有效。对于参数绑定无效。自动重连仅对连接建立时通过参数指定数据库有效,对后面的 `use db` 语句切换数据库无效。
|
||||||
|
|
||||||
- TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS: 自动重连重试间隔,单位毫秒,默认值 2000。仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
- TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS:自动重连重试间隔,单位毫秒,默认值 2000。仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
||||||
- TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT: 自动重连重试次数,默认值 3,仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
- TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT:自动重连重试次数,默认值 3,仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
||||||
- TSDBDriver.PROPERTY_KEY_DISABLE_SSL_CERT_VALIDATION: 关闭 SSL 证书验证 。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。
|
- TSDBDriver.PROPERTY_KEY_DISABLE_SSL_CERT_VALIDATION:关闭 SSL 证书验证 。仅在使用 WebSocket 连接时生效。true:启用,false:不启用。默认为 false。
|
||||||
|
|
||||||
- TSDBDriver.PROPERTY_KEY_APP_NAME: App 名称,可用于 `show connections` 查询结果显示。仅在使用 WebSocket 连接时生效。默认值为 java。
|
- TSDBDriver.PROPERTY_KEY_APP_NAME:App 名称,可用于 `show connections` 查询结果显示。仅在使用 WebSocket 连接时生效。默认值为 java。
|
||||||
- TSDBDriver.PROPERTY_KEY_APP_IP: App IP,可用于 `show connections` 查询结果显示。仅在使用 WebSocket 连接时生效。默认值为空。
|
- TSDBDriver.PROPERTY_KEY_APP_IP:App IP,可用于 `show connections` 查询结果显示。仅在使用 WebSocket 连接时生效。默认值为空。
|
||||||
|
|
||||||
此外对 JDBC 原生连接,通过指定 URL 和 Properties 还可以指定其他参数,比如日志级别、SQL 长度等。
|
此外对 JDBC 原生连接,通过指定 URL 和 Properties 还可以指定其他参数,比如日志级别、SQL 长度等。
|
||||||
|
|
||||||
|
@ -1364,18 +1364,18 @@ JDBC 标准不支持数据订阅,因此本章所有接口都是扩展接口。
|
||||||
- **异常**:如果创建失败,抛出 SQLException 异常。
|
- **异常**:如果创建失败,抛出 SQLException 异常。
|
||||||
|
|
||||||
创建消费者支持属性列表:
|
创建消费者支持属性列表:
|
||||||
- td.connect.type: 连接方式。jni:表示使用动态库连接的方式,ws/WebSocket:表示使用 WebSocket 进行数据通信。默认为 jni 方式。
|
- td.connect.type:连接方式。jni:表示使用动态库连接的方式,ws/WebSocket:表示使用 WebSocket 进行数据通信。默认为 jni 方式。
|
||||||
- bootstrap.servers: TDengine 服务端所在的`ip:port`,如果使用 WebSocket 连接,则为 taosAdapter 所在的`ip:port`。
|
- bootstrap.servers:TDengine 服务端所在的`ip:port`,如果使用 WebSocket 连接,则为 taosAdapter 所在的`ip:port`。
|
||||||
- enable.auto.commit: 是否允许自动提交。
|
- enable.auto.commit:是否允许自动提交。
|
||||||
- group.id: consumer: 所在的 group。
|
- group.id:consumer:所在的 group。
|
||||||
- value.deserializer: 结果集反序列化方法,可以继承 `com.taosdata.jdbc.tmq.ReferenceDeserializer`,并指定结果集 bean,实现反序列化。也可以继承 `com.taosdata.jdbc.tmq.Deserializer`,根据 SQL 的 resultSet 自定义反序列化方式。
|
- value.deserializer:结果集反序列化方法,可以继承 `com.taosdata.jdbc.tmq.ReferenceDeserializer`,并指定结果集 bean,实现反序列化。也可以继承 `com.taosdata.jdbc.tmq.Deserializer`,根据 SQL 的 resultSet 自定义反序列化方式。
|
||||||
- httpConnectTimeout: 创建连接超时参数,单位 ms,默认为 5000 ms。仅在 WebSocket 连接下有效。
|
- httpConnectTimeout:创建连接超时参数,单位 ms,默认为 5000 ms。仅在 WebSocket 连接下有效。
|
||||||
- messageWaitTimeout: 数据传输超时参数,单位 ms,默认为 10000 ms。仅在 WebSocket 连接下有效。
|
- messageWaitTimeout:数据传输超时参数,单位 ms,默认为 10000 ms。仅在 WebSocket 连接下有效。
|
||||||
- httpPoolSize: 同一个连接下最大并行请求数。仅在 WebSocket 连接下有效。
|
- httpPoolSize:同一个连接下最大并行请求数。仅在 WebSocket 连接下有效。
|
||||||
- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION: 传输过程是否启用压缩。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。
|
- TSDBDriver.PROPERTY_KEY_ENABLE_COMPRESSION:传输过程是否启用压缩。仅在使用 WebSocket 连接时生效。true:启用,false:不启用。默认为 false。
|
||||||
- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT: 是否启用自动重连。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。
|
- TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT:是否启用自动重连。仅在使用 WebSocket 连接时生效。true:启用,false:不启用。默认为 false。
|
||||||
- TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS: 自动重连重试间隔,单位毫秒,默认值 2000。仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
- TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS:自动重连重试间隔,单位毫秒,默认值 2000。仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
||||||
- TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT: 自动重连重试次数,默认值 3,仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
- TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT:自动重连重试次数,默认值 3,仅在 PROPERTY_KEY_ENABLE_AUTO_RECONNECT 为 true 时生效。
|
||||||
|
|
||||||
其他参数请参考:[Consumer 参数列表](../../../develop/tmq/#创建参数), 注意TDengine服务端自 3.2.0.0 版本开始消息订阅中的 auto.offset.reset 默认值发生变化。
|
其他参数请参考:[Consumer 参数列表](../../../develop/tmq/#创建参数), 注意TDengine服务端自 3.2.0.0 版本开始消息订阅中的 auto.offset.reset 默认值发生变化。
|
||||||
|
|
||||||
|
|
|
@ -109,15 +109,15 @@ DSN 描述字符串基本结构如下:
|
||||||
|
|
||||||
各部分意义见下表:
|
各部分意义见下表:
|
||||||
|
|
||||||
- **driver**: 必须指定驱动名以便连接器选择何种方式创建连接,支持如下驱动名:
|
- **driver**:必须指定驱动名以便连接器选择何种方式创建连接,支持如下驱动名:
|
||||||
- **taos**: 使用 TDengine 连接器驱动,默认是使用 taos 驱动。
|
- **taos**:使用 TDengine 连接器驱动,默认是使用 taos 驱动。
|
||||||
- **tmq**: 使用 TMQ 订阅数据。
|
- **tmq**:使用 TMQ 订阅数据。
|
||||||
- **protocol**: 显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 WebSocket 方式建立连接。
|
- **protocol**:显示指定以何种方式建立连接,例如:`taos+ws://localhost:6041` 指定以 WebSocket 方式建立连接。
|
||||||
- **http/ws**: 使用 WebSocket 创建连接。
|
- **http/ws**:使用 WebSocket 创建连接。
|
||||||
- **https/wss**: 在 WebSocket 连接方式下显示启用 SSL/TLS 连接。
|
- **https/wss**:在 WebSocket 连接方式下显示启用 SSL/TLS 连接。
|
||||||
- **username/password**: 用于创建连接的用户名及密码。
|
- **username/password**:用于创建连接的用户名及密码。
|
||||||
- **host/port**: 指定创建连接的服务器及端口,当不指定服务器地址及端口时(`taos://`),原生连接默认为 `localhost:6030`,WebSocket 连接默认为 `localhost:6041` 。
|
- **host/port**:指定创建连接的服务器及端口,当不指定服务器地址及端口时(`taos://`),原生连接默认为 `localhost:6030`,WebSocket 连接默认为 `localhost:6041` 。
|
||||||
- **database**: 指定默认连接的数据库名,可选参数。
|
- **database**:指定默认连接的数据库名,可选参数。
|
||||||
- **params**:其他可选参数。
|
- **params**:其他可选参数。
|
||||||
|
|
||||||
一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 WebSocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。
|
一个完整的 DSN 描述字符串示例如下:`taos+ws://localhost:6041/test`, 表示使用 WebSocket(`ws`)方式通过 `6041` 端口连接服务器 `localhost`,并指定默认数据库为 `test`。
|
||||||
|
@ -596,6 +596,6 @@ Offset 结构体提供了获取当前消息所属的数据库,主题和分区
|
||||||
## 附录
|
## 附录
|
||||||
|
|
||||||
- Rust 连接器文档:https://docs.rs/taos
|
- Rust 连接器文档:https://docs.rs/taos
|
||||||
- Rust 连接器项目地址: https://github.com/taosdata/taos-connector-rust
|
- Rust 连接器项目地址:https://github.com/taosdata/taos-connector-rust
|
||||||
- deadpool 连接池: https://crates.io/crates/deadpool
|
- deadpool 连接池:https://crates.io/crates/deadpool
|
||||||
- r2d2 连接池: https://crates.io/crates/r2d2
|
- r2d2 连接池:https://crates.io/crates/r2d2
|
||||||
|
|
|
@ -168,24 +168,24 @@ TDengine 目前支持时间戳、数字、字符、布尔类型,与 Python 对
|
||||||
| protocol | | username | password | host | port | database | params |
|
| protocol | | username | password | host | port | database | params |
|
||||||
```
|
```
|
||||||
|
|
||||||
- **protocol**: 使用 websocket 协议建立连接。例如`ws://localhost:6041`
|
- **protocol**:使用 websocket 协议建立连接。例如`ws://localhost:6041`
|
||||||
- **username/password**: 数据库的用户名和密码。
|
- **username/password**:数据库的用户名和密码。
|
||||||
- **host/port**: 主机地址和端口号。例如`localhost:6041`
|
- **host/port**:主机地址和端口号。例如`localhost:6041`
|
||||||
- **database**: 数据库名称。
|
- **database**:数据库名称。
|
||||||
- **params**: 其他参数。 例如token。
|
- **params**:其他参数。 例如token。
|
||||||
|
|
||||||
#### 建立连接
|
#### 建立连接
|
||||||
|
|
||||||
- `fn connect(dsn: Option<&str>, args: Option<&PyDict>) -> PyResult<Connection>`
|
- `fn connect(dsn: Option<&str>, args: Option<&PyDict>) -> PyResult<Connection>`
|
||||||
- **接口说明**:建立 taosAdapter 连接。
|
- **接口说明**:建立 taosAdapter 连接。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `dsn`: 类型 `Option<&str>` 可选,数据源名称(DSN),用于指定要连接的数据库的位置和认证信息。
|
- `dsn`:类型 `Option<&str>` 可选,数据源名称(DSN),用于指定要连接的数据库的位置和认证信息。
|
||||||
- `args`: 类型 `Option<&PyDict>` 可选,以 Python 字典的形式提供, 可用于设置
|
- `args`:类型 `Option<&PyDict>` 可选,以 Python 字典的形式提供, 可用于设置
|
||||||
- `user`: 数据库的用户名
|
- `user`:数据库的用户名
|
||||||
- `password`: 数据库的密码。
|
- `password`:数据库的密码。
|
||||||
- `host`: 主机地址
|
- `host`:主机地址
|
||||||
- `port`: 端口号
|
- `port`:端口号
|
||||||
- `database`: 数据库名称
|
- `database`:数据库名称
|
||||||
- **返回值**:连接对象。
|
- **返回值**:连接对象。
|
||||||
- **异常**:操作失败抛出 `ConnectionError` 异常。
|
- **异常**:操作失败抛出 `ConnectionError` 异常。
|
||||||
- `fn cursor(&self) -> PyResult<Cursor>`
|
- `fn cursor(&self) -> PyResult<Cursor>`
|
||||||
|
@ -205,7 +205,7 @@ TDengine 目前支持时间戳、数字、字符、布尔类型,与 Python 对
|
||||||
- **接口说明**:执行带有 req_id 的 sql 语句。
|
- **接口说明**:执行带有 req_id 的 sql 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`:待执行的 sql 语句。
|
- `sql`:待执行的 sql 语句。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **返回值**:影响的条数。
|
- **返回值**:影响的条数。
|
||||||
- **异常**:操作失败抛出 `QueryError` 异常。
|
- **异常**:操作失败抛出 `QueryError` 异常。
|
||||||
- `fn query(&self, sql: &str) -> PyResult<TaosResult>`
|
- `fn query(&self, sql: &str) -> PyResult<TaosResult>`
|
||||||
|
@ -218,7 +218,7 @@ TDengine 目前支持时间戳、数字、字符、布尔类型,与 Python 对
|
||||||
- **接口说明**:查询带有 req_id 的 sql 语句。
|
- **接口说明**:查询带有 req_id 的 sql 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`:待执行的 sql 语句。
|
- `sql`:待执行的 sql 语句。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **返回值**:`TaosResult` 数据集对象。
|
- **返回值**:`TaosResult` 数据集对象。
|
||||||
- **异常**:操作失败抛出 `QueryError` 异常。
|
- **异常**:操作失败抛出 `QueryError` 异常。
|
||||||
|
|
||||||
|
@ -238,11 +238,11 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- **接口说明**:无模式写入。
|
- **接口说明**:无模式写入。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `lines`:待写入的数据数组,无模式具体的数据格式可参考 `Schemaless 写入`。
|
- `lines`:待写入的数据数组,无模式具体的数据格式可参考 `Schemaless 写入`。
|
||||||
- `protocol`: 协议类型
|
- `protocol`:协议类型
|
||||||
- `PySchemalessProtocol::Line`:InfluxDB 行协议(Line Protocol)。
|
- `PySchemalessProtocol::Line`:InfluxDB 行协议(Line Protocol)。
|
||||||
- `PySchemalessProtocol::Telnet`:OpenTSDB 文本行协议。
|
- `PySchemalessProtocol::Telnet`:OpenTSDB 文本行协议。
|
||||||
- `PySchemalessProtocol::Json`:JSON 协议格式
|
- `PySchemalessProtocol::Json`:JSON 协议格式
|
||||||
- `precision`: 时间精度
|
- `precision`:时间精度
|
||||||
- `PySchemalessPrecision::Hour`:小时
|
- `PySchemalessPrecision::Hour`:小时
|
||||||
- `PySchemalessPrecision::Minute`:分钟
|
- `PySchemalessPrecision::Minute`:分钟
|
||||||
- `PySchemalessPrecision::Second` 秒
|
- `PySchemalessPrecision::Second` 秒
|
||||||
|
@ -250,7 +250,7 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `PySchemalessPrecision::Microsecond`:微秒
|
- `PySchemalessPrecision::Microsecond`:微秒
|
||||||
- `PySchemalessPrecision::Nanosecond`:纳秒
|
- `PySchemalessPrecision::Nanosecond`:纳秒
|
||||||
- `ttl`:表过期时间,单位天。
|
- `ttl`:表过期时间,单位天。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **异常**:操作失败抛出 `DataError` 或 `OperationalError` 异常。
|
- **异常**:操作失败抛出 `DataError` 或 `OperationalError` 异常。
|
||||||
|
|
||||||
#### 参数绑定
|
#### 参数绑定
|
||||||
|
@ -261,22 +261,22 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `fn prepare(&mut self, sql: &str) -> PyResult<()>`
|
- `fn prepare(&mut self, sql: &str) -> PyResult<()>`
|
||||||
- **接口说明**:绑定预编译 sql 语句。
|
- **接口说明**:绑定预编译 sql 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`: 预编译的 SQL 语句。
|
- `sql`:预编译的 SQL 语句。
|
||||||
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
||||||
- `fn set_tbname(&mut self, table_name: &str) -> PyResult<()>`
|
- `fn set_tbname(&mut self, table_name: &str) -> PyResult<()>`
|
||||||
- **接口说明**:设置将要写入数据的表名。
|
- **接口说明**:设置将要写入数据的表名。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `tableName`: 表名,如果需要指定数据库, 例如: `db_name.table_name` 即可。
|
- `tableName`:表名,如果需要指定数据库, 例如:`db_name.table_name` 即可。
|
||||||
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
||||||
- `fn set_tags(&mut self, tags: Vec<PyTagView>) -> PyResult<()>`
|
- `fn set_tags(&mut self, tags: Vec<PyTagView>) -> PyResult<()>`
|
||||||
- **接口说明**:设置表 Tags 数据, 用于自动建表。
|
- **接口说明**:设置表 Tags 数据, 用于自动建表。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `paramsArray`: Tags 数据。
|
- `paramsArray`:Tags 数据。
|
||||||
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
||||||
- `fn bind_param(&mut self, params: Vec<PyColumnView>) -> PyResult<()>`
|
- `fn bind_param(&mut self, params: Vec<PyColumnView>) -> PyResult<()>`
|
||||||
- **接口说明**:绑定数据。
|
- **接口说明**:绑定数据。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `paramsArray`: 绑定数据。
|
- `paramsArray`:绑定数据。
|
||||||
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
||||||
- `fn add_batch(&mut self) -> PyResult<()>`
|
- `fn add_batch(&mut self) -> PyResult<()>`
|
||||||
- **接口说明**:提交绑定数据。
|
- **接口说明**:提交绑定数据。
|
||||||
|
@ -298,8 +298,8 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- port:端口号。
|
- port:端口号。
|
||||||
- group.id:所在的 group。
|
- group.id:所在的 group。
|
||||||
- client.id:客户端id。
|
- client.id:客户端id。
|
||||||
- td.connect.user: 数据库用户名。
|
- td.connect.user:数据库用户名。
|
||||||
- td.connect.pass: 数据库密码。
|
- td.connect.pass:数据库密码。
|
||||||
- td.connect.token:数据库的连接token。
|
- td.connect.token:数据库的连接token。
|
||||||
- auto.offset.reset:来确定消费位置为最新数据(latest)还是包含旧数据(earliest)。
|
- auto.offset.reset:来确定消费位置为最新数据(latest)还是包含旧数据(earliest)。
|
||||||
- enable.auto.commit:是否允许自动提交。
|
- enable.auto.commit:是否允许自动提交。
|
||||||
|
@ -307,14 +307,14 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
|
|
||||||
- `fn Consumer(conf: Option<&PyDict>, dsn: Option<&str>) -> PyResult<Self>`
|
- `fn Consumer(conf: Option<&PyDict>, dsn: Option<&str>) -> PyResult<Self>`
|
||||||
- **接口说明** 消费者构造函数。
|
- **接口说明** 消费者构造函数。
|
||||||
- `conf`: 类型 `Option<&PyDict>` 可选,以 Python 字典的形式提供, 具体配置参见属性列表。
|
- `conf`:类型 `Option<&PyDict>` 可选,以 Python 字典的形式提供, 具体配置参见属性列表。
|
||||||
- `dsn`: 类型 `Option<&str>` 可选,数据源名称(DSN),用于指定要连接的数据库的位置和认证信息。
|
- `dsn`:类型 `Option<&str>` 可选,数据源名称(DSN),用于指定要连接的数据库的位置和认证信息。
|
||||||
- **返回值**:Consumer 消费者对象。
|
- **返回值**:Consumer 消费者对象。
|
||||||
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
||||||
- `fn subscribe(&mut self, topics: &PyList) -> PyResult<()>`
|
- `fn subscribe(&mut self, topics: &PyList) -> PyResult<()>`
|
||||||
- **接口说明** 订阅一组主题。
|
- **接口说明** 订阅一组主题。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `topics`: 订阅的主题列表。
|
- `topics`:订阅的主题列表。
|
||||||
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
||||||
- `fn unsubscribe(&mut self)`
|
- `fn unsubscribe(&mut self)`
|
||||||
- **接口说明** 取消订阅。
|
- **接口说明** 取消订阅。
|
||||||
|
@ -322,13 +322,13 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `fn poll(&mut self, timeout: Option<f64>) -> PyResult<Option<Message>>`
|
- `fn poll(&mut self, timeout: Option<f64>) -> PyResult<Option<Message>>`
|
||||||
- **接口说明** 轮询消息。
|
- **接口说明** 轮询消息。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `timeoutMs`: 表示轮询的超时时间,单位毫秒。
|
- `timeoutMs`:表示轮询的超时时间,单位毫秒。
|
||||||
- **返回值**:`Message` 每个主题对应的数据。
|
- **返回值**:`Message` 每个主题对应的数据。
|
||||||
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
||||||
- `fn commit(&mut self, message: &mut Message) -> PyResult<()>`
|
- `fn commit(&mut self, message: &mut Message) -> PyResult<()>`
|
||||||
- **接口说明** 提交当前处理的消息的偏移量。
|
- **接口说明** 提交当前处理的消息的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `message`: 类型 `Message`, 当前处理的消息的偏移量。
|
- `message`:类型 `Message`, 当前处理的消息的偏移量。
|
||||||
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
- **异常**:操作失败抛出 `ConsumerException` 异常。
|
||||||
- `fn assignment(&mut self) -> PyResult<Option<Vec<TopicAssignment>>>`
|
- `fn assignment(&mut self) -> PyResult<Option<Vec<TopicAssignment>>>`
|
||||||
- **接口说明**:获取消费者当前分配的指定的分区或所有分区。
|
- **接口说明**:获取消费者当前分配的指定的分区或所有分区。
|
||||||
|
@ -337,22 +337,22 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `fn seek(&mut self, topic: &str, vg_id: i32, offset: i64) -> PyResult<()>`
|
- `fn seek(&mut self, topic: &str, vg_id: i32, offset: i64) -> PyResult<()>`
|
||||||
- **接口说明**:将给定分区的偏移量设置到指定的位置。
|
- **接口说明**:将给定分区的偏移量设置到指定的位置。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `topic`: 订阅的主题。
|
- `topic`:订阅的主题。
|
||||||
- `vg_id`: vgroupid。
|
- `vg_id`:vgroupid。
|
||||||
- `offset`:需要设置的偏移量。
|
- `offset`:需要设置的偏移量。
|
||||||
- **异常**:操作失败抛出 ConsumerException 异常。
|
- **异常**:操作失败抛出 ConsumerException 异常。
|
||||||
- `fn committed(&mut self, topic: &str, vg_id: i32) -> PyResult<i64>`
|
- `fn committed(&mut self, topic: &str, vg_id: i32) -> PyResult<i64>`
|
||||||
- **接口说明**:获取订阅主题的vgroupid分区最后提交的偏移量。
|
- **接口说明**:获取订阅主题的vgroupid分区最后提交的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `topic`: 订阅的主题。
|
- `topic`:订阅的主题。
|
||||||
- `vg_id`: vgroupid。
|
- `vg_id`:vgroupid。
|
||||||
- **返回值**:`i64`,分区最后提交的偏移量。
|
- **返回值**:`i64`,分区最后提交的偏移量。
|
||||||
- **异常**:操作失败抛出 ConsumerException 异常。
|
- **异常**:操作失败抛出 ConsumerException 异常。
|
||||||
- `fn position(&mut self, topic: &str, vg_id: i32) -> PyResult<i64>`
|
- `fn position(&mut self, topic: &str, vg_id: i32) -> PyResult<i64>`
|
||||||
- **接口说明**:获取给定分区当前的偏移量。
|
- **接口说明**:获取给定分区当前的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `topic`: 订阅的主题。
|
- `topic`:订阅的主题。
|
||||||
- `vg_id`: vgroupid。
|
- `vg_id`:vgroupid。
|
||||||
- **返回值**:`i64`,分区最后提交的偏移量。
|
- **返回值**:`i64`,分区最后提交的偏移量。
|
||||||
- **异常**:操作失败抛出 ConsumerException 异常。
|
- **异常**:操作失败抛出 ConsumerException 异常。
|
||||||
- `fn close(&mut self)`
|
- `fn close(&mut self)`
|
||||||
|
@ -366,13 +366,13 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `def connect(*args, **kwargs):`
|
- `def connect(*args, **kwargs):`
|
||||||
- **接口说明**:建立 taosAdapter 连接。
|
- **接口说明**:建立 taosAdapter 连接。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `kwargs`: 以 Python 字典的形式提供, 可用于设置
|
- `kwargs`:以 Python 字典的形式提供, 可用于设置
|
||||||
- `user`: 数据库的用户名
|
- `user`:数据库的用户名
|
||||||
- `password`: 数据库的密码。
|
- `password`:数据库的密码。
|
||||||
- `host`: 主机地址
|
- `host`:主机地址
|
||||||
- `port`: 端口号
|
- `port`:端口号
|
||||||
- `database`: 数据库名称
|
- `database`:数据库名称
|
||||||
- `timezone`: 时区
|
- `timezone`:时区
|
||||||
- **返回值**:`TaosConnection` 连接对象。
|
- **返回值**:`TaosConnection` 连接对象。
|
||||||
- **异常**:操作失败抛出 `AttributeError` 或 `ConnectionError` 异常。
|
- **异常**:操作失败抛出 `AttributeError` 或 `ConnectionError` 异常。
|
||||||
- `def cursor(self)`
|
- `def cursor(self)`
|
||||||
|
@ -385,14 +385,14 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- **接口说明**:执行 sql 语句。
|
- **接口说明**:执行 sql 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `operation`:待执行的 sql 语句。
|
- `operation`:待执行的 sql 语句。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **返回值**:影响的条数。
|
- **返回值**:影响的条数。
|
||||||
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
||||||
- `def query(self, sql: str, req_id: Optional[int] = None) -> TaosResult`
|
- `def query(self, sql: str, req_id: Optional[int] = None) -> TaosResult`
|
||||||
- **接口说明**:查询数据。
|
- **接口说明**:查询数据。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`:待执行的 sql 语句。
|
- `sql`:待执行的 sql 语句。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **返回值**:`TaosResult` 数据集对象。
|
- **返回值**:`TaosResult` 数据集对象。
|
||||||
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
- **异常**:操作失败抛出 `ProgrammingError` 异常。
|
||||||
|
|
||||||
|
@ -415,11 +415,11 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- **接口说明**:无模式写入。
|
- **接口说明**:无模式写入。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `lines`:待写入的数据数组,无模式具体的数据格式可参考 `Schemaless 写入`。
|
- `lines`:待写入的数据数组,无模式具体的数据格式可参考 `Schemaless 写入`。
|
||||||
- `protocol`: 协议类型
|
- `protocol`:协议类型
|
||||||
- `SmlProtocol.LINE_PROTOCOL`:InfluxDB 行协议(Line Protocol)。
|
- `SmlProtocol.LINE_PROTOCOL`:InfluxDB 行协议(Line Protocol)。
|
||||||
- `SmlProtocol.TELNET_PROTOCOL`:OpenTSDB 文本行协议。
|
- `SmlProtocol.TELNET_PROTOCOL`:OpenTSDB 文本行协议。
|
||||||
- `SmlProtocol.JSON_PROTOCOL`:JSON 协议格式
|
- `SmlProtocol.JSON_PROTOCOL`:JSON 协议格式
|
||||||
- `precision`: 时间精度
|
- `precision`:时间精度
|
||||||
- `SmlPrecision.Hour`:小时
|
- `SmlPrecision.Hour`:小时
|
||||||
- `SmlPrecision.Minute`:分钟
|
- `SmlPrecision.Minute`:分钟
|
||||||
- `SmlPrecision.Second` 秒
|
- `SmlPrecision.Second` 秒
|
||||||
|
@ -427,7 +427,7 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `SmlPrecision.Microsecond`:微秒
|
- `SmlPrecision.Microsecond`:微秒
|
||||||
- `SmlPrecision.Nanosecond`:纳秒
|
- `SmlPrecision.Nanosecond`:纳秒
|
||||||
- `ttl`:表过期时间,单位天。
|
- `ttl`:表过期时间,单位天。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **返回值**:影响的条数。
|
- **返回值**:影响的条数。
|
||||||
- **异常**:操作失败抛出 `SchemalessError` 异常。
|
- **异常**:操作失败抛出 `SchemalessError` 异常。
|
||||||
|
|
||||||
|
@ -435,26 +435,26 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `def statement2(self, sql=None, option=None)`
|
- `def statement2(self, sql=None, option=None)`
|
||||||
- **接口说明**:使用连接对象创建 stmt2 对象
|
- **接口说明**:使用连接对象创建 stmt2 对象
|
||||||
- **参数说明**
|
- **参数说明**
|
||||||
- `sql`: 绑定的 SQL 语句,如果不为空会调用`prepare`函数
|
- `sql`:绑定的 SQL 语句,如果不为空会调用`prepare`函数
|
||||||
- `option` 传入 TaosStmt2Option 类实例选项
|
- `option` 传入 TaosStmt2Option 类实例选项
|
||||||
- **返回值**:stmt2 对象。
|
- **返回值**:stmt2 对象。
|
||||||
- **异常**:操作失败抛出 `ConnectionError` 异常。
|
- **异常**:操作失败抛出 `ConnectionError` 异常。
|
||||||
- `def prepare(self, sql)`
|
- `def prepare(self, sql)`
|
||||||
- **接口说明**:绑定预编译 sql 语句
|
- **接口说明**:绑定预编译 sql 语句
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`: 绑定的 SQL 语句
|
- `sql`:绑定的 SQL 语句
|
||||||
- **异常**:操作失败抛出 `StatementError` 异常。
|
- **异常**:操作失败抛出 `StatementError` 异常。
|
||||||
- `def bind_param(self, tbnames, tags, datas)`
|
- `def bind_param(self, tbnames, tags, datas)`
|
||||||
- **接口说明**:以独立数组方式绑定数据
|
- **接口说明**:以独立数组方式绑定数据
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `tbnames`: 绑定表名数组,数据类型为 list
|
- `tbnames`:绑定表名数组,数据类型为 list
|
||||||
- `tags`: 绑定 tag 列值数组,数据类型为 list
|
- `tags`:绑定 tag 列值数组,数据类型为 list
|
||||||
- `tags`: 绑定普通列值数组,数据类型为 list
|
- `tags`:绑定普通列值数组,数据类型为 list
|
||||||
- **异常**:操作失败抛出 `StatementError` 异常
|
- **异常**:操作失败抛出 `StatementError` 异常
|
||||||
- `def bind_param_with_tables(self, tables)`
|
- `def bind_param_with_tables(self, tables)`
|
||||||
- **接口说明**:以独立表方式绑定数据,独立表是以表为组织单位,每张表中有表名,TAG 值及普通列数值属性
|
- **接口说明**:以独立表方式绑定数据,独立表是以表为组织单位,每张表中有表名,TAG 值及普通列数值属性
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `tables`: `BindTable` 独立表对象数组
|
- `tables`:`BindTable` 独立表对象数组
|
||||||
- **异常**:操作失败抛出 `StatementError` 异常。
|
- **异常**:操作失败抛出 `StatementError` 异常。
|
||||||
- `def execute(self) -> int:`
|
- `def execute(self) -> int:`
|
||||||
- **接口说明**:执行将绑定数据全部写入
|
- **接口说明**:执行将绑定数据全部写入
|
||||||
|
@ -473,21 +473,21 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- td.connect.port:端口号。
|
- td.connect.port:端口号。
|
||||||
- group.id:所在的 group。
|
- group.id:所在的 group。
|
||||||
- client.id:客户端id。
|
- client.id:客户端id。
|
||||||
- td.connect.user: 数据库用户名。
|
- td.connect.user:数据库用户名。
|
||||||
- td.connect.pass: 数据库密码。
|
- td.connect.pass:数据库密码。
|
||||||
- td.connect.token:数据库的连接token。
|
- td.connect.token:数据库的连接token。
|
||||||
- auto.offset.reset:来确定消费位置为最新数据(latest)还是包含旧数据(earliest)。
|
- auto.offset.reset:来确定消费位置为最新数据(latest)还是包含旧数据(earliest)。
|
||||||
- enable.auto.commit:是否允许自动提交。
|
- enable.auto.commit:是否允许自动提交。
|
||||||
- auto.commit.interval.ms:自动提交间隔
|
- auto.commit.interval.ms:自动提交间隔
|
||||||
- `def Consumer(configs)`
|
- `def Consumer(configs)`
|
||||||
- **接口说明** 消费者构造函数。
|
- **接口说明** 消费者构造函数。
|
||||||
- `configs`: Python 字典的形式提供, 具体配置参见属性列表。
|
- `configs`:Python 字典的形式提供, 具体配置参见属性列表。
|
||||||
- **返回值**:Consumer 消费者对象。
|
- **返回值**:Consumer 消费者对象。
|
||||||
- **异常**:操作失败抛出 `TmqError` 异常。
|
- **异常**:操作失败抛出 `TmqError` 异常。
|
||||||
- `def subscribe(self, topics)`
|
- `def subscribe(self, topics)`
|
||||||
- **接口说明** 订阅一组主题。
|
- **接口说明** 订阅一组主题。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `topics`: 订阅的主题列表。
|
- `topics`:订阅的主题列表。
|
||||||
- **异常**:操作失败抛出 `TmqError` 异常。
|
- **异常**:操作失败抛出 `TmqError` 异常。
|
||||||
- `def unsubscribe(self)`
|
- `def unsubscribe(self)`
|
||||||
- **接口说明** 取消订阅。
|
- **接口说明** 取消订阅。
|
||||||
|
@ -495,14 +495,14 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `def poll(self, timeout: float = 1.0)`
|
- `def poll(self, timeout: float = 1.0)`
|
||||||
- **接口说明** 轮询消息。
|
- **接口说明** 轮询消息。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `timeout`: 表示轮询的超时时间,单位毫秒。
|
- `timeout`:表示轮询的超时时间,单位毫秒。
|
||||||
- **返回值**:`Message` 每个主题对应的数据。
|
- **返回值**:`Message` 每个主题对应的数据。
|
||||||
- **异常**:操作失败抛出 `TmqError` 异常。
|
- **异常**:操作失败抛出 `TmqError` 异常。
|
||||||
- `def commit(self, message: Message = None, offsets: [TopicPartition] = None)`
|
- `def commit(self, message: Message = None, offsets: [TopicPartition] = None)`
|
||||||
- **接口说明** 提交当前处理的消息的偏移量。
|
- **接口说明** 提交当前处理的消息的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `message`: 类型 `Message`, 当前处理的消息的偏移量。
|
- `message`:类型 `Message`, 当前处理的消息的偏移量。
|
||||||
- `offsets`: 类型 `[TopicPartition]`, 提交一批消息的偏移量。
|
- `offsets`:类型 `[TopicPartition]`, 提交一批消息的偏移量。
|
||||||
- **异常**:操作失败抛出 `TmqError` 异常。
|
- **异常**:操作失败抛出 `TmqError` 异常。
|
||||||
- `def assignment(self)`
|
- `def assignment(self)`
|
||||||
- **接口说明**:获取消费者当前分配的指定的分区或所有分区。
|
- **接口说明**:获取消费者当前分配的指定的分区或所有分区。
|
||||||
|
@ -511,25 +511,25 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `def seek(self, partition)`
|
- `def seek(self, partition)`
|
||||||
- **接口说明**:将给定分区的偏移量设置到指定的位置。
|
- **接口说明**:将给定分区的偏移量设置到指定的位置。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `partition`: 需要设置的偏移量。
|
- `partition`:需要设置的偏移量。
|
||||||
- `topic`: 订阅的主题
|
- `topic`:订阅的主题
|
||||||
- `partition`: 分区
|
- `partition`:分区
|
||||||
- `offset`: 偏移量
|
- `offset`:偏移量
|
||||||
- **异常**:操作失败抛出 `TmqError` 异常。
|
- **异常**:操作失败抛出 `TmqError` 异常。
|
||||||
- `def committed(self, partitions)`
|
- `def committed(self, partitions)`
|
||||||
- **接口说明**:获取订阅主题的分区最后提交的偏移量。
|
- **接口说明**:获取订阅主题的分区最后提交的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `partition`: 需要设置的偏移量。
|
- `partition`:需要设置的偏移量。
|
||||||
- `topic`: 订阅的主题
|
- `topic`:订阅的主题
|
||||||
- `partition`: 分区
|
- `partition`:分区
|
||||||
- **返回值**:`partition`,分区最后提交的偏移量。
|
- **返回值**:`partition`,分区最后提交的偏移量。
|
||||||
- **异常**:操作失败抛出 `TmqError` 异常。
|
- **异常**:操作失败抛出 `TmqError` 异常。
|
||||||
- `def position(self, partitions)`
|
- `def position(self, partitions)`
|
||||||
- **接口说明**:获取给定分区当前的偏移量。
|
- **接口说明**:获取给定分区当前的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `partition`: 需要设置的偏移量。
|
- `partition`:需要设置的偏移量。
|
||||||
- `topic`: 订阅的主题
|
- `topic`:订阅的主题
|
||||||
- `partition`: 分区
|
- `partition`:分区
|
||||||
- **返回值**:`partition`,分区最后提交的偏移量。
|
- **返回值**:`partition`,分区最后提交的偏移量。
|
||||||
- **异常**:操作失败抛出 TmqError 异常。
|
- **异常**:操作失败抛出 TmqError 异常。
|
||||||
- `def close(self)`
|
- `def close(self)`
|
||||||
|
@ -541,39 +541,39 @@ TaosResult 对象可以通过循环遍历获取查询到的数据。
|
||||||
- `def connect(**kwargs) -> TaosRestConnection`
|
- `def connect(**kwargs) -> TaosRestConnection`
|
||||||
- **接口说明**:建立 taosAdapter 连接。
|
- **接口说明**:建立 taosAdapter 连接。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `kwargs`: 以 Python 字典的形式提供, 可用于设置
|
- `kwargs`:以 Python 字典的形式提供, 可用于设置
|
||||||
- `user`: 数据库的用户名
|
- `user`:数据库的用户名
|
||||||
- `password`: 数据库的密码。
|
- `password`:数据库的密码。
|
||||||
- `host`: 主机地址
|
- `host`:主机地址
|
||||||
- `port`: 端口号
|
- `port`:端口号
|
||||||
- `database`: 数据库名称
|
- `database`:数据库名称
|
||||||
- **返回值**:连接对象。
|
- **返回值**:连接对象。
|
||||||
- **异常**:操作失败抛出 `ConnectError` 异常。
|
- **异常**:操作失败抛出 `ConnectError` 异常。
|
||||||
- `def execute(self, sql: str, req_id: Optional[int] = None) -> Optional[int]`
|
- `def execute(self, sql: str, req_id: Optional[int] = None) -> Optional[int]`
|
||||||
- **接口说明**:执行 sql 语句。
|
- **接口说明**:执行 sql 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`:待执行的 sql 语句。
|
- `sql`:待执行的 sql 语句。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **返回值**:影响的条数。
|
- **返回值**:影响的条数。
|
||||||
- **异常**:操作失败抛出 `ConnectError` 或 `HTTPError` 异常。
|
- **异常**:操作失败抛出 `ConnectError` 或 `HTTPError` 异常。
|
||||||
- `def query(self, sql: str, req_id: Optional[int] = None) -> Result`
|
- `def query(self, sql: str, req_id: Optional[int] = None) -> Result`
|
||||||
- **接口说明**:查询数据。
|
- **接口说明**:查询数据。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`:待执行的 sql 语句。
|
- `sql`:待执行的 sql 语句。
|
||||||
- `reqId`: 用于问题追踪。
|
- `reqId`:用于问题追踪。
|
||||||
- **返回值**:`Result` 数据集对象。
|
- **返回值**:`Result` 数据集对象。
|
||||||
- **异常**:操作失败抛出 `ConnectError` 或 `HTTPError` 异常。
|
- **异常**:操作失败抛出 `ConnectError` 或 `HTTPError` 异常。
|
||||||
- `RestClient(self, url: str, token: str = None, database: str = None, user: str = "root", password: str = "taosdata", timeout: int = None, convert_timestamp: bool = True, timezone: Union[str, datetime.tzinfo] = None)`
|
- `RestClient(self, url: str, token: str = None, database: str = None, user: str = "root", password: str = "taosdata", timeout: int = None, convert_timestamp: bool = True, timezone: Union[str, datetime.tzinfo] = None)`
|
||||||
- **接口说明**:建立 taosAdapter 连接 client。
|
- **接口说明**:建立 taosAdapter 连接 client。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `url`: taosAdapter REST 服务的 URL。
|
- `url`:taosAdapter REST 服务的 URL。
|
||||||
- `user`: 数据库的用户名。
|
- `user`:数据库的用户名。
|
||||||
- `password`: 数据库的密码。
|
- `password`:数据库的密码。
|
||||||
- `database`: 数据库名称。
|
- `database`:数据库名称。
|
||||||
- `timezone`: 时区。
|
- `timezone`:时区。
|
||||||
- `timeout`: HTTP 请求超时时间。单位为秒。
|
- `timeout`:HTTP 请求超时时间。单位为秒。
|
||||||
- `convert_timestamp`: 是否将时间戳从STR类型转换为datetime类型。
|
- `convert_timestamp`:是否将时间戳从STR类型转换为datetime类型。
|
||||||
- `timezone`: 时区.
|
- `timezone`:时区.
|
||||||
- **返回值**:连接对象。
|
- **返回值**:连接对象。
|
||||||
- **异常**:操作失败抛出 `ConnectError` 异常。
|
- **异常**:操作失败抛出 `ConnectError` 异常。
|
||||||
- `def sql(self, q: str, req_id: Optional[int] = None) -> dict`
|
- `def sql(self, q: str, req_id: Optional[int] = None) -> dict`
|
||||||
|
|
|
@ -116,11 +116,11 @@ Node.js 连接器(`@tdengine/websocket`), 其通过 taosAdapter 提供的 We
|
||||||
| protocol | | username | password | host | port | database | params |
|
| protocol | | username | password | host | port | database | params |
|
||||||
```
|
```
|
||||||
|
|
||||||
- **protocol**: 使用 websocket 协议建立连接。例如`ws://localhost:6041`
|
- **protocol**:使用 websocket 协议建立连接。例如`ws://localhost:6041`
|
||||||
- **username/password**: 数据库的用户名和密码。
|
- **username/password**:数据库的用户名和密码。
|
||||||
- **host/port**: 主机地址和端口号。例如`localhost:6041`
|
- **host/port**:主机地址和端口号。例如`localhost:6041`
|
||||||
- **database**: 数据库名称。
|
- **database**:数据库名称。
|
||||||
- **params**: 其他参数。 例如token。
|
- **params**:其他参数。 例如token。
|
||||||
|
|
||||||
- 完整 URL 示例:
|
- 完整 URL 示例:
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ WSConfig 中的配置如下:
|
||||||
- **接口说明**:执行 sql 语句。
|
- **接口说明**:执行 sql 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`:待执行的 sql 语句。
|
- `sql`:待执行的 sql 语句。
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:执行结果
|
- **返回值**:执行结果
|
||||||
```js
|
```js
|
||||||
TaosResult {
|
TaosResult {
|
||||||
|
@ -194,7 +194,7 @@ WSConfig 中的配置如下:
|
||||||
- **接口说明**:查询数据。
|
- **接口说明**:查询数据。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`:待执行的查询 sql 语句。
|
- `sql`:待执行的查询 sql 语句。
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:WSRows 数据集对象。
|
- **返回值**:WSRows 数据集对象。
|
||||||
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
||||||
|
|
||||||
|
@ -225,11 +225,11 @@ WSConfig 中的配置如下:
|
||||||
- **接口说明**:无模式写入。
|
- **接口说明**:无模式写入。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `lines`:待写入的数据数组,无模式具体的数据格式可参考 `Schemaless 写入`。
|
- `lines`:待写入的数据数组,无模式具体的数据格式可参考 `Schemaless 写入`。
|
||||||
- `protocol`: 协议类型
|
- `protocol`:协议类型
|
||||||
- `SchemalessProto.InfluxDBLineProtocol`:InfluxDB 行协议(Line Protocol)。
|
- `SchemalessProto.InfluxDBLineProtocol`:InfluxDB 行协议(Line Protocol)。
|
||||||
- `SchemalessProto.OpenTSDBTelnetLineProtocol`:OpenTSDB 文本行协议。
|
- `SchemalessProto.OpenTSDBTelnetLineProtocol`:OpenTSDB 文本行协议。
|
||||||
- `SchemalessProto.OpenTSDBJsonFormatProtocol`:JSON 协议格式。
|
- `SchemalessProto.OpenTSDBJsonFormatProtocol`:JSON 协议格式。
|
||||||
- `precision`: 时间精度
|
- `precision`:时间精度
|
||||||
- `Precision.HOURS`:小时
|
- `Precision.HOURS`:小时
|
||||||
- `Precision.MINUTES`:分钟
|
- `Precision.MINUTES`:分钟
|
||||||
- `Precision.SECONDS`:秒
|
- `Precision.SECONDS`:秒
|
||||||
|
@ -237,31 +237,31 @@ WSConfig 中的配置如下:
|
||||||
- `Precision.MICRO_SECONDS`:微秒
|
- `Precision.MICRO_SECONDS`:微秒
|
||||||
- `Precision.NANO_SECONDS`:纳秒
|
- `Precision.NANO_SECONDS`:纳秒
|
||||||
- `ttl`:表过期时间,单位天。
|
- `ttl`:表过期时间,单位天。
|
||||||
- `reqId`: 用于问题追踪,可选。
|
- `reqId`:用于问题追踪,可选。
|
||||||
- **异常**:连接失败抛出 `TaosResultError` 异常。
|
- **异常**:连接失败抛出 `TaosResultError` 异常。
|
||||||
|
|
||||||
### 参数绑定
|
### 参数绑定
|
||||||
- `async stmtInit(reqId?:number): Promise<WsStmt>`
|
- `async stmtInit(reqId?:number): Promise<WsStmt>`
|
||||||
- **接口说明** 使用 WsSql 对象创建 stmt 对象。
|
- **接口说明** 使用 WsSql 对象创建 stmt 对象。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:stmt 对象。
|
- **返回值**:stmt 对象。
|
||||||
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async prepare(sql: string): Promise<void>`
|
- `async prepare(sql: string): Promise<void>`
|
||||||
- **接口说明** 绑定预编译 sql 语句。
|
- **接口说明** 绑定预编译 sql 语句。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `sql`: 预编译的 SQL 语句。
|
- `sql`:预编译的 SQL 语句。
|
||||||
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async setTableName(tableName: string): Promise<void>`
|
- `async setTableName(tableName: string): Promise<void>`
|
||||||
- **接口说明** 设置将要写入数据的表名。
|
- **接口说明** 设置将要写入数据的表名。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `tableName`: 表名,如果需要指定数据库, 例如: `db_name.table_name` 即可。
|
- `tableName`:表名,如果需要指定数据库, 例如:`db_name.table_name` 即可。
|
||||||
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
||||||
通过 StmtBindParams 对象设置绑定数据。
|
通过 StmtBindParams 对象设置绑定数据。
|
||||||
- `setBoolean(params :any[])`
|
- `setBoolean(params :any[])`
|
||||||
- **接口说明** 设置布尔值。
|
- **接口说明** 设置布尔值。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `params`: 布尔类型列表。
|
- `params`:布尔类型列表。
|
||||||
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- 下面接口除了要设置的值类型不同外,其余同 setBoolean:
|
- 下面接口除了要设置的值类型不同外,其余同 setBoolean:
|
||||||
- `setTinyInt(params :any[])`
|
- `setTinyInt(params :any[])`
|
||||||
|
@ -284,12 +284,12 @@ WSConfig 中的配置如下:
|
||||||
- `async setTags(paramsArray:StmtBindParams): Promise<void>`
|
- `async setTags(paramsArray:StmtBindParams): Promise<void>`
|
||||||
- **接口说明** 设置表 Tags 数据,用于自动建表。
|
- **接口说明** 设置表 Tags 数据,用于自动建表。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `paramsArray`: Tags 数据。
|
- `paramsArray`:Tags 数据。
|
||||||
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async bind(paramsArray:StmtBindParams): Promise<void>`
|
- `async bind(paramsArray:StmtBindParams): Promise<void>`
|
||||||
- **接口说明** 绑定数据。
|
- **接口说明** 绑定数据。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `paramsArray`: 绑定数据。
|
- `paramsArray`:绑定数据。
|
||||||
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:连接失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async batch(): Promise<void>`
|
- `async batch(): Promise<void>`
|
||||||
- **接口说明** 提交绑定数据。
|
- **接口说明** 提交绑定数据。
|
||||||
|
@ -307,69 +307,69 @@ WSConfig 中的配置如下:
|
||||||
### 数据订阅
|
### 数据订阅
|
||||||
|
|
||||||
- **创建消费者支持属性列表**:
|
- **创建消费者支持属性列表**:
|
||||||
- taos.TMQConstants.CONNECT_USER: 用户名。
|
- taos.TMQConstants.CONNECT_USER:用户名。
|
||||||
- taos.TMQConstants.CONNECT_PASS: 密码。
|
- taos.TMQConstants.CONNECT_PASS:密码。
|
||||||
- taos.TMQConstants.GROUP_ID: 所在的 group。
|
- taos.TMQConstants.GROUP_ID:所在的 group。
|
||||||
- taos.TMQConstants.CLIENT_ID: 客户端id。
|
- taos.TMQConstants.CLIENT_ID:客户端id。
|
||||||
- taos.TMQConstants.WS_URL: taosAdapter 的url地址。
|
- taos.TMQConstants.WS_URL:taosAdapter 的url地址。
|
||||||
- taos.TMQConstants.AUTO_OFFSET_RESET: 来确定消费位置为最新数据(latest)还是包含旧数据(earliest)。
|
- taos.TMQConstants.AUTO_OFFSET_RESET:来确定消费位置为最新数据(latest)还是包含旧数据(earliest)。
|
||||||
- taos.TMQConstants.ENABLE_AUTO_COMMIT: 是否允许自动提交。
|
- taos.TMQConstants.ENABLE_AUTO_COMMIT:是否允许自动提交。
|
||||||
- taos.TMQConstants.AUTO_COMMIT_INTERVAL_MS: 自动提交间隔。
|
- taos.TMQConstants.AUTO_COMMIT_INTERVAL_MS:自动提交间隔。
|
||||||
- taos.TMQConstants.CONNECT_MESSAGE_TIMEOUT: 数据传输超时参数,单位 ms,默认为 10000 ms。
|
- taos.TMQConstants.CONNECT_MESSAGE_TIMEOUT:数据传输超时参数,单位 ms,默认为 10000 ms。
|
||||||
- `static async newConsumer(wsConfig:Map<string, any>):Promise<WsConsumer>`
|
- `static async newConsumer(wsConfig:Map<string, any>):Promise<WsConsumer>`
|
||||||
- **接口说明** 消费者构造函数。
|
- **接口说明** 消费者构造函数。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `wsConfig`: 创建消费者属性配置。
|
- `wsConfig`:创建消费者属性配置。
|
||||||
- **返回值**:WsConsumer 消费者对象。
|
- **返回值**:WsConsumer 消费者对象。
|
||||||
- **异常**:如果在执行过程中出现异常,抛出 `TDWebSocketClientError` 错误。
|
- **异常**:如果在执行过程中出现异常,抛出 `TDWebSocketClientError` 错误。
|
||||||
- `async subscribe(topics: Array<string>, reqId?:number): Promise<void>`
|
- `async subscribe(topics: Array<string>, reqId?:number): Promise<void>`
|
||||||
- **接口说明** 订阅一组主题。
|
- **接口说明** 订阅一组主题。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `topics`: 订阅的主题列表。
|
- `topics`:订阅的主题列表。
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async unsubscribe(reqId?:number): Promise<void>`
|
- `async unsubscribe(reqId?:number): Promise<void>`
|
||||||
- **接口说明** 取消订阅。
|
- **接口说明** 取消订阅。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async poll(timeoutMs: number, reqId?:number):Promise<Map<string, TaosResult>>`
|
- `async poll(timeoutMs: number, reqId?:number):Promise<Map<string, TaosResult>>`
|
||||||
- **接口说明** 轮询消息。
|
- **接口说明** 轮询消息。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `timeoutMs`: 表示轮询的超时时间,单位毫秒。
|
- `timeoutMs`:表示轮询的超时时间,单位毫秒。
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:`Map<string, TaosResult>` 每个主题对应的数据。
|
- **返回值**:`Map<string, TaosResult>` 每个主题对应的数据。
|
||||||
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async subscription(reqId?:number):Promise<Array<string>>`
|
- `async subscription(reqId?:number):Promise<Array<string>>`
|
||||||
- **接口说明** 获取当前订阅的所有主题。
|
- **接口说明** 获取当前订阅的所有主题。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:`Array<string>` 主题列表。
|
- **返回值**:`Array<string>` 主题列表。
|
||||||
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async commit(reqId?:number):Promise<Array<TopicPartition>>`
|
- `async commit(reqId?:number):Promise<Array<TopicPartition>>`
|
||||||
- **接口说明** 提交当前处理的消息的偏移量。
|
- **接口说明** 提交当前处理的消息的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:`Array<TopicPartition>` 每个主题的消费进度。
|
- **返回值**:`Array<TopicPartition>` 每个主题的消费进度。
|
||||||
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
- **异常**:失败抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async committed(partitions:Array<TopicPartition>, reqId?:number):Promise<Array<TopicPartition>>`
|
- `async committed(partitions:Array<TopicPartition>, reqId?:number):Promise<Array<TopicPartition>>`
|
||||||
- **接口说明**:获取一组分区最后提交的偏移量。
|
- **接口说明**:获取一组分区最后提交的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `partitions`:一个 `Array<TopicPartition>` 类型的参数,表示要查询的分区集合。
|
- `partitions`:一个 `Array<TopicPartition>` 类型的参数,表示要查询的分区集合。
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:`Array<TopicPartition>`,即一组分区最后提交的偏移量。
|
- **返回值**:`Array<TopicPartition>`,即一组分区最后提交的偏移量。
|
||||||
- **异常**:如果在获取提交的偏移量过程中发生错误,将抛出 `TDWebSocketClientError` 异常。
|
- **异常**:如果在获取提交的偏移量过程中发生错误,将抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async seek(partition:TopicPartition, reqId?:number):Promise<void>`
|
- `async seek(partition:TopicPartition, reqId?:number):Promise<void>`
|
||||||
- **接口说明**:将给定分区的偏移量设置到指定的位置。
|
- **接口说明**:将给定分区的偏移量设置到指定的位置。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `partition`:一个 `TopicPartition` 类型的参数,表示要操作的分区和要设置的偏移量。
|
- `partition`:一个 `TopicPartition` 类型的参数,表示要操作的分区和要设置的偏移量。
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **异常**:如果在设置偏移量过程中发生错误,将抛出 `TDWebSocketClientError` 异常。
|
- **异常**:如果在设置偏移量过程中发生错误,将抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async positions(partitions:Array<TopicPartition>, reqId?:number):Promise<Array<TopicPartition>>`
|
- `async positions(partitions:Array<TopicPartition>, reqId?:number):Promise<Array<TopicPartition>>`
|
||||||
- **接口说明**:获取给定分区当前的偏移量。
|
- **接口说明**:获取给定分区当前的偏移量。
|
||||||
- **参数说明**:
|
- **参数说明**:
|
||||||
- `partitions`:一个 `TopicPartition` 类型的参数,表示要查询的分区。
|
- `partitions`:一个 `TopicPartition` 类型的参数,表示要查询的分区。
|
||||||
- `reqId`: 请求 id 非必填,用于问题追踪。
|
- `reqId`:请求 id 非必填,用于问题追踪。
|
||||||
- **返回值**:`Array<TopicPartition>`,即一组分区最后提交的偏移量。
|
- **返回值**:`Array<TopicPartition>`,即一组分区最后提交的偏移量。
|
||||||
- **异常**:如果在获取偏移量过程中发生错误,将抛出 `TDWebSocketClientError` 异常。
|
- **异常**:如果在获取偏移量过程中发生错误,将抛出 `TDWebSocketClientError` 异常。
|
||||||
- `async seekToBeginning(partitions:Array<TopicPartition>):Promise<void>`
|
- `async seekToBeginning(partitions:Array<TopicPartition>):Promise<void>`
|
||||||
|
|
|
@ -18,8 +18,8 @@ TDengine 服务端或客户端安装后,`taos.h` 位于:
|
||||||
|
|
||||||
TDengine 客户端驱动的动态库位于:
|
TDengine 客户端驱动的动态库位于:
|
||||||
|
|
||||||
- Linux: `/usr/local/taos/driver/libtaos.so`
|
- Linux:`/usr/local/taos/driver/libtaos.so`
|
||||||
- Windows: `C:\TDengine\taos.dll`
|
- Windows:`C:\TDengine\taos.dll`
|
||||||
- macOS:`/usr/local/lib/libtaos.dylib`
|
- macOS:`/usr/local/lib/libtaos.dylib`
|
||||||
|
|
||||||
## 支持的平台
|
## 支持的平台
|
||||||
|
@ -85,7 +85,7 @@ phpize && ./configure --enable-swoole && make -j && make install
|
||||||
|
|
||||||
本节展示了使用客户端驱动访问 TDengine 集群的常见访问方式的示例代码。
|
本节展示了使用客户端驱动访问 TDengine 集群的常见访问方式的示例代码。
|
||||||
|
|
||||||
> 所有错误都会抛出异常: `TDengine\Exception\TDengineException`
|
> 所有错误都会抛出异常:`TDengine\Exception\TDengineException`
|
||||||
|
|
||||||
### 建立连接
|
### 建立连接
|
||||||
|
|
||||||
|
|
|
@ -52,11 +52,11 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:WebSocket 连接与
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
4.1 【DSN】:Data Source Name 必填,为新添加的 ODBC 数据源命名
|
4.1 【DSN】:Data Source Name 必填,为新添加的 ODBC 数据源命名
|
||||||
|
|
||||||
4.2【连接类型】 : 必选,选择连接类型,这里选择 【WebSocket】
|
4.2【连接类型】:必选,选择连接类型,这里选择 【WebSocket】
|
||||||
|
|
||||||
4.3【URL】必填,ODBC 数据源 URL,示例: `http://localhost:6041`, 云服务的 url 示例: `https://gw.cloud.taosdata.com?token=your_token`
|
4.3【URL】必填,ODBC 数据源 URL,示例:`http://localhost:6041`, 云服务的 url 示例:`https://gw.cloud.taosdata.com?token=your_token`
|
||||||
|
|
||||||
4.4【数据库】选填,需要连接的默认数据库
|
4.4【数据库】选填,需要连接的默认数据库
|
||||||
|
|
||||||
|
@ -84,11 +84,11 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:WebSocket 连接与
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
4.1 【DSN】:Data Source Name 必填,为新添加的 ODBC 数据源命名
|
4.1 【DSN】:Data Source Name 必填,为新添加的 ODBC 数据源命名
|
||||||
|
|
||||||
4.2 【连接类型】 : 必选,选择连接类型,这里选择 【Native】 原生连接;
|
4.2 【连接类型】:必选,选择连接类型,这里选择 【Native】 原生连接;
|
||||||
|
|
||||||
4.3 【服务器】必填,ODBC 数据源 服务器 地址,示例: `localhost:6030`
|
4.3 【服务器】必填,ODBC 数据源 服务器 地址,示例:`localhost:6030`
|
||||||
|
|
||||||
4.4 【数据库】选填,需要连接的默认数据库
|
4.4 【数据库】选填,需要连接的默认数据库
|
||||||
|
|
||||||
|
@ -267,388 +267,388 @@ TDengine ODBC 支持两种连接 TDengine 数据库方式:WebSocket 连接与
|
||||||
|
|
||||||
#### 数据源和驱动程序管理
|
#### 数据源和驱动程序管理
|
||||||
|
|
||||||
- API: ConfigDSN
|
- API:ConfigDSN
|
||||||
- **是否支持**: 支持(仅 Windows)
|
- **是否支持**:支持(仅 Windows)
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 配置数据源
|
- **作用**:配置数据源
|
||||||
|
|
||||||
- API: ConfigDriver
|
- API:ConfigDriver
|
||||||
- **是否支持**: 支持(仅 Windows)
|
- **是否支持**:支持(仅 Windows)
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于执行与特定驱动程序相关的安装和配置任务
|
- **作用**:用于执行与特定驱动程序相关的安装和配置任务
|
||||||
|
|
||||||
- API: ConfigTranslator
|
- API:ConfigTranslator
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于解析DSN的配置,在DSN配置和实际数据库驱动程序配置之间进行翻译或转换
|
- **作用**:用于解析DSN的配置,在DSN配置和实际数据库驱动程序配置之间进行翻译或转换
|
||||||
|
|
||||||
|
|
||||||
#### 连接到数据源
|
#### 连接到数据源
|
||||||
|
|
||||||
- API: SQLAllocHandle
|
- API:SQLAllocHandle
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 分配环境、连接、语句或描述符句柄
|
- **作用**:分配环境、连接、语句或描述符句柄
|
||||||
|
|
||||||
- API: SQLConnect
|
- API:SQLConnect
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 通过数据源名称、用户 ID 和密码连接到特定驱动程序
|
- **作用**:通过数据源名称、用户 ID 和密码连接到特定驱动程序
|
||||||
|
|
||||||
- API: SQLDriverConnect
|
- API:SQLDriverConnect
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 通过连接字符串连接到特定驱动程序,支持更多连接信息
|
- **作用**:通过连接字符串连接到特定驱动程序,支持更多连接信息
|
||||||
|
|
||||||
- API: SQLBrowseConnect
|
- API:SQLBrowseConnect
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于发现和枚举连接到数据源所需的特性和属性值。每次调用 SQLBrowseConnect 都会返回属性和属性值的连续级别
|
- **作用**:用于发现和枚举连接到数据源所需的特性和属性值。每次调用 SQLBrowseConnect 都会返回属性和属性值的连续级别
|
||||||
|
|
||||||
- API: SQLAllocEnv
|
- API:SQLAllocEnv
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocEnv 已替换为 SQLAllocHandle
|
- **作用**:在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocEnv 已替换为 SQLAllocHandle
|
||||||
|
|
||||||
- API: SQLAllocConnect
|
- API:SQLAllocConnect
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocConnect 已替换为 SQLAllocHandle
|
- **作用**:在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocConnect 已替换为 SQLAllocHandle
|
||||||
|
|
||||||
|
|
||||||
#### 获取有关驱动程序和数据源的信息
|
#### 获取有关驱动程序和数据源的信息
|
||||||
|
|
||||||
- API: SQLDataSources
|
- API:SQLDataSources
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回可用数据源的列表,由驱动程序管理器处理
|
- **作用**:返回可用数据源的列表,由驱动程序管理器处理
|
||||||
|
|
||||||
- API: SQLDrivers
|
- API:SQLDrivers
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回由驱动程序管理器处理的已安装驱动程序及其属性的列表
|
- **作用**:返回由驱动程序管理器处理的已安装驱动程序及其属性的列表
|
||||||
|
|
||||||
- API: SQLGetInfo
|
- API:SQLGetInfo
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回有关数据库环境的详细信息,如数据库产品名称、驱动程序名、数据库的SQL语法特性、连接能力等等
|
- **作用**:返回有关数据库环境的详细信息,如数据库产品名称、驱动程序名、数据库的SQL语法特性、连接能力等等
|
||||||
|
|
||||||
- API: SQLGetFunctions
|
- API:SQLGetFunctions
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于查询驱动程序支持的函数
|
- **作用**:用于查询驱动程序支持的函数
|
||||||
|
|
||||||
- API: SQLGetTypeInfo
|
- API:SQLGetTypeInfo
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回有关支持的数据类型的信息
|
- **作用**:返回有关支持的数据类型的信息
|
||||||
|
|
||||||
|
|
||||||
#### 设置和检索驱动程序属性
|
#### 设置和检索驱动程序属性
|
||||||
|
|
||||||
- API: SQLSetConnectAttr
|
- API:SQLSetConnectAttr
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 设置连接属性,当设置SQL_ATTR_AUTOCOMMIT属性时,用于控制自动提交模式
|
- **作用**:设置连接属性,当设置SQL_ATTR_AUTOCOMMIT属性时,用于控制自动提交模式
|
||||||
|
|
||||||
- API: SQLGetConnectAttr
|
- API:SQLGetConnectAttr
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回连接属性的值
|
- **作用**:返回连接属性的值
|
||||||
|
|
||||||
- API: SQLSetConnectOption
|
- API:SQLSetConnectOption
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLSetConnectAttr
|
- **作用**:在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLSetConnectAttr
|
||||||
|
|
||||||
- API: SQLGetConnectOption
|
- API:SQLGetConnectOption
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLGetConnectAttr
|
- **作用**:在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetConnectOption 已替换为 SQLGetConnectAttr
|
||||||
|
|
||||||
- API: SQLSetEnvAttr
|
- API:SQLSetEnvAttr
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 设置控制环境的属性
|
- **作用**:设置控制环境的属性
|
||||||
|
|
||||||
- API: SQLGetEnvAttr
|
- API:SQLGetEnvAttr
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回环境属性的当前设置
|
- **作用**:返回环境属性的当前设置
|
||||||
|
|
||||||
- API: SQLSetStmtAttr
|
- API:SQLSetStmtAttr
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 设置与语句相关的属性
|
- **作用**:设置与语句相关的属性
|
||||||
|
|
||||||
- API: SQLGetStmtAttr
|
- API:SQLGetStmtAttr
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回语句属性的当前设置
|
- **作用**:返回语句属性的当前设置
|
||||||
|
|
||||||
- API: SQLSetStmtOption
|
- API:SQLSetStmtOption
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLSetStmtAttr
|
- **作用**:在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLSetStmtAttr
|
||||||
|
|
||||||
- API: SQLGetStmtOption
|
- API:SQLGetStmtOption
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLGetStmtAttr
|
- **作用**:在 ODBC 3.x 中,ODBC 2.0 函数 SQLSetStmtOption 已替换为 SQLGetStmtAttr
|
||||||
|
|
||||||
|
|
||||||
#### 准备 SQL 请求
|
#### 准备 SQL 请求
|
||||||
|
|
||||||
- API: SQLAllocStmt
|
- API:SQLAllocStmt
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocStmt 已替换为 SQLAllocHandle
|
- **作用**:在 ODBC 3.x 中,ODBC 2.x 函数 SQLAllocStmt 已替换为 SQLAllocHandle
|
||||||
|
|
||||||
- API: SQLPrepare
|
- API:SQLPrepare
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于预处理SQL语句,这通常是SQLExecute之前的一个步骤
|
- **作用**:用于预处理SQL语句,这通常是SQLExecute之前的一个步骤
|
||||||
|
|
||||||
- API: SQLBindCol
|
- API:SQLBindCol
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于将结果集中的列绑定到应用程序缓冲区
|
- **作用**:用于将结果集中的列绑定到应用程序缓冲区
|
||||||
|
|
||||||
- API: SQLBindParameter
|
- API:SQLBindParameter
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于将SQL语句的参数绑定到应用程序缓冲区
|
- **作用**:用于将SQL语句的参数绑定到应用程序缓冲区
|
||||||
|
|
||||||
- API: SQLGetCursorName
|
- API:SQLGetCursorName
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回与指定语句关联的游标名称
|
- **作用**:返回与指定语句关联的游标名称
|
||||||
|
|
||||||
- API: SQLSetCursorName
|
- API:SQLSetCursorName
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 设置游标名称,允许在查询中使用命名游标
|
- **作用**:设置游标名称,允许在查询中使用命名游标
|
||||||
|
|
||||||
- API: SQLSetScrollOptions
|
- API:SQLSetScrollOptions
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 设置控制光标行为的选项
|
- **作用**:设置控制光标行为的选项
|
||||||
|
|
||||||
|
|
||||||
#### 提交请求
|
#### 提交请求
|
||||||
|
|
||||||
- API: SQLExecute
|
- API:SQLExecute
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于执行之前通过 SQLPrepare 准备好的SQL语句
|
- **作用**:用于执行之前通过 SQLPrepare 准备好的SQL语句
|
||||||
|
|
||||||
- API: SQLExecDirect
|
- API:SQLExecDirect
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于执行包含SQL语句的字符串
|
- **作用**:用于执行包含SQL语句的字符串
|
||||||
|
|
||||||
- API: SQLNativeSql
|
- API:SQLNativeSql
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于将应用程序提供的SQL语句转换为数据库驱动程序的本机SQL语法
|
- **作用**:用于将应用程序提供的SQL语句转换为数据库驱动程序的本机SQL语法
|
||||||
|
|
||||||
- API: SQLDescribeParam
|
- API:SQLDescribeParam
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 返回语句中特定参数的描述
|
- **作用**:返回语句中特定参数的描述
|
||||||
|
|
||||||
- API: SQLNumParams
|
- API:SQLNumParams
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于查询预编译SQL语句中的参数数量
|
- **作用**:用于查询预编译SQL语句中的参数数量
|
||||||
|
|
||||||
- API: SQLParamData
|
- API:SQLParamData
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于从参数数据流中获取下一个参数值
|
- **作用**:用于从参数数据流中获取下一个参数值
|
||||||
|
|
||||||
- API: SQLPutData
|
- API:SQLPutData
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 当使用流输入方式时,可以用于向输出参数发送数据块
|
- **作用**:当使用流输入方式时,可以用于向输出参数发送数据块
|
||||||
|
|
||||||
|
|
||||||
#### 检索结果和关于结果的信息
|
#### 检索结果和关于结果的信息
|
||||||
|
|
||||||
- API: SQLRowCount
|
- API:SQLRowCount
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回受插入或删除请求影响的行数
|
- **作用**:返回受插入或删除请求影响的行数
|
||||||
|
|
||||||
- API: SQLNumResultCols
|
- API:SQLNumResultCols
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回结果集中的列数
|
- **作用**:返回结果集中的列数
|
||||||
|
|
||||||
- API: SQLDescribeCol
|
- API:SQLDescribeCol
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于描述结果集中列的属性。它提供了关于列的数据类型、列名、列的最大宽度、小数位数和是否可为空等信息
|
- **作用**:用于描述结果集中列的属性。它提供了关于列的数据类型、列名、列的最大宽度、小数位数和是否可为空等信息
|
||||||
|
|
||||||
- API: SQLColAttribute
|
- API:SQLColAttribute
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回结果集中列的描述符信息,如标题、排序规则等
|
- **作用**:返回结果集中列的描述符信息,如标题、排序规则等
|
||||||
|
|
||||||
- API: SQLColAttributes
|
- API:SQLColAttributes
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLColAttributes 已替换为 SQLColAttribute
|
- **作用**:在 ODBC 3.x 中,ODBC 2.0 函数 SQLColAttributes 已替换为 SQLColAttribute
|
||||||
|
|
||||||
- API: SQLGetData
|
- API:SQLGetData
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于从结果集中的当前行获取特定列的数据
|
- **作用**:用于从结果集中的当前行获取特定列的数据
|
||||||
|
|
||||||
- API: SQLMoreResults
|
- API:SQLMoreResults
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 多个结果集的 SQL 语句执行后(例如:一个批处理或存储过程),移动到下一个结果集
|
- **作用**:多个结果集的 SQL 语句执行后(例如:一个批处理或存储过程),移动到下一个结果集
|
||||||
|
|
||||||
- API: SQLFetch
|
- API:SQLFetch
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于从结果集中提取下一行数据,并返回所有绑定列的数据
|
- **作用**:用于从结果集中提取下一行数据,并返回所有绑定列的数据
|
||||||
|
|
||||||
- API: SQLFetchScroll
|
- API:SQLFetchScroll
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于从结果集中提取指定的数据行集,并返回所有绑定列的数据
|
- **作用**:用于从结果集中提取指定的数据行集,并返回所有绑定列的数据
|
||||||
|
|
||||||
- API: SQLExtendedFetch
|
- API:SQLExtendedFetch
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,SQLExtendedFetch 已替换为 SQLFetchScroll
|
- **作用**:在 ODBC 3.x 中,SQLExtendedFetch 已替换为 SQLFetchScroll
|
||||||
|
|
||||||
- API: SQLSetPos
|
- API:SQLSetPos
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 设置行集中的游标位置,并允许应用程序更新数据集中的行
|
- **作用**:设置行集中的游标位置,并允许应用程序更新数据集中的行
|
||||||
|
|
||||||
- API: SQLBulkOperations
|
- API:SQLBulkOperations
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 执行批量插入和批量书签操作,包括更新、删除和按书签提取
|
- **作用**:执行批量插入和批量书签操作,包括更新、删除和按书签提取
|
||||||
|
|
||||||
|
|
||||||
#### 检索错误或诊断信息
|
#### 检索错误或诊断信息
|
||||||
|
|
||||||
- API: SQLError
|
- API:SQLError
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLError 已替换为 SQLGetDiagRec
|
- **作用**:在 ODBC 3.x 中,ODBC 2.x 函数 SQLError 已替换为 SQLGetDiagRec
|
||||||
|
|
||||||
- API: SQLGetDiagField
|
- API:SQLGetDiagField
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回附加诊断信息(单条诊断结果)
|
- **作用**:返回附加诊断信息(单条诊断结果)
|
||||||
|
|
||||||
- API: SQLGetDiagRec
|
- API:SQLGetDiagRec
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回附加诊断信息(多条诊断结果)
|
- **作用**:返回附加诊断信息(多条诊断结果)
|
||||||
|
|
||||||
|
|
||||||
#### 获取有关数据源的系统表项的信息
|
#### 获取有关数据源的系统表项的信息
|
||||||
|
|
||||||
- API: SQLColumnPrivileges
|
- API:SQLColumnPrivileges
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 用于检索指定表中列的权限信息,如哪些用户或角色拥有对特定列的读取、插入、更新或删除权限
|
- **作用**:用于检索指定表中列的权限信息,如哪些用户或角色拥有对特定列的读取、插入、更新或删除权限
|
||||||
|
|
||||||
- API: SQLColumns
|
- API:SQLColumns
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: X/Open
|
- **标准**:X/Open
|
||||||
- **作用**: 返回指定表中的列名列表
|
- **作用**:返回指定表中的列名列表
|
||||||
|
|
||||||
- API: SQLForeignKeys
|
- API:SQLForeignKeys
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 检索外键关系的详细信息
|
- **作用**:检索外键关系的详细信息
|
||||||
|
|
||||||
- API: SQLPrimaryKeys
|
- API:SQLPrimaryKeys
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 返回构成表主键的列名列表
|
- **作用**:返回构成表主键的列名列表
|
||||||
|
|
||||||
- API: SQLSpecialColumns
|
- API:SQLSpecialColumns
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: X/Open
|
- **标准**:X/Open
|
||||||
- **作用**: 返回数据库中特殊列的信息,如唯一键或索引列
|
- **作用**:返回数据库中特殊列的信息,如唯一键或索引列
|
||||||
|
|
||||||
- API: SQLStatistics
|
- API:SQLStatistics
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 返回关于表的统计信息,如行数、列数、平均行宽等
|
- **作用**:返回关于表的统计信息,如行数、列数、平均行宽等
|
||||||
|
|
||||||
- API: SQLTablePrivileges
|
- API:SQLTablePrivileges
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 返回用户在特定表上的权限,如SELECT、INSERT、UPDATE等
|
- **作用**:返回用户在特定表上的权限,如SELECT、INSERT、UPDATE等
|
||||||
|
|
||||||
- API: SQLTables
|
- API:SQLTables
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: X/Open
|
- **标准**:X/Open
|
||||||
- **作用**: 返回存储在数据源的当前数据库中的表信息
|
- **作用**:返回存储在数据源的当前数据库中的表信息
|
||||||
|
|
||||||
- API: SQLProcedures
|
- API:SQLProcedures
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 返回数据库中可用的存储过程信息,包括名称和类型
|
- **作用**:返回数据库中可用的存储过程信息,包括名称和类型
|
||||||
|
|
||||||
- API: SQLProcedureColumns
|
- API:SQLProcedureColumns
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 返回存储过程的列信息,包括输入输出参数的详细信息
|
- **作用**:返回存储过程的列信息,包括输入输出参数的详细信息
|
||||||
|
|
||||||
|
|
||||||
#### 执行事务
|
#### 执行事务
|
||||||
|
|
||||||
- API: SQLTransact
|
- API:SQLTransact
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.x 函数 SQLTransact 已替换为 SQLEndTran
|
- **作用**:在 ODBC 3.x 中,ODBC 2.x 函数 SQLTransact 已替换为 SQLEndTran
|
||||||
|
|
||||||
- API: SQLEndTran
|
- API:SQLEndTran
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 用于提交或回滚事务。TDengine 是非事务性的,因此 SQLEndTran 函数最多只能模拟提交或回滚操作。如果有任何未完成的连接或语句,无论是提交(commit)还是回滚(rollback)都不会成功
|
- **作用**:用于提交或回滚事务。TDengine 是非事务性的,因此 SQLEndTran 函数最多只能模拟提交或回滚操作。如果有任何未完成的连接或语句,无论是提交(commit)还是回滚(rollback)都不会成功
|
||||||
|
|
||||||
|
|
||||||
#### 终止连接
|
#### 终止连接
|
||||||
|
|
||||||
- API: SQLDisconnect
|
- API:SQLDisconnect
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 断开数据库连接
|
- **作用**:断开数据库连接
|
||||||
|
|
||||||
- API: SQLFreeHandle
|
- API:SQLFreeHandle
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ISO 92
|
- **标准**:ISO 92
|
||||||
- **作用**: 释放与特定环境、连接、语句或描述符句柄关联的资源
|
- **作用**:释放与特定环境、连接、语句或描述符句柄关联的资源
|
||||||
|
|
||||||
- API: SQLFreeConnect
|
- API:SQLFreeConnect
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeConnect 已替换为 SQLFreeHandle
|
- **作用**:在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeConnect 已替换为 SQLFreeHandle
|
||||||
|
|
||||||
- API: SQLFreeEnv
|
- API:SQLFreeEnv
|
||||||
- **是否支持**: 不支持
|
- **是否支持**:不支持
|
||||||
- **标准**: 弃用
|
- **标准**:弃用
|
||||||
- **作用**: 在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeEnv 已替换为 SQLFreeHandle
|
- **作用**:在 ODBC 3.x 中,ODBC 2.0 函数 SQLFreeEnv 已替换为 SQLFreeHandle
|
||||||
|
|
||||||
- API: SQLFreeStmt
|
- API:SQLFreeStmt
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 结束语句处理,丢弃挂起的结果,并且可以选择释放与语句句柄关联的所有资源
|
- **作用**:结束语句处理,丢弃挂起的结果,并且可以选择释放与语句句柄关联的所有资源
|
||||||
|
|
||||||
- API: SQLCloseCursor
|
- API:SQLCloseCursor
|
||||||
- **是否支持**: 支持
|
- **是否支持**:支持
|
||||||
- **标准**: ODBC
|
- **标准**:ODBC
|
||||||
- **作用**: 关闭与当前语句句柄关联的游标,并释放游标所使用的所有资源
|
- **作用**:关闭与当前语句句柄关联的游标,并释放游标所使用的所有资源
|
||||||
|
|
||||||
|
|
|
@ -75,12 +75,12 @@ http://<fqdn>:<port>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_m
|
||||||
|
|
||||||
参数说明:
|
参数说明:
|
||||||
|
|
||||||
- fqdn: 集群中的任一台主机 FQDN 或 IP 地址。
|
- fqdn:集群中的任一台主机 FQDN 或 IP 地址。
|
||||||
- port: 配置文件中 httpPort 配置项,缺省为 6041。
|
- port:配置文件中 httpPort 配置项,缺省为 6041。
|
||||||
- db_name: 可选参数,指定本次所执行的 SQL 语句的默认数据库库名。
|
- db_name:可选参数,指定本次所执行的 SQL 语句的默认数据库库名。
|
||||||
- tz: 可选参数,指定返回时间的时区,遵照 IANA Time Zone 规则,如 `America/New_York`。
|
- tz:可选参数,指定返回时间的时区,遵照 IANA Time Zone 规则,如 `America/New_York`。
|
||||||
- req_id: 可选参数,指定请求 id,可以用于 tracing。
|
- req_id:可选参数,指定请求 id,可以用于 tracing。
|
||||||
- row_with_meta: 可选参数,指定是否每行数据都携带列名,缺省为 false。(3.3.2.0 版本开始支持)
|
- row_with_meta:可选参数,指定是否每行数据都携带列名,缺省为 false。(3.3.2.0 版本开始支持)
|
||||||
|
|
||||||
例如:`http://h1.taos.com:6041/rest/sql/test` 是指向地址为 `h1.taos.com:6041` 的 URL,并将默认使用的数据库库名设置为 `test`。
|
例如:`http://h1.taos.com:6041/rest/sql/test` 是指向地址为 `h1.taos.com:6041` 的 URL,并将默认使用的数据库库名设置为 `test`。
|
||||||
|
|
||||||
|
|
|
@ -431,7 +431,7 @@ description: TDengine 服务端的错误码列表和详细说明
|
||||||
| 0x80002635 | Incorrect TIMESTAMP value | 主键时间戳列值非法 | 检查并修正 SQL 语句 |
|
| 0x80002635 | Incorrect TIMESTAMP value | 主键时间戳列值非法 | 检查并修正 SQL 语句 |
|
||||||
| 0x80002637 | soffset/offset can not be less than 0 | soffset/offset 值非法 | 检查并修正 SQL 语句 |
|
| 0x80002637 | soffset/offset can not be less than 0 | soffset/offset 值非法 | 检查并修正 SQL 语句 |
|
||||||
| 0x80002638 | slimit/soffset only available for PARTITION/GROUP BY query | slimit/soffset 只支持 PARTITION BY/GROUP BY 语句 | 检查并修正 SQL 语句 |
|
| 0x80002638 | slimit/soffset only available for PARTITION/GROUP BY query | slimit/soffset 只支持 PARTITION BY/GROUP BY 语句 | 检查并修正 SQL 语句 |
|
||||||
| 0x80002639 | Invalid topic query | 不支持的TOPIC查询语 |
|
| 0x80002639 | Invalid topic query | 不支持的 TOPIC 查询语法 |
|
||||||
| 0x8000263A | Cannot drop super table in batch | 不支持批量删除超级表 | 检查并修正 SQL 语句 |
|
| 0x8000263A | Cannot drop super table in batch | 不支持批量删除超级表 | 检查并修正 SQL 语句 |
|
||||||
| 0x8000263B | Start(end) time of query range required or time range too large | 窗口个数超出限制 | 检查并修正 SQL 语句 |
|
| 0x8000263B | Start(end) time of query range required or time range too large | 窗口个数超出限制 | 检查并修正 SQL 语句 |
|
||||||
| 0x8000263C | Duplicated column names | 列名称重复 | 检查并修正 SQL 语句 |
|
| 0x8000263C | Duplicated column names | 列名称重复 | 检查并修正 SQL 语句 |
|
||||||
|
@ -496,21 +496,21 @@ description: TDengine 服务端的错误码列表和详细说明
|
||||||
| 0x80002802 | Invalid function para type | 函数输入参数类型不正确。函数输入参数要求为数值类型,但是用户所给参数为字符串。比如 SUM("abc")。 | 调整函数参数输入为正确类型 |
|
| 0x80002802 | Invalid function para type | 函数输入参数类型不正确。函数输入参数要求为数值类型,但是用户所给参数为字符串。比如 SUM("abc")。 | 调整函数参数输入为正确类型 |
|
||||||
| 0x80002803 | Invalid function para value | 函数输入参数取值不正确。函数输入参数范围不正确。比如 SAMPLE 函数第二个参数指定采样个数范围为 [1, 1000], 如果不在这个范围内会会报错。 | 调整函数参数输入为正确取值。 |
|
| 0x80002803 | Invalid function para value | 函数输入参数取值不正确。函数输入参数范围不正确。比如 SAMPLE 函数第二个参数指定采样个数范围为 [1, 1000], 如果不在这个范围内会会报错。 | 调整函数参数输入为正确取值。 |
|
||||||
| 0x80002804 | Not builtin function | 函数非内置函数。内置函数不在的哈希表中会报错,用户应该很少遇见这个问题,否则是内部内置函数哈希初始化的时候出错或者写坏。 | 客户应该不会遇到,如果遇到,说明程序有 bug,咨询开发人员。 |
|
| 0x80002804 | Not builtin function | 函数非内置函数。内置函数不在的哈希表中会报错,用户应该很少遇见这个问题,否则是内部内置函数哈希初始化的时候出错或者写坏。 | 客户应该不会遇到,如果遇到,说明程序有 bug,咨询开发人员。 |
|
||||||
| 0x80002805 | Duplicate timestamps not allowed in function | 函数输入主键列有重复时间戳。对某些依赖时间线顺序函数做超级表查询时,所有子表数据会按照时间戳进行排序后合并为一条时间线进行计算,因此子表合并后的时间戳可能会出现重复,导致某些计算没有意义而报错。涉及到的函数有:CSUM,DERIVATIVE,DIFF,IRATE,MAVG,STATECOUNT,STATEDURATION,TWA | 如果需要对超级表查询并且使用这些依赖时间线顺序函数时,确保子表中不存在重复时间戳数据。 |
|
| 0x80002805 | Duplicate timestamps not allowed in function | 函数输入主键列有重复时间戳。对某些依赖时间线顺序函数做超级表查询时,所有子表数据会按照时间戳进行排序后合并为一条时间线进行计算,因此子表合并后的时间戳可能会出现重复,导致某些计算没有意义而报错。涉及到的函数有:CSUM、DERIVATIVE、DIFF、IRATE、MAVG、STATECOUNT、STATEDURATION、TWA | 如果需要对超级表查询并且使用这些依赖时间线顺序函数时,确保子表中不存在重复时间戳数据。 |
|
||||||
|
|
||||||
|
|
||||||
## udf
|
## udf
|
||||||
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
||||||
| ---------- | ---------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------- |
|
| ---------- | ---------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------- |
|
||||||
| 0x80002901 | udf is stopping | dnode 退出时,收到 udf 调用 | 停止执行 udf 查询 |
|
| 0x80002901 | udf is stopping | dnode 退出时,收到 udf 调用 | 停止执行 udf 查询 |
|
||||||
| 0x80002902 | udf pipe read error | taosd读取udfd pipe,发生错误 | udfd异常退出,1)c udf崩溃 2)udfd崩溃 |
|
| 0x80002902 | udf pipe read error | taosd 读取 udfd pipe,发生错误 | udfd 异常退出,1. c udf 崩溃 2. udfd 崩溃 |
|
||||||
| 0x80002903 | udf pipe connect error | taosd建立到udfd的管道连接时,发生错误 | 1)taosd对应的udfd未启动。重启taosd |
|
| 0x80002903 | udf pipe connect error | taosd 建立到 udfd 的管道连接时,发生错误 | 1. taosd 对应的 udfd 未启动。重启 taosd |
|
||||||
| 0x80002904 | udf pip not exist | udf建立,调用,拆除三个阶段,两个阶段中间发生连接错误,导致连接消失,后续阶段继续执行 | udfd异常退出,1)c udf崩溃 2)udfd崩溃 |
|
| 0x80002904 | udf pip not exist | udf 建立,调用,拆除三个阶段,两个阶段中间发生连接错误,导致连接消失,后续阶段继续执行 | udfd 异常退出,1. c udf 崩溃 2. udfd 崩溃 |
|
||||||
| 0x80002905 | udf load failure | udfd加载udf时错误 | 1)mnode中udf不存在 2)udf 加载出错。查看日志 |
|
| 0x80002905 | udf load failure | udfd 加载 udf 时错误 | 1.mnode 中 udf 不存在 2. udf 加载出错。查看日志 |
|
||||||
| 0x80002906 | udf invalid function input | udf 检查输入 | udf 函数不接受输入,如输入列类型错误 |
|
| 0x80002906 | udf invalid function input | udf 检查输入 | udf 函数不接受输入,如输入列类型错误 |
|
||||||
| 0x80002907 | udf invalid bufsize | udf 聚合函数中间结果大于创建udf中指定的 bufsize | 增大 bufSize,或者降低中间结果大小 |
|
| 0x80002907 | udf invalid bufsize | udf 聚合函数中间结果大于创建udf中指定的 bufsize | 增大 bufSize,或者降低中间结果大小 |
|
||||||
| 0x80002908 | udf invalid output type | udf 输出的类型和创建 udf 中指定的类型 | 修改 udf,或者创建 udf 的类型,使得结果相同 |
|
| 0x80002908 | udf invalid output type | udf 输出的类型和创建 udf 中指定的类型 | 修改 udf,或者创建 udf 的类型,使得结果相同 |
|
||||||
| 0x80002909 | udf program language not supported | udf编程语言不支持 | 使用支持的语言,当前支持c,python |
|
| 0x80002909 | udf program language not supported | udf 编程语言不支持 | 使用支持的语言,当前支持 c、python |
|
||||||
| 0x8000290A | udf function execution failure | udf 函数执行错误,如返回错误的行数 | 具体查看错误日志 |
|
| 0x8000290A | udf function execution failure | udf 函数执行错误,如返回错误的行数 | 具体查看错误日志 |
|
||||||
|
|
||||||
|
|
||||||
|
@ -557,8 +557,10 @@ description: TDengine 服务端的错误码列表和详细说明
|
||||||
|
|
||||||
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
||||||
| ---------- | --------------------- | -------------------------------------------------------------------------------- | ------------------------------ |
|
| ---------- | --------------------- | -------------------------------------------------------------------------------- | ------------------------------ |
|
||||||
|
| 0x800003E6 | Consumer not exist | Consumer 超时下线 | 重新建 consumer 订阅数据 |
|
||||||
|
| 0x800003EA | Consumer not ready | Consumer 正在平衡中 | 等待 2 秒后重试 |
|
||||||
| 0x80004000 | Invalid message | 订阅到的数据非法,一般不会出现 | 具体查看 client 端的错误日志提示 |
|
| 0x80004000 | Invalid message | 订阅到的数据非法,一般不会出现 | 具体查看 client 端的错误日志提示 |
|
||||||
| 0x80004001 | Consumer mismatch | 订阅请求的vnode和重新分配的vnode不一致,一般存在于有新消费者加入相同消费者组里时 | 内部错误,不暴露给用户 |
|
| 0x80004001 | Consumer mismatch | 订阅请求的 vnode 和重新分配的 vnode 不一致,一般存在于有新消费者加入相同消费者组里时 | 内部错误 |
|
||||||
| 0x80004002 | Consumer closed | 消费者已经不存在了 | 查看是否已经 close 掉了 |
|
| 0x80004002 | Consumer closed | 消费者已经不存在了 | 查看是否已经 close 掉了 |
|
||||||
| 0x80004017 | Invalid status, please subscribe topic first | 数据订阅状态不对 | 没有调用 subscribe,直接 poll 数据 |
|
| 0x80004017 | Invalid status, please subscribe topic first | 数据订阅状态不对 | 没有调用 subscribe,直接 poll 数据 |
|
||||||
| 0x80004100 | Stream task not exist | 流计算任务不存在 | 具体查看 server 端的错误日志 |
|
| 0x80004100 | Stream task not exist | 流计算任务不存在 | 具体查看 server 端的错误日志 |
|
||||||
|
|
|
@ -19,9 +19,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
在面对亿万级别的点位信息时,任何微小的数据处理逻辑错误或冗余都可能导致性能瓶颈。得益于全球社区爱好者的共同努力、超过 53 万个的装机实例部署,以及在极端条件下的严格验证,TDengine 在功能和性能方面均达到顶尖水平。在车联网领域,TDengine 的核心价值体现在以下几个方面。
|
在面对亿万级别的点位信息时,任何微小的数据处理逻辑错误或冗余都可能导致性能瓶颈。得益于全球社区爱好者的共同努力、超过 53 万个的装机实例部署,以及在极端条件下的严格验证,TDengine 在功能和性能方面均达到顶尖水平。在车联网领域,TDengine 的核心价值体现在以下几个方面。
|
||||||
|
|
||||||
- 便于采集:作为物联网的一个分支,车联网的技术特点与之一致。TDengine配备了可视化采集界面,用户无须编写代码即可轻松将Kafka、MQTT等通用消息中间件中
|
- 便于采集:作为物联网的一个分支,车联网的技术特点与之一致。TDengine 配备了可视化采集界面,用户无须编写代码即可轻松将 Kafka、MQTT 等通用消息中间件中的数据导入数据库。此外,提供的可视化性能指标看板大大简化了数据接入和管理的工作流程。
|
||||||
的数据导入数据库。此外,提供的可视化性能指标看板大大简化了数据接入和管理
|
|
||||||
的工作流程。
|
|
||||||
- 数据存储:车联网数据具有高度的相关性,例如特定车型的配置信息或同一车辆上不同点位的状态数据。TDengine 的设计理念完美契合车联网的需求,采用“一车一表”的模式,简化了数据存储管理的复杂性。结合云原生架构、冷热数据分离、列式存储以及动态扩容(包括横向、纵向扩容和动态添加存储空间)等技术,TDengine 在数据存储的性能和成本控制方面表现出色。
|
- 数据存储:车联网数据具有高度的相关性,例如特定车型的配置信息或同一车辆上不同点位的状态数据。TDengine 的设计理念完美契合车联网的需求,采用“一车一表”的模式,简化了数据存储管理的复杂性。结合云原生架构、冷热数据分离、列式存储以及动态扩容(包括横向、纵向扩容和动态添加存储空间)等技术,TDengine 在数据存储的性能和成本控制方面表现出色。
|
||||||
- 查询分析:TDengine 作为一个开放且简洁的时序大数据平台,提供了丰富的 API,兼容各种分析工具、编程语言和 BI 系统,如 Matlab、R、永洪 BI 等。TDengine 主要采用 SQL,易于学习和使用,支持状态、计数、时间、事件及会话窗口等多种分析模式,并内置了 70 多个基础算子,足以应对日常的分析需求。对于更专业的算法分析,用户可通过 C 或 Python 语言开发 UDF,并将其集成到 TDengine 中。
|
- 查询分析:TDengine 作为一个开放且简洁的时序大数据平台,提供了丰富的 API,兼容各种分析工具、编程语言和 BI 系统,如 Matlab、R、永洪 BI 等。TDengine 主要采用 SQL,易于学习和使用,支持状态、计数、时间、事件及会话窗口等多种分析模式,并内置了 70 多个基础算子,足以应对日常的分析需求。对于更专业的算法分析,用户可通过 C 或 Python 语言开发 UDF,并将其集成到 TDengine 中。
|
||||||
|
|
||||||
|
@ -57,8 +55,4 @@ TDengine能够无缝地从外部消息队列(如MQTT、Kafka)中采集并过
|
||||||
方案特点如下。
|
方案特点如下。
|
||||||
- 高性能:该项目服务于一万辆车,数据量呈现快速增长态势,日均写入记录高达约 10 亿条。项目对聚合查询的高效性和存储压缩性能进行了严格的验证,无损压缩率可达 4%。这证明了 TDengine 在处理大规模数据时的卓越性能。
|
- 高性能:该项目服务于一万辆车,数据量呈现快速增长态势,日均写入记录高达约 10 亿条。项目对聚合查询的高效性和存储压缩性能进行了严格的验证,无损压缩率可达 4%。这证明了 TDengine 在处理大规模数据时的卓越性能。
|
||||||
- 乱序治理:尽管消息队列的使用难以避免乱序问题的出现,尤其是在离线数据补传的场景中,乱序数据往往表现为时间戳早于当前车辆存储记录的时间戳。这种乱序写入会导致大量存储碎片的产生,严重时会影响数据库的性能。TDengine 巧妙地解决了这一行业难题,支持在线整理乱序写入,确保数据库性能不受影响。同时,对于异常数据段的删除,也可以通过在线整理实现真正的数据存储空间释放,而不仅仅是索引屏蔽。
|
- 乱序治理:尽管消息队列的使用难以避免乱序问题的出现,尤其是在离线数据补传的场景中,乱序数据往往表现为时间戳早于当前车辆存储记录的时间戳。这种乱序写入会导致大量存储碎片的产生,严重时会影响数据库的性能。TDengine 巧妙地解决了这一行业难题,支持在线整理乱序写入,确保数据库性能不受影响。同时,对于异常数据段的删除,也可以通过在线整理实现真正的数据存储空间释放,而不仅仅是索引屏蔽。
|
||||||
- 数据应用:鉴于车辆运营涉及食品安全的特殊性,实时监控当前车辆位置信息显
|
- 数据应用:鉴于车辆运营涉及食品安全的特殊性,实时监控当前车辆位置信息显得尤为重要。TDengine 具备缓存实时数据的功能,无论数据库中已存储多少数据,仍能保持稳定的性能,毫秒级响应最新数据请求,充分发挥时序数据库的实时特性。业务中还需要进行历史轨迹回放、行驶里程分析、时间分段分析等多项操作,TDengine 的强大性能和多功能性为业务分析提供了无限可能。
|
||||||
得尤为重要。TDengine 具备缓存实时数据的功能,无论数据库中已存储多少数据,
|
|
||||||
仍能保持稳定的性能,毫秒级响应最新数据请求,充分发挥时序数据库的实时特
|
|
||||||
性。业务中还需要进行历史轨迹回放、行驶里程分析、时间分段分析等多项操作,
|
|
||||||
TDengine 的强大性能和多功能性为业务分析提供了无限可能。
|
|
|
@ -18,10 +18,8 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
储能系统的核心组件是电芯,对其实时工作参数(如电流、电压、温度、内阻)的监控对于保障储能系统的安全和可靠运行至关重要。如何有效地存储和分析这些海量的测点和数据,已成为储能领域不得不正视的技术难题。这些难题主要体现在如下几个方面。
|
储能系统的核心组件是电芯,对其实时工作参数(如电流、电压、温度、内阻)的监控对于保障储能系统的安全和可靠运行至关重要。如何有效地存储和分析这些海量的测点和数据,已成为储能领域不得不正视的技术难题。这些难题主要体现在如下几个方面。
|
||||||
- 测点量大:分布式光伏组件众多,大型储能系统中电芯数量庞大,需要监测的测点数从数十万到数千万不等。加之较高的采集频率,每天产生的海量监测数据需要进行长期持久化存储。
|
- 测点量大:分布式光伏组件众多,大型储能系统中电芯数量庞大,需要监测的测点数从数十万到数千万不等。加之较高的采集频率,每天产生的海量监测数据需要进行长期持久化存储。
|
||||||
- 数据接入难:电网调度中心须实时监控分布式光伏电站和储能系统的运行状况,但由于分布式光伏电站目前主要通过配网侧接入电网,数据接入过程面临挑战。
|
- 数据接入难:电网调度中心须实时监控分布式光伏电站和储能系统的运行状况,但由于分布式光伏电站目前主要通过配网侧接入电网,数据接入过程面临挑战。另外,由于营销系统与调度中心的信息化水平存在差异,数据接入过程中存在客观难题:数据提取规则复杂,测点数量庞大,传统的数据采集方案资源消耗大。
|
||||||
另外,由于营销系统与调度中心的信息化水平存在差异,数据接入过程中存在客观难题:数据提取规则复杂,测点数量庞大,传统的数据采集方案资源消耗大。
|
- 数据分发难:分布式光伏电站的运行数据一旦接入省级调度中心,就需要迅速分发至各地市的生产区以驱动后续业务。如何实现快速且高效的数据分发,是客户需要解决的一个棘手问题。
|
||||||
- 数据分发难:分布式光伏电站的运行数据一旦接入省级调度中心,就需要迅速分发至各地市的生产区以驱动后续业务。如何实现快速且高效的数据分发,是客户
|
|
||||||
需要解决的一个棘手问题。
|
|
||||||
- 聚合分析难:分布式光伏电站的运行数据须根据电站在电网拓扑中的具体隶属关系(如电站隶属于某台配电变压器、馈线、主网变压器)进行多维度的聚合分析。现有技术方案在提供高效聚合分析手段方面存在不足,如性能低下、耗时过长等问题尤为突出。
|
- 聚合分析难:分布式光伏电站的运行数据须根据电站在电网拓扑中的具体隶属关系(如电站隶属于某台配电变压器、馈线、主网变压器)进行多维度的聚合分析。现有技术方案在提供高效聚合分析手段方面存在不足,如性能低下、耗时过长等问题尤为突出。
|
||||||
|
|
||||||
## TDengine在新能源中的核心价值
|
## TDengine在新能源中的核心价值
|
||||||
|
@ -31,8 +29,7 @@ toc_max_heading_level: 4
|
||||||
- 支持海量测点:TDengine 能够支持高达 10 亿个时间线,充分满足分布式光伏电站和储能系统的数据处理需求。
|
- 支持海量测点:TDengine 能够支持高达 10 亿个时间线,充分满足分布式光伏电站和储能系统的数据处理需求。
|
||||||
- 高性能:面对千万级测点的分钟级数据采集场景,调度业务对时序数据库的写入性能和低延迟有着严苛的要求。TDengine 凭借“一个数据采集点一张表”的创新设计理念,实现了卓越的写入性能,完全契合业务需求。
|
- 高性能:面对千万级测点的分钟级数据采集场景,调度业务对时序数据库的写入性能和低延迟有着严苛的要求。TDengine 凭借“一个数据采集点一张表”的创新设计理念,实现了卓越的写入性能,完全契合业务需求。
|
||||||
- 最新状态数据快速查询:在千万级测点数据写入后,调度业务需要时序数据库能够迅速查询各设备的最新状态数据,以驱动后续业务逻辑。TDengine 通过超级表和内置的高速读缓存设计,使用户能够高效查询光伏设备和储能电芯的最新运行数据,使运维人员能够实时获取并监控设备状态,从而提高运维效率。
|
- 最新状态数据快速查询:在千万级测点数据写入后,调度业务需要时序数据库能够迅速查询各设备的最新状态数据,以驱动后续业务逻辑。TDengine 通过超级表和内置的高速读缓存设计,使用户能够高效查询光伏设备和储能电芯的最新运行数据,使运维人员能够实时获取并监控设备状态,从而提高运维效率。
|
||||||
- 数据订阅与分发:针对需要实时数据分发的业务场景,TDengine内置的消息队列功能从机制上解决了大量数据即时分发的难题,简化了整个系统架构的复
|
- 数据订阅与分发:针对需要实时数据分发的业务场景,TDengine 内置的消息队列功能从机制上解决了大量数据即时分发的难题,简化了整个系统架构的复杂性。
|
||||||
杂性。
|
|
||||||
- 开放的生态:TDengine 易于与其他系统集成,兼容多种大数据框架,支持数据的整合与分析,为开发者提供了一个灵活的生态平台。
|
- 开放的生态:TDengine 易于与其他系统集成,兼容多种大数据框架,支持数据的整合与分析,为开发者提供了一个灵活的生态平台。
|
||||||
|
|
||||||
## TDengine 在新能源中的应用
|
## TDengine 在新能源中的应用
|
||||||
|
|
|
@ -28,7 +28,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
## TDengine在智慧油田中的应用
|
## TDengine在智慧油田中的应用
|
||||||
|
|
||||||
在一项致力于提升大型油田生产管理水平的技术方案中,客户设定了实现多个关键领域技术集成的目标。这些领域包括但不限于如下这些
|
在一项致力于提升大型油田生产管理水平的技术方案中,客户设定了实现多个关键领域技术集成的目标。这些领域包括但不限于如下这些。
|
||||||
- 自动化采集与控制:在生产现场构建先进的自动化系统,以实现数据的实时采集和精确控制,提升生产过程的自动化水平。
|
- 自动化采集与控制:在生产现场构建先进的自动化系统,以实现数据的实时采集和精确控制,提升生产过程的自动化水平。
|
||||||
- 生产视频系统:整合高效的视频监控系统,对生产过程进行全面监控,确保作业安全,并为管理层提供实时、直观的决策支持。
|
- 生产视频系统:整合高效的视频监控系统,对生产过程进行全面监控,确保作业安全,并为管理层提供实时、直观的决策支持。
|
||||||
- 工业物联网:运用物联网技术,将各种传感器和设备无缝连接,实现数据的远程采集与分析,提高油田运营的透明度和智能化程度。
|
- 工业物联网:运用物联网技术,将各种传感器和设备无缝连接,实现数据的远程采集与分析,提高油田运营的透明度和智能化程度。
|
||||||
|
|
|
@ -15,11 +15,9 @@ toc_max_heading_level: 4
|
||||||

|

|
||||||
|
|
||||||
随着工业数字化的巨浪席卷而来,我们见证了数据采集量的爆炸式增长和分析需求的日益复杂化,随之而来的问题和挑战也愈发凸显。
|
随着工业数字化的巨浪席卷而来,我们见证了数据采集量的爆炸式增长和分析需求的日益复杂化,随之而来的问题和挑战也愈发凸显。
|
||||||
- 海量设备数据采集:在过去的十余年里,制造业的数字化进程取得了显著进展。工厂的数据采集点从传统的数千个激增至数十万甚至数百万个。面对如此庞大的
|
- 海量设备数据采集:在过去的十余年里,制造业的数字化进程取得了显著进展。工厂的数据采集点从传统的数千个激增至数十万甚至数百万个。面对如此庞大的数据采集需求,传统的实时数据库已显得力不从心。
|
||||||
数据采集需求,传统的实时数据库已显得力不从心。
|
|
||||||
- 动态扩容:随着数据的逐步接入,初期的硬件配置往往较为有限。随着业务量的增加和数据量的上升,硬件资源必须迅速扩展以满足业务的正常运行。然而,一旦系统上线运行,通常不允许进行停机扩容,这就要求系统在设计时就要考虑到未来的扩展性。
|
- 动态扩容:随着数据的逐步接入,初期的硬件配置往往较为有限。随着业务量的增加和数据量的上升,硬件资源必须迅速扩展以满足业务的正常运行。然而,一旦系统上线运行,通常不允许进行停机扩容,这就要求系统在设计时就要考虑到未来的扩展性。
|
||||||
- 数据关联与多维分析:传统工业实时数据库通常只包含几个固定的字段,如变量名、变量值、质量戳和时间戳,缺乏信息间的关联性,这使得复杂的多维分析变
|
- 数据关联与多维分析:传统工业实时数据库通常只包含几个固定的字段,如变量名、变量值、质量戳和时间戳,缺乏信息间的关联性,这使得复杂的多维分析变得难以执行。
|
||||||
得难以执行。
|
|
||||||
- 截面查询与插值查询:为了满足报表和其他统计需求,系统需要支持历史截面查询以及按指定时间间隔进行的线性插值查询。
|
- 截面查询与插值查询:为了满足报表和其他统计需求,系统需要支持历史截面查询以及按指定时间间隔进行的线性插值查询。
|
||||||
- 第三方系统数据库对接:除了设备数据以外,还须采集来自各个生产系统的数据,这些系统通常位于过程监控层或生产管理层。这就要求系统能够实时采集数据、迁移历史数据,并在网络断开时能够断线续传。除了 API 以外,常见的对接方式还包括数据库对接,例如,与LIMIS对接,采集其关系型数据库中存储的时序数据,或与第三方生产数据库(如AVEVA PI System或Wonderware系统)对接,获取实时、历史和报警数据。
|
- 第三方系统数据库对接:除了设备数据以外,还须采集来自各个生产系统的数据,这些系统通常位于过程监控层或生产管理层。这就要求系统能够实时采集数据、迁移历史数据,并在网络断开时能够断线续传。除了 API 以外,常见的对接方式还包括数据库对接,例如,与LIMIS对接,采集其关系型数据库中存储的时序数据,或与第三方生产数据库(如AVEVA PI System或Wonderware系统)对接,获取实时、历史和报警数据。
|
||||||
- 与SCADA(Supervisory Control and Data Acquisition,监控控制与数据采集)系统对接:SCADA 系统作为过程监控层的核心,汇集了站内和厂区的所有生产数据,并提供了直观易用的开发、运行和管理界面。然而,其自带的传统实时数据库在分析能力和高密度点位容量上存在限制,通常仅支持约 1 万个点位。因此,将 SCADA 系统与性能更优越的数据库相结合,充分发挥双方的优势,通过面向操作技术层的模块化组态开发,为工业控制系统注入新的活力,已成为工业数字化发展的重要方向。
|
- 与SCADA(Supervisory Control and Data Acquisition,监控控制与数据采集)系统对接:SCADA 系统作为过程监控层的核心,汇集了站内和厂区的所有生产数据,并提供了直观易用的开发、运行和管理界面。然而,其自带的传统实时数据库在分析能力和高密度点位容量上存在限制,通常仅支持约 1 万个点位。因此,将 SCADA 系统与性能更优越的数据库相结合,充分发挥双方的优势,通过面向操作技术层的模块化组态开发,为工业控制系统注入新的活力,已成为工业数字化发展的重要方向。
|
||||||
|
@ -58,7 +56,6 @@ toc_max_heading_level: 4
|
||||||
- 统计意义的降采样同步:TDengine 利用流计算技术,实现了具有统计意义的降采样数据同步。通过这种方式,可以在不损失数据精度的前提下,对数据进行降采样处理,确保即使在数据时间颗粒度增大的情况下,也能保持数据的准确性。流计算的使用方式简便,无须复杂配置,客户只须根据自己的需求编写SQL即可实现。
|
- 统计意义的降采样同步:TDengine 利用流计算技术,实现了具有统计意义的降采样数据同步。通过这种方式,可以在不损失数据精度的前提下,对数据进行降采样处理,确保即使在数据时间颗粒度增大的情况下,也能保持数据的准确性。流计算的使用方式简便,无须复杂配置,客户只须根据自己的需求编写SQL即可实现。
|
||||||
- 订阅式传输:TDengine 采用了类似 Kafka 的消息订阅方式进行数据同步,相较于传统的周期性同步和普通订阅访问,这种方式实现了负载隔离和流量削峰,提高了同步的稳定性和效率。消息订阅机制遵循至少一次消费原则,确保在网络断线故障恢复后,能够从断点处继续消费数据,或者从头开始消费,以保证消费者能够接收到完整的生产数据。
|
- 订阅式传输:TDengine 采用了类似 Kafka 的消息订阅方式进行数据同步,相较于传统的周期性同步和普通订阅访问,这种方式实现了负载隔离和流量削峰,提高了同步的稳定性和效率。消息订阅机制遵循至少一次消费原则,确保在网络断线故障恢复后,能够从断点处继续消费数据,或者从头开始消费,以保证消费者能够接收到完整的生产数据。
|
||||||
- 操作行为同步:TDengine 能够将操作行为同步到中心端,确保设备故障或人为对边缘侧数据的修改和删除操作能够实时反映到中心侧,维护了数据的一致性。
|
- 操作行为同步:TDengine 能够将操作行为同步到中心端,确保设备故障或人为对边缘侧数据的修改和删除操作能够实时反映到中心侧,维护了数据的一致性。
|
||||||
- 数据传输压缩:在数据传输过程中,TDengine实现了高达20%的数据压缩率,结合流计算的降采样同步,显著降低了同步过程对带宽的占用,提高了数据传输
|
- 数据传输压缩:在数据传输过程中,TDengine 实现了高达 20% 的数据压缩率,结合流计算的降采样同步,显著降低了同步过程对带宽的占用,提高了数据传输效率。
|
||||||
效率。
|
|
||||||
- 多种同步方式:TDengine 支持多对一、一对多以及多对多的数据同步模式,满足不同场景下的数据同步需求。
|
- 多种同步方式:TDengine 支持多对一、一对多以及多对多的数据同步模式,满足不同场景下的数据同步需求。
|
||||||
- 支持双活:数据中心侧可实现异地灾备。边缘侧的 TDengine 或第三方客户端能够根据集团中心侧的 TDengine 状态进行智能连接。若主 TDengine 集群发生故障,无法对外提供服务,异地备用的 TDengine 集群将立即激活,接管所有客户端的访问连接,包括写入和查询功能。一旦主 TDengine 集群恢复正常,备用集群会将历史缓存和实时数据同步回主集群,整个过程对客户端透明,无须人工干预。
|
- 支持双活:数据中心侧可实现异地灾备。边缘侧的 TDengine 或第三方客户端能够根据集团中心侧的 TDengine 状态进行智能连接。若主 TDengine 集群发生故障,无法对外提供服务,异地备用的 TDengine 集群将立即激活,接管所有客户端的访问连接,包括写入和查询功能。一旦主 TDengine 集群恢复正常,备用集群会将历史缓存和实时数据同步回主集群,整个过程对客户端透明,无须人工干预。
|
|
@ -16,8 +16,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
在时序数据处理领域,金融机构面临着一系列核心需求与挑战,这些需求与挑战不仅关系到日常运营的效率,还直接影响到决策的准确性和业务的创新能力。
|
在时序数据处理领域,金融机构面临着一系列核心需求与挑战,这些需求与挑战不仅关系到日常运营的效率,还直接影响到决策的准确性和业务的创新能力。
|
||||||
|
|
||||||
- 高性能写入:金融机构需要的是一个能够实时处理巨量数据流的平台。随着交易活动的频繁和市场数据的不断更新,平台必须能够每秒处理数以亿计的数据点,
|
- 高性能写入:金融机构需要的是一个能够实时处理巨量数据流的平台。随着交易活动的频繁和市场数据的不断更新,平台必须能够每秒处理数以亿计的数据点,确保数据的即时性和完整性,以支持实时的交易决策和风险管理。
|
||||||
确保数据的即时性和完整性,以支持实时的交易决策和风险管理。
|
|
||||||
- 强大的读取及数据消费性能:金融市场的特点是业务场景多变,这要求平台必须具备高度的数据读取和计算能力。例如,量化投资策略的研发依赖于实时行情数据和衍生数据的深度分析。平台需要支持高效的数据查询和计算,以便量化分析师能够快速回测模型、优化策略,并进行实时学习和调整。
|
- 强大的读取及数据消费性能:金融市场的特点是业务场景多变,这要求平台必须具备高度的数据读取和计算能力。例如,量化投资策略的研发依赖于实时行情数据和衍生数据的深度分析。平台需要支持高效的数据查询和计算,以便量化分析师能够快速回测模型、优化策略,并进行实时学习和调整。
|
||||||
- 计算性能:资产和衍生品的监控对平台的计算性能提出了更高的要求。金融机构需要能够执行复杂的统计分析、风险预测和价格发现等计算任务,以监控市场动态和评估投资组合的风险。这要求平台不仅要有强大的计算能力,还要能够提供快速响应,以支持实时决策和快速反应市场变化。
|
- 计算性能:资产和衍生品的监控对平台的计算性能提出了更高的要求。金融机构需要能够执行复杂的统计分析、风险预测和价格发现等计算任务,以监控市场动态和评估投资组合的风险。这要求平台不仅要有强大的计算能力,还要能够提供快速响应,以支持实时决策和快速反应市场变化。
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ dnode 在 TDengine 集群中的唯一标识由其实例的 endpoint(EP)决
|
||||||
在集群内部,一个 vnode 由其所归属的 dnode 的 endpoint 和所属的 vgroup ID 唯一标识。管理节点负责创建和管理这些 vnode,确保它们能够正常运行并协同工作。
|
在集群内部,一个 vnode 由其所归属的 dnode 的 endpoint 和所属的 vgroup ID 唯一标识。管理节点负责创建和管理这些 vnode,确保它们能够正常运行并协同工作。
|
||||||
|
|
||||||
**管理节点(mnode):**
|
**管理节点(mnode):**
|
||||||
mnode(管理节点)是 TDengine 集群中的核心逻辑单元,负责监控和维护所有 dnode的运行状态,并在节点之间实现负载均衡(如图 15-1 中的 M1、M2、M3 所示)。作为元数据(包括用户、数据库、超级表等)的存储和管理中心,mnode 也被称为 MetaNode。
|
mnode(管理节点)是 TDengine 集群中的核心逻辑单元,负责监控和维护所有 dnode的运行状态,并在节点之间实现负载均衡(如图 1 中的 M1、M2、M3 所示)。作为元数据(包括用户、数据库、超级表等)的存储和管理中心,mnode 也被称为 MetaNode。
|
||||||
|
|
||||||
为了提高集群的高可用性和可靠性,TDengine 集群允许有多个(最多不超过 3 个)mnode。这些 mnode 自动组成一个虚拟的 mnode 组,共同承担管理职责。mnode 支持多副本,并采用 Raft 一致性协议来确保数据的一致性和操作的可靠性。在 mnode 集群中,任何数据更新操作都必须在 leader 节点上执行。
|
为了提高集群的高可用性和可靠性,TDengine 集群允许有多个(最多不超过 3 个)mnode。这些 mnode 自动组成一个虚拟的 mnode 组,共同承担管理职责。mnode 支持多副本,并采用 Raft 一致性协议来确保数据的一致性和操作的可靠性。在 mnode 集群中,任何数据更新操作都必须在 leader 节点上执行。
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ mnode 集群的第 1 个节点在集群部署时自动创建,而其他节点
|
||||||
为了实现集群内部的信息共享和通信,每个 dnode 通过内部消息交互机制自动获取整个集群中所有 mnode 所在的 dnode 的 endpoint。
|
为了实现集群内部的信息共享和通信,每个 dnode 通过内部消息交互机制自动获取整个集群中所有 mnode 所在的 dnode 的 endpoint。
|
||||||
|
|
||||||
**计算节点(qnode):**
|
**计算节点(qnode):**
|
||||||
qnode(计算节点)是 TDengine 集群中负责执行查询计算任务的虚拟逻辑单元,同时也处理基于系统表的 show 命令。为了提高查询性能和并行处理能力,集群中可以配置多个 qnode,这些 qnode 在整个集群范围内共享使用(如图 15-1 中的 Q1、Q2、Q3 所示)。
|
qnode(计算节点)是 TDengine 集群中负责执行查询计算任务的虚拟逻辑单元,同时也处理基于系统表的 show 命令。为了提高查询性能和并行处理能力,集群中可以配置多个 qnode,这些 qnode 在整个集群范围内共享使用(如图 1 中的 Q1、Q2、Q3 所示)。
|
||||||
|
|
||||||
与 dnode 不同,qnode 并不与特定的数据库绑定,这意味着一个 qnode 可以同时处理来自多个数据库的查询任务。每个 dnode 上最多有一个 qnode,并由其所归属的 dnode 的endpoint 唯一标识。
|
与 dnode 不同,qnode 并不与特定的数据库绑定,这意味着一个 qnode 可以同时处理来自多个数据库的查询任务。每个 dnode 上最多有一个 qnode,并由其所归属的 dnode 的endpoint 唯一标识。
|
||||||
|
|
||||||
|
@ -155,14 +155,14 @@ TDengine 集群可以容纳单个、多个甚至几千个数据节点。应用
|
||||||
|
|
||||||
<center> 图 2 TDengine 典型的操作流程 </center>
|
<center> 图 2 TDengine 典型的操作流程 </center>
|
||||||
|
|
||||||
1. 应用通过 JDBC 或其他 API 接口发起插入数据的请求。
|
- 第 1 步:应用通过 JDBC 或其他 API 接口发起插入数据的请求。
|
||||||
2. taosc 会检查缓存,看是否保存有该表所在数据库的 vgroup-info 信息。如果有,直接到第 4 步。如果没有,taosc 将向 mnode 发出 get vgroup-info 请求。
|
- 第 2 步:taosc 会检查缓存,看是否保存有该表所在数据库的 vgroup-info 信息。如果有,直接到第 4 步。如果没有,taosc 将向 mnode 发出 get vgroup-info 请求。
|
||||||
3. mnode 将该表所在数据库的 vgroup-info 返回给 taosc。Vgroup-info 包含数据库的 vgroup 分布信息(vnode ID 以及所在的 dnode 的 End Point,如果副本数为 N,就有 N 组 End Point),还包含每个 vgroup 中存储数据表的 hash 范围。如果 taosc 迟迟得不到 mnode 回应,而且存在多个 mnode,taosc 将向下一个 mnode 发出请求。
|
- 第 4 步:mnode 将该表所在数据库的 vgroup-info 返回给 taosc。Vgroup-info 包含数据库的 vgroup 分布信息(vnode ID 以及所在的 dnode 的 End Point,如果副本数为 N,就有 N 组 End Point),还包含每个 vgroup 中存储数据表的 hash 范围。如果 taosc 迟迟得不到 mnode 回应,而且存在多个 mnode,taosc 将向下一个 mnode 发出请求。
|
||||||
4. taosc 会继续检查缓存,看是否保存有该表的 meta-data。如果有,直接到第 6 步。如果没有,taosc 将向 vnode 发出 get meta-data 请求。
|
- 第 4 步:taosc 会继续检查缓存,看是否保存有该表的 meta-data。如果有,直接到第 6 步。如果没有,taosc 将向 vnode 发出 get meta-data 请求。
|
||||||
5. vnode 将该表的 meta-data 返回给 taosc。Meta-data 包含有该表的 schema。
|
- 第 5 步:vnode 将该表的 meta-data 返回给 taosc。Meta-data 包含有该表的 schema。
|
||||||
6. taosc 向 leader vnode 发起插入请求。
|
- 第 6 步:taosc 向 leader vnode 发起插入请求。
|
||||||
7. vnode 插入数据后,给 taosc 一个应答,表示插入成功。如果 taosc 迟迟得不到 vnode 的回应,taosc 会认为该节点已经离线。这种情况下,如果被插入的数据库有多个副本,taosc 将向 vgroup 里下一个 vnode 发出插入请求。
|
- 第 7 步:vnode 插入数据后,给 taosc 一个应答,表示插入成功。如果 taosc 迟迟得不到 vnode 的回应,taosc 会认为该节点已经离线。这种情况下,如果被插入的数据库有多个副本,taosc 将向 vgroup 里下一个 vnode 发出插入请求。
|
||||||
8. taosc 通知 APP,写入成功。
|
- 第 8 步:taosc 通知 APP,写入成功。
|
||||||
|
|
||||||
对于第二步,taosc 启动时,并不知道 mnode 的 End Point,因此会直接向配置的集群对外服务的 End Point 发起请求。如果接收到该请求的 dnode 并没有配置 mnode,该 dnode 会在回复的消息中告知 mnode EP 列表,这样 taosc 会重新向新的 mnode 的 EP 发出获取 meta-data 的请求。
|
对于第二步,taosc 启动时,并不知道 mnode 的 End Point,因此会直接向配置的集群对外服务的 End Point 发起请求。如果接收到该请求的 dnode 并没有配置 mnode,该 dnode 会在回复的消息中告知 mnode EP 列表,这样 taosc 会重新向新的 mnode 的 EP 发出获取 meta-data 的请求。
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ TDengine 采用了一种数据驱动的策略来实现缓存数据的持久化
|
||||||
|
|
||||||
每个数据文件块(以 .data 结尾)都配有一个索引文件(以 .head 结尾),该索引文件包含每张表的各个数据文件块的摘要信息,记录了每个数据文件块在数据文件中的偏移量、数据的起始时间和结束时间等信息,以便于快速定位所需数据。此外,每个数据文件块还有一个与之关联的 last 文件(以 .last 结尾),该文件旨在防止数据文件块在落盘时发生碎片化。如果某张表落盘的记录条数未达到数据库参数 minRows(每块最小记录条数)的要求,这些记录将首先存储在 last 文件中,待下次落盘时,新落盘的记录将与 last文件中的记录合并,然后再写入数据文件块。
|
每个数据文件块(以 .data 结尾)都配有一个索引文件(以 .head 结尾),该索引文件包含每张表的各个数据文件块的摘要信息,记录了每个数据文件块在数据文件中的偏移量、数据的起始时间和结束时间等信息,以便于快速定位所需数据。此外,每个数据文件块还有一个与之关联的 last 文件(以 .last 结尾),该文件旨在防止数据文件块在落盘时发生碎片化。如果某张表落盘的记录条数未达到数据库参数 minRows(每块最小记录条数)的要求,这些记录将首先存储在 last 文件中,待下次落盘时,新落盘的记录将与 last文件中的记录合并,然后再写入数据文件块。
|
||||||
|
|
||||||
在数据写入硬盘的过程中,是否对数据进行压缩取决于数据库参数 comp 的设置。TDengine 提供了 3 种压缩选项—无压缩、一级压缩和二级压缩,对应的 comp 值分别为 0、1 和 2。一级压缩会根据数据类型采用相应的压缩算法,如 delta-delta 编码、simple8B 方法、zig-zag 编码、LZ4 等。二级压缩则在一级压缩的基础上进一步使用通用压缩算法,以实现更高的压缩率。
|
在数据写入硬盘的过程中,是否对数据进行压缩取决于数据库参数 comp 的设置。TDengine 提供了 3 种压缩选项—无压缩、一级压缩和二级压缩,对应的 comp 值分别为 0、1 和 2。一级压缩会根据数据类型采用相应的压缩算法,如 delta-delta 编码、simple8B 编码、zig-zag 编码、LZ4 等。二级压缩则在一级压缩的基础上进一步使用通用压缩算法,以实现更高的压缩率。
|
||||||
|
|
||||||
### 预计算
|
### 预计算
|
||||||
|
|
||||||
|
@ -325,7 +325,7 @@ TDengine 采用了一种数据驱动的策略来实现缓存数据的持久化
|
||||||
|
|
||||||
### 多级存储与对象存储
|
### 多级存储与对象存储
|
||||||
|
|
||||||
说明:多级存储功能仅企业版支持,从 2.0.16.0 版本开始提供。
|
说明:多级存储功能仅企业版支持。
|
||||||
|
|
||||||
在默认配置下,TDengine 会将所有数据保存在 /var/lib/taos 目录下,而且每个 vnode 的数据文件保存在该目录下的不同目录。为扩大存储空间,尽量减少文件读取的瓶颈,提高数据吞吐率 TDengine 可通过配置系统参数 dataDir 让多个挂载的硬盘被系统同时使用。
|
在默认配置下,TDengine 会将所有数据保存在 /var/lib/taos 目录下,而且每个 vnode 的数据文件保存在该目录下的不同目录。为扩大存储空间,尽量减少文件读取的瓶颈,提高数据吞吐率 TDengine 可通过配置系统参数 dataDir 让多个挂载的硬盘被系统同时使用。
|
||||||
|
|
||||||
|
|
|
@ -87,14 +87,14 @@ TDengine 为了解决实际应用中对不同数据采集点数据进行高效
|
||||||

|

|
||||||
|
|
||||||
具体步骤说明如下。
|
具体步骤说明如下。
|
||||||
第 1 步,taosc 从 mnode 获取库和表的元数据信息。
|
- 第 1 步,taosc 从 mnode 获取库和表的元数据信息。
|
||||||
第 2 步,mnode 返回请求的元数据信息。
|
- 第 2 步,mnode 返回请求的元数据信息。
|
||||||
第 3 步,taosc 向超级表所属的每个 vnode 发送查询请求。
|
- 第 3 步,taosc 向超级表所属的每个 vnode 发送查询请求。
|
||||||
第 4 步,vnode 启动本地查询,在获得查询结果后返回查询响应。
|
- 第 4 步,vnode 启动本地查询,在获得查询结果后返回查询响应。
|
||||||
第 5 步,taosc 向聚合节点(在本例中为 qnode)发送查询请求。
|
- 第 5 步,taosc 向聚合节点(在本例中为 qnode)发送查询请求。
|
||||||
第 6 步,qnode 向每个 vnode 节点发送数据请求消息来拉取数据。
|
- 第 6 步,qnode 向每个 vnode 节点发送数据请求消息来拉取数据。
|
||||||
第 7 步,vnode 返回本节点的查询计算结果。
|
- 第 7 步,vnode 返回本节点的查询计算结果。
|
||||||
第 8 步,qnode 完成多节点数据聚合后将最终查询结果返回给客户端。
|
- 第 8 步,qnode 完成多节点数据聚合后将最终查询结果返回给客户端。
|
||||||
|
|
||||||
TDengine 为了提升聚合计算速度,在 vnode 内实现了标签数据与时序数据的分离存储。首先,系统会在内存中过滤标签数据,以确定需要参与聚合操作的表的集合。这样做可以显著减少需要扫描的数据集,从而大幅提高聚合计算的速度。
|
TDengine 为了提升聚合计算速度,在 vnode 内实现了标签数据与时序数据的分离存储。首先,系统会在内存中过滤标签数据,以确定需要参与聚合操作的表的集合。这样做可以显著减少需要扫描的数据集,从而大幅提高聚合计算的速度。
|
||||||
|
|
||||||
|
@ -127,6 +127,6 @@ TDengine 针对不同类型的缓存对象采用了相应的缓存管理策略
|
||||||

|

|
||||||
|
|
||||||
- 元数据缓存(meta data):包括数据库、超级表、用户、节点、视图、虚拟节点等信息,以及表的 schema 和其所在虚拟节点的映射关系。通过在 taosc 缓存元数据可以避免频繁地向 mnode/vnode 请求元数据。taosc 对元数据的缓存采用固定大小的缓存空间,先到先得,直到缓存空间用完。当缓存空间用完时,缓存会被进行部分淘汰处理,用来缓存新进请求所需要的元数据。
|
- 元数据缓存(meta data):包括数据库、超级表、用户、节点、视图、虚拟节点等信息,以及表的 schema 和其所在虚拟节点的映射关系。通过在 taosc 缓存元数据可以避免频繁地向 mnode/vnode 请求元数据。taosc 对元数据的缓存采用固定大小的缓存空间,先到先得,直到缓存空间用完。当缓存空间用完时,缓存会被进行部分淘汰处理,用来缓存新进请求所需要的元数据。
|
||||||
- 时序数据缓存(time series data):时序数据首先被缓存在 vnode 的内存中,以SkipList 形式组织,当达到落盘条件后,将时序数据进行压缩,写入数据存储文件
|
- 时序数据缓存(time series data):时序数据首先被缓存在 vnode 的内存中,以 skipList 形式组织,当达到落盘条件后,将时序数据进行压缩,写入数据存储文件
|
||||||
中,并从缓存中清除。
|
中,并从缓存中清除。
|
||||||
- 最新数据缓存(last/last_row):对时序数据中的最新数据进行缓存,可以提高最新数据的查询效率。最新数据以子表为单元组织成 KV 形式,其中,K 是子表 ID,V 是该子表中每列的最后一个非 NULL 以及最新的一行数据。
|
- 最新数据缓存(last/last_row):对时序数据中的最新数据进行缓存,可以提高最新数据的查询效率。最新数据以子表为单元组织成 KV 形式,其中,K 是子表 ID,V 是该子表中每列的最后一个非 NULL 以及最新的一行数据。
|
|
@ -13,8 +13,7 @@ TDengine 流计算的架构如下图所示。当用户输入用于创建流的 S
|
||||||
mnode 包含与流计算相关的如下 4 个逻辑模块。
|
mnode 包含与流计算相关的如下 4 个逻辑模块。
|
||||||
- 任务调度,负责将逻辑执行计划转化为物理执行计划,并下发到每个 vnode。
|
- 任务调度,负责将逻辑执行计划转化为物理执行计划,并下发到每个 vnode。
|
||||||
- meta store,负责存储流计算任务的元数据信息以及流任务相应的 DAG 信息。
|
- meta store,负责存储流计算任务的元数据信息以及流任务相应的 DAG 信息。
|
||||||
- 检查点调度,负责定期生成检查点(checkpoint)事务,并下发到各 source task(源
|
- 检查点调度,负责定期生成检查点(checkpoint)事务,并下发到各 source task(源任务)。
|
||||||
任务)。
|
|
||||||
- exec 监控,负责接收上报的心跳、更新 mnode 中各任务的执行状态,以及定期监控检查点执行状态和 DAG 变动信息。
|
- exec 监控,负责接收上报的心跳、更新 mnode 中各任务的执行状态,以及定期监控检查点执行状态和 DAG 变动信息。
|
||||||
|
|
||||||
此外,mnode 还承担着向流计算任务下发控制命令的重要角色,这些命令包括但不限于暂停、恢复执行、删除流任务及更新流任务的上下游信息等。
|
此外,mnode 还承担着向流计算任务下发控制命令的重要角色,这些命令包括但不限于暂停、恢复执行、删除流任务及更新流任务的上下游信息等。
|
||||||
|
@ -67,7 +66,7 @@ TDengine 的流计算功能允许根据记录的事件时间将数据划分到
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
按照流任务承担任务的不同,可将其划分为 3 个类别—source task(源任务)、agg task(聚合任务)和 sink task(写回任务)。
|
按照流任务承担任务的不同,可将其划分为 3 个类别:source task(源任务)、agg task(聚合任务)和 sink task(写回任务)。
|
||||||
|
|
||||||
### source task
|
### source task
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ TDengine 通过日志文件记录系统运行状态,帮助用户监控系统
|
||||||
### 普通日志实现逻辑
|
### 普通日志实现逻辑
|
||||||
|
|
||||||
- 普通日志分同步和异步两种方式,同步立即写入日志文件,异步写入到 buff 里,然后定时写入日志文件。
|
- 普通日志分同步和异步两种方式,同步立即写入日志文件,异步写入到 buff 里,然后定时写入日志文件。
|
||||||
- 异步方式日志文件缓存在循环 buff 里, buff 的大小为 buffSize = 20 M。如果某次写buf 的日志大小大于buf 可用空间,本次日志会舍弃,日志里记录: ...Lost N lines here...
|
- 异步方式日志文件缓存在循环 buff 里, buff 的大小为 buffSize = 20M。如果某次写 buf 的日志大小大于buf 可用空间,本次日志会舍弃,日志里记录: ...Lost N lines here...
|
||||||

|

|
||||||
- 异步线程里每隔 1s 会更新磁盘信息用于判断是否有空间写日志
|
- 异步线程里每隔 1s 会更新磁盘信息用于判断是否有空间写日志
|
||||||
- 异步线程每隔 Interval 时间处理一次写入逻辑。写入规则如下:
|
- 异步线程每隔 Interval 时间处理一次写入逻辑。写入规则如下:
|
||||||
|
@ -69,13 +69,13 @@ TDengine 通过日志文件记录系统运行状态,帮助用户监控系统
|
||||||
- 因为上报数据和删除文件里的上报内容没法作为一个原子操作,所以如果上报后还没删除数据就 crash,可能导致下次重复上报,重复上报的数据会覆盖,并没丢失,影响很小。
|
- 因为上报数据和删除文件里的上报内容没法作为一个原子操作,所以如果上报后还没删除数据就 crash,可能导致下次重复上报,重复上报的数据会覆盖,并没丢失,影响很小。
|
||||||
- 另外为了保证性能,slow log thread 线程把慢 sql 日志写入临时文件缓存,只保证刷新到操作系统的磁盘缓冲区,并不真正每次都 fsync 到磁盘,所以如果机器断电,仍可能丢失数据。该异常出现概率很小,可以容忍此种情况下的数据丢失。
|
- 另外为了保证性能,slow log thread 线程把慢 sql 日志写入临时文件缓存,只保证刷新到操作系统的磁盘缓冲区,并不真正每次都 fsync 到磁盘,所以如果机器断电,仍可能丢失数据。该异常出现概率很小,可以容忍此种情况下的数据丢失。
|
||||||
### 慢日志行为说明
|
### 慢日志行为说明
|
||||||
- 慢日志一方面会记录到本地慢日志文件中,另一方面会通过 taosAdapter 发送到 taosKeeper 进行结构化存储(需打开 monitorr 开关)。
|
- 慢日志一方面会记录到本地慢日志文件中,另一方面会通过 taosAdapter 发送到 taosKeeper 进行结构化存储(需打开 monitor 开关)。
|
||||||
- 慢日志文件存储规则为:
|
- 慢日志文件存储规则为:
|
||||||
- 慢日志文件一天一个,如果当天没有慢日志,没有当天的文件。
|
- 慢日志文件一天一个,如果当天没有慢日志,没有当天的文件。
|
||||||
- 文件名为 taosSlowLog.yyyy-mm-dd(taosSlowLog.2024-08-02),日志存储路径通过 logDir 配置。
|
- 文件名为 taosSlowLog.yyyy-mm-dd(taosSlowLog.2024-08-02),日志存储路径通过 logDir 配置。
|
||||||
- 多个客户端的日志存储在相应日志路径下的同一个 taosSlowLog.yyyy.mm.dd 文件里。
|
- 多个客户端的日志存储在相应日志路径下的同一个 taosSlowLog.yyyy.mm.dd 文件里。
|
||||||
- 慢日志文件不自动删除,不压缩。
|
- 慢日志文件不自动删除,不压缩。
|
||||||
- 使用和普通日志文件相同的三个参数 logDir, minimalLogDirGB, asyncLog。另外两个参数 numOfLogLines,logKeepDays 不适用于慢日志。
|
- 使用和普通日志文件相同的三个参数 logDir、minimalLogDirGB、asyncLog。另外两个参数 numOfLogLines、logKeepDays 不适用于慢日志。
|
||||||
|
|
||||||
## 日志级别说明
|
## 日志级别说明
|
||||||
|
|
||||||
|
|
|
@ -7,20 +7,20 @@ description: 一些常见问题的解决方法汇总
|
||||||
|
|
||||||
如果 FAQ 中的信息不能够帮到您,需要 TDengine 技术团队的技术支持与协助,请将以下两个目录中内容打包:
|
如果 FAQ 中的信息不能够帮到您,需要 TDengine 技术团队的技术支持与协助,请将以下两个目录中内容打包:
|
||||||
|
|
||||||
1. /var/log/taos (如果没有修改过默认路径)
|
1. `/var/log/taos` (如果没有修改过默认路径)
|
||||||
2. /etc/taos(如果没有指定其他配置文件路径)
|
2. `/etc/taos` (如果没有指定其他配置文件路径)
|
||||||
|
|
||||||
附上必要的问题描述,包括使用的 TDengine 版本信息、平台环境信息、发生该问题的执行操作、出现问题的表征及大概的时间,在 [GitHub](https://github.com/taosdata/TDengine) 提交 issue。
|
附上必要的问题描述,包括使用的 TDengine 版本信息、平台环境信息、发生该问题的执行操作、出现问题的表征及大概的时间,在 [GitHub](https://github.com/taosdata/TDengine) 提交 issue。
|
||||||
|
|
||||||
为了保证有足够的 debug 信息,如果问题能够重复,请修改/etc/taos/taos.cfg 文件,最后面添加一行“debugFlag 135"(不带引号本身),然后重启 taosd, 重复问题,然后再递交。也可以通过如下 SQL 语句,临时设置 taosd 的日志级别。
|
为了保证有足够的 debug 信息,如果问题能够重复,请修改 `/etc/taos/taos.cfg` 文件,最后面添加一行 `debugFlag 135`,然后重启 taosd, 重复问题,然后再递交。也可以通过如下 SQL 语句,临时设置 taosd 的日志级别。
|
||||||
|
|
||||||
```
|
```
|
||||||
alter dnode <dnode_id> 'debugFlag' '135';
|
alter dnode <dnode_id> 'debugFlag' '135';
|
||||||
```
|
```
|
||||||
|
|
||||||
其中 dnode_id 请从 show dnodes; 命令输出中获取。
|
其中 dnode_id 请从 `show dnodes` 命令输出中获取。
|
||||||
|
|
||||||
但系统正常运行时,请一定将 debugFlag 设置为 131,否则会产生大量的日志信息,降低系统效率。
|
但系统正常运行时,请一定将 debugFlag 设置为 `131`,否则会产生大量的日志信息,降低系统效率。
|
||||||
|
|
||||||
## 常见问题列表
|
## 常见问题列表
|
||||||
|
|
||||||
|
@ -56,17 +56,17 @@ description: 一些常见问题的解决方法汇总
|
||||||
|
|
||||||
3. 在服务器,执行 `systemctl status taosd` 检查 *taosd* 运行状态。如果没有运行,启动 *taosd*
|
3. 在服务器,执行 `systemctl status taosd` 检查 *taosd* 运行状态。如果没有运行,启动 *taosd*
|
||||||
|
|
||||||
4. 确认客户端连接时指定了正确的服务器 FQDN (Fully Qualified Domain Name —— 可在服务器上执行 Linux/macOS 命令 hostname -f 获得),FQDN 配置参考:[一篇文章说清楚 TDengine 的 FQDN](https://www.taosdata.com/blog/2020/09/11/1824.html)。
|
4. 确认客户端连接时指定了正确的服务器 FQDN (Fully Qualified Domain Name —— 可在服务器上执行 Linux/macOS 命令 `hostname -f` 获得),FQDN 配置参考 [一篇文章说清楚 TDengine 的 FQDN](https://www.taosdata.com/blog/2020/09/11/1824.html)。
|
||||||
|
|
||||||
5. ping 服务器 FQDN,如果没有反应,请检查你的网络,DNS 设置,或客户端所在计算机的系统 hosts 文件。如果部署的是 TDengine 集群,客户端需要能 ping 通所有集群节点的 FQDN。
|
5. ping 服务器 FQDN,如果没有反应,请检查你的网络,DNS 设置,或客户端所在计算机的系统 hosts 文件。如果部署的是 TDengine 集群,客户端需要能 ping 通所有集群节点的 FQDN。
|
||||||
|
|
||||||
6. 检查防火墙设置(Ubuntu 使用 ufw status,CentOS 使用 firewall-cmd --list-port),确保集群中所有主机在端口 6030/6041 上的 TCP/UDP 协议能够互通。
|
6. 检查防火墙设置(Ubuntu 使用 ufw status,CentOS 使用 firewall-cmd --list-port),确保集群中所有主机在端口 6030/6041 上的 TCP/UDP 协议能够互通。
|
||||||
|
|
||||||
7. 对于 Linux 上的 JDBC(ODBC, Python, Go 等接口类似)连接, 确保*libtaos.so*在目录*/usr/local/taos/driver*里, 并且*/usr/local/taos/driver*在系统库函数搜索路径*LD_LIBRARY_PATH*里
|
7. 对于 Linux 上的 JDBC(ODBC、Python、Go 等接口类似)连接,确保 *libtaos.so* 在目录 */usr/local/taos/driver* 里,并且 */usr/local/taos/driver* 在系统库函数搜索路径 *LD_LIBRARY_PATH* 里
|
||||||
|
|
||||||
8. 对于 macOS 上的 JDBC(ODBC, Python, Go 等接口类似)连接, 确保*libtaos.dylib*在目录*/usr/local/lib*里, 并且*/usr/local/lib*在系统库函数搜索路径*LD_LIBRARY_PATH*里
|
8. 对于 macOS 上的 JDBC(ODBC、Python、Go 等接口类似)连接,确保 *libtaos.dylib* 在目录 */usr/local/lib* 里,并且 */usr/local/lib* 在系统库函数搜索路径 *LD_LIBRARY_PATH* 里
|
||||||
|
|
||||||
9. 对于 Windows 上的 JDBC, ODBC, Python, Go 等连接,确保*C:\TDengine\driver\taos.dll*在你的系统库函数搜索目录里 (建议*taos.dll*放在目录 _C:\Windows\System32_)
|
9. 对于 Windows 上的 JDBC、ODBC、Python、Go 等连接,确保 *C:\TDengine\driver\taos.dll* 在你的系统库函数搜索目录里 (建议 *taos.dll* 放在目录 _C:\Windows\System32_)
|
||||||
|
|
||||||
10. 如果仍不能排除连接故障
|
10. 如果仍不能排除连接故障
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ description: 一些常见问题的解决方法汇总
|
||||||
检查服务器侧 TCP 端口连接是否工作:`nc -l {port}`
|
检查服务器侧 TCP 端口连接是否工作:`nc -l {port}`
|
||||||
检查客户端侧 TCP 端口连接是否工作:`nc {hostIP} {port}`
|
检查客户端侧 TCP 端口连接是否工作:`nc {hostIP} {port}`
|
||||||
|
|
||||||
- Windows 系统请使用 PowerShell 命令 Test-NetConnection -ComputerName \{fqdn} -Port \{port} 检测服务段端口是否访问
|
- Windows 系统请使用 PowerShell 命令 `Test-NetConnection -ComputerName \{fqdn} -Port \{port}` 检测服务段端口是否访问
|
||||||
|
|
||||||
11. 也可以使用 taos 程序内嵌的网络连通检测功能,来验证服务器和客户端之间指定的端口连接是否通畅:[运维指南](../../operation)。
|
11. 也可以使用 taos 程序内嵌的网络连通检测功能,来验证服务器和客户端之间指定的端口连接是否通畅:[运维指南](../../operation)。
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ local_option: {
|
||||||
|
|
||||||
其含义是,在当前的命令行程序下,清空本机所有客户端生成的日志文件(resetLog),或修改一个特定模块的日志记录级别(只对当前命令行程序有效,如果 taos 命令行程序重启,则需要重新设置):
|
其含义是,在当前的命令行程序下,清空本机所有客户端生成的日志文件(resetLog),或修改一个特定模块的日志记录级别(只对当前命令行程序有效,如果 taos 命令行程序重启,则需要重新设置):
|
||||||
|
|
||||||
- value 的取值可以是:131(输出错误和警告日志),135( 输出错误、警告和调试日志),143( 输出错误、警告、调试和跟踪日志)。
|
- value 的取值可以是:131(输出错误和警告日志)、135( 输出错误、警告和调试日志)、143( 输出错误、警告、调试和跟踪日志)。
|
||||||
|
|
||||||
### 12. go 语言编写组件编译失败怎样解决?
|
### 12. go 语言编写组件编译失败怎样解决?
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ TDengine 中时间戳的时区总是由客户端进行处理,而与服务端
|
||||||
|
|
||||||
这个现象可能是因为 taosAdapter 没有被正确启动引起的,需要执行:```systemctl start taosadapter``` 命令来启动 taosAdapter 服务。
|
这个现象可能是因为 taosAdapter 没有被正确启动引起的,需要执行:```systemctl start taosadapter``` 命令来启动 taosAdapter 服务。
|
||||||
|
|
||||||
需要说明的是,taosAdapter 的日志路径 path 需要单独配置,默认路径是 /var/log/taos ;日志等级 logLevel 有 8 个等级,默认等级是 info ,配置成 panic 可关闭日志输出。请注意操作系统 / 目录的空间大小,可通过命令行参数、环境变量或配置文件来修改配置,默认配置文件是 /etc/taos/taosadapter.toml 。
|
需要说明的是,taosAdapter 的日志路径 path 需要单独配置,默认路径是 /var/log/taos ;日志等级 logLevel 有 8 个等级,默认等级是 info ,配置成 panic 可关闭日志输出。请注意操作系统 `/` 目录的空间大小,可通过命令行参数、环境变量或配置文件来修改配置,默认配置文件是 /etc/taos/taosadapter.toml 。
|
||||||
|
|
||||||
有关 taosAdapter 组件的详细介绍请看文档:[taosAdapter](../../reference/components/taosadapter/)
|
有关 taosAdapter 组件的详细介绍请看文档:[taosAdapter](../../reference/components/taosadapter/)
|
||||||
|
|
||||||
|
@ -254,19 +254,19 @@ launchctl limit maxfiles
|
||||||
TDengine 中的所有名称,包括数据库名、表名等都是区分大小写的,如果这些名称在程序或 TDengine CLI 中没有使用反引号(`)括起来使用,即使你输入的是大写的,引擎也会转化成小写来使用,如果名称前后加上了反引号,引擎就不会再转化成小写,会保持原样来使用。
|
TDengine 中的所有名称,包括数据库名、表名等都是区分大小写的,如果这些名称在程序或 TDengine CLI 中没有使用反引号(`)括起来使用,即使你输入的是大写的,引擎也会转化成小写来使用,如果名称前后加上了反引号,引擎就不会再转化成小写,会保持原样来使用。
|
||||||
|
|
||||||
### 23 在 TDengine CLI中查询,字段内容不能完全显示出来怎么办?
|
### 23 在 TDengine CLI中查询,字段内容不能完全显示出来怎么办?
|
||||||
可以使用 \G 参数来竖式显示,如 show databases\G; (为了输入方便,在"\"后加 TAB 键,会自动补全后面的内容)
|
可以使用 `\G` 参数来竖式显示,如 `show databases\G;` (为了输入方便,在"\"后加 TAB 键,会自动补全后面的内容)
|
||||||
|
|
||||||
### 24 使用 taosBenchmark 测试工具写入数据查询很快,为什么我写入的数据查询非常慢?
|
### 24 使用 taosBenchmark 测试工具写入数据查询很快,为什么我写入的数据查询非常慢?
|
||||||
TDengine 在写入数据时如果有很严重的乱序写入问题,会严重影响查询性能,所以需要在写入前解决乱序的问题。如果业务是从 kafka 消费写入,请合理设计消费者,尽可能的一个子表数据由一个消费者去消费并写入,避免由设计产生的乱序。
|
TDengine 在写入数据时如果有很严重的乱序写入问题,会严重影响查询性能,所以需要在写入前解决乱序的问题。如果业务是从 Kafka 消费写入,请合理设计消费者,尽可能的一个子表数据由一个消费者去消费并写入,避免由设计产生的乱序。
|
||||||
|
|
||||||
### 25 我想统计下前后两条写入记录之间的时间差值是多少?
|
### 25 我想统计下前后两条写入记录之间的时间差值是多少?
|
||||||
使用 DIFF 函数,可以查看时间列或数值列前后两条记录的差值,非常方便,详细说明见 SQL 手册->函数->DIFF
|
使用 DIFF 函数,可以查看时间列或数值列前后两条记录的差值,非常方便,详细说明见 SQL 手册->函数->DIFF
|
||||||
|
|
||||||
### 26 遇到报错 “DND ERROR Version not compatible,cliver : 3000700swr wer : 3020300”
|
### 26 遇到报错 “DND ERROR Version not compatible, client: 3000700, server: 3020300”
|
||||||
说明客户端和服务端版本不兼容,这里cliver的版本是3.0.7.0,server版本是 3.2.3.0。目前的兼容策略是前三位一致,client 和 sever才能兼容。
|
说明客户端和服务端版本不兼容,这里 client 的版本是 3.0.7.0,server 版本是 3.2.3.0。目前的兼容策略是前三位一致,client 和 sever 才能兼容。
|
||||||
|
|
||||||
### 27 修改 database 的 root 密码后,启动 taos 遇到报错 “failed to connect to server, reason: Authentication failure”
|
### 27 修改 database 的 root 密码后,启动 taos 遇到报错 “failed to connect to server, reason: Authentication failure”
|
||||||
默认情况,启动taos服务会使用系统默认的用户名(root)和密码尝试连接taosd,在root密码修改后,启用taos连接就需要指明用户名和密码,例如: taos -h xxx.xxx.xxx.xxx -u root -p,然后输入新密码进行连接。
|
默认情况,启动taos服务会使用系统默认的用户名(root)和密码尝试连接 taosd,在 root 密码修改后,启用 taos 连接就需要指明用户名和密码,例如 `taos -h xxx.xxx.xxx.xxx -u root -p`,然后输入新密码进行连接。
|
||||||
|
|
||||||
### 28 修改 database 的 root 密码后,Grafana 监控插件 TDinsight 无数据展示
|
### 28 修改 database 的 root 密码后,Grafana 监控插件 TDinsight 无数据展示
|
||||||
TDinsight 插件中展示的数据是通过 taosKeeper 和 taosAdapter 服务收集并存储于 TD 的 log 库中,在 root 密码修改后,需要同步更新 taosKeeper 和 taosAdapter 配置文件中对应的密码信息,然后重启 taosKeeper 和 taosAdapter 服务(注:若是集群需要重启每个节点上的对应服务)。
|
TDinsight 插件中展示的数据是通过 taosKeeper 和 taosAdapter 服务收集并存储于 TD 的 log 库中,在 root 密码修改后,需要同步更新 taosKeeper 和 taosAdapter 配置文件中对应的密码信息,然后重启 taosKeeper 和 taosAdapter 服务(注:若是集群需要重启每个节点上的对应服务)。
|
||||||
|
@ -277,11 +277,11 @@ TDinsight插件中展示的数据是通过taosKeeper和taosAdapter服务收集
|
||||||
### 30 为什么开源版 TDengine 的主进程会建立一个与公网的连接?
|
### 30 为什么开源版 TDengine 的主进程会建立一个与公网的连接?
|
||||||
这个连接只会上报不涉及任何用户数据的最基本信息,用于官方了解产品在世界范围内的分布情况,进而优化产品,提升用户体验,具体采集项目为:集群名、操作系统版本、cpu信息等。
|
这个连接只会上报不涉及任何用户数据的最基本信息,用于官方了解产品在世界范围内的分布情况,进而优化产品,提升用户体验,具体采集项目为:集群名、操作系统版本、cpu信息等。
|
||||||
|
|
||||||
该特性为可选配置项,在开源版中默认开启,具体参数为 telemetryReporting , 在官方文档中有做说明,链接如下:[参数简介](https://docs.taosdata.com/reference/components/taosd/#%E7%9B%91%E6%8E%A7%E7%9B%B8%E5%85%B3)
|
该特性为可选配置项,在开源版中默认开启,具体参数为 telemetryReporting,在官方文档中有做说明,链接如下:[参数简介](https://docs.taosdata.com/reference/components/taosd/#%E7%9B%91%E6%8E%A7%E7%9B%B8%E5%85%B3)
|
||||||
|
|
||||||
您可以随时关闭该参数,只需要在taos.cfg 中修改 telemetryReporting 为 0,然后重启数据库服务即可。
|
您可以随时关闭该参数,只需要在taos.cfg 中修改 telemetryReporting 为 0,然后重启数据库服务即可。
|
||||||
|
|
||||||
代码位于:[点击此处](https://github.com/taosdata/TDengine/blob/62e609c558deb764a37d1a01ba84bc35115a85a4/source/dnode/mnode/impl/src/mndTelem.c)
|
代码位于:[点击此处](https://github.com/taosdata/TDengine/blob/62e609c558deb764a37d1a01ba84bc35115a85a4/source/dnode/mnode/impl/src/mndTelem.c)
|
||||||
|
|
||||||
此外,对于安全性要求极高的企业版 TDengine Enterprise 来说,此参数不会工作。
|
此外,对于安全性要求极高的企业版 TDengine Enterprise 来说,此参数不会工作。
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,10 @@ TDengine 3.x 各版本安装包下载链接如下:
|
||||||
|
|
||||||
import Release from "/components/ReleaseV3";
|
import Release from "/components/ReleaseV3";
|
||||||
|
|
||||||
|
## 3.3.5.8
|
||||||
|
|
||||||
|
<Release type="tdengine" version="3.3.5.8" />
|
||||||
|
|
||||||
## 3.3.5.2
|
## 3.3.5.2
|
||||||
|
|
||||||
<Release type="tdengine" version="3.3.5.2" />
|
<Release type="tdengine" version="3.3.5.2" />
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
---
|
||||||
|
title: 3.3.5.8 版本说明
|
||||||
|
sidebar_label: 3.3.5.8
|
||||||
|
description: 3.3.5.8 版本说明
|
||||||
|
---
|
||||||
|
|
||||||
|
## 特性
|
||||||
|
1. 特性:JDBC 支持 ONLY META 订阅
|
||||||
|
2. 特性:Grafana 插件 SQL 编辑支持多行
|
||||||
|
3. 特性:ODBC 支持 VARBINARY/GEOMETRY 类型
|
||||||
|
4. 特性:支持 Excel 通过 ODBC 驱动连接 TDengine
|
||||||
|
5. 特性:taosX agent 支持指定本地端口
|
||||||
|
|
||||||
|
## 优化
|
||||||
|
1. 优化:WebSocket 连接订阅消息为空时,支持获取错误
|
||||||
|
2. 优化:JDBC 支持无符号整数
|
||||||
|
3. 优化:MQTT/Kafka/CSV 新增写并发参数
|
||||||
|
4. 优化:开源版本 TDengine 支持与 TDgpt 对接
|
||||||
|
5. 优化:Flink 连接器支持 BinaryRowData 数据传输类型
|
||||||
|
6. 优化:参数绑定 SQL 语句中,LIMIT 子句支持使用 ? 作为参数占位符
|
||||||
|
7. 优化:taosX 备份开启 WebSocket 压缩
|
||||||
|
8. 优化:ODBC SQLSetStmtAttr 支持 SQL_ROWSET_SIZE 属性
|
||||||
|
9. 优化:TMQ 数据同步任务新增 Number Of Writters/Consumers 等参数
|
||||||
|
10. 优化:mac 安装包增加连接器文件
|
||||||
|
11. 优化:Rust 连接器支持订阅结果为空时的错误处理
|
||||||
|
12. 优化:TSBS 支持生成 CSV 文件
|
||||||
|
13. 优化:TDinsight 添加连接分类信息
|
||||||
|
14. 优化:Explorer float 显示精度与 taos shell 一致
|
||||||
|
15. 优化:Flink 连接器 Table 支持更新和删除操作
|
||||||
|
16. 优化:taosX Agent 在 taosX 无法连接时可重试恢复
|
||||||
|
|
||||||
|
## 修复
|
||||||
|
1. 修复:Explorer 注册邮箱支持包含 "."
|
||||||
|
2. 修复:AWS 云存储下 taosAdapter flock 失败
|
||||||
|
3. 修复:修改子表中布尔类型标签的值时,数据订阅的元数据返回结果存在错误
|
||||||
|
4. 修复:Explorer 导入 CSV 时列包含空格时预览将失效
|
||||||
|
5. 修复:解决 stmtbind 线程在系统处于空闲状态时 CPU 占用过高的问题
|
||||||
|
6. 修复:数据源任务不再处理数据时健康状态恢复为 Idle
|
||||||
|
7. 修复:JDBC 示例代码安全漏洞
|
||||||
|
8. 修复:taosX 平滑升级
|
||||||
|
9. 修复:ODBC 调用 SQLSetConnectAttr 设置 SQL_ATTR_TXN_ISOLATION 时 core
|
||||||
|
10. 修复:received/processed_messages 当前运行指标重启未清零
|
||||||
|
11. 修复:使用 taosX 恢复数据时,若未指定数据库,系统可能崩溃
|
||||||
|
12. 修复:创建数据库时,keep_time_offset 选项支持使用后缀 h和 d 来指定时间值
|
||||||
|
13. 修复:删除流计算时可能的死锁
|
||||||
|
14. 修复:双副本数据库在某个 dnode 断网后写入数据失败的问题
|
||||||
|
15. 修复:查询 information_schema.ins_tables 表时,如果 mnode 的 Leader 发生变更,可能会触发 Sync leader is unreachable 错误
|
||||||
|
16. 修复:数据重新整理后,涉及复合主键的时间过滤查询结果出现错误的问题
|
||||||
|
17. 修复:当主键列的连接条件为非简单等值条件时,可能导致 JOIN 结果出现错误
|
||||||
|
18. 修复:Python WebSocket 连接器 Cusor.fetchmany 接口自定义长度问题
|
||||||
|
19. 修复:Show Grants 命令返回的列数目不正确的问题
|
||||||
|
20. 修复:备份计划未启动时查看备份点列表不符合预期
|
||||||
|
21. 修复:taosX 任务写入中断后未重新启动
|
||||||
|
22. 修复:JDBC select server_version() 结果未释放导致内存持续增长
|
||||||
|
23. 修复:在使用 WHERE tbname IN () 语句时,如果筛选出的子表不属于同一超级表,执行 LAST 查询可能会导致 taosd 崩溃
|
||||||
|
24. 修复:taosd 异常退出并再次启动后,如果未进入数据文件的 WAL 过大,可能导致启动时 oom
|
||||||
|
25. 修复:在使用 interp 插值填充时,如果 select list 中包含字符串常量或字符串标签列,返回的字符串内容可能会出现缺失的情况[#29353](https://github.com/taosdata/TDengine/issues/29353)
|
||||||
|
26. 修复:在超级表上执行 JOIN 查询时,将子查询用作右表可能会导致结果缺失
|
||||||
|
27. 修复:同时使用 DISTINCT 和 ORDER BY 关键字时出现的语法错误问题[#29263](https://github.com/taosdata/TDengine/issues/29263)
|
||||||
|
28. 修复:使用 CAST 函数将浮点数转换为字符串后进行比较时,可能会因精度丢失而导致结果不准确[#29382](https://github.com/taosdata/TDengine/issues/29382)
|
||||||
|
29. 修复:在从 3.3.4 版本升级到 3.3.5 版本后,如果配置的字符集在系统中不存在,taosd 服务将无法正常启动
|
||||||
|
30. 修复:websocket 接口 timing 字段有时为负值
|
||||||
|
31. 修复:taosX 备份任务显示备份点重复
|
||||||
|
32. 修复:配置项 s3BucketName 被误设为全局变量参数,导致文件上传到 S3 失败
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#define TDENGINE_STREAMMSG_H
|
#define TDENGINE_STREAMMSG_H
|
||||||
|
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
//#include "trpc.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -256,6 +255,14 @@ typedef struct {
|
||||||
int32_t tEncodeStreamTaskRunReq(SEncoder* pEncoder, const SStreamTaskRunReq* pReq);
|
int32_t tEncodeStreamTaskRunReq(SEncoder* pEncoder, const SStreamTaskRunReq* pReq);
|
||||||
int32_t tDecodeStreamTaskRunReq(SDecoder* pDecoder, SStreamTaskRunReq* pReq);
|
int32_t tDecodeStreamTaskRunReq(SDecoder* pDecoder, SStreamTaskRunReq* pReq);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMsgHead head;
|
||||||
|
int64_t streamId;
|
||||||
|
} SStreamTaskStopReq;
|
||||||
|
|
||||||
|
int32_t tEncodeStreamTaskStopReq(SEncoder* pEncoder, const SStreamTaskStopReq* pReq);
|
||||||
|
int32_t tDecodeStreamTaskStopReq(SDecoder* pDecoder, SStreamTaskStopReq* pReq);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -25,11 +25,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ANAL_FORECAST_DEFAULT_ROWS 10
|
#define ANALY_FORECAST_DEFAULT_ROWS 10
|
||||||
#define ANAL_FORECAST_DEFAULT_CONF 95
|
#define ANALY_FORECAST_DEFAULT_CONF 95
|
||||||
#define ANAL_FORECAST_DEFAULT_WNCHECK 1
|
#define ANALY_FORECAST_DEFAULT_WNCHECK 1
|
||||||
#define ANAL_FORECAST_MAX_ROWS 40000
|
#define ANALY_FORECAST_MAX_HISTORY_ROWS 40000
|
||||||
#define ANAL_ANOMALY_WINDOW_MAX_ROWS 40000
|
#define ANALY_MAX_FC_ROWS 1024
|
||||||
|
#define ANALY_ANOMALY_WINDOW_MAX_ROWS 40000
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EAnalAlgoType type;
|
EAnalAlgoType type;
|
||||||
|
@ -65,30 +66,30 @@ typedef struct {
|
||||||
|
|
||||||
int32_t taosAnalyticsInit();
|
int32_t taosAnalyticsInit();
|
||||||
void taosAnalyticsCleanup();
|
void taosAnalyticsCleanup();
|
||||||
SJson *taosAnalSendReqRetJson(const char *url, EAnalHttpType type, SAnalyticBuf *pBuf);
|
SJson *taosAnalySendReqRetJson(const char *url, EAnalHttpType type, SAnalyticBuf *pBuf);
|
||||||
|
|
||||||
int32_t taosAnalGetAlgoUrl(const char *algoName, EAnalAlgoType type, char *url, int32_t urlLen);
|
int32_t taosAnalyGetAlgoUrl(const char *algoName, EAnalAlgoType type, char *url, int32_t urlLen);
|
||||||
bool taosAnalGetOptStr(const char *option, const char *optName, char *optValue, int32_t optMaxLen);
|
bool taosAnalyGetOptStr(const char *option, const char *optName, char *optValue, int32_t optMaxLen);
|
||||||
bool taosAnalGetOptInt(const char *option, const char *optName, int64_t *optValue);
|
bool taosAnalyGetOptInt(const char *option, const char *optName, int64_t *optValue);
|
||||||
int64_t taosAnalGetVersion();
|
int64_t taosAnalyGetVersion();
|
||||||
void taosAnalUpdate(int64_t newVer, SHashObj *pHash);
|
void taosAnalyUpdate(int64_t newVer, SHashObj *pHash);
|
||||||
|
|
||||||
int32_t tsosAnalBufOpen(SAnalyticBuf *pBuf, int32_t numOfCols);
|
int32_t tsosAnalyBufOpen(SAnalyticBuf *pBuf, int32_t numOfCols);
|
||||||
int32_t taosAnalBufWriteOptStr(SAnalyticBuf *pBuf, const char *optName, const char *optVal);
|
int32_t taosAnalyBufWriteOptStr(SAnalyticBuf *pBuf, const char *optName, const char *optVal);
|
||||||
int32_t taosAnalBufWriteOptInt(SAnalyticBuf *pBuf, const char *optName, int64_t optVal);
|
int32_t taosAnalyBufWriteOptInt(SAnalyticBuf *pBuf, const char *optName, int64_t optVal);
|
||||||
int32_t taosAnalBufWriteOptFloat(SAnalyticBuf *pBuf, const char *optName, float optVal);
|
int32_t taosAnalyBufWriteOptFloat(SAnalyticBuf *pBuf, const char *optName, float optVal);
|
||||||
int32_t taosAnalBufWriteColMeta(SAnalyticBuf *pBuf, int32_t colIndex, int32_t colType, const char *colName);
|
int32_t taosAnalyBufWriteColMeta(SAnalyticBuf *pBuf, int32_t colIndex, int32_t colType, const char *colName);
|
||||||
int32_t taosAnalBufWriteDataBegin(SAnalyticBuf *pBuf);
|
int32_t taosAnalyBufWriteDataBegin(SAnalyticBuf *pBuf);
|
||||||
int32_t taosAnalBufWriteColBegin(SAnalyticBuf *pBuf, int32_t colIndex);
|
int32_t taosAnalyBufWriteColBegin(SAnalyticBuf *pBuf, int32_t colIndex);
|
||||||
int32_t taosAnalBufWriteColData(SAnalyticBuf *pBuf, int32_t colIndex, int32_t colType, void *colValue);
|
int32_t taosAnalyBufWriteColData(SAnalyticBuf *pBuf, int32_t colIndex, int32_t colType, void *colValue);
|
||||||
int32_t taosAnalBufWriteColEnd(SAnalyticBuf *pBuf, int32_t colIndex);
|
int32_t taosAnalyBufWriteColEnd(SAnalyticBuf *pBuf, int32_t colIndex);
|
||||||
int32_t taosAnalBufWriteDataEnd(SAnalyticBuf *pBuf);
|
int32_t taosAnalyBufWriteDataEnd(SAnalyticBuf *pBuf);
|
||||||
int32_t taosAnalBufClose(SAnalyticBuf *pBuf);
|
int32_t taosAnalyBufClose(SAnalyticBuf *pBuf);
|
||||||
void taosAnalBufDestroy(SAnalyticBuf *pBuf);
|
void taosAnalyBufDestroy(SAnalyticBuf *pBuf);
|
||||||
|
|
||||||
const char *taosAnalysisAlgoType(EAnalAlgoType algoType);
|
const char *taosAnalysisAlgoType(EAnalAlgoType algoType);
|
||||||
EAnalAlgoType taosAnalAlgoInt(const char *algoName);
|
EAnalAlgoType taosAnalyAlgoInt(const char *algoName);
|
||||||
const char *taosAnalAlgoUrlStr(EAnalAlgoType algoType);
|
const char *taosAnalyAlgoUrlStr(EAnalAlgoType algoType);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -490,6 +490,7 @@ typedef enum ENodeType {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
uint8_t option; // 0x0 REQ_OPT_TBNAME, 0x01 REQ_OPT_TBUID
|
uint8_t option; // 0x0 REQ_OPT_TBNAME, 0x01 REQ_OPT_TBUID
|
||||||
|
uint8_t autoCreateCtb; // 0x0 not auto create, 0x01 auto create
|
||||||
const char* dbFName;
|
const char* dbFName;
|
||||||
const char* tbName;
|
const char* tbName;
|
||||||
} SBuildTableInput;
|
} SBuildTableInput;
|
||||||
|
@ -1847,6 +1848,7 @@ typedef struct {
|
||||||
int32_t statusSeq;
|
int32_t statusSeq;
|
||||||
int64_t ipWhiteVer;
|
int64_t ipWhiteVer;
|
||||||
int64_t analVer;
|
int64_t analVer;
|
||||||
|
int64_t timestamp;
|
||||||
} SStatusReq;
|
} SStatusReq;
|
||||||
|
|
||||||
int32_t tSerializeSStatusReq(void* buf, int32_t bufLen, SStatusReq* pReq);
|
int32_t tSerializeSStatusReq(void* buf, int32_t bufLen, SStatusReq* pReq);
|
||||||
|
@ -2172,6 +2174,7 @@ typedef struct {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
char tbName[TSDB_TABLE_NAME_LEN];
|
char tbName[TSDB_TABLE_NAME_LEN];
|
||||||
uint8_t option;
|
uint8_t option;
|
||||||
|
uint8_t autoCreateCtb;
|
||||||
} STableInfoReq;
|
} STableInfoReq;
|
||||||
|
|
||||||
int32_t tSerializeSTableInfoReq(void* buf, int32_t bufLen, STableInfoReq* pReq);
|
int32_t tSerializeSTableInfoReq(void* buf, int32_t bufLen, STableInfoReq* pReq);
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef enum {
|
||||||
QUERY_QUEUE,
|
QUERY_QUEUE,
|
||||||
FETCH_QUEUE,
|
FETCH_QUEUE,
|
||||||
READ_QUEUE,
|
READ_QUEUE,
|
||||||
|
STATUS_QUEUE,
|
||||||
WRITE_QUEUE,
|
WRITE_QUEUE,
|
||||||
APPLY_QUEUE,
|
APPLY_QUEUE,
|
||||||
SYNC_QUEUE,
|
SYNC_QUEUE,
|
||||||
|
@ -38,6 +39,7 @@ typedef enum {
|
||||||
STREAM_QUEUE,
|
STREAM_QUEUE,
|
||||||
ARB_QUEUE,
|
ARB_QUEUE,
|
||||||
STREAM_CTRL_QUEUE,
|
STREAM_CTRL_QUEUE,
|
||||||
|
STREAM_LONG_EXEC_QUEUE,
|
||||||
QUEUE_MAX,
|
QUEUE_MAX,
|
||||||
} EQueueType;
|
} EQueueType;
|
||||||
|
|
||||||
|
|
|
@ -401,6 +401,7 @@
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_TASK_CHECK, "vnode-stream-task-check", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_TASK_CHECK, "vnode-stream-task-check", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_UNUSED, "vnd-stream-unused", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_UNUSED, "vnd-stream-unused", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_GET_STREAM_PROGRESS, "vnd-stream-progress", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_GET_STREAM_PROGRESS, "vnd-stream-progress", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_ALL_STOP, "vnd-stream-allstop", NULL, NULL)
|
||||||
TD_CLOSE_MSG_SEG(TDMT_VND_STREAM_MSG)
|
TD_CLOSE_MSG_SEG(TDMT_VND_STREAM_MSG)
|
||||||
|
|
||||||
TD_NEW_MSG_SEG(TDMT_VND_TMQ_MSG) //8 << 8
|
TD_NEW_MSG_SEG(TDMT_VND_TMQ_MSG) //8 << 8
|
||||||
|
|
|
@ -82,7 +82,7 @@ int32_t convertStringToTimestamp(int16_t type, char* inputData, int64_t timePrec
|
||||||
int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision);
|
int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision);
|
||||||
|
|
||||||
int32_t taosFormatUtcTime(char* buf, int32_t bufLen, int64_t ts, int32_t precision);
|
int32_t taosFormatUtcTime(char* buf, int32_t bufLen, int64_t ts, int32_t precision);
|
||||||
|
char* formatTimestampLocal(char* buf, int64_t val, int precision);
|
||||||
struct STm {
|
struct STm {
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
int64_t fsec; // in NANOSECOND
|
int64_t fsec; // in NANOSECOND
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
// message process
|
// message process
|
||||||
int32_t tqStreamTaskStartAsync(SStreamMeta* pMeta, SMsgCb* cb, bool restart);
|
int32_t tqStreamTaskStartAsync(SStreamMeta* pMeta, SMsgCb* cb, bool restart);
|
||||||
int32_t tqStreamStartOneTaskAsync(SStreamMeta* pMeta, SMsgCb* cb, int64_t streamId, int32_t taskId);
|
int32_t tqStreamStartOneTaskAsync(SStreamMeta* pMeta, SMsgCb* cb, int64_t streamId, int32_t taskId);
|
||||||
int32_t tqStreamTaskProcessUpdateReq(SStreamMeta* pMeta, SMsgCb* cb, SRpcMsg* pMsg, bool restored);
|
int32_t tqStreamTaskProcessUpdateReq(SStreamMeta* pMeta, SMsgCb* cb, SRpcMsg* pMsg, bool restored, bool isLeader);
|
||||||
int32_t tqStreamTaskProcessDispatchReq(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
int32_t tqStreamTaskProcessDispatchReq(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
||||||
int32_t tqStreamTaskProcessDispatchRsp(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
int32_t tqStreamTaskProcessDispatchRsp(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
||||||
int32_t tqStreamTaskProcessRetrieveReq(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
int32_t tqStreamTaskProcessRetrieveReq(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
||||||
|
@ -39,6 +39,7 @@ int32_t tqStreamTaskProcessRunReq(SStreamMeta* pMeta, SRpcMsg* pMsg, bool isLead
|
||||||
int32_t tqStartTaskCompleteCallback(SStreamMeta* pMeta);
|
int32_t tqStartTaskCompleteCallback(SStreamMeta* pMeta);
|
||||||
int32_t tqStreamTasksGetTotalNum(SStreamMeta* pMeta);
|
int32_t tqStreamTasksGetTotalNum(SStreamMeta* pMeta);
|
||||||
int32_t tqStreamTaskProcessTaskResetReq(SStreamMeta* pMeta, char* msg);
|
int32_t tqStreamTaskProcessTaskResetReq(SStreamMeta* pMeta, char* msg);
|
||||||
|
int32_t tqStreamTaskProcessAllTaskStopReq(SStreamMeta* pMeta, SMsgCb* pMsgCb, SRpcMsg* pMsg);
|
||||||
int32_t tqStreamTaskProcessRetrieveTriggerReq(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
int32_t tqStreamTaskProcessRetrieveTriggerReq(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
||||||
int32_t tqStreamTaskProcessRetrieveTriggerRsp(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
int32_t tqStreamTaskProcessRetrieveTriggerRsp(SStreamMeta* pMeta, SRpcMsg* pMsg);
|
||||||
int32_t tqStreamTaskProcessTaskPauseReq(SStreamMeta* pMeta, char* pMsg);
|
int32_t tqStreamTaskProcessTaskPauseReq(SStreamMeta* pMeta, char* pMsg);
|
||||||
|
|
|
@ -79,6 +79,7 @@ typedef struct SDbInfo {
|
||||||
typedef struct STablesReq {
|
typedef struct STablesReq {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
SArray* pTables;
|
SArray* pTables;
|
||||||
|
uint8_t autoCreate; // 0x0 not auto create, 0x01 auto create
|
||||||
} STablesReq;
|
} STablesReq;
|
||||||
|
|
||||||
typedef struct SCatalogReq {
|
typedef struct SCatalogReq {
|
||||||
|
|
|
@ -183,7 +183,7 @@ void qCleanExecTaskBlockBuf(qTaskInfo_t tinfo);
|
||||||
*/
|
*/
|
||||||
int32_t qAsyncKillTask(qTaskInfo_t tinfo, int32_t rspCode);
|
int32_t qAsyncKillTask(qTaskInfo_t tinfo, int32_t rspCode);
|
||||||
|
|
||||||
int32_t qKillTask(qTaskInfo_t tinfo, int32_t rspCode);
|
int32_t qKillTask(qTaskInfo_t tinfo, int32_t rspCode, int64_t waitDuration);
|
||||||
|
|
||||||
bool qTaskIsExecuting(qTaskInfo_t qinfo);
|
bool qTaskIsExecuting(qTaskInfo_t qinfo);
|
||||||
|
|
||||||
|
|
|
@ -348,9 +348,9 @@ typedef int32_t (*TScriptCloseFunc)();
|
||||||
#define udfFatal(...) { if (udfDebugFlag & 1) { taosPrintLog("UDF FATAL ", 1, 255, __VA_ARGS__); }}
|
#define udfFatal(...) { if (udfDebugFlag & 1) { taosPrintLog("UDF FATAL ", 1, 255, __VA_ARGS__); }}
|
||||||
#define udfError(...) { if (udfDebugFlag & 1) { taosPrintLog("UDF ERROR ", 1, 255, __VA_ARGS__); }}
|
#define udfError(...) { if (udfDebugFlag & 1) { taosPrintLog("UDF ERROR ", 1, 255, __VA_ARGS__); }}
|
||||||
#define udfWarn(...) { if (udfDebugFlag & 2) { taosPrintLog("UDF WARN ", 2, 255, __VA_ARGS__); }}
|
#define udfWarn(...) { if (udfDebugFlag & 2) { taosPrintLog("UDF WARN ", 2, 255, __VA_ARGS__); }}
|
||||||
#define udfInfo(...) { if (udfDebugFlag & 2) { taosPrintLog("UDF ", 2, 255, __VA_ARGS__); }}
|
#define udfInfo(...) { if (udfDebugFlag & 2) { taosPrintLog("UDF INFO ", 2, 255, __VA_ARGS__); }}
|
||||||
#define udfDebug(...) { if (udfDebugFlag & 4) { taosPrintLog("UDF ", 4, udfDebugFlag, __VA_ARGS__); }}
|
#define udfDebug(...) { if (udfDebugFlag & 4) { taosPrintLog("UDF DEBUG ", 4, udfDebugFlag, __VA_ARGS__); }}
|
||||||
#define udfTrace(...) { if (udfDebugFlag & 8) { taosPrintLog("UDF ", 8, udfDebugFlag, __VA_ARGS__); }}
|
#define udfTrace(...) { if (udfDebugFlag & 8) { taosPrintLog("UDF TRACE ", 8, udfDebugFlag, __VA_ARGS__); }}
|
||||||
#endif
|
#endif
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
@ -571,6 +571,7 @@ typedef struct SVnodeModifyOpStmt {
|
||||||
SHashObj* pVgroupsHashObj; // SHashObj<vgId, SVgInfo>
|
SHashObj* pVgroupsHashObj; // SHashObj<vgId, SVgInfo>
|
||||||
SHashObj* pTableBlockHashObj; // SHashObj<tuid, STableDataCxt*>
|
SHashObj* pTableBlockHashObj; // SHashObj<tuid, STableDataCxt*>
|
||||||
SHashObj* pSubTableHashObj; // SHashObj<table_name, STableMeta*>
|
SHashObj* pSubTableHashObj; // SHashObj<table_name, STableMeta*>
|
||||||
|
SHashObj* pSuperTableHashObj; // SHashObj<table_name, STableMeta*>
|
||||||
SHashObj* pTableNameHashObj; // set of table names for refreshing meta, sync mode
|
SHashObj* pTableNameHashObj; // set of table names for refreshing meta, sync mode
|
||||||
SHashObj* pDbFNameHashObj; // set of db names for refreshing meta, sync mode
|
SHashObj* pDbFNameHashObj; // set of db names for refreshing meta, sync mode
|
||||||
SHashObj* pTableCxtHashObj; // temp SHashObj<tuid, STableDataCxt*> for single request
|
SHashObj* pTableCxtHashObj; // temp SHashObj<tuid, STableDataCxt*> for single request
|
||||||
|
|
|
@ -158,9 +158,12 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const ch
|
||||||
int32_t qStmtBindParams2(SQuery* pQuery, TAOS_STMT2_BIND* pParams, int32_t colIdx, void* charsetCxt);
|
int32_t qStmtBindParams2(SQuery* pQuery, TAOS_STMT2_BIND* pParams, int32_t colIdx, void* charsetCxt);
|
||||||
int32_t qBindStmtStbColsValue2(void* pBlock, SArray* pCols, TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen,
|
int32_t qBindStmtStbColsValue2(void* pBlock, SArray* pCols, TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen,
|
||||||
STSchema** pTSchema, SBindInfo2* pBindInfos, void *charsetCxt);
|
STSchema** pTSchema, SBindInfo2* pBindInfos, void *charsetCxt);
|
||||||
int32_t qBindStmtColsValue2(void* pBlock, SArray* pCols, TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen, void *charsetCxt);
|
int32_t qBindStmtColsValue2(void* pBlock, SArray* pCols, TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen,
|
||||||
|
void* charsetCxt);
|
||||||
int32_t qBindStmtSingleColValue2(void* pBlock, SArray* pCols, TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen,
|
int32_t qBindStmtSingleColValue2(void* pBlock, SArray* pCols, TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen,
|
||||||
int32_t colIdx, int32_t rowNum, void* charsetCxt);
|
int32_t colIdx, int32_t rowNum, void* charsetCxt);
|
||||||
|
int32_t qBindStmt2RowValue(void* pBlock, SArray* pCols, TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen,
|
||||||
|
STSchema** pTSchema, SBindInfo2* pBindInfos, void* charsetCxt);
|
||||||
int32_t qBindStmtTagsValue2(void* pBlock, void* boundTags, int64_t suid, const char* sTableName, char* tName,
|
int32_t qBindStmtTagsValue2(void* pBlock, void* boundTags, int64_t suid, const char* sTableName, char* tName,
|
||||||
TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen, void* charsetCxt);
|
TAOS_STMT2_BIND* bind, char* msgBuf, int32_t msgBufLen, void* charsetCxt);
|
||||||
|
|
||||||
|
|
|
@ -409,48 +409,16 @@ void* getTaskPoolWorkerCb();
|
||||||
#define IS_AUDIT_CTB_NAME(_ctbname) \
|
#define IS_AUDIT_CTB_NAME(_ctbname) \
|
||||||
((*(_ctbname) == 't') && (0 == strncmp(_ctbname, TSDB_AUDIT_CTB_OPERATION, TSDB_AUDIT_CTB_OPERATION_LEN)))
|
((*(_ctbname) == 't') && (0 == strncmp(_ctbname, TSDB_AUDIT_CTB_OPERATION, TSDB_AUDIT_CTB_OPERATION_LEN)))
|
||||||
|
|
||||||
#define qFatal(...) \
|
// clang-format off
|
||||||
do { \
|
#define qFatal(...) do { if (qDebugFlag & DEBUG_FATAL) { taosPrintLog("QRY FATAL ", DEBUG_FATAL, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
if (qDebugFlag & DEBUG_FATAL) { \
|
#define qError(...) do { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("QRY ERROR ", DEBUG_ERROR, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
taosPrintLog("QRY FATAL ", DEBUG_FATAL, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); \
|
#define qWarn(...) do { if (qDebugFlag & DEBUG_WARN) { taosPrintLog("QRY WARN ", DEBUG_WARN, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
} \
|
#define qInfo(...) do { if (qDebugFlag & DEBUG_INFO) { taosPrintLog("QRY INFO ", DEBUG_INFO, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
} while (0)
|
#define qDebug(...) do { if (qDebugFlag & DEBUG_DEBUG) { taosPrintLog("QRY DEBUG ", DEBUG_DEBUG, qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define qError(...) \
|
#define qTrace(...) do { if (qDebugFlag & DEBUG_TRACE) { taosPrintLog("QRY TRACE ", DEBUG_TRACE, qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
do { \
|
#define qDebugL(...)do { if (qDebugFlag & DEBUG_DEBUG) { taosPrintLongString("QRY DEBUG ", DEBUG_DEBUG, qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
if (qDebugFlag & DEBUG_ERROR) { \
|
#define qInfoL(...) do { if (qDebugFlag & DEBUG_INFO) { taosPrintLongString("QRY INFO ", DEBUG_INFO, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
taosPrintLog("QRY ERROR ", DEBUG_ERROR, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); \
|
// clang-format on
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#define qWarn(...) \
|
|
||||||
do { \
|
|
||||||
if (qDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("QRY WARN ", DEBUG_WARN, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#define qInfo(...) \
|
|
||||||
do { \
|
|
||||||
if (qDebugFlag & DEBUG_INFO) { \
|
|
||||||
taosPrintLog("QRY ", DEBUG_INFO, tsLogEmbedded ? 255 : qDebugFlag, __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#define qDebug(...) \
|
|
||||||
do { \
|
|
||||||
if (qDebugFlag & DEBUG_DEBUG) { \
|
|
||||||
taosPrintLog("QRY ", DEBUG_DEBUG, qDebugFlag, __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#define qTrace(...) \
|
|
||||||
do { \
|
|
||||||
if (qDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("QRY ", DEBUG_TRACE, qDebugFlag, __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#define qDebugL(...) \
|
|
||||||
do { \
|
|
||||||
if (qDebugFlag & DEBUG_DEBUG) { \
|
|
||||||
taosPrintLongString("QRY ", DEBUG_DEBUG, qDebugFlag, __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define QRY_ERR_RET(c) \
|
#define QRY_ERR_RET(c) \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -58,6 +58,7 @@ extern "C" {
|
||||||
#define STREAM_EXEC_T_STOP_ALL_TASKS (-5)
|
#define STREAM_EXEC_T_STOP_ALL_TASKS (-5)
|
||||||
#define STREAM_EXEC_T_RESUME_TASK (-6)
|
#define STREAM_EXEC_T_RESUME_TASK (-6)
|
||||||
#define STREAM_EXEC_T_ADD_FAILED_TASK (-7)
|
#define STREAM_EXEC_T_ADD_FAILED_TASK (-7)
|
||||||
|
#define STREAM_EXEC_T_STOP_ONE_TASK (-8)
|
||||||
|
|
||||||
typedef struct SStreamTask SStreamTask;
|
typedef struct SStreamTask SStreamTask;
|
||||||
typedef struct SStreamQueue SStreamQueue;
|
typedef struct SStreamQueue SStreamQueue;
|
||||||
|
@ -140,6 +141,7 @@ enum {
|
||||||
STREAM_QUEUE__SUCESS = 1,
|
STREAM_QUEUE__SUCESS = 1,
|
||||||
STREAM_QUEUE__FAILED,
|
STREAM_QUEUE__FAILED,
|
||||||
STREAM_QUEUE__PROCESSING,
|
STREAM_QUEUE__PROCESSING,
|
||||||
|
STREAM_QUEUE__CHKPTFAILED,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum EStreamTaskEvent {
|
typedef enum EStreamTaskEvent {
|
||||||
|
@ -498,8 +500,10 @@ typedef struct STaskUpdateInfo {
|
||||||
} STaskUpdateInfo;
|
} STaskUpdateInfo;
|
||||||
|
|
||||||
typedef struct SScanWalInfo {
|
typedef struct SScanWalInfo {
|
||||||
int32_t scanCounter;
|
int32_t scanSentinel;
|
||||||
tmr_h scanTimer;
|
tmr_h scanTimer;
|
||||||
|
int64_t lastScanTs;
|
||||||
|
int32_t tickCounter;
|
||||||
} SScanWalInfo;
|
} SScanWalInfo;
|
||||||
|
|
||||||
typedef struct SFatalErrInfo {
|
typedef struct SFatalErrInfo {
|
||||||
|
@ -768,15 +772,19 @@ void streamMetaCleanup();
|
||||||
int32_t streamMetaOpen(const char* path, void* ahandle, FTaskBuild expandFunc, FTaskExpand expandTaskFn, int32_t vgId,
|
int32_t streamMetaOpen(const char* path, void* ahandle, FTaskBuild expandFunc, FTaskExpand expandTaskFn, int32_t vgId,
|
||||||
int64_t stage, startComplete_fn_t fn, SStreamMeta** pMeta);
|
int64_t stage, startComplete_fn_t fn, SStreamMeta** pMeta);
|
||||||
void streamMetaClose(SStreamMeta* streamMeta);
|
void streamMetaClose(SStreamMeta* streamMeta);
|
||||||
int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask); // save to stream meta store
|
|
||||||
int32_t streamMetaRemoveTask(SStreamMeta* pMeta, STaskId* pKey);
|
int32_t streamMetaSaveTaskInMeta(SStreamMeta* pMeta, SStreamTask* pTask); // save to stream meta store
|
||||||
|
int32_t streamMetaRemoveTaskInMeta(SStreamMeta* pMeta, STaskId* pKey);
|
||||||
|
|
||||||
int32_t streamMetaRegisterTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask, bool* pAdded);
|
int32_t streamMetaRegisterTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask, bool* pAdded);
|
||||||
int32_t streamMetaUnregisterTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId);
|
int32_t streamMetaUnregisterTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId);
|
||||||
int32_t streamMetaGetNumOfTasks(SStreamMeta* pMeta);
|
int32_t streamMetaGetNumOfTasks(SStreamMeta* pMeta);
|
||||||
|
|
||||||
int32_t streamMetaAcquireTaskNoLock(SStreamMeta* pMeta, int64_t streamId, int32_t taskId, SStreamTask** pTask);
|
int32_t streamMetaAcquireTaskNoLock(SStreamMeta* pMeta, int64_t streamId, int32_t taskId, SStreamTask** pTask);
|
||||||
int32_t streamMetaAcquireTaskUnsafe(SStreamMeta* pMeta, STaskId* pId, SStreamTask** pTask);
|
int32_t streamMetaAcquireTaskUnsafe(SStreamMeta* pMeta, STaskId* pId, SStreamTask** pTask);
|
||||||
int32_t streamMetaAcquireTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId, SStreamTask** pTask);
|
int32_t streamMetaAcquireTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId, SStreamTask** pTask);
|
||||||
void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask);
|
void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask);
|
||||||
|
|
||||||
void streamMetaClear(SStreamMeta* pMeta);
|
void streamMetaClear(SStreamMeta* pMeta);
|
||||||
void streamMetaInitBackend(SStreamMeta* pMeta);
|
void streamMetaInitBackend(SStreamMeta* pMeta);
|
||||||
int32_t streamMetaCommit(SStreamMeta* pMeta);
|
int32_t streamMetaCommit(SStreamMeta* pMeta);
|
||||||
|
@ -797,6 +805,7 @@ void streamMetaClearSetUpdateTaskListComplete(SStreamMeta* pMeta);
|
||||||
bool streamMetaInitUpdateTaskList(SStreamMeta* pMeta, int32_t transId);
|
bool streamMetaInitUpdateTaskList(SStreamMeta* pMeta, int32_t transId);
|
||||||
|
|
||||||
void streamMetaRLock(SStreamMeta* pMeta);
|
void streamMetaRLock(SStreamMeta* pMeta);
|
||||||
|
int32_t streamMetaTryRlock(SStreamMeta* pMeta);
|
||||||
void streamMetaRUnLock(SStreamMeta* pMeta);
|
void streamMetaRUnLock(SStreamMeta* pMeta);
|
||||||
void streamMetaWLock(SStreamMeta* pMeta);
|
void streamMetaWLock(SStreamMeta* pMeta);
|
||||||
void streamMetaWUnLock(SStreamMeta* pMeta);
|
void streamMetaWUnLock(SStreamMeta* pMeta);
|
||||||
|
@ -810,6 +819,7 @@ void streamMetaLoadAllTasks(SStreamMeta* pMeta);
|
||||||
int32_t streamMetaStartAllTasks(SStreamMeta* pMeta);
|
int32_t streamMetaStartAllTasks(SStreamMeta* pMeta);
|
||||||
int32_t streamMetaStopAllTasks(SStreamMeta* pMeta);
|
int32_t streamMetaStopAllTasks(SStreamMeta* pMeta);
|
||||||
int32_t streamMetaStartOneTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId);
|
int32_t streamMetaStartOneTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId);
|
||||||
|
int32_t streamMetaStopOneTask(SStreamMeta* pMeta, int64_t streamId, int32_t taskId);
|
||||||
bool streamMetaAllTasksReady(const SStreamMeta* pMeta);
|
bool streamMetaAllTasksReady(const SStreamMeta* pMeta);
|
||||||
int32_t streamTaskSendNegotiateChkptIdMsg(SStreamTask* pTask);
|
int32_t streamTaskSendNegotiateChkptIdMsg(SStreamTask* pTask);
|
||||||
int32_t streamTaskCheckIfReqConsenChkptId(SStreamTask* pTask, int64_t ts);
|
int32_t streamTaskCheckIfReqConsenChkptId(SStreamTask* pTask, int64_t ts);
|
||||||
|
|
|
@ -662,9 +662,9 @@ enum { RAND_ERR_MEMORY = 1, RAND_ERR_FILE = 2, RAND_ERR_NETWORK = 4 };
|
||||||
#define AUDIT_OPERATION_LEN 20
|
#define AUDIT_OPERATION_LEN 20
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ANAL_ALGO_TYPE_ANOMALY_DETECT = 0,
|
ANALY_ALGO_TYPE_ANOMALY_DETECT = 0,
|
||||||
ANAL_ALGO_TYPE_FORECAST = 1,
|
ANALY_ALGO_TYPE_FORECAST = 1,
|
||||||
ANAL_ALGO_TYPE_END,
|
ANALY_ALGO_TYPE_END,
|
||||||
} EAnalAlgoType;
|
} EAnalAlgoType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue