-
1.创建小时分区表预创建分区720个,分区保留策略为最近720小时CREATE table day_part(id int,d_time timestamp) DISTRIBUTE BY HASH (id)PARTITION BY RANGE (d_time)(PARTITION p1 START('2025-01-06 11:17:00 ') END('2025-02-06 12:17:00') EVERY(interval '1 hours'));ALTER TABLE day_part ADD PARTITION pmax VALUES LESS THAN (maxvalue);2.确认最近1个月的小时分区预创建成功select pg_get_tabledef('day_part');3.更改表分区策略为最近2小时4.检查分区自动删除到最近2小时 请问第3,4步骤怎么实现
-
物化自动定时刷新怎么使用的?实验过程如下,物化视图没有自动刷新
-
字符串分割函数split_part(string, delimiter, field)根据分隔符delimiter将字符串string分割,并返回第field个子串。示例: split_part('abc~def~ghi', '~', 2) 返回 def数组长度函数array_length(array, dimension)返回数组array的长度。dimension指定数组的维度,默认为1。示例: array_length('{1,2,3,4}', 1) 返回 4总结字符串操作:length:获取字符串长度。substring:提取字符串子串。replace:替换字符串中的子串。||:字符串连接。数组操作:array_length:获取数组的长度。array_cat:拼接两个数组。按分隔符分割字符串为数组:string_to_array:根据指定分隔符拆分字符串为数组。regexp_split_to_array:使用正则表达式更灵活地分割字符串。这些函数和操作在数据处理、文本分析和数据清洗等场景中非常有用。分割符分割字符串为数组string_to_array(string, delimiter)根据分隔符delimiter将字符串string分割成数组。示例: string_to_array('a,b,c', ',') 返回 {'a','b','c'}使用这些函数可以帮助你在PostgreSQL中处理字符串和数组相关的操作。
-
PostgreSQL的网络连接受到多种因素的影响和限制,这些限制可能来自于配置文件、操作系统设置以及物理硬件的能力。以下是一些常见的网络连接限制及其相关配置:1. max_connections 参数说明:这是控制PostgreSQL实例可以同时处理的最大客户端连接数的主要参数。配置位置:位于postgresql.conf文件中。默认值:通常为100,但可以根据服务器的资源进行调整。影响:如果尝试超过此限制建立新的连接,将会收到错误消息。2. listen_addresses 参数说明:定义了PostgreSQL监听哪些IP地址上的连接请求。配置位置:同样在postgresql.conf中。默认值:通常是localhost,意味着只接受来自本地机器的连接。影响:如果希望允许远程访问,则需要将这个参数设置为特定的IP地址或'*'(表示所有接口)。3. unix_socket_directories 参数说明:指定用于Unix域套接字通信的目录。配置位置:postgresql.conf。默认值:通常是/tmp。影响:这决定了本地客户端如何通过Unix域套接字与数据库服务通信。4. pg_hba.conf 文件说明:这是一个非常重要的文件,它定义了哪些主机可以连接到PostgreSQL服务器,以及它们可以使用哪种认证方法。配置内容:包括类型(如host, local)、数据库名、用户、地址、认证方法等。影响:不正确的配置可能导致合法用户无法连接,或者让未经授权的用户能够访问敏感数据。5. 操作系统级别的限制文件描述符限制:每个进程可以打开的文件数量有限制,这直接影响到PostgreSQL能支持的最大连接数。网络端口范围:某些操作系统对应用程序可用的端口号有特定的限制。防火墙规则:防火墙设置可能阻止外部主机连接到PostgreSQL服务器。6. 硬件及网络基础设施带宽限制:网络带宽不足会影响数据传输速度。延迟问题:长距离网络连接可能会引入较高的延迟。并发能力:服务器CPU和内存资源也会影响其处理大量并发连接的能力。7. 安全性考虑SSL/TLS加密:启用SSL/TLS加密会增加额外的计算开销,可能稍微降低性能。认证方法:不同的认证方法(如密码、证书)对连接过程有不同的安全性和性能影响。为了优化PostgreSQL的网络连接性能并确保安全性,建议定期审查上述配置,并根据实际需求做出相应调整。同时,也要注意监控系统的整体健康状况,以确保有足够的资源来支持预期的工作负载。
-
为了配置Log4j2以统一管理openGauss的控制台输出日志,你需要确保Log4j2能够捕获并记录来自openGauss JDBC驱动或其他与openGauss交互的Java代码的日志。以下是一个简化的步骤指南,帮助你完成这一配置:1. 引入Log4j2依赖确保你的项目(如Maven或Gradle项目)中已经包含了Log4j2的核心和API依赖。2. 创建或更新log4j2.xml配置文件在你的资源目录(如src/main/resources)中,创建或更新log4j2.xml文件以包含以下配置:<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <!-- 控制台Appender --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- 可选:文件Appender,如果你想同时记录到文件 --> <!--<File name="File" fileName="logs/app.log"> <PatternLayout> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n</pattern> </PatternLayout> </File>--> </Appenders> <Loggers> <!-- Root logger,设置默认日志级别和Appender --> <Root level="info"> <AppenderRef ref="Console"/> </Root> <!-- 为openGauss相关的包或类设置特定的Logger(可选,但推荐) --> <Logger name="com.yourpackage.that.interacts.with.openGauss" level="debug" additivity="false"> <AppenderRef ref="Console"/> </Logger> <!-- 如果openGauss JDBC驱动使用特定的日志记录器名称,你也可以为其设置Logger --> <Logger name="org.postgresql" level="debug" additivity="false"> <!-- 注意:openGauss JDBC可能基于PostgreSQL,因此使用org.postgresql作为示例 --> <AppenderRef ref="Console"/> </Logger> </Loggers> </Configuration>在这个配置中:%d{HH:mm:ss.SSS} 是日期时间格式。[%t] 是线程名称。%-5level 是日志级别。%logger{36} 是日志记录器的名称,最多36个字符。- %msg%n 是日志消息和换行符。你需要将com.yourpackage.that.interacts.with.openGauss替换为实际与openGauss交互的Java代码的包名或类名前缀。如果openGauss的JDBC驱动使用特定的日志框架(如SLF4J、java.util.logging等)并且这些框架被桥接到Log4j2,则你可能需要为这些框架的日志记录器设置Logger。在上面的示例中,我假设openGauss JDBC驱动可能基于PostgreSQL JDBC,因此使用了org.postgresql作为日志记录器的名称。然而,你应该根据实际的JDBC驱动文档来确定正确的日志记录器名称。3. 在Java代码中使用Log4j2确保你的Java代码中使用Log4j2的API来记录日志。例如:import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class OpenGaussExample { private static final Logger logger = LogManager.getLogger(OpenGaussExample.class); public static void main(String[] args) { logger.info("Starting OpenGauss example..."); // 连接数据库的代码... try { // 假设这里有一个数据库连接和查询 logger.debug("Executing query..."); // 查询代码... logger.info("Query executed successfully."); } catch (Exception e) { logger.error("Error executing query", e); } } }4. 运行并验证运行你的Java应用程序,并观察控制台输出。你应该能够看到Log4j2记录的日志,包括与openGauss交互的日志信息。注意事项确保log4j2.xml文件位于正确的资源目录中。如果你的应用程序是Web应用程序,请确保Log4j2的配置文件被正确加载。根据你的需求调整日志级别和Appender配置。如果openGauss JDBC驱动使用不同的日志记录机制(如自定义的日志框架),你可能需要查阅该驱动的文档来了解如何配置日志记录。
-
PostgreSQL 的性能优化是一个涉及多个方面的复杂过程,从硬件配置到数据库设置、查询优化等都有可能影响最终的性能表现。以下是一些常见的性能优化技巧:1. 硬件和操作系统优化选择合适的硬件:确保服务器有足够的CPU、内存以及快速的磁盘I/O。使用SSD可以显著提高读写速度。调整内核参数:根据需要调整Linux内核参数,如vm.swappiness减少交换频率,fs.file-max增加文件描述符限制等。使用RAID:对于关键数据存储,考虑使用RAID 10以平衡性能与冗余。2. PostgreSQL配置优化工作内存 (work_mem):适当增加此值可以加快排序和哈希操作的速度。共享缓冲区大小 (shared_buffers):通常建议将该值设为总RAM的25%左右,但不要超过8GB。维护工作内存 (maintenance_work_mem):在执行大型维护任务(如VACUUM, CREATE INDEX)时提供额外内存。检查点相关参数:合理设置checkpoint_completion_target和max_wal_size来控制检查点的行为。并行度:通过设置max_parallel_workers_per_gather等参数启用并行查询支持。日志记录:减少不必要的日志记录可以帮助减轻系统负担。3. 数据库设计优化索引策略:创建适当的索引来加速查询,同时避免过度索引。表分区:对于非常大的表,考虑使用分区来提高查询效率。数据类型选择:选用最适合的数据类型,比如使用integer而不是numeric当不需要小数时。规范化与反规范化:根据实际需求平衡两者之间的关系,有时候为了性能牺牲一定的数据一致性是值得的。4. 查询优化分析查询计划:使用EXPLAIN命令来理解查询是如何执行的,并据此进行优化。避免全表扫描:尽量让查询能够利用索引,避免对整个表进行扫描。减少子查询:如果可能的话,尝试重写复杂的子查询为更简单的形式。使用JOIN条件中的索引:确保连接条件上的字段上有索引。5. 定期维护定期运行ANALYZE:保持统计信息最新有助于优化器做出更好的决策。定期清理:使用VACUUM和REINDEX命令来回收空间并更新索引。监控工具:利用pg_stat_statements等扩展来追踪慢查询和资源消耗大户。6. 使用外部工具缓存层:对于频繁访问但不经常变化的数据,可以考虑使用Redis或Memcached等缓存服务。负载均衡:通过设置主从复制或使用逻辑复制来分散读取压力。数据库监控:部署像pgBadger这样的工具来分析日志文件,找出潜在问题。每个环境的具体情况都不同,因此重要的是要基于实际的应用场景来进行针对性的调优。希望上述建议能帮助您提升PostgreSQL数据库的性能!
-
PostgreSQL主备搭建指南引言在现代数据库系统中,数据的高可用性和可靠性是至关重要的。PostgreSQL作为一个强大的开源关系型数据库管理系统,提供了多种方式来实现这些目标,其中一种常见的方法就是通过设置主服务器(Primary)与备用服务器(Standby)来构建复制架构。本文将指导您如何使用流复制(Streaming Replication)来搭建一个基本的PostgreSQL主备环境。准备工作两台服务器:一台作为主服务器,另一台作为备用服务器。PostgreSQL版本一致或兼容。网络连接正常,确保主备之间可以互相通信。根据实际情况准备操作系统用户和权限。步骤1: 配置主服务器安装PostgreSQL:根据您的操作系统选择合适的安装方法。修改配置文件:打开postgresql.conf文件,并找到listen_addresses参数,将其设置为'*'或者指定的IP地址,允许远程访问。启用wal_level至replica或更高,以支持流复制。设置max_wal_senders大于0,定义了可以同时发送WAL日志的最大客户端数量。创建复制用户:需要一个专门用于复制过程的用户账户。CREATE ROLE replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'yourpassword';配置pg_hba.conf:添加规则允许复制用户从备用服务器IP访问。host replication replicator <standby_ip>/32 md5重启PostgreSQL服务使更改生效。步骤2: 初始化备用服务器安装PostgreSQL:同样地,在备用服务器上安装相同版本的PostgreSQL。停止PostgreSQL服务。基于主服务器进行基础备份:使用pg_basebackup工具从主服务器获取数据副本。pg_basebackup -h <primary_ip> -D /path/to/your/data/directory -U replicator -P --wal-method=stream编辑recovery.conf:在数据目录下创建此文件,以便指示PostgreSQL启动时进入恢复模式。standby_mode = 'on' primary_conninfo = 'host=<primary_ip> port=5432 user=replicator password=yourpassword' trigger_file = '/tmp/postgresql.trigger.5432'启动PostgreSQL服务:此时,备用服务器应开始从主服务器接收更新并保持同步。测试与验证检查主服务器上的pg_stat_replication视图,确认有活动的复制槽。在主服务器上执行一些简单的写操作,然后检查备用服务器是否反映了这些变化。尝试手动切换角色,例如关闭主服务器后观察备用服务器能否自动接管。结论通过上述步骤,您可以成功建立一个PostgreSQL的主备架构。这样的配置不仅提高了系统的可用性,也增强了灾难恢复能力。不过,请注意这只是一个入门级示例;对于生产环境来说,可能还需要考虑更多细节如安全性加强、性能优化等。希望本指南能帮助到您!如果您有任何问题或需要进一步的帮助,请随时留言。
-
PostgreSQL主备同步机制深度解析在分布式数据库系统中,确保数据的一致性和可靠性是一项至关重要的任务。PostgreSQL作为一个高度可扩展且功能丰富的开源关系型数据库管理系统,提供了多种数据同步机制来保证数据的高可用性和一致性。本文将深入探讨PostgreSQL的主备同步机制,特别是其流复制技术,并包含相关的配置代码示例。一、PostgreSQL主备同步概述PostgreSQL的主备同步机制基于日志的复制机制(Write-Ahead Logging, WAL)进行。这种机制使得数据在主数据库(Primary)和从数据库(Standby)之间保持同步,从而确保高可用性和数据冗余。主数据库(Primary):负责处理所有写操作(插入、更新、删除)以及读操作。从数据库(Standby):负责接收从主数据库传递来的WAL日志,并应用这些日志以保持数据的一致性。可以配置为只读以分担查询负载。二、WAL日志机制WAL日志文件记录了数据库的每一个修改操作。主数据库将所有变更首先写入WAL日志文件,然后将这些日志发送给从数据库。发送WAL数据:主数据库通过WAL Sender进程(wal_sender)将WAL日志发送给从数据库。接收和写入WAL数据:从数据库通过WAL Receiver进程(wal_receiver)接收来自主数据库的WAL日志,并将其写入本地存储。应用WAL数据:从数据库将接收到的WAL日志应用到自身的数据库实例中,从而使数据与主数据库保持一致。WAL日志文件通常被以16MB为一个文件块存储,称为WAL段。主数据库的WAL Sender进程将最新的WAL日志记录发送给从数据库。三、PostgreSQL主备同步配置要实现PostgreSQL的主备同步,需要对主库和备库进行一系列配置。以下是一个详细的配置步骤。1. 配置主库(1)docker-compose.yml配置文件version: '3' services: postgres: image: postgres:11-alpine container_name: postgres-master ports: - "5432:5432" volumes: - "./pgdata:/var/lib/postgresql/data" environment: POSTGRES_PASSWORD: password POSTGRES_USER: dbuser POSTGRES_DB: example TZ: Asia/Shanghai(2)pg_hba.conf配置host replication repuser 172.27.1.11/32 md5 host replication repuser 172.27.1.12/32 md5(3)postgresql.conf配置listen_addresses = '*' wal_level = replica archive_mode = on archive_command = '/bin/date' max_wal_senders = 10 wal_keep_segments = 64 wal_sender_timeout = 60s hot_standby = on max_connections = 1000(4)创建数据库复制用户docker exec -it postgres-master /bin/bash psql -U dbuser -d example CREATE ROLE repuser LOGIN REPLICATION ENCRYPTED PASSWORD 'repuser';2. 配置备库(1)使用pg_basebackup拉起备库./pg_basebackup -h localhost -U repuser -p 5432 -P -v -R -X stream -D ../data_b -l backup_label(2)修改postgresql.confecho "port = 5433" >> ../data_b/postgresql.conf echo "hot_standby = on" >> ../data_b/postgresql.conf(3)启动备库./pg_ctl start -D ../data_b -l logfile_b3. 设置同步复制参数在主库上设置synchronous_commit和synchronous_standby_names参数,使备库变为同步状态。ALTER SYSTEM SET synchronous_commit = 'on'; ALTER SYSTEM SET synchronous_standby_names = 'walreceiver'; SELECT pg_reload_conf();四、同步复制的工作机制在同步复制模式下,当主库执行写操作并等待确认时,备库接收并写入XLOG。随后,主库进程被唤醒,确保数据一致性。主库插入数据,刷XLOG:主库插入数据后,将变更写入WAL日志文件,并调用SyncRepWaitForLSN函数等待。备库接收并写入XLOG:备库的WAL Receiver进程接收来自主库的WAL日志,并将其写入本地存储。主库唤醒并确认提交:备库将XLOG刷入磁盘后,通知主库的WAL Sender进程。主库收到通知后,使用SyncRepWakeQueue唤醒所有等待队列中的进程,并确认事务提交。五、数据一致性保证在主库崩溃的情况下,通过recovery流程可以保证数据不丢失。由于主库先写了XLOG并且已落盘,如果主库崩溃而备库尚未收到这条XLOG,但在主库恢复时,会通过recovery流程恢复这条数据,从而保证数据一致性。六、性能与可靠性权衡synchronous_commit参数:off:性能优先,但存在数据丢失风险。local:本地数据安全,适度性能与安全平衡。on:最高级别的数据持久性保障,但会增加事务提交延迟。remote_write:适度数据安全与性能平衡,依赖于远程数据传输。remote_apply:高数据安全性,但事务提交延迟较大。synchronous_standby_names参数:定义参与同步复制过程中的备用服务器,确保数据的高可用性和一致性。七、应用场景银行交易、财务系统:对数据安全性和事务持久性有极高标准要求。医疗系统:需要确保数据的每一次更改都能被可靠保存。政府服务:要求数据的每一次变更都具备高度的可靠性和持久性。八、总结PostgreSQL的主备同步机制基于WAL日志实现,通过流复制技术确保数据在主库和备库之间保持同步。通过合理配置synchronous_commit和synchronous_standby_names参数,可以在性能与可靠性之间找到平衡点。在实际应用中,根据具体场景选择合适的配置参数,可以确保数据的高可用性和一致性。
-
在当今数字化时代,数据管理与处理的重要性不言而喻。PostgreSQL 作为一款功能强大、开源且高度可扩展的关系型数据库管理系统,被广泛应用于各种领域。无论你是初涉数据库领域的新手,还是希望深入了解 PostgreSQL 的开发者,掌握其基础语法都是至关重要的。在这篇博客中,我们将深入探讨 PostgreSQL 的基础语法,并通过丰富的代码示例帮助你快速上手。一、连接到 PostgreSQL 数据库在使用 PostgreSQL 之前,首先需要连接到数据库服务器。通常,可以使用命令行客户端或者各种数据库连接工具(如 pgAdmin)来实现连接。以下是使用命令行客户端连接到本地 PostgreSQL 数据库的基本语法:psql -U [用户名] -d [数据库名]例如,如果你的用户名是 postgres,数据库名为 mydb,则连接命令如下:psql -U postgres -d mydb成功连接后,将进入 PostgreSQL 的命令行交互界面,可以在此处输入 SQL 命令与数据库进行交互。二、数据库操作创建数据库创建数据库是使用 PostgreSQL 的第一步。使用 CREATE DATABASE 语句可以创建一个新的数据库。示例代码如下:CREATE DATABASE testdb;上述代码创建了一个名为 testdb 的数据库。在实际应用中,可以根据项目需求为数据库取一个有意义的名称。删除数据库当不再需要某个数据库时,可以使用 DROP DATABASE 语句将其删除。但要注意,删除数据库将永久删除其中的所有数据,操作需谨慎。示例如下:DROP DATABASE testdb;执行此命令后,testdb 数据库及其包含的所有对象(如表、视图等)都将被删除。三、表操作创建表表是数据库中存储数据的基本结构。使用 CREATE TABLE 语句来创建表,需要指定表名以及各列的名称、数据类型和约束等信息。以下是一个创建简单用户表的示例:CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE );在这个示例中,id 列是一个自增的主键,确保每条记录都有唯一的标识符。username 和 password 列是必填字段,email 列要求值唯一,以保证用户邮箱的唯一性。修改表结构随着项目的发展,可能需要对表结构进行修改,如添加新列、修改列的数据类型或约束等。使用 ALTER TABLE 语句可以实现这些操作。例如,向 users 表中添加一个 age 列:ALTER TABLE users ADD COLUMN age INT;删除表如果某个表不再使用,可以使用 DROP TABLE 语句将其删除。例如:DROP TABLE users;执行此命令后,users 表将被删除,表中的所有数据也将丢失。四、数据操作插入数据使用 INSERT INTO 语句向表中插入数据。以下是向 users 表插入一条记录的示例:INSERT INTO users (username, password, email, age) VALUES ('John Doe', 'password123', 'john@example.com', 25);可以一次插入多条记录,例如:INSERT INTO users (username, password, email, age) VALUES ('Alice Smith', 'alicepass', 'alice@example.com', 30), ('Bob Johnson', 'bobpass', 'bob@example.com', 35);查询数据查询数据是数据库操作中最常用的功能之一。使用 SELECT 语句从表中检索数据。例如,查询 users 表中的所有记录:SELECT * FROM users;也可以只查询特定列:SELECT username, email FROM users;还可以使用 WHERE 子句添加查询条件,例如查询年龄大于 30 岁的用户:SELECT * FROM users WHERE age > 30;更新数据使用 UPDATE 语句更新表中的数据。例如,将用户 John Doe 的年龄更新为 26 岁:UPDATE users SET age = 26 WHERE username = 'John Doe';删除数据使用 DELETE FROM 语句从表中删除数据。例如,删除年龄小于 20 岁的用户记录:DELETE FROM users WHERE age < 20;五、数据约束数据约束用于确保数据的完整性和一致性。除了前面提到的主键约束(PRIMARY KEY)和唯一约束(UNIQUE)外,还有其他常见的约束类型。非空约束非空约束(NOT NULL)确保列中的值不能为空。如在创建 users 表时,username 和 password 列都设置了非空约束,这意味着插入记录时这两列必须提供值。外键约束外键约束(FOREIGN KEY)用于建立表之间的关联关系。例如,假设有一个 orders 表,其中包含 user_id 列,用于关联 users 表中的 id 列。创建 orders 表的示例如下:CREATE TABLE orders ( id SERIAL PRIMARY KEY, order_number VARCHAR(20), user_id INT REFERENCES users(id) );通过外键约束,可以保证 orders 表中的 user_id 列的值必须存在于 users 表的 id 列中,从而维护了数据的关联性和一致性。六、函数与运算符PostgreSQL 提供了丰富的内置函数和运算符,用于数据处理和计算。常用函数数学函数:如 ABS()(绝对值函数)、ROUND()(四舍五入函数)等。例如:SELECT ABS(-5), ROUND(3.14159, 2);字符串函数:如 CONCAT()(连接字符串函数)、SUBSTRING()(截取字符串函数)等。例如:SELECT CONCAT('Hello', ' ', 'World'), SUBSTRING('Hello, World', 1, 5);日期和时间函数:如 CURRENT_DATE(获取当前日期)、EXTRACT()(提取日期或时间的部分信息)等。例如:SELECT CURRENT_DATE, EXTRACT(YEAR FROM CURRENT_TIMESTAMP);运算符算术运算符:包括加法(+)、减法(-)、乘法(*)、除法(/)等。例如:SELECT 5 + 3, 10 - 2, 4 * 5, 20 / 4;比较运算符:如等于(=)、不等于(<> 或 !=)、大于(>)、小于(<)等。例如:SELECT 5 > 3, 10 <> 5;逻辑运算符:包括 AND(与)、OR(或)、NOT(非)等。例如:SELECT (5 > 3) AND (10 < 20), (5 > 10) OR (3 < 5);七、聚合函数聚合函数用于对一组数据进行计算并返回一个单一的值。常见的聚合函数有 COUNT()(计数)、SUM()(求和)、AVG()(平均值)、MAX()(最大值)和 MIN()(最小值)等。例如,统计 users 表中的用户数量:SELECT COUNT(*) FROM users;计算 orders 表中订单金额的总和:SELECT SUM(order_amount) FROM orders;获取 users 表中用户的最大年龄:SELECT MAX(age) FROM users;八、分组与排序分组查询使用 GROUP BY 子句可以按照指定的列对数据进行分组,并结合聚合函数进行分组统计。例如,统计每个用户的订单数量:SELECT user_id, COUNT(*) FROM orders GROUP BY user_id;排序查询使用 ORDER BY 子句对查询结果进行排序。可以指定升序(ASC,默认)或降序(DESC)。例如,按照用户年龄升序查询 users 表:SELECT * FROM users ORDER BY age ASC;按照订单金额降序查询 orders 表:SELECT * FROM orders ORDER BY order_amount DESC;九、子查询子查询是嵌套在其他查询中的查询语句。它可以作为主查询的条件、列表达式或数据源等。例如,查询年龄大于平均年龄的用户:SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users);在这个示例中,内部子查询 (SELECT AVG(age) FROM users) 先计算出用户的平均年龄,然后外部查询根据这个结果筛选出年龄大于平均年龄的用户记录。十、连接查询连接查询用于从多个表中检索相关数据。常见的连接类型包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。例如,查询用户及其对应的订单信息(内连接):SELECT users.username, orders.order_number FROM users INNER JOIN orders ON users.id = orders.user_id;左连接会返回左表中的所有记录以及与右表匹配的记录,如果右表中没有匹配的记录,则对应的列值为 NULL。例如:SELECT users.username, orders.order_number FROM users LEFT JOIN orders ON users.id = orders.user_id;右连接和全连接的原理类似,只是连接的方向和结果集有所不同。通过以上对 PostgreSQL 基础语法的详细介绍,相信你已经对这个强大的数据库管理系统有了初步的认识和理解。从数据库和表的创建与管理,到数据的插入、查询、更新和删除,再到各种约束、函数、运算符以及高级查询(如分组、排序、子查询和连接查询)的运用,这些基础语法构成了 PostgreSQL 数据库操作的核心知识体系。在实际应用中,你可以根据具体的业务需求灵活运用这些语法,构建高效、可靠的数据库应用程序。不断实践和探索,你将能够更深入地掌握 PostgreSQL 的强大功能,为数据处理与管理提供有力的支持。
-
select oid,relfilenode,relname from pg_class where relname ='teacher'; oid | relfilenode | relname -------+-------------+--------- 17530 | 17542 | teacher然而在操作系统里面,只找到17542这个文件,没有像_vm,_fsm这些文件[Ruby@gauss-dis-134 base]$ find ./ -name 17542* ./17325/17542像在postgresql,openGauss,都是有_fsm,_vm的文件的
-
在postgresql或者openGauss中,数据文件目录的base目录下,名称和oid都是一一对弈对应的,如:openGauss=# select oid,datname from pg_database; oid | datname -------+------------- 1 | template1 16398 | db_web_data 15649 | template0 16400 | db_test2 16399 | db_test1 15654 | postgres 16405 | db_test123对应着文件系统的目录[omm@txy base]$ ls -ls total 120 20 drwx------ 2 omm dbgrp 20480 Oct 12 10:15 1 16 drwx------ 2 omm dbgrp 16384 Oct 12 10:15 15649 16 drwx------ 2 omm dbgrp 16384 Nov 3 23:24 15654 16 drwx------ 2 omm dbgrp 16384 Oct 16 15:44 16398 16 drwx------ 2 omm dbgrp 16384 Oct 23 17:03 16399 16 drwx------ 2 omm dbgrp 16384 Oct 23 17:03 16400 16 drwx------ 2 omm dbgrp 16384 Oct 23 17:25 16405 4 drwx------ 2 omm dbgrp 4096 Oct 12 10:14 pgsql_tmp但是在gaussdb,我发现并不是一样的gaussdb=> select oid,datname from pg_database; oid | datname -------+------------ 1 | template1 14942 | template0 17325 | db_ora 17457 | db_conn10w 17458 | db_default 14948 | postgres 16809 | test在文件目录里面反而是这些?[Ruby@gauss-dis-133 base]$ ls -lsa total 160 4 drwx------ 10 Ruby Ruby 4096 Nov 9 14:29 . 4 drwx------ 22 Ruby Ruby 4096 Nov 9 14:51 .. 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 1 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 14942 24 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 14948 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 16763 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25211 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25294 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25295新建一个数据库gaussdb=> create database db_newdb; gaussdb=> select oid,datname from pg_database; oid | datname -------+------------ 1 | template1 14942 | template0 17325 | db_ora 17457 | db_conn10w 17458 | db_default 14948 | postgres 16809 | test 17521 | db_newdb很明显会发现多了33483这个目录,可是我新建这个db_newdb的oid是17521啊,为什么对不上呢?[Ruby@gauss-dis-133 base]$ ls -lsa total 160 4 drwx------ 10 Ruby Ruby 4096 Nov 9 14:29 . 4 drwx------ 22 Ruby Ruby 4096 Nov 9 14:51 .. 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 1 16 drwx------ 2 Ruby Ruby 16384 Nov 9 08:18 14942 24 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 14948 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 16763 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25211 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25294 20 drwx------ 2 Ruby Ruby 20480 Nov 9 08:18 25295 16 drwx------ 2 Ruby Ruby 16384 Nov 9 14:29 33483```
-
Mysql转PostgreSQL注意事项- ifnull()和COALESCE()12345mysql--ifnull()改pg--COALESCE()ps:mysql -- ifnull(a.audit_result, '')pgsql -- COALESCE(a.audit_result, '')- date_format()和to_date()12345mysql--date_format()改pg--to_date(),声明类型 ‘ ::text'ps://pg数据库中不能使用'%',如 %y-%m-%dto_date(create_time::text, 'YY-MM-DD')- find_in_set()和ANY (string_to_array(‘’, ‘,’))12345mysql--find_in_set()改pg--ANY (string_to_array(some_column, ','))ps:SELECT t.dept_id FROM sys_dept t WHERE find_in_set('100', ancestors)SELECT t.dept_id FROM sys_dept t WHERE '100' = ANY (string_to_array(ancestors, ','))- sysdate()和now()12mysql--sysdate()改pg--now()- 模糊匹配123// 如果使用 concat参数,pg数据库需配置隐形转换类型mysql-- like concat('%', #{testItem}, '%') 改pg-- ilike '%'|| #{testItem} ||'%' 或 like concat('%', #{testItem}, '%')- GROUP_CONCAT()和string_agg()12mysql-- GROUP_CONCAT(t.cname)改pg-- array_to_string(array_agg(t.cname),',') 或 string_agg(t.cname,',')- locate()和strpos()12mysql-- locate()改pg-- strpos()
-
Linux 中 Vim 的使用指南在 Linux 系统中,Vim 是一个功能强大的文本编辑器,深受开发者和系统管理员的喜爱。它具有高度的可定制性和高效的编辑功能,可以帮助用户快速编辑各种文本文件。本文将为你详细介绍 Linux 中 Vim 的使用方法,包括基本操作、快捷键、配置和插件等内容。一、Vim 的基本模式Vim 有三种基本模式:命令模式、插入模式和可视模式。命令模式当你打开 Vim 时,默认处于命令模式。在这个模式下,你可以使用各种命令来移动光标、删除文本、复制粘贴等。常用的命令包括:h(向左移动光标)、j(向下移动光标)、k(向上移动光标)、l(向右移动光标)、i(进入插入模式)、d(删除文本)、y(复制文本)、p(粘贴文本)等。插入模式在命令模式下,按下i键可以进入插入模式。在插入模式下,你可以像在其他文本编辑器中一样输入文本。按下Esc键可以退出插入模式,回到命令模式。可视模式在命令模式下,按下v键可以进入可视模式。在可视模式下,你可以选择文本块,然后进行复制、粘贴、删除等操作。按下Esc键可以退出可视模式,回到命令模式。二、Vim 的快捷键Vim 有很多快捷键,可以帮助你提高编辑效率。以下是一些常用的快捷键:移动光标h、j、k、l:向左、下、上、右移动光标。w:移动到下一个单词的开头。b:移动到上一个单词的开头。e:移动到下一个单词的结尾。删除文本x:删除光标所在的字符。dd:删除当前行。dw:删除当前单词。复制粘贴yy:复制当前行。p:粘贴文本。撤销和重做u:撤销上一次操作。Ctrl + r:重做上一次撤销的操作。查找和替换/pattern:查找指定的模式。按下n键可以继续查找下一个匹配项,按下N键可以查找上一个匹配项。:%s/old/new/g:将文件中的所有old替换为new。三、Vim 的配置Vim 的配置文件是~/.vimrc。你可以在这个文件中设置各种选项,以满足你的个性化需求。以下是一些常用的配置选项:设置行号在~/.vimrc文件中添加以下内容:set number设置缩进在~/.vimrc文件中添加以下内容:set tabstop=4 set shiftwidth=4 set expandtab设置语法高亮在~/.vimrc文件中添加以下内容:syntax on设置自动缩进在~/.vimrc文件中添加以下内容:set autoindent四、Vim 的插件Vim 有很多插件,可以扩展其功能。以下是一些常用的插件:NERDTreeNERDTree 是一个文件浏览器插件,可以帮助你快速浏览和管理文件系统。安装方法:在~/.vimrc文件中添加以下内容:Plugin 'scrooloose/nerdtree'然后在 Vim 中运行:PluginInstall命令安装插件。vim-airlinevim-airline 是一个状态栏插件,可以显示当前文件的信息、Vim 的模式等。安装方法:在~/.vimrc文件中添加以下内容:Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes'然后在 Vim 中运行:PluginInstall命令安装插件。YouCompleteMeYouCompleteMe 是一个代码自动补全插件,可以为多种编程语言提供智能的代码补全功能。安装方法:首先安装依赖项,然后在~/.vimrc文件中添加以下内容:Plugin 'Valloric/YouCompleteMe'最后在 Vim 中运行:PluginInstall命令安装插件。五、总结Vim 是一个功能强大的文本编辑器,掌握其基本操作、快捷键、配置和插件等内容,可以帮助你提高编辑效率。希望本文对你在 Linux 中使用 Vim 有所帮助。
-
Linux系统中磁盘管理LVM与挂载本文以属于Linux系统基本概念,如果以查找教程教程,解决问题为主,只需要查看本文后半部分。如需要系统性学习请查看本文前半部分。0. 引言在Linux系统中,分区(Partition)是一个物理硬盘驱动器(HDD)或固态硬盘(SSD)上被划分出来的独立存储区域。每个分区都有自己独立的文件系统,可以包含不同类型的文件和数据,并且可以被操作系统独立地访问和管理。分区又可以分为物理分区和逻辑分区。挂载指的是将一个文件系统连接到一个已存在的目录树中的某个点上,这个点称为“挂载点”(mount point)。挂载点既可以是本地路径,也可以是网络路径。一旦文件系统被挂载,用户就可以通过该挂载点访问和操作文件系统中的文件和目录。本文将主要讲解Linux系统的分区,挂载概念以及如何进行屋里分区,逻辑分区,分组分卷,挂载的概念和操作实例,相关常见问题等。本文操作极容易导致主机无法自动重启,请慎重操作。操作前务必要进行备份操作!1. Linux系统磁盘分区1.1 分区的基本概念物理分区:直接在物理硬盘上划分出的存储区域,它们占据了硬盘的一部分物理空间。物理分区是磁盘分区的最基本形式。tips:一块实体磁盘是一个物理分区吗?“块实体磁盘”通常指的是物理硬盘本身,它是存储数据的物理媒介。而“物理分区”则是指在物理硬盘上定义的逻辑区域,用于组织和管理数据。这两个概念并不完全等同。块实体磁盘: 这个术语中的“块”通常指的是磁盘上数据的最小读写单位——块(block)。块实体磁盘是指整个物理磁盘设备,它可以是一个硬盘驱动器(HDD)、固态硬盘(SSD)、甚至是闪存驱动器或其他任何形式的非易失性存储设备。在较低层次,磁盘被划分为一系列的块,操作系统通过这些块来读写数据。物理分区: 物理分区是物理硬盘上的一部分,是通过分区表(例如MBR或GPT)定义的逻辑区域。一个物理硬盘可以被分成一个或多个物理分区,每个分区可以有自己的文件系统,可以独立地被格式化和挂载。物理分区是操作系统用来区分和管理磁盘空间的一种方式。逻辑分区:在扩展分区内部创建的分区称为逻辑分区。在MBR(主引导记录)分区表类型的硬盘上,一个硬盘最多可以有四个主分区,或者三个主分区加上一个扩展分区,扩展分区内可以包含多个逻辑分区。GPT(GUID分区表)分区表类型则不受这个限制,支持更多的分区数量。分区表:分区表是硬盘上用于存储分区信息的结构GPT是一种分区表格式。GPT提供了对更大磁盘和更多分区的支持,并且是许多现代Linux发行版的默认选择。2. Linux磁盘管理LVM逻辑卷管理器LVM(LVM,Logical Volume Manager)允许用户将一个或多个物理硬盘上的分区组合成更大的存储池,并在这个池上创建逻辑卷(Logical Volumes,LVs),这些逻辑卷可以独立于底层物理磁盘进行扩展和收缩,从而提供了更好的磁盘空间利用率和管理效率。LVM系统和磁盘的关系如图所示依次为:disk -> partition -> PV -> VG -> LV -> fs,也即磁盘->分区->物理卷->卷组->逻辑卷->文件系统。2.1 LVM的主要组成部分物理卷(Physical Volume,PV): 物理卷是LVM的基本构建单元,可以是一个物理硬盘或其上的分区,也可以是软件RAID设备或任何其他形式的块设备。物理卷被划分为若干个物理区域(Physical Extents,PEs),这是LVM内部的最小存储单元。卷组(Volume Group,VG): 卷组是由一个或多个物理卷组成的集合,相当于一个大的存储池。在卷组中,物理区域(PEs)被统一管理和分配。卷组为逻辑卷提供了存储空间。逻辑卷(Logical Volume,LV): 逻辑卷是从卷组中分配出来的存储空间,它看起来就像一个普通的硬盘分区,可以被格式化为各种文件系统并挂载使用。逻辑卷的大小可以动态调整,而不必关心底层物理磁盘的限制。2.2 pv,vg ,lv的关系一个物理硬盘可以组成一个物理分区,一个物理硬盘也可以组成多个物理分区(一般最多四个)。一个物理分区为一个物理卷(pv)。1个至多个物理卷可以组成一个卷组(vg),一个卷组又可以分成多个逻辑卷。PV与VG的关系:一个或多个物理卷可以组成一个卷组。在创建卷组时,需要指定包含哪些物理卷。卷组中的物理卷可以来自不同的物理磁盘,也可以来自同一个物理磁盘的不同分区。VG与LV的关系:一个卷组可以划分出多个逻辑卷。逻辑卷的大小和数量取决于卷组的总容量和实际需求。在卷组上创建逻辑卷时,可以指定逻辑卷的大小和名称等属性。整体关系:PV(物理卷)-> VG(卷组)-> LV(逻辑卷)。这种层次结构使得Linux系统能够灵活地管理存储资源,实现数据的动态分配和扩展。物理卷,卷组,逻辑卷的关系图如下所示2.3 LVM设计的目的这种分层的架构允许用户更灵活地管理存储空间,例如动态调整逻辑卷的大小、在卷组之间移动物理卷,或者在一个卷组中创建多个逻辑卷来满足不同的应用需求。当给逻辑卷分配的空间较大时,我们可以动态减小逻辑卷的大小。当给逻辑卷分配的空间较小时,我们可以动态扩大逻辑卷的大小。同事还可以给卷组扩容。3. LVM实操讲解本次我使用的Linux主机位vm下的虚拟机,openeuler for BClinux 21.10在操作前我们首先查看系统的磁盘分区情况lsblk可以看到系统共有两个磁盘。第一个磁盘创建成物理分区sda1,sda2。sda1和sda2分别各自成为一个物理卷。sda2下有三个逻辑卷,分别挂载在不同的目录下。下面我们给虚拟机新增一个10G的磁盘,一个20G的磁盘和一个30G的磁盘(具体步骤此处不做讨论)来模拟物理机插入磁盘操作。可以参考文章:VMware虚拟机添加磁盘查看磁盘目录lsblk可以看到已经有多余的三个磁盘。LVM操作的基本命令如下3.1 创建物理分区在sdb,sdc,sdd三个磁盘分别创建三个物理分区(使用fdisk),物理分区类型都为lvm# 此处为使用fdisk工具在sdb创建了一个10G大小的物理分区sdb1,其余物理分区创建过程类似[root@localhost ~]# fdisk /dev/sdb欢迎使用 fdisk (util-linux 2.35.2)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。设备不包含可识别的分区表。创建了一个磁盘标识符为 0x511b7112 的新 DOS 磁盘标签。命令(输入 m 获取帮助):n分区类型p 主分区 (0 primary, 0 extended, 4 free)e 扩展分区 (逻辑分区容器)选择 (默认 p):p分区号 (1-4, 默认 1):第一个扇区 (2048-41943039, 默认 2048):最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): +10G创建了一个新分区 1,类型为“Linux”,大小为 10 GiB。命令(输入 m 获取帮助):t已选择分区 1Hex code or alias (type L to list all): 8e已将分区“Linux”的类型更改为“Linux LVM”。命令(输入 m 获取帮助):w分区表已调整。将调用 ioctl() 来重新读分区表。正在同步磁盘。此处为使用fdisk工具在sdb创建了一个10G大小的物理分区sdb1,其余物理分区创建过程类似按要求创建完分区后磁盘物理分区情况如下图所示3.2 创建物理卷创建物理卷使用的命令为pvcreatepvcreate [选项] 设备文件-f: 强制创建物理卷,不需要用户确认。-y: 自动回答“yes”以确认物理卷的创建。-u UUID: 指定设备的UUID。-Z: 指定是否使用前4个扇区。下面我们使用pvcreate将上述创建的9个物理分区设置为初始化物理卷pvcreate /dev/sdb1部分物理卷信息如下3.3 创建卷组卷组是由一个或多个物理卷(PV)组成的集合。物理卷可以是硬盘上的分区、整个硬盘、软件RAID设备或其他任何形式的块设备。卷组的作用是将这些物理卷的存储空间汇集在一起,形成一个更大的、逻辑上连续的存储池,供逻辑卷使用。使用vgcreate来创建卷组vgcreate 命令用于创建一个新的卷组(Volume Group)。vgcreate VG_new PV ...[ -A | --autobackup y | n ] # 是否自动备份元数据[ -c | --clustered y | n ] # 是否集群化卷组[ -l | --maxlogicalvolumes 数量 ] # 设置最大逻辑卷数目[ -p | --maxphysicalvolumes 数量 ] # 设置最大物理卷数目[ -M | --metadatatype lvm2 ] # 指定元数据类型[ -s | --physicalextentsize 大小[m|UNIT] ] # 设置物理区块大小[ -f | --force ] # 强制创建,忽略警告[ -Z | --zero y | n ] # 是否清零物理卷的开始部分[ --addtag 标签 ] # 添加标签[ --alloc contiguous | cling | cling_by_tags | normal | anywhere | inherit ] # 分配策略[ --metadataprofile 字符串 ] # 元数据配置文件[ --labelsector 数字 ] # 标签扇区[ --metadatasize 大小[m|UNIT] ] # 元数据大小[ --pvmetadatacopies 0 | 1 | 2 ] # 物理卷元数据拷贝数[ --vgmetadatacopies all | unmanaged | 数字 ] # 卷组元数据拷贝策略[ --reportformat basic | json ] # 报告格式[ --dataalignment 大小[k|UNIT] ] # 数据对齐[ --dataalignmentoffset 大小[k|UNIT] ] # 数据对齐偏移[ --shared ] # 共享卷组[ --systemid 字符串 ] # 系统ID[ --locktype sanlock | dlm | none ] # 锁类型[ COMMON_OPTIONS ] # 公共选项LVM的公共选项:[ -d | --debug ] # 开启调试模式[ -h | --help ] # 显示帮助信息[ -q | --quiet ] # 静默模式[ -v | --verbose ] # 详细模式[ -y | --yes ] # 自动回答“yes”[ -t | --test ] # 测试模式,不执行命令[ --commandprofile 字符串 ] # 命令配置文件[ --config 字符串 ] # 配置字符串[ --driverloaded y | n ] # 驱动是否加载[ --nolocking ] # 不使用锁[ --lockopt 字符串 ] # 锁选项[ --longhelp ] # 显示长帮助信息[ --profile 字符串 ] # 配置文件[ --version ] # 显示版本信息# 为了更全面的展示卷组的功能,我们将sdb1,sdc1,sdd1三个物理卷组成一个卷组,命名为xiangguvgcreate xianggu /dev/sdb1 /dev/sdc1 /dev/sdd1# 将sdb2和sdb3组成逻辑卷chaovgcreate chao /dev/sdb2 /dev/sdb3# 将sdc2 创建成一个卷组shuvgcreate shu /dev/sdc23.4 创建逻辑卷逻辑卷是在卷组(Volume Group,VG)之上创建的,用于存储数据的逻辑单元。它提供了比传统分区更灵活的存储管理方式,允许动态调整大小而不影响上层的文件系统或应用程序。使用lvcreate命令可以创建逻辑卷。lvcreate [选项] 卷组-L 或 --size:指定逻辑卷的大小,可以使用单位如G(Gibibyte)、M(Mebibyte)等。-n 或 --name:指定逻辑卷的名称。-l 或 --extents:基于物理区域(PE)的数量来指定逻辑卷的大小。-i 或 --mirrors:指定逻辑卷的镜像数量,用于创建镜像逻辑卷。-m 或 --mirrorlog:指定镜像日志的存储位置。-I 或 --stripes:指定逻辑卷的条带数。-S 或 --stripesize:指定逻辑卷的条带大小。-r 或 --regionsize:指定物理区域(PE)的大小。-R 或 --redundancy:设置镜像的冗余策略。-s 或 --snapshot:创建快照逻辑卷。-V 或 --virtualsize:设置快照的虚拟大小。-W 或 --writeable:创建写入式快照。-P 或 --poolmetadatasize:设置存储池的元数据大小。-K 或 --thinpool:创建精简存储池。-T 或 --thin:在精简存储池中创建精简逻辑卷。在创建逻辑卷之前,我们看一下各个卷组的大小vgdisplay#########################################################[root@localhost ~]# vgdisplay--- Volume group ---VG Name shuSystem IDFormat lvm2Metadata Areas 1Metadata Sequence No 1VG Access read/writeVG Status resizableMAX LV 0Cur LV 0Open LV 0Max PV 0Cur PV 1Act PV 1VG Size <15.00 GiBPE Size 4.00 MiBTotal PE 3839Alloc PE / Size 0 / 0Free PE / Size 3839 / <15.00 GiBVG UUID x4dnET-dQQv-TAKr-lpEw-3Ej1-IvNB-Z4Idty--- Volume group ---VG Name chaoSystem IDFormat lvm2Metadata Areas 2Metadata Sequence No 1VG Access read/writeVG Status resizableMAX LV 0Cur LV 0Open LV 0Max PV 0Cur PV 2Act PV 2VG Size 9.99 GiBPE Size 4.00 MiBTotal PE 2558Alloc PE / Size 0 / 0Free PE / Size 2558 / 9.99 GiBVG UUID sQfM7y-rtE9-B0kz-1YcA-3bSu-Vbdm-iFi2vT--- Volume group ---VG Name xiangguSystem IDFormat lvm2Metadata Areas 3Metadata Sequence No 1VG Access read/writeVG Status resizableMAX LV 0Cur LV 0Open LV 0Max PV 0Cur PV 3Act PV 3VG Size <21.99 GiBPE Size 4.00 MiBTotal PE 5629Alloc PE / Size 0 / 0Free PE / Size 5629 / <21.99 GiBVG UUID 44PuR0-JQK2-eOIV-p3zO-5Vvm-XgWZ-OlLZwx其中最大的卷为xianggu卷组,空间略小于22G我们使用xianggu卷组创建一个10G的逻辑卷,逻辑卷名称为logical,并将其设置为ext4类型lvcreate -L 10G -n logical xianggumkfs.ext4 /dev/xianggu使用lsblk查看挂载情况lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 200G 0 disk├─sda1 8:1 0 1G 0 part /boot└─sda2 8:2 0 199G 0 part├─bigcloud--enterprise--linux--for--euler-root 253:0 0 70G 0 lvm /├─bigcloud--enterprise--linux--for--euler-swap 253:1 0 7.9G 0 lvm [SWAP]└─bigcloud--enterprise--linux--for--euler-home 253:2 0 121.1G 0 lvm /homesdb 8:16 0 20G 0 disk├─sdb1 8:17 0 10G 0 part│ └─xianggu-logical 253:3 0 21G 0 lvm├─sdb2 8:18 0 5G 0 part└─sdb3 8:19 0 5G 0 partsdc 8:32 0 30G 0 disk├─sdc1 8:33 0 10G 0 part│ └─xianggu-logical 253:3 0 21G 0 lvm├─sdc2 8:34 0 15G 0 part└─sdc3 8:35 0 5G 0 partsdd 8:48 0 10G 0 disk├─sdd1 8:49 0 2G 0 part│ └─xianggu-logical 253:3 0 21G 0 lvm├─sdd2 8:50 0 3G 0 part└─sdd3 8:51 0 5G 0 partsr0 11:0 1 5.2G 0 rom查看逻辑卷lvdisplay[root@localhost ~]# lvs[root@localhost ~]# lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Converthome bigcloud-enterprise-linux-for-euler -wi-ao---- <121.11groot bigcloud-enterprise-linux-for-euler -wi-ao---- 70.00gswap bigcloud-enterprise-linux-for-euler -wi-ao---- <7.89glogical xianggu -wi------- 10.00g3.5 挂载逻辑卷在上面的操作,我们创建了逻辑卷logical,现在我们挂载逻辑卷。# 创建挂载路径mkdir /soft# 使用mount挂载,重启后会失效mount /dev/xianggu/logical /soft[root@localhost /]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 200G 0 disk├─sda1 8:1 0 1G 0 part /boot└─sda2 8:2 0 199G 0 part├─bigcloud--enterprise--linux--for--euler-root 253:0 0 70G 0 lvm /├─bigcloud--enterprise--linux--for--euler-swap 253:1 0 7.9G 0 lvm [SWAP]└─bigcloud--enterprise--linux--for--euler-home 253:2 0 121.1G 0 lvm /homesdb 8:16 0 20G 0 disk├─sdb1 8:17 0 10G 0 part│ └─xianggu-logical 253:3 0 10G 0 lvm /soft├─sdb2 8:18 0 5G 0 part└─sdb3 8:19 0 5G 0 partsdc 8:32 0 30G 0 disk├─sdc1 8:33 0 10G 0 part│ └─xianggu-logical 253:3 0 10G 0 lvm /soft├─sdc2 8:34 0 15G 0 part└─sdc3 8:35 0 5G 0 partsdd 8:48 0 10G 0 disk├─sdd1 8:49 0 2G 0 part├─sdd2 8:50 0 3G 0 part└─sdd3 8:51 0 5G 0 partsr0 11:0 1 5.2G 0 rom## 修改/etc/fstab 永久挂载vi /etc/fstab# 在最后一行添加/dev/xianggu/logical /soft ext4 defaults 0 03.5 卷组扩容与缩容物理卷(Physical Volume, PV)本身不能直接动态扩容,因为物理卷是基于底层存储设备(如硬盘分区或裸设备)的固定部分。给卷组扩容的方法就是将新的物理卷pv添加到卷组。给卷组缩容的方法就是将物理卷pv从卷组中拿出。扩容使用的命令是vgextend用法如下vgextend 卷组 物理卷# 查看系统中的卷组有哪些vgdisplay[root@localhost /]# vgs[root@localhost /]# vgsWARNING: Couldn't find device with uuid afbT6Z-5uF9-sfiF-3Gf6-Vy34-fxW1-AHTrCw.WARNING: VG xianggu is missing PV afbT6Z-5uF9-sfiF-3Gf6-Vy34-fxW1-AHTrCw (last written to [unknown]).VG #PV #LV #SN Attr VSize VFreebigcloud-enterprise-linux-for-euler 1 3 0 wz--n- <199.00g 0chao 2 0 0 wz--n- 9.99g 9.99gshu 1 0 0 wz--n- <15.00g <15.00gxianggu 5 1 0 wz-pn- 31.98g 21.98g看到香菇卷的大小为约12Gvgdisplay xianggu--- Volume group ---VG Name xiangguSystem IDFormat lvm2Metadata Areas 3Metadata Sequence No 8VG Access read/writeVG Status resizableMAX LV 0Cur LV 1Open LV 1Max PV 0Cur PV 3Act PV 3VG Size <21.99 GiBPE Size 4.00 MiBTotal PE 5629Alloc PE / Size 2560 / 10.00 GiBFree PE / Size 3069 / <11.99 GiBVG UUID 44PuR0-JQK2-eOIV-p3zO-5Vvm-XgWZ-OlLZwx现在我们将xianggu卷组中加入sdd3,可以看到卷组容量为约27G,卷组成功扩容[root@localhost /]# vgextend xianggu /dev/sdd3Volume group "xianggu" successfully extended[root@localhost /]# vgdisplay xianggu--- Volume group ---VG Name xiangguSystem IDFormat lvm2Metadata Areas 4Metadata Sequence No 9VG Access read/writeVG Status resizableMAX LV 0Cur LV 1Open LV 1Max PV 0Cur PV 4Act PV 4VG Size 26.98 GiBPE Size 4.00 MiBTotal PE 6908Alloc PE / Size 2560 / 10.00 GiBFree PE / Size 4348 / 16.98 GiBVG UUID 44PuR0-JQK2-eOIV-p3zO-5Vvm-XgWZ-OlLZwx下面我们对卷组进行缩容,xianggu卷组是由sdb1,sdc1,sdd1,sdd3组成的缩减逻辑卷是一项风险较高的操作,可能导致数据丢失。# 查看各个物理卷pv的状态pvscan xianggu[root@localhost /]# pvscanPV /dev/sdc2 VG shu lvm2 [<15.00 GiB / <15.00 GiB free]PV /dev/sdb2 VG chao lvm2 [<5.00 GiB / <5.00 GiB free]PV /dev/sdb3 VG chao lvm2 [<5.00 GiB / <5.00 GiB free]WARNING: Couldn't find device with uuid afbT6Z-5uF9-sfiF-3Gf6-Vy34-fxW1-AHTrCw.WARNING: VG xianggu is missing PV afbT6Z-5uF9-sfiF-3Gf6-Vy34-fxW1-AHTrCw (last written to [unknown]).PV /dev/sdb1 VG xianggu lvm2 [<10.00 GiB / 0 free]PV /dev/sdc1 VG xianggu lvm2 [<10.00 GiB / 9.99 GiB free]PV /dev/sdd1 VG xianggu lvm2 [<2.00 GiB / <2.00 GiB free]PV [unknown] VG xianggu lvm2 [<5.00 GiB / <5.00 GiB free]PV /dev/sdd3 VG xianggu lvm2 [<5.00 GiB / <5.00 GiB free]PV /dev/sda2 VG bigcloud-enterprise-linux-for-euler lvm2 [<199.00 GiB / 0 free]PV /dev/sdc3 lvm2 [<5.00 GiB]PV /dev/sdd2 lvm2 [3.00 GiB]Total: 11 [263.96 GiB] / in use: 9 [255.96 GiB] / in no VG: 2 [<8.00 GiB]下面我们要在xianggu卷组中删除sdc1如果发现物理卷上有逻辑卷,这将导致数据丢失,务必先备份使用的命令是vgreduce,用法如下greduce <卷组名称> <物理卷名称>#在xianggu卷组中删除sdc1# 如果 /dev/sdc1 上还有逻辑卷,并且这些逻辑卷没有被正确处理(如删除或迁移)vgreduce xianggu /dev/sdc13.6 逻辑卷扩容与缩容逻辑卷扩容与缩容允许用户在不丢失数据的情况下动态地调整逻辑卷的大小缩减逻辑卷是一项风险较高的操作,可能导致数据丢失。逻辑卷扩容使用的命令为lvextend,缩容使用的是lvreduce语法如下# 扩容或者创建lv逻辑卷lvextend -L [+]大小 /dev/卷组名/逻辑卷名# 缩容lv逻辑卷lvreduce -L [-]大小 /dev/卷组名/逻辑卷名下面进行实际操作# 给logical逻辑卷进行扩容2G# 首先要保证logical所在的2卷组容量足够# 查看xianggu卷组剩余容量[root@localhost ~]# vgdisplay xiangguWARNING: Couldn't find device with uuid afbT6Z-5uF9-sfiF-3Gf6-Vy34-fxW1-AHTrCw.WARNING: VG xianggu is missing PV afbT6Z-5uF9-sfiF-3Gf6-Vy34-fxW1-AHTrCw (last written to [unknown]).--- Volume group ---VG Name xiangguSystem IDFormat lvm2Metadata Areas 4Metadata Sequence No 10VG Access read/writeVG Status resizableMAX LV 0Cur LV 1Open LV 0Max PV 0Cur PV 5Act PV 4VG Size 31.98 GiBPE Size 4.00 MiBTotal PE 8187Alloc PE / Size 2560 / 10.00 GiBFree PE / Size 5627 / 21.98 GiBVG UUID 44PuR0-JQK2-eOIV-p3zO-5Vvm-XgWZ-OlLZwx# 剩余12G,进行扩容[root@localhost /]# lvextend +L +2G /dev/xianggu/logical# 使用文件系统工具来扩展文件系统。[root@localhost /] # resize2fs /dev/xianggu/logical# 给logical逻辑卷进行缩容1G# 在进行缩容之前,必须先卸载逻辑卷上的文件系统。[root@localhost /]# umount /dev/xianggu/logical /soft[root@localhost /]# lvextend +l 1G /dev/xianggu/logical#重新逻辑卷上的文件系统。[root@localhost /]# mount /dev/xianggu/logical /soft对于ext2、ext3、ext4文件系统,你可以使用resize2fs命令:bash复制代码resize2fs /dev/myvg/mylv注意:在大多数情况下,resize2fs会自动检测并扩展文件系统到逻辑卷的新大小,但最好先检查其手册页以确认。对于xfs文件系统,xfs_growfs命令用于扩展文件系统:bash复制代码xfs_growfs /mount_point其中/mount_point是逻辑卷挂载的点。上述扩容和缩容也可以直接来指定逻辑卷容量大小# 或者直接设置新大小lvextend -L <new_size>G /dev/myvg/mylv# 若是扩容,需要指定扩容的文件类型。若是缩容,需要先卸载文件路径,缩容后再挂载6. 答疑6.1 为什么创建物理卷后的容量小于物理分区的容量当物理分区被初始化为物理卷时,其容量会基于PE的大小进行划分。如果物理分区的总容量不能被PE大小整除,那么最后一部分空间可能会被浪费或保留为未分配空间,从而导致物理卷的容量小于物理分区的原始容量。LVM可能会为物理卷预留一定的空间用于管理目的,如快照、镜像、恢复点等。这些预留空间会减少可用于实际数据存储的容量。6.2为什么创建逻辑卷后的总容量小于物理卷容量之和卷组(Volume Group, VG)是由一个或多个物理卷(Physical Volume, PV)组成的集合。VG的容量是所有PV容量的总和,但并非所有这些容量都会直接分配给逻辑卷。LVM可能会为VG或LV预留一定的空间用于管理目的,如快照、镜像等。这些预留空间会减少可用于逻辑卷的实际容量。
-
Antdb常用管理操作单节点环境启动adb_ctl start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s] 例:adb_ctl start -D /home/antdb/datapath停止adb_ctl stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s] Shutdown modes are: smart quit after all clients have disconnected fast quit directly, with proper shutdown (default) immediate quit without complete shutdown; will lead to recovery on restart 例:adb_ctl stop -D /home/antdb/datapath -m f集中式高可用集群环境adbdcs 集群的启停启动 adbdcs 集群分别以 AntDB 用户,例如 adb01 登录三台机器(一主二备)。使用以下命令分别启动 adbdcs。sudo systemctl start adbdcs停止 adbdcs 集群分别以 AntDB 用户,例如 adb01 登录三台机器(一主二备)。使用以下命令分别停止 adbdcs。sudo systemctl stop adbdcs查看 adbdcs 节点启停状态分别以 AntDB 用户,例如 adb01 登录三台机器(一主二备)。使用以下命令分别停止 adbdcs。sudo systemctl status adbdcs错误排查如果启动 adbdcs 或者停止 adbdcs 服务失败,请根据日志文件中的日志信息排查错误。# adbdcs的日志在系统日志中,如果有问题,可以通过日志报错去调查 tail -f /var/log/messages 高可用集群的启停启动集群分别以 AntDB 用户,例如 adb01 登录三台机器(一主二备)。使用以下命令分别启动 adbhamgr。sudo systemctl start adbhamgr说明默认前提是集群搭建完毕:adbdcs 启动成功,主备搭建成功。具体搭建步骤请参考集中式安装部署手册。停止集群分别以 AntDB 用户,例如 adb01 登录三台机器(一主二备)。使用以下命令分别停止 adbhamgr。sudo systemctl stop adbhamgr说明adbhamgr 停止后,集群即停止成功。重启集群adbhamgrctl 的 restart 后直接跟集群名称,可以重启集群。--force 能强制重启集群。[antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml restart antdb-cluster + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Replica | running | 467 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Sync Standby | running | 467 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Leader | running | 467 | | +-------------+--------------------+--------------+---------+-----+-----------+ When should the restart take place (e.g. 2022-12-27T16:11) [now]: Are you sure you want to restart members adbhamgr-03, adbhamgr-01, adbhamgr-02? [y/N]: y Restart if the PostgreSQL version is less than provided (e.g. 9.5.2) []: Success: restart on member adbhamgr-03 Success: restart on member adbhamgr-01 Success: restart on member adbhamgr-02 #--force强制重启 [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml restart antdb-cluster --force + Cluster: antdb-cluster (7348278630800196973) ---+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Sync Standby | running | 467 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Replica | running | 467 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Leader | running | 467 | | +-------------+--------------------+--------------+---------+-----+-----------+ Success: restart on member adbhamgr-03 Success: restart on member adbhamgr-01 Success: restart on member adbhamgr-02重启节点adbhamgrctl 的 restart 后跟集群名称和节点名称,可以重启集群的节点。--force 能强制重启集群。[antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml restart antdb-cluster adbhamgr-01 + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Sync Standby | running | 467 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Replica | running | 467 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Leader | running | 467 | | +-------------+--------------------+--------------+---------+-----+-----------+ When should the restart take place (e.g. 2022-12-27T16:19) [now]: Are you sure you want to restart members adbhamgr-01? [y/N]: y Restart if the PostgreSQL version is less than provided (e.g. 9.5.2) []: Success: restart on member adbhamgr-01 #--force强制重启 [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml restart antdb-cluster adbhamgr-01 --force + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Replica | running | 467 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Sync Standby | running | 467 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Leader | running | 467 | | +-------------+--------------------+--------------+---------+-----+-----------+ Success: restart on member adbhamgr-01错误排查如果启动 adbhamgr 或者停止 adbhamgr 服务失败,请根据日志文件中的日志信息排查错误。# adbhamgr的日志在系统日志中,如果有问题,可以通过日志报错去调查 tail -f /var/log/messages # 查adbhamgr日志的命令: sudo systemctl status adbhamgr -l sudo journalctl -f -u adbhamgr 数据库状态查询用 adbhamgrctl 命令可以做如下操作,进行集群的维护和查询。Usage: adbhamgrctl [OPTIONS] COMMAND [ARGS]... Options: -c, --config-file TEXT Configuration file -d, --dcs TEXT Use this DCS -k, --insecure Allow connections to SSL sites without certs --help Show this message and exit. Commands: configure Create configuration file dsn Generate a dsn for the provided member, defaults to a dsn of... edit-config Edit cluster configuration failover Failover to a replica flush Flush scheduled events list List the adbhamgr members for a given adbhamgr pause Disable auto failover query Query a adbhamgr PostgreSQL member reinit Reinitialize cluster member reload Reload cluster member configuration remove Remove cluster from DCS restart Restart cluster member resume Resume auto failover scaffold Create a structure for the cluster in DCS show-config Show cluster configuration switchover Switchover to a replica version Output version of adbhamgrctl command or a running adbhamgr...集中式高可用支持查看整个集群的状态,通过查询结果确认集群或者单个主机的运行状态是否正常。该命令在集群中的任意一个主机上执行,结果都一样。#集群状态查询命令: adbhamgrctl -c /etc/adbhamgr.yml list 例如,下面命令执行后,发现集群中三个节点 Leader、Sync Standby、Replica 都存在,且State为running,说明该集群处于正常状态。 antdb@adb06:~$ adbhamgrctl -c /etc/adbhamgr.yml list + Cluster: antdb-cluster (7348278630800196973) -----+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+----------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 192.168.10.101:55551 | Replica | running | 188 | 0 | | adbhamgr-02 | 192.168.10.106:55551 | Sync Standby | running | 188 | 0 | | adbhamgr-03 | 192.168.10.103:55551 | Leader | running | 188 | | +-------------+----------------------+--------------+---------+-----+-----------+参数说明字段字段含义字段值Member集群中的节点成员名称在 adbhamgr.yml 文件中自定义Host集群中节点的 IP 和端口号在 adbhamgr.yml 文件中设置,形式是 IP:PORTRole集群中节点的角色属性Leader:主节点;Sync Standby:同步备节点;Replica:异步备节点State当前节点的状态running:运行中;crashed:节点奔溃中;creating replica:创建中;starting:启动中;stopped:节点停止TL“时间线”(Timeline)每当归档文件恢复完成后,创建一个新的时间线用来区别新生成的 WAL 记录。Lag in MB节点之间相互同步的偏移量正常为 0,代表主备之间同步成功。主节点压数据的时候,备节点还没及时同步则会出现大于 0的数值。Pending restart等待重新启动如果存在需要重启的节点,该列才会出现,用‘*’表示Cluster集群名称,如 Cluster: antdb-cluster,代表这个集群名称是 antdb-cluster在 adbhamgr.yml 文件中自定义主备切换数据库在运行过程中,数据库管理员可能需要手工对数据库节点做主备切换。例如发现数据库节点主备 failover 后需要恢复原有的主备角色,或怀疑硬件故障需要手动进行主备切换。可以通过 switchover 或 failover,手动实现主备切换。操作步骤非故障切换:使用命令 adbhamgrctl -c /etc/adbhamgr.yml switchover 进行手动切换主备。[antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml switchover Master [adbhamgr-02]: adbhamgr-02 #输入当前主节点 Candidate ['adbhamgr-01', 'adbhamgr-03'] []: adbhamgr-01 #输入当前同步备节点(Sync Standby) When should the switchover take place (e.g. 2022-12-27T12:14 ) [now]: Current cluster topology + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Sync Standby | running | 465 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Leader | running | 465 | | | adbhamgr-03 | 10.19.36.207:55551 | Replica | running | 465 | 0 | +-------------+--------------------+--------------+---------+-----+-----------+ Are you sure you want to switchover cluster antdb-cluster, demoting current master adbhamgr-02? [y/N]: y #查看主备切换结果: [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml list + Cluster: antdb-cluster (7348278630800196973) ---+----------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+----------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Sync Standby | running | 465 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Leader | stopping | | | | adbhamgr-03 | 10.19.36.207:55551 | Replica | running | 465 | 0 | +-------------+--------------------+--------------+----------+-----+-----------+ #Leader由adbhamgr-02切换到了adbhamgr-01 [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml list + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Leader | running | 466 | | | adbhamgr-02 | 10.19.36.206:55551 | Replica | running | 466 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Sync Standby | running | 466 | 0 | +-------------+--------------------+--------------+---------+-----+-----------+故障切换:使用命令 adbhamgrctl -c /etc/adbhamgr.yml failover 进行手动切换主备。[antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml failover Candidate ['adbhamgr-02', 'adbhamgr-03'] []: adbhamgr-03 #输入当前同步备节点(Sync Standby) Current cluster topology + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Leader | running | 466 | | | adbhamgr-02 | 10.19.36.206:55551 | Replica | running | 466 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Sync Standby | running | 466 | 0 | +-------------+--------------------+--------------+---------+-----+-----------+ Are you sure you want to failover cluster antdb-cluster, demoting current master adbhamgr-01? [y/N]: y #查看主备切换结果: [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml list + Cluster: antdb-cluster (7348278630800196973) ---+----------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+----------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Leader | stopping | | | | adbhamgr-02 | 10.19.36.206:55551 | Replica | running | 466 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Sync Standby | running | 466 | 0 | +-------------+--------------------+--------------+----------+-----+-----------+ [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml list + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Replica | stopped | | unknown | | adbhamgr-02 | 10.19.36.206:55551 | Sync Standby | running | 467 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Leader | running | 467 | | +-------------+--------------------+--------------+---------+-----+-----------+ #Leader由adbhamgr-01切换到了adbhamgr-03 [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml list + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.29:55551 | Replica | running | 467 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Sync Standby | running | 467 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Leader | running | 467 | | +-------------+--------------------+--------------+---------+-----+-----------+重新初始化节点adbhamgrctl 的 reinit 后跟集群名称,并选择对应的节点,可以重新初始化集群的某节点。--force 能强制重新初始化。# 可以在交互式选项里面选择需要重启的节点 [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml reinit antdb-cluster + Cluster: antdb-cluster (7348278630800196973) ---+---------+-----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +-------------+--------------------+--------------+---------+-----+-----------+ | adbhamgr-01 | 10.19.28.129:55551 | Replica | running | 467 | 0 | | adbhamgr-02 | 10.19.36.206:55551 | Sync Standby | running | 467 | 0 | | adbhamgr-03 | 10.19.36.207:55551 | Leader | running | 467 | | +-------------+--------------------+--------------+---------+-----+-----------+ Which member do you want to reinitialize [adbhamgr-02, adbhamgr-03, adbhamgr-01]? []: adbhamgr-01 Are you sure you want to reinitialize members adbhamgr-01? [y/N]: y Success: reinitialize for member adbhamgr-01 # 也可以在命令行直接输入需要重新初始化的节点,--force能强制重新初始化。 [antdb@host-10-19-28-129 ~]$ adbhamgrctl -c /etc/adbhamgr.yml reinit antdb-cluster adbhamgr-01 --force Success: reinitialize for member adbhamgr-01参考ADBDCS 常用操作集群信息查询用 adbdcsctl 命令对 adbdcs 集群做如下操作,进行 adbdcs 集群的维护和查询。NAME: adbdcsctl - A simple command line client for adbdcs. WARNING: Environment variable adbdcsCTL_API is not set; defaults to adbdcsctl v2. Set environment variable adbdcsCTL_API=3 to use v3 API or adbdcsCTL_API=2 to use v2 API. USAGE: adbdcsctl [global options] command [command options] [arguments...] VERSION: 3.3.18 COMMANDS: backup backup an adbdcs directory cluster-health check the health of the adbdcs cluster mk make a new key with a given value mkdir make a new directory rm remove a key or a directory rmdir removes the key if it is an empty directory or a key-value pair get retrieve the value of a key ls retrieve a directory set set the value of a key setdir create a new directory or update an existing directory TTL update update an existing key with a given value updatedir update an existing directory watch watch a key for changes exec-watch watch a key for changes and exec an executable member member add, remove and list subcommands user user add, grant and revoke subcommands role role add, grant and revoke subcommands auth overall auth controls help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --debug output cURL commands which can be used to reproduce the request --no-sync don't synchronize cluster information before sending request --output simple, -o simple output response in the given format (simple, `extended` or `json`) (default: "simple") --discovery-srv value, -D value domain name to query for SRV records describing cluster endpoints --insecure-discovery accept insecure SRV records describing cluster endpoints --peers value, -C value DEPRECATED - "--endpoints" should be used instead --endpoint value DEPRECATED - "--endpoints" should be used instead --endpoints value a comma-delimited list of machine addresses in the cluster (default: "http://127.0.0.1:2379,http://127.0.0.1:4001") --cert-file value identify HTTPS client using this SSL certificate file --key-file value identify HTTPS client using this SSL key file --ca-file value verify certificates of HTTPS-enabled servers using this CA bundle --username value, -u value provide username[:password] and prompt if password is not supplied. --timeout value connection timeout per request (default: 2s) --total-timeout value timeout for the command execution (except watch) (default: 5s) --help, -h show help --version, -v print the version使用 member list 选项查看 adbdcs 集群中的节点成员情况:# 下述命令中--endpoints需要指定集群的计算机地址列表。其中127.0.0.1代表本机,12379为端口号。 [antdb@localhost ~]$ adbdcsctl --endpoints=http://127.0.0.1:12379 member list 338f9fdae9331534: name=adbdcs-2 peerURLs=http://10.21.10.242:12380 clientURLs=http://10.21.10.242:12379,http://127.0.0.1:12379 isLeader=true 9ab50241714c014f: name=adbdcs-3 peerURLs=http://10.21.10.243:12380 clientURLs=http://10.21.10.243:12379,http://127.0.0.1:12379 isLeader=false d97b22cbde6ee848: name=adbdcs-1 peerURLs=http://10.21.10.241:12380 clientURLs=http://10.21.10.241:12379,http://127.0.0.1:12379 isLeader=false使用 cluster-health 选项查看 adbdcs 集群中的健康状况:[antdb@localhost ~]$ adbdcsctl --endpoints=http://127.0.0.1:12379 cluster-health member 338f9fdae9331534 is healthy: got healthy result from http://10.21.10.242:12379 member 9ab50241714c014f is healthy: got healthy result from http://10.21.10.243:12379 member d97b22cbde6ee848 is healthy: got healthy result from http://10.21.10.241:12379使用 ls 选项查看 adbdcs 集群中的数据目录结构:[antdb@localhost ~]$ adbdcsctl --endpoints=http://127.0.0.1:12379 ls /service [antdb@localhost ~]$ adbdcsctl --endpoints=http://127.0.0.1:12379 ls /service /service/antdbcluster [antdb@localhost ~]$ adbdcsctl --endpoints=http://127.0.0.1:12379 ls /service/antdbcluster /service/antdbcluster/sync /service/antdbcluster/config /service/antdbcluster/status /service/antdbcluster/history /service/antdbcluster/members /service/antdbcluster/initialize /service/antdbcluster/leader使用 get 选项获取 adbdcs 集群中的存储的节点信息:[antdb@localhost ~]$ adbdcsctl --endpoints=http://127.0.0.1:12379 ls /service/antdbcluster/members /service/antdbcluster/members/adbhamgr-2 /service/antdbcluster/members/adbhamgr-3 /service/antdbcluster/members/adbhamgr-1 [antdb@localhost ~]$ adbdcsctl --endpoints=http://127.0.0.1:12379 get /service/antdbcluster/members/adbhamgr-1 {"conn_url":"postgres://10.21.10.241:55551/postgres","api_url":"http://10.21.10.241:8008/adbhamgr","state":"running","role":"master","version":"2.1.5","is_far_sync":false,"xlog_location":83886968,"timeline":4}
上滑加载中
推荐直播
-
DTT年度收官盛典:华为开发者空间大咖汇,共探云端开发创新
2025/01/08 周三 16:30-18:00
Yawei 华为云开发工具和效率首席专家 Edwin 华为开发者空间产品总监
数字化转型进程持续加速,驱动着技术革新发展,华为开发者空间如何巧妙整合鸿蒙、昇腾、鲲鹏等核心资源,打破平台间的壁垒,实现跨平台协同?在科技迅猛发展的今天,开发者们如何迅速把握机遇,实现高效、创新的技术突破?DTT 年度收官盛典,将与大家共同探索华为开发者空间的创新奥秘。
去报名 -
GaussDB应用实战:手把手带你写SQL
2025/01/09 周四 16:00-18:00
Steven 华为云学堂技术讲师
本期直播将围绕数据库中常用的数据类型、数据库对象、系统函数及操作符等内容展开介绍,帮助初学者掌握SQL入门级的基础语法。同时在线手把手教你写好SQL。
去报名
热门标签