Merge branch 'master' into fix_retry_in_clickhousetest

This commit is contained in:
alesapin 2021-05-18 22:04:38 +03:00
commit 77f342d1e2
6 changed files with 58 additions and 47 deletions

View File

@ -7,11 +7,11 @@ toc_title: ODBC
# ODBC {#table-engine-odbc}
允许ClickHouse通过以下方式连接到外部数据库 [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity).
允许ClickHouse通过[ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity)方式连接到外部数据库.
为了安全地实现ODBC连接ClickHouse使用单独的程序 `clickhouse-odbc-bridge`. 如果直接从ODBC驱动程序加载 `clickhouse-server`驱动程序问题可能会导致ClickHouse服务器崩溃。 ClickHouse自动启动 `clickhouse-odbc-bridge` 当它是必需的。 ODBC桥程序是从相同的软件包作为安装 `clickhouse-server`.
为了安全地实现ODBC连接ClickHouse使用了一个独立程序 `clickhouse-odbc-bridge`. 如果ODBC驱动程序是直接从 `clickhouse-server`中加载的那么驱动问题可能会导致ClickHouse服务崩溃。 当有需要时ClickHouse会自动启动 `clickhouse-odbc-bridge`。 ODBC桥梁程序与`clickhouse-server`来自相同的安装包.
该引擎支持 [可为空](../../../sql-reference/data-types/nullable.md) 数据类型。
该引擎支持 [可为空](../../../sql-reference/data-types/nullable.md) 数据类型。
## 创建表 {#creating-a-table}
@ -25,14 +25,14 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
ENGINE = ODBC(connection_settings, external_database, external_table)
```
请参阅的详细说明 [CREATE TABLE](../../../sql-reference/statements/create.md#create-table-query) 查询。
详情请见 [CREATE TABLE](../../../sql-reference/statements/create.md#create-table-query) 查询。
表结构可以与源表结构不同:
- 列名应与源表中的列名相同,但您可以按任何顺序使用其中的一些列。
- 列类型可能与源表中的列类型不同。 ClickHouse尝试 [](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) ClickHouse数据类型的值
- 列类型可能与源表中的列类型不同。 ClickHouse尝试将数值[映射](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) ClickHouse数据类型。
**发动机参数**
**引擎参数**
- `connection_settings` — Name of the section with connection settings in the `odbc.ini` 文件
- `external_database` — Name of a database in an external DBMS.
@ -40,13 +40,13 @@ ENGINE = ODBC(connection_settings, external_database, external_table)
## 用法示例 {#usage-example}
**通过ODBC从本地MySQL安装中检索数据**
**通过ODBC从本地安装的MySQL中检索数据**
此示例检查Ubuntu Linux18.04和MySQL服务器5.7
本示例针对Ubuntu Linux18.04和MySQL服务器5.7进行检查
确保安装了unixODBC和MySQL连接器。
确保安装了unixODBC和MySQL连接器。
默认情况下如果从软件包安装ClickHouse以用户身份启动 `clickhouse`. 因此您需要在MySQL服务器中创建和配置此用户。
默认情况下如果从软件包安装ClickHouse以用户`clickhouse`的身份启动 . 因此您需要在MySQL服务器中创建和配置此用户。
``` bash
$ sudo mysql
@ -57,7 +57,7 @@ mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'clickhouse' WITH GRANT OPTION;
```
然后配置连接 `/etc/odbc.ini`.
然后在`/etc/odbc.ini`中配置连接 .
``` bash
$ cat /etc/odbc.ini
@ -70,7 +70,7 @@ USERNAME = clickhouse
PASSWORD = clickhouse
```
您可以使用 `isql` unixodbc安装中的实用程序。
您可以从安装的unixodbc中使用 `isql` 实用程序来检查连接情况
``` bash
$ isql -v mysqlconn

View File

@ -5,13 +5,13 @@ machine_translated_rev: 5decc73b5dc60054f19087d3690c4eb99446a6c3
# 系统。data_type_families {#system_tables-data_type_families}
包含有关受支持的信息 [数据类型](../../sql-reference/data-types/).
包含有关受支持的[数据类型](../../sql-reference/data-types/)的信息.
列:
字段包括:
- `name` ([字符串](../../sql-reference/data-types/string.md)) — Data type name.
- `case_insensitive` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Property that shows whether you can use a data type name in a query in case insensitive manner or not. For example, `Date``date` 都是有效的。
- `alias_to` ([字符串](../../sql-reference/data-types/string.md)) — Data type name for which `name` 是个化名
- `name` ([String](../../sql-reference/data-types/string.md)) — 数据类型的名称.
- `case_insensitive` ([UInt8](../../sql-reference/data-types/int-uint.md)) — 该属性显示是否可以在查询中以不区分大小写的方式使用数据类型名称。例如 `Date``date` 都是有效的。
- `alias_to` ([String](../../sql-reference/data-types/string.md)) — 名称为别名的数据类型名称。
**示例**
@ -36,4 +36,4 @@ SELECT * FROM system.data_type_families WHERE alias_to = 'String'
**另请参阅**
- [语法](../../sql-reference/syntax.md) — Information about supported syntax.
- [Syntax](../../sql-reference/syntax.md) — 关于所支持的语法信息.

