YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
- MPP 架构
- 镜像分布策略
- 持续聚集
- 滑动窗口
- Grafana 监控指标解读
- Prometheus 监控指标解读
- 术语表
-
工具指南
- mxaddmirrors
- mxbackup
- mxbench
- mxdeletesystem
- mxgate
- mxinitstandby
- mxmoveseg
- mxpacklogs
- mxrecover
- mxrestore
- mxshift
- mxstart
- mxstate
- mxstop
- gpconfig
-
数据类型
-
存储引擎
-
执行引擎
-
系统配置参数
SQL 参考
- ABORT
- ALTER_DATABASE
- ALTER_EXTENSION
- ALTER_EXTERNAL_TABLE
- ALTER_FOREIGN_DATA_WRAPPER
- ALTER_FOREIGN_TABLE
- ALTER_FUNCTION
- ALTER_INDEX
- ALTER_RESOURCE_GROUP
- ALTER_RESOURCE_QUEUE
- ALTER_ROLE
- ALTER_RULE
- ALTER_SCHEMA
- ALTER_SEQUENCE
- ALTER_SERVER
- ALTER_TABLE
- ALTER_TABLESPACE
- ALTER_TYPE
- ALTER_USER_MAPPING
- ALTER_VIEW
- ANALYZE
- BEGIN
- CHECKPOINT
- COMMIT
- COPY
- CREATE_DATABASE
- CREATE_EXTENSION
- CREATE_EXTERNAL_TABLE
- CREATE_FOREIGN_DATA_WRAPPER
- CREATE_FOREIGN_TABLE
- CREATE_FUNCTION
- CREATE_INDEX
- CREATE_RESOURCE_GROUP
- CREATE_RESOURCE_QUEUE
- CREATE_ROLE
- CREATE_RULE
- CREATE_SCHEMA
- CREATE_SEGMENT_SET
- CREATE_SEQUENCE
- CREATE_SERVER
- CREATE_TABLE
- CREATE_TABLE_AS
- CREATE_TABLESPACE
- CREATE_TYPE
- CREATE_USER_MAPPING
- CREATE_VIEW
- DELETE
- DROP_DATABASE
- DROP_EXTENSION
- DROP_EXTERNAL_TABLE
- DROP_FOREIGN_DATA_WRAPPER
- DROP_FOREIGN_TABLE
- DROP_FUNCTION
- DROP_INDEX
- DROP_RESOURCE_GROUP
- DROP_RESOURCE_QUEUE
- DROP_ROLE
- DROP_RULE
- DROP_SCHEMA
- DROP_SEGMENT_SET
- DROP_SEQUENCE
- DROP_SERVER
- DROP_TABLE
- DROP_TABLESPACE
- DROP_TYPE
- DROP_USER_MAPPING
- DROP_VIEW
- END
- EXPLAIN
- GRANT
- INSERT
- LOAD
- LOCK
- REINDEX
- RELEASE_SAVEPOINT
- RESET
- REVOKE
- ROLLBACK_TO_SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT INTO
- SET ROLE
- SET TRANSACTION
- SET
- SHOW
- START TRANSACTION
- TRUNCATE
- UPDATE
- VACUUM
常见问题(FAQ)
-
新架构 FAQ
- 听说 5.x 下不能随便重启 Supervisor 了,为什么,如果重启了会发生什么?
- 为什么每个服务器上都有 Shard / Cluster 服务进程,但只有一个是活跃(active)状态?
- etcd 是部署在每台主机上吗?
- 日常我们需要针对 etcd 做哪些运维操作?
- etcd 的数据量有多大?是否需要特别的运维工作?
- 引入 etcd 后,图形化界面部署数据库集群操作有哪些变化?
- 5.0 现版本如何在线扩容?
- 5.0 beta 号称实现了 Master Auto-failover,为什么 Master 关机并切换后,再开机 Master 不会自动恢复?
- 当故障自动转移(Auto-failover)发生在不同组件,会分别产生什么影响?我要如何进一步操作?
- YMatrix 5 单个组件启动
- 我不想安装 etcd,可以选择在 YMatrix 5.X 上安装无 etcd(非高可用)的集群吗?
- Master 发生自动切换的延迟是多久?
- Segment 是否可以被 supervisor 自动恢复?
- 当半数以上的 etcd 进程异常(被杀死或无法启动)后,集群出现宕机,是正常现象吗?
-
集群部署 FAQ
- error: could not access directory /data/mxdata_20221104084534/master/mxseg-1: Permission denied
- yum 安装 matrixdb 包后报错 cpio read error
- could not connect to server: No route to host
- setuptools 报告不支持参数:unknown distribution option:long_description_content_type
- ssh 默认端口不是 22
- 图形化界面初始化报错:ping <主机名1> error:lookup multiple ip:<IP 地址1>,<IP 地址1> ping <主机名2> error:lookup multiple ip:<IP 地址2>,<IP 地址2>
- 使用图形化界面部署 YMatrix 报错 failed to connect to host=mdw user=mxadmin database=postgres: dial error (dial tcp 192.168.247.132:5432: connect: connection refused)
- 添加主机失败 collect: do collect: unmarshal remote: json: cannot unmarshal string into Go struct field Disk.hardware.disk.ineligibleDesc of type mxi18n.Message
- 集群启动报错
- 图形化部署 YMatrix 报错:优化操作系统配置 ... 已撤销...
- 安装 YMatrix 安装包报错,缺少依赖
- 由于服务器内核参数配置异常导致 Supervisor 启动异常 panic: timeout to start gRPC service
- 安装 YMatrix 收集信息失败
- 初始化失败,报 failed: initialize_database: error execute /opt/ymatrix/matrixdb-5.0.0+enterprise/bin/initdb
- 可以使用 Nginx 为图形化界面配置域名吗?
- Interconnect error writing an outgoing packet: operation not permitted
- 由于环境限制,我没办法使用图形化部署 YMatrix,可以使用命令行部署的方式吗?
- /etc/hosts 文件缺少 localhost 配置选项导致 Supervisor 服务启动异常
- YMatrix 至少需要多少服务器才能实现新架构中 etcd 集群的高可用?
- 安装数据库时报错 LOG: gp_role forced to 'utility' in single-user mode Y.sh: line 1: 11865 Illegal instruction
-
SQL 查询 FAQ
- ERROR: EvalPlanQual can not handle subPlan with Motion node
- ERROR: Too many unresolved insertion xids, please do a vacuum
- ERROR: modification of distribution columns in OnConflictUpdate is not supported
- 图形化客户端收到 log:server closed the connection unexpectedly
- PARTITION 表简单 Filter 操作的 UNION ALL 查询比 IN 查询慢
- 插入 int 类型数据,单独查询跑很快,但放到 Plpgsql Function 里很慢
- PARTITION 分区裁剪更新操作,两个会话(Session)独立更新会导致互锁
- 自定义 type 使用及单表字段扩展
- ERROR,XX000,Right sibling's left-link doesn't match : block 817 links to 45366 instead of expected 70930 in index tab_idx
- 更新删除时报错 cannot delete from table &tablename because it does not have a replica identity and publishes deletes
- ERROR: could not read block 0 in file base/1588803/269422
- 行转列示例
- 列转行示例
- pg_hba.conf 文件内容配置的顺序导致的远程访问权限异常
- idle in transaction timeout 报错
- insufficient memory reserved for statement 报错
- evalplanqual can not hanlde subplan with motion node 报错
- 在客户端创建表在 Linux 上查询不到,但是客户端上可以查询到
- UUID 分布键插入数据出现数据丢失、数据重复问题
- 数据库对应的操作系统版本从 CentOS7 升级到 CentOS8,查询语句性能下降
- 执行 SQL 语句时显示 insufficient memory reserved for statement 错误
- 创建 matrixts 扩展时报错 ERROR: type mxkv_text already exist
-
MatrixGate FAQ
- 数据加载性能低
- failed to acquire resources on on or more segments ,fatal out of memory
- mxgate 发生锁等待卡住
- mxgate 排除某一列
- mxgate 流式加载增加列不停服的办法
- mxgate socket 文件缺失?
- data format error: invalid input syntax for type integer: 1970-01-01 00:00:01
- mxgate 入库时间字段默认值相差 8 小时
- Aborting operation regardless of REJECT LIMIT value, last error was: invalid input syntax for type timestamp: 22:31:01, column batch_num
- ERROR c.s.o.matrixdb.MatrixdbSource 77 -MatrixdbSource sendingPostRequest errorCode: 400, errorMsg: target table name is empty
- responseCode:500 errorMsg: ERROR: invalid byte sequence for encoding UTF8: 0x81
- body size exceeds the given limit
- you license is expired 2022-11-02
- 使用 MatrixGate 迁移数据报错:Cannot start source: --local-ip localhost is not a valid IP address
- 使用 MatrixGate 数据加载表数据存在双引号
- MatrixGate 升级
- MatrixGate 需要加载包含 unix 时间数据的数据文件,但数据文件中 unix 数据所在的字段不是第一个字段
- MatrixGate 加载数据文件中有 \N 字符
- MatrixGate 通过迁移模式写入时出现 Handshaking was terminated on port XXX
- MatrixGate 可以实现任意列时间戳转换吗?
- MatrixGate JAVA SDK JAR 包可以下载到本地导入吗?
- Kafka 消费 key 字段包含 @ 符号,数据解析找不到 value
- mxgate 迁移模式非 mxadmin 用户提示没有权限
-
运维 FAQ
- 忘记密码
- ssh_exchange_identification: Connection closed by remote host
- psql: WARNING: database testdb must be vacuumed within 529926866 transactions (seg35 192.168.247.129:6005 pid=448116)
- could not read block 3684552 of temporary file
- YMatrix 可以修改服务器主机名(Hostname)吗?
- 数据库启动报错 FATAL: database postgres does not exist
- rpc error: code = Unknown desc = primary not found in shard state
- mxaddmirrors 执行部署添加 Mirror 报错
- ERROR: replication slot internal_wal_replication_slot already exists
- ERROR: interconnect Error: Could not set up tcp listener socket
- 使用 mxshift 工具进行迁移之前,如何增加白名单?
- 如果我在内网环境使用 mxshift 工具,需要开通哪些端口?
- index ron requires 19160 bvtes, maximum size is 8191
-
监控告警 FAQ
- 可以离线安装 Grafana 监控吗?
- Grafana 报错 Annotation Query Failed No message available
- Grafana 发送邮件报错 smtp; 554 Reject by behaviour spam at Rcpt State(Connection IP address:***) ANTISPAM_BAT[01201311R106a,ay29a033002195086]: spfcheck failedCONTINUE
-
PXF FAQ
- remote component error,Failed connect to localhost:5888; Connection refused (libchurl.c:950)
- 文件入库时,某一个字段包含换行符,将一行数据切分成两行,再以分隔符切分,就会导致数据与字段数不一致,也就是说一行数据里有两个 \n 一个在中间一个在尾部 但是中间那个不能被当做换行符处理
- PXF 访问 S3 可以递归当前目录,或者所有子目录下的所有文件吗?
- PXF 可以读取 S3 存储上的文件吗?如何读取?
-
PLPython FAQ
- PLPython 和 Python 连接数据库操作的区别与优劣是什么?
- 如何在数据库中使用 PLPython
- PLPython 中如果需要第三方的库怎么安装?
- Python 访问 YMatrix 数据库示例
- Python 批量插入数据示例
- PLPython 中使用 Python 代码
- PLPython 标准异常处理
- 使用 traceback 处理 PLPython 异常
-
性能 FAQ
INSERT
在表中创建新行。
概要
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table [( column [, ...] )]
{DEFAULT VALUES | VALUES ( {expression | DEFAULT} [, ...] ) [, ...] | query}
[ON CONFLICT [conflict_target] conflict_action]
[RETURNING * | output_expression [[AS] output_name] [, ...]]
其中 conflict_target 可以是以下之一:
( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
且 conflict_action 是以下之一:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
描述
INSERT
将新行插入表中。可以插入由值表达式指定的一或多个行,或查询产生的零或多个行。
目标列名称可以按任何顺序列出。如果根本没有给出任何列名列表,则默认为表中的列按声明的顺序排列。VALUES
子句或查询提供的值与从左到右的显式或隐式列列表相关联。
在显式或隐式列列表中不存在的每个列都将填充一个默认值,该默认值可以是其声明的默认值,如果没有默认值,则为 NULL
。
如果任何列的表达式的数据类型都不正确,则将尝试自动类型转换。
YMatrix 支持 INSERT INTO ... VALUES ... ON CONFLICT ... DO ...
的语法来支持对 HEAP 表数据进行 UPSERT 操作。限制:使用 UPSERT 功能时,建表的唯一约束或索引必须包含分布键。同时,UPSERT 不支持在不同实例间移动数据,不支持更新分布键。更多 UPSERT 使用方法请见数据分批合并场景(UPSERT)。此语句只适用于 HEAP 表。
可选的 RETURNING
子句使 INSERT
根据实际插入的每一行计算并返回值。这对于获取默认提供的值(例如序列号)很有用。但是,允许使用表列的任何表达式。RETURNING
列表的语法与 SELECT
的输出列表的语法相同。
您必须对表具有 INSERT
特权才能插入表中。指定列列表后,仅需要对列出的列具有 INSERT
特权。使用 RETURNING
子句需要 RETURNING
中提到的所有列都具有 SELECT
特权。如果提供查询以插入查询中的行,则必须对查询中引用的任何表或列具有 SELECT
特权。
注意!
UPSERT 不是一个 SQL 语句,而是一个在时序场景中为便于数据分批上传而支持的更新 / 插入操作。
输出
成功完成后,INSERT
命令将返回以下形式的命令标记:
INSERT oid count
count
是插入的行数。如果 count
恰好为 1
,并且目标表具有 OID
,则 OID
是分配给插入行的 OID
。否则,OID
为零。
参数
插入
with_query
WITH
子句允许您指定一个或多个子查询,这些子查询可以在INSERT
查询中按名称引用。
对于包含WITH
子句的INSERT
命令, 该子句只能包含SELECT
语句, 而WITH
子句不能包含数据修改命令(INSERT
,UPDATE
或DELETE
)。
查询(SELECT
语句)也可能包含WITH
子句。 在这种情况下,可以在INSERT
查询中引用两套with_query
, 但是第二套优先,因为它的嵌套更紧密。
table
- 现有表的名称(可以由模式(Schema)限定)。
column
- 表中列的名称。 如果需要,可以使用子字段名称或数组下标来限定列名称。(仅插入到复合列的某些字段中,未指定的字段为空。)
DEFAULT VALUES
- 所有列均将填充其默认值。
expression
- 要分配给相应列的表达式或值。
DEFAULT
- 相应的列将填充其默认值。
query
- 提供要插入的行的查询(
SELECT
语句)。 有关语法的说明,请参见SELECT
语句。
output_expression
- 插入每行后,由
INSERT
命令计算并返回的表达式。 该表达式可以使用表的任何列名称。 写入*
返回插入行的所有列。
output_name
- 用于返回的列的名称。
ON CONFLICT 子句
ON CONFLICT DO UPDATE 保证一个原子的 INSERT 或者 UPDATE 结果。在没有无关错误的前提下,这两种结果之一可以得到保证,即使在很高的并发度也能保证。这也可以被称作 UPSERT — “UPDATE 或 INSERT”。
conflict_target
- 通过选择仲裁者索引来指定哪些行与 ON CONFLICT在其上采取可替代动作的行相冲突。 要么执行唯一索引推断,要么显式命名一个 约束。对于ON CONFLICT DO NOTHING来说, 它对于指定一个conflict_target是可选的。 在被省略时,与所有有效约束(以及唯一索引)的冲突都会被处理。对于 ON CONFLICT DO UPDATE,必须 提供一个conflict_target。
conflict_action
- conflict_action指定一个可替换的 ON CONFLICT动作。它可以是 DO NOTHING,也可以是一个指定在冲突情况下 要被执行的UPDATE动作细节的DO UPDATE子句。ON CONFLICT DO UPDATE中的SET和 WHERE子句能够使用该表的名称(或者别名) 访问现有的行,并且可以用特殊的被排除 表访问要插入的行。这个动作要求被排除 列所在目标表的任何列上的SELECT特权。
注意所有行级BEFORE INSERT触发器的效果都会 反映在被排除值中,因为那些效果可能会 让该行避免被插入。
注解
要将数据插入分区表中,请指定根分区表,即使用 CREATE TABLE
命令创建的表。 您还可以在 INSERT
命令中指定分区表的叶子表。 如果数据对于指定的叶子表无效,则返回错误。 不支持在 INSERT
命令中指定不是叶子表的子表。 不支持在分区表的任何子表上执行其他 DML 命令,例如 UPDATE
和 DELETE
。 这些命令必须在根分区表(使用 CREATE TABLE
命令创建的表)上执行。
示例
在表 films
中插入一行:
INSERT INTO films VALUES ('UA502', 'Bananas', 105,
'1971-07-13', 'Comedy', '82 minutes');
在此示例中,省略了 length
列,因此它将具有默认值:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
本示例对 date_prod
列使用 DEFAULT
子句,而不是指定值:
INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT,
'Comedy', '82 minutes');
要插入完全由默认值组成的行:
INSERT INTO films DEFAULT VALUES;
要使用多行 VALUES
语法插入多行:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
本示例从表 films
中向表 films
中插入一些行,其列布局与 films
相同:
INSERT INTO films SELECT * FROM tmp_films WHERE date_prod <
'2004-05-07';
在表 distributors
中插入一行,返回由 DEFAULT
子句生成的序列号:
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
RETURNING did;
在 HEAP 表实现 UPSERT:
// 创建测试表
CREATE TABLE conditions (
tag_id text NOT NULL,
ts timestamptz not null,
location text ,
temperature double precision ,
humidity double precision
) DISTRIBUTED BY (tag_id);
// 创建唯一索引
CREATE UNIQUE INDEX ON conditions(tag_id,ts);
// 插入测试数据
INSERT INTO conditions(tag_id,ts,location) VALUES('tag1','2022-07-19 00:00:00','office') ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
INSERT INTO conditions(tag_id,ts,temperature) VALUES('tag1','2022-07-19 00:00:00',70.2) ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
INSERT INTO conditions(tag_id,ts,humidity) VALUES('tag1','2022-07-19 00:00:00',50.1) ON CONFLICT(tag_id,ts) DO UPDATE
SET location = excluded.location,temperature = excluded.temperature,humidity = excluded.humidity;
// 查看测试数据
mydb=# SELECT * FROM conditions;
tag_id | ts | location | temperature | humidity
--------+------------------------+----------+-------------+----------
tag1 | 2022-07-19 00:00:00+08 | office | |
(1 row)
Time: 16.340 ms
兼容性
INSERT
符合 SQL 标准。 标准不允许列名列表被省略,但不是所有的列都由 VALUES
子句或查询填充的情况。
SELECT
记录了 query 子句的可能限制。