• [技术干货] 探索 PostgreSQL 基础语法:开启数据库编程之旅
    在当今数字化时代,数据管理与处理的重要性不言而喻。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 的强大功能,为数据处理与管理提供有力的支持。
  • [问题求助] 【小白求助】为什么在gaussdb里面,表文件没有fsm和vm文件
    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的文件的
  • [问题求助] 【小白求助】为什么base目录下数据库目录名称与pg_database视图中的oid不匹配
    在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注意事项及说明【转】
    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 是一个功能强大的文本编辑器,深受开发者和系统管理员的喜爱。它具有高度的可定制性和高效的编辑功能,可以帮助用户快速编辑各种文本文件。本文将为你详细介绍 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 有所帮助。
  • [技术干货] inux系统中磁盘管理LVM与挂载
    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常用管理操作
    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}
  • [技术干货] PostgreSQL数据库高可用设计方案:构建坚若磐石的业务基石
    在当今数据驱动的时代,数据库系统的高可用性对于保持业务连续性和用户体验至关重要。PostgreSQL作为一款功能丰富、性能优越的开源关系型数据库,其高可用方案的设计与实施成为了众多企业和开发者关注的焦点。本文将深入探讨PostgreSQL实现高可用性的几种关键技术与策略,包括主从复制、流复制、逻辑复制、读写分离、自动故障转移、以及监控与告警系统,为您的数据库部署保驾护航。1. 主从复制与流复制基本概念PostgreSQL的主从复制(Master-Slave Replication)是一种常见的高可用架构,其中数据从主节点实时复制到一个或多个从节点。流复制(Streaming Replication)是PostgreSQL自9.0版本以来提供的功能,它允许从主节点连续不断地将事务日志发送到从节点,实现近乎实时的数据同步。实现步骤配置主节点:在主节点上启用归档模式(wal_level = replica)和配置归档目录。配置从节点:初始化从节点数据库,使用pg_basebackup从主节点获取基础备份,并配置recovery.conf文件指向主节点。启动复制:在从节点上启动PostgreSQL,它将开始从主节点接收WAL日志并应用。2. 逻辑复制逻辑复制是PostgreSQL提供的另一种复制方式,与流复制相比,它基于SQL级别的复制,可以筛选复制的数据库对象,适用于复杂的数据分发场景或跨版本复制。配置:在发布端创建发布,定义要复制的表或数据库;在订阅端设置订阅,并指定要连接的发布端。优势:更灵活的过滤和转换选项,支持跨平台复制。3. 读写分离通过主从复制,可以实现读写分离,将读请求分散到从节点,减轻主节点的压力,提高整体吞吐量。路由策略:可以使用应用层或代理软件(如PgBouncer、HAProxy)实现读写分离。4. 自动故障转移自动故障转移机制是高可用集群不可或缺的一环,确保在主节点故障时能自动切换到从节点,无缝接管服务。工具:Patroni、repmgr、Stolon等是常用的自动化故障转移解决方案,它们监控主节点状态,并在故障时触发切换。5. 监控与告警系统有效的监控和告警机制是及时发现问题、预防故障的关键。监控指标:包括CPU、内存使用率、磁盘I/O、连接数、复制延迟、WAL生成速率等。告警设置:利用Prometheus、Grafana、Zabbix等监控工具设置阈值告警,及时通知运维人员。结语构建PostgreSQL的高可用架构是一个涉及多个层面的系统工程,需要综合考虑数据复制、故障转移、负载均衡、监控等多个因素。通过精心设计与实施上述方案,可以极大提高数据库的可用性和可靠性,为业务稳定运行提供强有力的支撑。随着技术的不断进步,PostgreSQL社区也在持续推出更多先进特性与工具,以满足日益增长的高可用性需求,确保数据服务的不间断。
  • [技术干货] PostgreSQL数据库配置优
    PostgreSQL数据库配置优化:迈向极致性能的指南PostgreSQL,作为功能强大且开源的关系型数据库管理系统,其性能表现深受配置参数的影响。正确的配置优化不仅可以提升数据库处理速度、增强稳定性,还能有效管理资源消耗。本文旨在深入探讨PostgreSQL的配置优化策略,涵盖核心参数调整、内存管理、并发控制、磁盘I/O优化等方面,为数据库管理员和开发者提供一份全面的优化指南。核心配置优化1. shared_buffersshared_buffers是PostgreSQL分配给共享内存缓冲池的大小,用于存储最近使用的数据库块。增加这个值可以减少磁盘I/O,但过多会占用宝贵的系统内存。一般建议设置为系统总内存的25%到30%,具体依据系统负载而定。2. effective_cache_size虽然不是实际分配内存的参数,effective_cache_size却影响查询规划器对索引和顺序扫描的选择。它告诉PostgreSQL预计有多少数据可以被操作系统缓存。合理设置可以提升查询效率,推荐值为系统内存的75%到80%。3. maintenance_work_mem用于维护操作(如VACuum、排序、创建索引等)的内存大小。过小可能导致磁盘临时文件的使用,影响性能。根据最大维护操作的大小动态调整,一般建议至少为几百MB到几个GB。内存管理work_mem每个工作进程在执行排序或哈希操作时使用的内存量。较小的值可能导致频繁的磁盘溢出。根据最复杂的查询需求调整,但要避免过度分配导致内存压力。max_connections限制同时连接数,过多连接会消耗大量内存和资源。根据实际应用需求设定,同时考虑连接池的使用来高效复用连接。并发控制max_worker_processes & max_parallel_workers前者决定了PostgreSQL可以使用的最大后台进程数,后者是并行查询可以使用的最大工作者数量。根据硬件核心数合理设置,以平衡并发处理能力和资源使用。deadlock_timeout死锁检测超时时间。适当减小可以更快发现死锁,但频繁检测也会带来一定开销。根据业务特点调整。磁盘I/O优化synchronous_commit控制事务日志的同步策略。设置为off可以提高写入速度,但牺牲了一定的数据安全性。根据数据丢失容忍度选择。wal_buffersWAL缓冲区大小,影响日志写入磁盘的速度。适量增加可以减少I/O等待,但过高占用内存。checkpoint_segments / checkpoint_timeout控制检查点的频率和大小,影响日志写入磁盘的时机。合理配置可以平滑I/O峰值,减少对性能的冲击。
  • [技术干货] PostgreSQL数据库中的热备份原理与实践
    PostgreSQL数据库中的热备份原理与实践:确保数据安全的不间断守护者在数据库运维领域,数据备份是确保数据安全、防范意外损失的重要防线。PostgreSQL,作为一款成熟的开源关系型数据库,提供了多种备份机制,其中热备份(Hot Backup)因其能够在数据库运行状态下进行,不影响业务连续性而广受青睐。本文将深入探讨PostgreSQL热备份的原理、实现方式以及实际操作步骤,帮助您构建一套高效、可靠的数据库备份策略。热备份原理热备份,顾名思义,是指在数据库保持正常运行、接受读写操作的同时进行备份。PostgreSQL通过其内置的Write-Ahead Logging(WAL)机制支持热备份。WAL记录了对数据库的所有更改操作,包括插入、更新、删除等,这些更改先被写入到WAL日志文件中,然后再反映到数据库的实际数据文件。热备份的核心在于备份数据库的物理文件(包括数据文件和索引等)以及WAL日志。这样,即便在备份期间数据库发生崩溃或异常,也能通过WAL日志恢复到备份点之后的任何状态,确保数据的完整性和一致性。实现方式PostgreSQL热备份主要通过两种官方推荐的方法实现:使用pg_basebackup工具(随pgBackRest包提供)或直接使用COPY命令结合pg_start_backup和pg_stop_backup函数。使用pg_basebackup安装pgBackRest:首先确保安装pgBackRest工具,它提供了pg_basebackup命令行工具,专门用于热备份。执行备份:运行命令开始备份,例如:pg_basebackup --pgdata=/var/lib/postgresql/data --stanza=my_stanza --type=full --backup-dir=/backups/full这里--pgdata指向数据库的数据目录,--stanza是备份集的标识,--type=full表示全量备份,--backup-dir指定备份存放位置。使用pg_start_backup和pg_stop_backup启动备份:在数据库中执行SQL命令开启备份模式:SELECT pg_start_backup('my_backup_label', true);这里my_backup_label是备份的标签,true表示执行一次全备份。复制文件:使用系统级别的命令(如rsync或cp)复制数据库的数据目录到备份位置。结束备份:在数据库中执行SQL命令停止备份模式:SELECT pg_stop_backup();实践操作中的注意事项权限管理:确保执行备份操作的用户具有足够的权限。备份策略:结合全量和增量备份,制定合理的备份策略,以平衡存储空间和恢复速度。存储介质:备份存储位置应选择稳定、可靠的存储介质,考虑网络备份至远程位置以增加灾难恢复能力。监控与测试:定期检查备份作业的执行情况,且定期进行备份恢复测试,确保备份有效性。结语PostgreSQL的热备份机制通过其先进的WAL技术,实现了数据库运行状态下无中断的数据保护。合理运用上述备份方法,结合科学的备份策略与实践,是确保数据安全、提升业务连续性的关键。在数据驱动的时代,掌握并实践这些备份技术,无疑是对抗数据风险的强有力保障。
  • [技术干货] 探秘PostgreSQL数据库物理存储结构
    探秘PostgreSQL数据库物理存储结构:数据组织与管理的底层逻辑PostgreSQL,作为一款功能强大且高度可扩展的关系型数据库管理系统,其卓越的性能和稳定性部分归功于其精心设计的物理存储结构。本文将深入探讨PostgreSQL的物理存储布局,包括数据文件组织、表空间、页与块的概念、以及WAL(Write-Ahead Log)机制,帮助您更好地理解数据在硬盘上的存储和管理方式。数据文件与表空间PostgreSQL使用表空间(tablespaces)作为逻辑上的数据存放区域,允许用户将不同的数据库对象(如表、索引)分配到不同的物理位置上。默认情况下,所有数据库对象都存储在名为pg_default的默认表空间中,但用户可以根据需要创建额外的表空间,实现数据的物理隔离和灵活管理。每个数据库在物理存储上对应一个目录,其中包含了该数据库下的各种数据文件和控制文件。这些文件按照一定的规则组织,包括但不限于表数据文件、索引文件、系统目录信息等。页与块:数据的最小存储单元PostgreSQL将数据存储的基本单位定义为“页”(Page),也常被称为“块”(Block)。默认情况下,每页大小为8KB,这是数据库读写操作的基本单位。这意味着每次从磁盘读取或写入数据时,都是以页为单位进行的。每个页都有一个头部,记录了页的元数据,比如页类型、页面编号、上一页和下一页的指针等信息。表数据文件结构表数据被存储在一系列的.dat文件中,每个表至少对应一个这样的文件(如果数据量大,还会自动分裂成多个)。这些文件内部由连续的页构成,页内数据按照行的方式组织,每行记录根据其在表中的位置(即行标识符,TID)进行排序。索引文件结构索引文件同样以页的形式存储,但其内部结构与表数据文件不同。PostgreSQL支持多种索引类型(如B-Tree、Hash、GiST、SP-GiST、GIN和BRIN),每种索引类型有其独特的页结构设计,旨在高效地支持查询操作。Write-Ahead Log(WAL)为了保证数据的持久性和事务的ACID特性,PostgreSQL采用了Write-Ahead Log(预写日志)机制。WAL记录了对数据库的所有修改操作,包括数据的增删改。在事务提交前,相关的日志会先被写入到WAL文件中,之后才修改内存中的数据。这种机制确保了即使在系统崩溃时,也能通过重放WAL日志恢复到一致状态。WAL还支持异步复制,是实现高可用和容灾恢复的重要基础。通过将WAL日志传输到备用服务器并重放,可以实现数据的实时同步。总结PostgreSQL的物理存储结构设计精细,通过表空间、页与块、以及WAL机制等核心组件,实现了数据的有效组织、高效访问与持久化存储。深入理解这些底层原理,对于数据库管理员和开发者来说至关重要,不仅能帮助他们更好地优化数据库性能,还能在遇到问题时迅速定位并解决。随着技术的演进,PostgreSQL也在不断优化其存储结构,以适应日益增长的数据规模和复杂的应用场景。
  • [技术干货] 深入解析PostgreSQL数据库中的执行计划
    深入解析PostgreSQL数据库中的执行计划:优化查询性能的艺术在数据库管理和优化的领域中,了解和利用执行计划(Execution Plan)是提高查询效率、优化数据库性能的关键。PostgreSQL,作为一个功能丰富且性能优异的开源关系型数据库,提供了强大的执行计划分析工具,帮助开发者深入理解查询的执行过程,进而优化SQL语句,达到更快的数据处理速度。本文将详细介绍PostgreSQL中的执行计划,包括其概念、查看方法、解读技巧以及优化策略。执行计划概览执行计划是数据库引擎对SQL查询解析后生成的一系列操作步骤,它详细描述了查询是如何被执行的,包括数据的访问路径(索引扫描、顺序扫描等)、数据的过滤条件、排序、连接方式等。一个好的执行计划意味着数据库能够高效地找到并返回所需数据,反之,则可能导致查询缓慢,影响应用性能。查看执行计划的方法EXPLAIN命令EXPLAIN是PostgreSQL中最常用的查看执行计划的命令。使用它,可以在不真正执行SQL语句的情况下,获取执行计划的文本描述:EXPLAIN SELECT * FROM my_table WHERE column = 'value';EXPLAIN ANALYZE如果想要获取更详细的执行信息,包括实际的行数、时间花费等,可以使用EXPLAIN ANALYZE:EXPLAIN ANALYZE SELECT * FROM my_table WHERE column = 'value';使用pgAdmin或其他GUI工具除了命令行,还可以使用图形界面工具如pgAdmin,它提供了更直观的方式来查看和分析执行计划。解读执行计划执行计划通常由多个节点组成,每个节点代表一个操作,如Seq Scan(顺序扫描)、Index Scan(索引扫描)、Nested Loop(嵌套循环连接)等。理解每个节点的意义是关键:Seq Scan:表示全表扫描,当没有适用的索引时使用,或优化器判断全表扫描更高效时。Index Scan:利用索引快速定位数据,适用于索引覆盖查询或查询条件选择性高时。Bitmap Heap Scan:先通过索引构建位图,再访问表数据,适合索引小而表大的情况。Join:包括Nested Loop、Hash Join、Merge Join等,根据数据量和连接条件不同选择最优方式。优化策略索引优化根据执行计划中的扫描类型,判断是否需要添加或优化索引。例如,频繁的全表扫描可能提示需要创建合适的索引。查询优化重写查询,减少复杂度,尽量避免子查询和复杂的连接。使用LIMIT时,考虑加上ORDER BY和合适的索引,以便优化器选择索引扫描。分析WHERE子句中的条件,确保索引能够有效利用。统计信息更新PostgreSQL依赖统计信息来做出执行计划的选择,定期运行ANALYZE命令更新统计信息,确保优化器的决策准确。结语掌握PostgreSQL的执行计划不仅能够帮助开发者诊断查询性能瓶颈,而且是优化数据库操作、提升应用响应速度的有效途径。通过频繁地分析和调整,结合实际场景定制优化策略,可以最大化地发挥PostgreSQL的潜力,构建出高效、稳定的数据库服务。记住,优化是一个持续的过程,随着数据量的增长和查询模式的变化,执行计划的评估和调整应当成为常态。
  • [技术干货] PostgreSQL数据库中的事务、并发控制与锁机制
    PostgreSQL数据库中的事务、并发控制与锁机制:确保数据一致性的艺术在数据库管理系统中,PostgreSQL凭借其强大的并发控制能力和事务处理机制,赢得了广泛的认可。事务(Transactions)确保数据操作的原子性、一致性、隔离性和持久性(ACID属性),而并发控制与锁机制则是实现这一目标的关键。本文将深入探讨PostgreSQL中的事务管理、并发控制原理,以及锁机制的实现,帮助您更好地理解如何在复杂多变的数据库操作中维持数据的一致性和完整性。事务(Transactions)定义事务是数据库操作的逻辑单元,它包含一系列操作,这些操作要么全部成功执行,要么全部不执行。PostgreSQL遵循严格的ACID原则,确保事务的正确执行:原子性(Atomicity):事务被视为不可分割的工作单位,所有操作要么全部完成,要么全部不完成。一致性(Consistency):事务执行前后,数据库总是处于一致的状态,符合所有的预定义规则。隔离性(Isolation):并发执行的事务之间互不影响,仿佛每个事务都是在单独操作数据库一样。持久性(Durability):一旦事务提交,其效果就会永久保存在数据库中,即使系统出现故障也不会丢失。常用命令BEGIN:开始一个新事务。COMMIT:提交当前事务,所有更改变为永久。ROLLBACK:撤销当前事务的所有更改,回到事务开始前的状态。并发控制问题与挑战在多用户环境下,如果没有适当的并发控制,可能会遇到脏读、不可重复读、幻读等问题,破坏数据的一致性。PostgreSQL通过实现不同的隔离级别来解决这些问题。隔离级别READ UNCOMMITTED:最低级别,可能导致脏读、不可重复读和幻读。READ COMMITTED:默认级别,解决了脏读问题,但可能出现不可重复读和幻读。REPEATABLE READ:解决了脏读和不可重复读,但可能遇到幻读。SERIALIZABLE:最高级别,通过锁定等手段模拟串行执行,避免了所有并发问题,但性能开销较大。锁机制类型PostgreSQL使用多种锁来实现并发控制,主要分为两类:行级锁(Row-Level Locks):细粒度锁,锁定单行或某些行,减少锁的竞争。表级锁(Table-Level Locks):较粗粒度,锁定整个表,适用于DDL操作。锁模式共享锁(Share Locks, S):允许读取数据,阻止其他事务获取排他锁。排他锁(Exclusive Locks, X):用于数据修改操作,阻止其他事务读取或修改数据。意向锁(Intent Locks, IX/SIX):表级锁,表明事务可能需要在表中的某些行上获取行级锁。弱共享锁(Weak Share Locks, SS):特定于SERIALIZABLE级别,用于检测可能的冲突。死锁处理当两个或多个事务互相等待对方持有的锁,形成死锁时,PostgreSQL自动检测并选择一个事务进行回滚,以打破死锁。结语PostgreSQL的事务处理、并发控制和锁机制构成了其强大数据一致性的基石。理解并合理应用这些概念,可以有效地设计和优化数据库操作流程,确保在高并发环境下数据的完整性和一致性。通过精细调整隔离级别和锁策略,可以在保证数据一致性的前提下,最大化数据库的并发处理能力,满足多样化应用的需求。
  • [技术干货] PostgreSQL数据库中的用户及权限管理
    PostgreSQL数据库中的用户及权限管理:构筑安全数据访问的基石在数据库管理系统的世界里,PostgreSQL以它的可靠性、高性能和丰富的特性而著称,广泛应用于各类企业和项目中。在数据安全管理方面,用户及权限管理是确保数据访问控制、保护数据安全的关键环节。本文将深入探讨PostgreSQL中的用户管理、权限体系以及最佳实践,帮助你构建一个既安全又高效的数据访问环境。用户管理创建用户在PostgreSQL中,创建新用户的操作简单直接,使用CREATE USER命令即可:CREATE USER username WITH PASSWORD 'password';这里,username是你想创建的用户名,password则是该用户的密码。为了安全起见,建议使用强密码并定期更换。修改用户密码用户密码可以通过ALTER USER命令进行修改:ALTER USER username WITH PASSWORD 'new_password';删除用户当不再需要某个用户时,可以使用DROP USER命令删除:DROP USER username;注意,删除用户前请确认该用户没有正在运行的会话或持有重要权限,避免影响数据库的正常运作。权限管理基础权限PostgreSQL提供了细粒度的权限控制,包括但不限于对数据库、表、视图、函数等的访问权限:连接权限:允许用户连接到数据库,使用GRANT命令:GRANT CONNECT ON DATABASE dbname TO username;读写权限:控制对特定表的访问,如只读、读写:GRANT SELECT ON table_name TO username; -- 只读权限 GRANT ALL PRIVILEGES ON table_name TO username; -- 所有权限角色与权限组PostgreSQL支持角色的概念,角色可以视为一组权限的集合,用户可以被赋予一个或多个角色,简化权限管理。创建角色并分配权限:CREATE ROLE role_name; GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO role_name;然后,将角色授予用户:GRANT role_name TO username;回收权限使用REVOKE命令可以回收之前赋予的权限:REVOKE ALL PRIVILEGES ON table_name FROM username;最佳实践最小权限原则:每个用户或角色仅被授予完成其任务所需的最小权限集。定期审核:定期检查并更新用户权限,确保权限分配的准确性和时效性。使用角色管理权限:通过角色来分配权限而不是直接对用户,便于权限的批量管理与调整。安全的密码策略:实施强密码策略,定期更换密码,并考虑使用密码过期策略。日志审计:启用并定期审查数据库日志,监控异常登录和权限使用情况。综上所述,PostgreSQL的用户及权限管理系统提供了强大的工具来构建安全、高效的数据访问控制。通过合理规划和细致管理,可以确保数据资源得到恰当的保护,同时支持业务的灵活发展。
  • [技术干货] 探秘PostgreSQL数据库中的触发器
    探秘PostgreSQL数据库中的触发器:自动化数据处理的艺术在数据库管理系统的世界里,PostgreSQL以其强大的功能、高度的可扩展性和卓越的稳定性脱颖而出,成为众多开发者和企业的优选。其中,触发器(Triggers)作为PostgreSQL中的一项重要功能,为数据库操作的自动化、数据的连续性和业务逻辑的无缝集成提供了强大支持。本文将深入剖析PostgreSQL数据库中的触发器机制,探讨其定义、使用场景、创建方法以及最佳实践,引领您探索数据处理自动化的新境界。触发器基础触发器是数据库中一种特殊的存储过程,它与特定的数据库事件(如INSERT、UPDATE、DELETE)关联,当这些事件发生时自动执行。简而言之,触发器就像是数据库的“监听器”,在特定条件满足时自动响应,执行预定义的操作,从而实现数据的自动维护、业务规则的强制执行或数据同步等功能。使用场景1. 数据完整性检查在数据插入或更新前,触发器可以进行数据验证,确保新数据符合预期的格式或业务规则,比如检查输入的日期格式、确保某字段值的唯一性等。2. 自动审计通过触发器,可以在数据变更前后记录变更日志,包括谁、何时、做了什么改变,这对于数据审计、合规性和故障排查至关重要。3. 数据同步当一个表的数据发生变化时,触发器可以自动更新另一个表或外部系统,确保数据的一致性,比如同步库存信息到订单系统。4. 业务逻辑自动化复杂的业务规则,如订单状态改变时自动调整库存、计算积分等,可通过触发器实现,简化应用程序逻辑,提高效率。创建触发器创建触发器的基本步骤涉及定义触发时机(BEFORE/AFTER)、触发事件(INSERT/UPDATE/DELETE)、触发操作(针对每行或语句)及执行的函数。以下是创建触发器的示例:CREATE TRIGGER example_trigger AFTER INSERT ON products FOR EACH ROW EXECUTE FUNCTION update_inventory_level();此例中,当products表中有新数据插入后,update_inventory_level()函数会被调用,用于更新库存水平。触发器函数触发器关联的函数(如上例中的update_inventory_level())通常使用PL/pgSQL编写,也可以是其他支持的编程语言(如Python)。函数定义需考虑事务的原子性,确保数据操作的一致性和完整性。最佳实践性能考量:频繁触发的触发器可能影响数据库性能,尤其是在大数据量操作时,应谨慎设计并适时考虑批量处理。避免循环触发:确保触发器逻辑不会无意中触发自己或其它触发器,形成死循环。测试与监控:充分测试触发器逻辑,确保其按预期工作,并监控触发器的执行情况,以便及时发现并解决潜在问题。文档与注释:清晰记录触发器的目的、关联事件和函数逻辑,便于后期维护和团队协作。结语PostgreSQL的触发器机制是实现数据自动化处理的强有力工具,通过灵活设计和管理,可以极大提升数据库的运维效率和业务响应能力。掌握触发器的精髓,意味着在数据库管理的征途上又迈出了坚实的一步,向着更高层次的数据管理自动化迈进。
总条数:103 到第
上滑加载中