View File

@ -7,33 +7,33 @@ toc_title: "\u7CFB\u7EDF\u8868"
# 系统表 {#system-tables}
## 言 {#system-tables-introduction}
## 言 {#system-tables-introduction}
系统表提供以下信息:
系统表提供的信息如下:
- 服务器状态、进程和环境。
- 服务器的状态、进程以及环境。
- 服务器的内部进程。
系统表:
- 坐落`system` 数据库。
- 仅适用于读取数据
- 不能删除或更改,但可以分离。
- 存储`system` 数据库。
- 仅提供数据读取功能
- 不能删除或更改,但可以对其进行分离(detach)操作
大多数系统表将数据存储在RAM中。 ClickHouse服务器在开始时创建此类系统表。
大多数系统表将其数据存储在RAM中。 一个ClickHouse服务在刚启动时便会创建此类系统表。
与其他系统表不同,系统日志表 [metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log), [query_log](../../operations/system-tables/query_log.md#system_tables-query_log), [query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log), [trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log), [part_log](../../operations/system-tables/part_log.md#system.part_log), crash_log and text_log 默认采用[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) 引擎并将其数据存储在存储文件系统中。 如果从文件系统中删除表ClickHouse服务器会在下一次写入数据时再次创建空表。 如果系统表架构在新版本中发生更改,则ClickHouse会重命名当前表并创建一个新表。
不同于其他系统表,系统日志表 [metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log), [query_log](../../operations/system-tables/query_log.md#system_tables-query_log), [query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log), [trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log), [part_log](../../operations/system-tables/part_log.md#system.part_log), crash_log and text_log 默认采用[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) 引擎并将其数据存储在文件系统中。 如果人为的从文件系统中删除表ClickHouse服务器会在下一次进行数据写入时再次创建空表。 如果系统表结构在新版本中发生更改,那么ClickHouse会重命名当前表并创建一个新表。
用户可以通过在`/etc/clickhouse-server/config.d/`下创建与系统表同名的配置文件, 或者在`/etc/clickhouse-server/config.xml`中设置相应配置项,来自定义系统日志表的结构。可自定义的配置项如下:
用户可以通过在`/etc/clickhouse-server/config.d/`下创建与系统表同名的配置文件, 或者在`/etc/clickhouse-server/config.xml`中设置相应配置项,来自定义系统日志表的结构。可自定义的配置项如下:
- `database`: 系统日志表所在的数据库。这个选项目前已经废弃。所有的系统日表都位于`system`库中。
- `table`: 系统日志表
- `database`: 系统日志表所在的数据库。这个选项目前已经不推荐使用。所有的系统日表都位于`system`库中。
- `table`: 接收数据写入的系统日志表。
- `partition_by`: 指定[PARTITION BY](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)表达式。
- `ttl`: 指定系统日志表TTL选项。
- `flush_interval_milliseconds`: 指定系统日志表数据落盘时间
- `engine`: 指定完整的表引擎定义。(以`ENGINE = `开)。 这个选项与`partition_by`以及`ttl`冲突。如果两者一起设置,服务启动时会抛出异常并且退出。
- `flush_interval_milliseconds`: 指定日志表数据刷新到磁盘的时间间隔
- `engine`: 指定完整的表引擎定义。(以`ENGINE = `开)。 这个选项与`partition_by`以及`ttl`冲突。如果两者一起设置,服务启动时会抛出异常并且退出。
一个配置定义的例如下:
配置定义的例如下:
```
<yandex>
@ -50,20 +50,20 @@ toc_title: "\u7CFB\u7EDF\u8868"
</yandex>
```
默认情况下,表增长是无限的。 要控制表的大小,可以使用 TTL 删除过期日志记录的设置。 你也可以使用分区功能 `MergeTree`-发动机表。
默认情况下,表增长是无限的。可以通过TTL 删除过期日志记录的设置来控制表的大小。 你也可以使用分区功能 `MergeTree`-引擎表。
## 系统指标的来源 {#system-tables-sources-of-system-metrics}
用于收集ClickHouse服务器使用的系统指标:
- `CAP_NET_ADMIN` 能力。
- [procfs](https://en.wikipedia.org/wiki/Procfs) (仅在Linux中)。
- [procfs](https://en.wikipedia.org/wiki/Procfs) (仅限于Linux)。
**procfs**
如果ClickHouse服务器没有 `CAP_NET_ADMIN` 能力,它试图回`ProcfsMetricsProvider`. `ProcfsMetricsProvider` 允许收集每个查询系统指标(用于CPU和I/O
如果ClickHouse服务器没有 `CAP_NET_ADMIN` 能力,那么试图退回到 `ProcfsMetricsProvider`. `ProcfsMetricsProvider` 允许收集每个查询系统指标(包括CPU和I/O
如果系统上支持并启用procfsClickHouse server将收集这些指标:
如果系统上支持并启用procfsClickHouse server将收集如下指标:
- `OSCPUVirtualTimeMicroseconds`
- `OSCPUWaitMicroseconds`

View File

@ -238,7 +238,7 @@ SELECT a, b, c FROM (SELECT ...)
当一个`SELECT`子句包含`DISTINCT`, `GROUP BY`, `ORDER BY`, `LIMIT`时,请注意,这些仅会在插入数据时在每个单独的数据块上执行。例如,如果你在其中包含了`GROUP BY`,则只会在查询期间进行聚合,但聚合范围仅限于单个批的写入数据。数据不会进一步被聚合。但是当你使用一些其他数据聚合引擎时这是例外的,如:`SummingMergeTree`。
目前对物化视图执行`ALTER`是不支持的,因此这可能是不方便的。如果物化视图是使用的`TO [db.]name`的方式进行构建的,你可以使用`DETACH`语句将视图剥离,然后使用`ALTER`运行在目标表上,然后使用`ATTACH`将之前剥离的表重新加载进来。
目前对物化视图执行`ALTER`是不支持的,因此这可能是不方便的。如果物化视图是使用的`TO [db.]name`的方式进行构建的,你可以使用`DETACH`语句将视图剥离,然后使用`ALTER`运行在目标表上,然后使用`ATTACH`将之前剥离的表重新加载进来。
视图看起来和普通的表相同。例如,你可以通过`SHOW TABLES`查看到它们。

View File

@ -45,11 +45,6 @@ class IMergeTreeDataPartWriter;
class MarkCache;
class UncompressedCache;
namespace ErrorCodes
{
}
/// Description of the data part.
class IMergeTreeDataPart : public std::enable_shared_from_this<IMergeTreeDataPart>
{

View File

@ -13,6 +13,7 @@
#include <DataTypes/DataTypesNumber.h>
#include <DataTypes/DataTypeArray.h>
#include <IO/ReadHelpers.h>
#include <IO/ReadBufferFromFile.h>
#include <Common/PipeFDs.h>
#include <Common/CurrentThread.h>
#include <common/getThreadId.h>
@ -176,6 +177,7 @@ NamesAndTypesList StorageSystemStackTrace::getNamesAndTypes()
{
return
{
{ "thread_name", std::make_shared<DataTypeString>() },
{ "thread_id", std::make_shared<DataTypeUInt64>() },
{ "query_id", std::make_shared<DataTypeString>() },
{ "trace", std::make_shared<DataTypeArray>(std::make_shared<DataTypeUInt64>()) }
@ -213,6 +215,18 @@ void StorageSystemStackTrace::fillData(MutableColumns & res_columns, ContextPtr,
throwFromErrno("Cannot send signal with sigqueue", ErrorCodes::CANNOT_SIGQUEUE);
}
std::filesystem::path thread_name_path = it->path();
thread_name_path.append("comm");
String thread_name;
if (std::filesystem::exists(thread_name_path))
{
constexpr size_t comm_buf_size = 32; /// More than enough for thread name
ReadBufferFromFile comm(thread_name_path.string(), comm_buf_size);
readStringUntilEOF(thread_name, comm);
comm.close();
}
/// Just in case we will wait for pipe with timeout. In case signal didn't get processed.
if (wait(100) && sig_value.sival_int == data_ready_num.load(std::memory_order_acquire))
@ -225,9 +239,10 @@ void StorageSystemStackTrace::fillData(MutableColumns & res_columns, ContextPtr,
for (size_t i = stack_trace_offset; i < stack_trace_size; ++i)
arr.emplace_back(reinterpret_cast<intptr_t>(stack_trace.getFramePointers()[i]));
res_columns[0]->insert(tid);
res_columns[1]->insertData(query_id_data, query_id_size);
res_columns[2]->insert(arr);
res_columns[0]->insert(thread_name);
res_columns[1]->insert(tid);
res_columns[2]->insertData(query_id_data, query_id_size);
res_columns[3]->insert(arr);
}
else
{
@ -235,9 +250,10 @@ void StorageSystemStackTrace::fillData(MutableColumns & res_columns, ContextPtr,
/// Cannot obtain a stack trace. But create a record in result nevertheless.
res_columns[0]->insert(tid);
res_columns[1]->insertDefault();
res_columns[0]->insert(thread_name);
res_columns[1]->insert(tid);
res_columns[2]->insertDefault();
res_columns[3]->insertDefault();
}
/// Signed integer overflow is undefined behavior in both C and C++. However, according to