PostgreSQL日常维护

PostgreSQL日常维护

Pgsql 登录时,必须使用 postgres 用户,登录后的命令提示符为"postgres=#postgres 表示你当前所在的库

root@bogon \]# su postgres\[postgres@bogon \~$ /usr/local/pgsql/bin/psqlpsql (16.3)Type "help" for help. postgres=# 2.数据库的操作 ```shell postgres=# \l postgres=# \l+ postgres=# select datname from pg_database; ``` 2.2创建库 ```shell postgres=# create database mydb; ``` 删除库 ```shell postgres=# drop database mydb; ``` 切换库 ```shell postgres=# \c mydb mydb=# ``` 2.5 查看库大小 函数以字节为单位返回数据库的大小 ```shell postgres=# SELECT pg_database_size('mydb');pg database size 7594499 (1行记录) pg_size_pretty()函数将字节转为更易于阅读值postgres=# SELECT pg size pretty(pg database size('mydb')),pg_size pretty 7417 kB(1行记录) ``` 3.数据表操作 3.1列出表 列出表的常用方法: ```shell mydb=#\dt; 列出表(显示 search path 中模式里的表,默认 public) mydb=#d 列出表,视图和序列 mydb=# \d+ ``` ```shell mydb=#\dt my schema.* 列出指定模式下的表(例如my_schema) mydb=#\dt *.* 查看当前数据库的所有表(包括系统表) mydb=#SELECT * FROM pg tables WHERE schemaname ='public' ``` 使用 SLQL 方式列出当前数据库中 public 模式下的所有表及其详细信息 pg tables 是视图:属于 pgcatalog 模式,但它是基于 pg class 和pg namespace的逻辑视图,并非物理表。无需切换数据库,直接查询pg_catalog.pg tables 即可获取当前数据库的表信息 3.2创建表 PostgreSQl 支持标准的 SQL 类型 int、smallint、real、double precision、char(N)、varchar(N)、date、time、timestamp和interval,还支持其他的通用功能的类型和丰富的几何类型。PostgreSQL 中可以定制任意数量的用户定义数据类型。因而类型名并不是语法关键字,除了SQL 标准要求支持的特例外。 ```shell postgres=# create table test(id int,name char(10),age int);CREATE TABLE ``` 3.3复制表 要将已有的 table name 表复制为新表 new_table,í包括表结构和数据,请使用以下语句CREATE TABLE new table AS TABLE table name; 例如: ```shell postgres=# CREATE TABLE test2 AS TABLE test;SELECT O postgres=#dt 关联列表 架构模式 名称 类型 拥有者 hr employees 数据表 postgres hr test 数据表 postgres hr test2 数据表 postgres ``` 3.4删除表 ```shell postgres=# drop table test2. ``` 3.5查看表结构 ```shell postgres=#d test; 数据表"hr.test" 栏位 类型 校对规则 |可空的| 预设 id integer | | | name character(10) age integer ``` 4.模式操作命令 是一个逻辑容器,用于组织和管理数在 PostgreSQL 中,模式(Schema)据库对象(如表、视图、函数、索引等)。它类似于文件系统中的文件夹,帮助你在同一个数据库中分类存储不同的对象,避免命名冲突,并实现权限隔离 4.1创建模式 在当前库 postgres 中创建名为 hr 的模式 ```shell postgres=# CREATE SCHEMA hr; CREATE SCHEMA ``` 4.2默认模式 PostgreSQl 每个数据库都有一个默认模式 public。 如果创建对象(表、视图等)时不指定模式,默认会放在public 模式中。 通过 search path 参数可以设置模式的搜索优先级(类似 PATH 环境变量): ```shell postgres=# SHOW search path; search path $user , public(1行记录) ``` search path用于控制对象解析顺序,避免每次查询都要写模式名$user,public 表示优先查找当前用户同名模式,再找public 模式。 4.3删除模式 删除空模式 ```shell postgres=# DROP SCHEMA hr; DROP SCHEMA ``` 强制删除模式及其所有对象 ```shell postgres=# DROP SCHEMA hr CASCADE; DROP SCHEMA ``` 4.4查看所有模式 元命令列出当前库中所有模式 ```shell postgres=# \dn 架构模式列表 名称 | 拥有者 public | publicpg database_owner (1行记录) ``` SQL 查询,列出当前库中所有模式 ```shell postgres=# SELECT schema name FROM information schema. schemata; schema name information schema pg_catalogpg toast public (4 行记录) ``` 4.5在指定模式中创建表 未指定模式时,创建的对象(表,视图等)会按 search path 顺序创建到第一个可用的模式中 在 postgres 库中的 hr 模式下创建一个名为 employees 的库 ```shell postgres=#CREATE TABLE hr.employees (id SERIAL PRIMARY KEY, name TEXT); ``` 4.6切换当前模式 切换模式也就是调整 search path 的搜索范围 切换到单个 schema ```shell SET search path TO new schema; ``` 切换到多个 schema(按优先级顺序) ```shell SET search path To hr, public; ``` 表示优先搜索 hr 模式,其次 public 4.7查看当前所在schema ```shell postgres=# SELECT current schema();current schema hr(1行记录) ``` 步骤三:在每个模式中创建同名表,并插入数据 在 schema 1中创建 users表 在 schemal 中创建 users 表 ```shell mydb=#CREATE TABLE schemal.users (id int): mydb=#INSERT INTO schemal.users VALUES(1): ``` 在 shema 2中创建 users表 在 schema2 中创建同名 users 表 ```shell mydb=#CREATE TABLE schema2.users (id int); mydb=#INSERT INTo schema2.users VALUES(2); ``` 步骤四:跨模式查询 查询 schemal.users 和 schema2.users(需显式指定模式名) ```shell mydb=#SELECT * FROM schemal.users; mydb=#SELECT * FROM schema2.users; ``` 设置 search path 切换默认模式(不需显式指定模式名) ```shell mydb=#SET search path TO schemal; mydb=#SELECT *FROM users;--默认访问 schemal.users mydb=#SET search path To schema2; mydb=#SELECT *FROM users;--默认访问 schema2.users ``` 数据操作 添加数据 在 postgres 库,新建表 test ```shell postgres=# create table test(id int,name char(10),age int); CREATE TABLE postgres=# insert into test values(1,'zhangsan',18): INSERT O 1 ``` 查询数据 ```shell postgres-# select * from test; id | name |age ------+-------------+------ 1 | zhangsan | 18 (1 行记录) 修改数据 postgres=# update test set age=20 where id=l; UPDATE 1 postgres=# select * from test; id | name | age ------+---------+-------- 1 | zhangsan| 20 (1 行记录) 删除数据 postgres=# delete from test where id=l; DELETE 1 postgres=# select * from test; id |name |age -------+--------+------- (0 行记录) ``` 备份与恢复 PostgreSQl, 数据库应当被定期地备份。虽然过程相当简单,但清晰地理解其底层技术和假设是非常重要的。 有三种不同的基本方法来备份 PostgreSQL 数据: SQL转储 文件系统级备份 连续归档 一种都有其优缺点,我们主要以 SQL 转储为主。 SQL转储 SQL 转储方法的思想是创建一个由 SQL,命令组成的文件,当把这个文件回馈给服务器时,服务器将利用其中的SQL 命令重建与转储时状态一样的数据库。PostgreSQL 为此提供了工具 pg dump。这个工具的基本用法是: ```shell pg dump dbname > dumpfile ``` ​ 正如你所见,pg dump把结果输出到标准输出。我们后面将看到这样做有什么用处。 尽管上述命令会创建一个文本文件,pg_dump 可以用其他格式创建文件以支持并行 和细粒度的对象恢复控制。' pg_dump 是一个普通的 PostgresqL 客户端应用(尽管是个 相当聪明的东西) 这就意味着你可以在任何可以访问该数据库的远端主机上进行备份工作。但是请记住 pg_dump不会以任何特殊权限运行。具体说来,就是它必须要有你想备份的表的读 权限,因此为了备份整个数据库你几乎总是必须以一个数据库超级用户来运行它(如果你没有足够的特权 来备份整个数据库,你仍然可以使用诸如-n schema 或-t table 选项来备份该数据库中你能够 访问的部分) 要声明 pg dump连接哪个数据库服务器,使用命令行选项-hhost和-pport。 默认主机是本地主机或你的 PGHOST 环境变量指定的主机。类似地,默认端口是环境变量 PGPORT 或(如果 PGPORT 不存在)内建的默认值。(服务器通常有相同的默认值,所以还算方便。) 和任何其他 PostgreSQL 客户端应用一样,pg_dump 默认使用与当前操作系统用户名同名的数据库用户名进行连接。要使用其他名字,要么声明-U选项,要么设置环境变量 PGUSER。请注意 pg_dump 的连接也要通过客户认证机制。 pg dump 对于其他备份方法的一个重要优势是,pg_dump 的输出可以很容易地在新版本的PostgreSQL中载入,而文件级备份和连续归档都是极度的服务器版本限定的。pg dump 也是唯一可以将一个数据库传送到一个不同机器架构上的方法,例如从一个 32 位服务器到一个 64 位服务器, 由 pg dump 创建的备份在内部是一致的,也就是说,转储表现了 pg dump开始运行时刻的数据库快照,且在 pg_dump 运行过程中发生的更新将不会被转储pg_dump 工作的时候并不阻塞其他的对数据库的操作。 (但是会阻塞那些需要排它锁的操作,比如大部分形式的 ALTER TABLE) 从转储中恢复 pg_dump 生成的文本文件可以由 psq1 程序读取。 从转储中恢复的常用命令是: psql dbname \< dumpfile 其中 dumpfile 就是 pg_dump 命令的输出文件。这条命令不会创建数据库dbname,你必须在执行 psql 前自己从 template0 创建(例如,用命令 createdb-T template0 dbname)。psql 支持类似pg_dump 的选项用以指定要连接的数据库服务器和要使用的用户名。参阅 psql的手册获取更多信息。非文本文件转储可以使用 pg restore 工具来恢复 在开始恢复之前,转储库中对象的拥有者以及在其上被授子了权限的用户必须已经存在。如果它们不存在,那么恢复过程将无法将对象创建成具有原来的所属关系以及权限(有时候这就是你所需要的,但通常不是)。 默认情况下,psq1 脚本在遇到一个 SQL, 错误后会继续执行。你也许希望在遇到一个 SQL,错误后让 psql 退出,那么可以设置 ON ERROR STOP 变量来运行 psql,这将使 psq1 在遇到 S 错误后退出并返回状态 3: psql --set ON ERROR STOP=on dbname \< infile 不管怎样,你将只能得到一个部分恢复的数据库。作为另一种选择,你可以指定让整个恢复作为一个单独的事务运行,这样恢复要么完全完成要么完全回滚。这种模式可以通过向 psq\] 传递-1 或--single-transaction 命令行选项来指定。在使用这种模式时,注意即使是很小的一个错误也会导致运行了数小时的恢复被回滚。但是,这仍然比在一个部分恢复后手工清理复杂的数据库要更好。 pg_dump 和 psql 读写管道的能力使得直接从一个服务器转储一个数据库到另一个服务器成为可能,例如: pg_dump -h hostl dbname \|psql -h host2 dbname 注意: pg_dump 产生的转储是相对于 template0。这意味着在 templatel 中加入的任何语言、过程等都会被 pg_dump 转储。结果是,如果在恢复时使用的是一个自定义的 templatel,你必须从 template0 创建一个空的数据库,正如上面的例子所示。 一旦完成恢复,在每个数据库上运行 ANALYZE是明智的举动,这样优化器就有有用的统计数据了。 使用 pg_dumpall pg_dump 每次只转储一个数据库,而且它不会转储关于角色或表空间(因为它们是集簇范围的)的信息。为了支持方便地转储一个数据库集的全部内容,提供了 pg dumpa11程序。pg_dumpa11 备份一个给定集簇中的每一个数据库,并且也保留了集簇范围的数据,如角色和表空间定义。该命令的基本用法是: pg_dumpal1 \>dumpfile 转储的结果可以使用 psql 恢复: psql -f dumpfile postgres (实际上,你可以指定恢复到任何已有数据库名,但是如果你正在将转储载入到一个空集簇中则通常要用(postgres)。在恢复一个pg dumpall 转储时常常需要具有数据库超级用户访问权限,因为它需要恢复角色和表空间信息。如果你在使用表空间,请确保转储中的表空间路径适合于新的安装。 pg_dumpall 工作时会发出命令重新创建角色、表空间和空数据库,接着为每一个数据库 pg_dump。这意味着每个数据库自身是一致的,但是不同数据库的快照并不同步。 集簇范围的数据可以使用pg dumpall的--globals-only 选项来单独转储。如果在单个数据库上运行 pg_dump 命令,上述做法对于完全备份整个集簇是必需的。 远程连接 修改 PostgreSQl 监听地址 默认 Postgresql 监听的地址是 127.0.0.1,别的机器无法远程连接上,所以需要调整,修改 postgresq1.conf 文件。 修改PG数据库的配置文件 ```shell vim /var/lib/pgsql/data/postgresgl.conf listen_addresses = '*' # what IP address(es) to listen on; systemctl restart postgresql ``` ​ 重启 ​ 配置访问权限 默认是只能本地访问PostgreSQL的,我们需要在pg_hba.conf中 找到 IPv4 local connections 这一行,在这一行下面添加 \[root@localhost \]#vim /usr/local/pgsql/data/pg_hba. conf ## IPv4 local connections: host al1 all 0.0.0.0/0 trust host all all 127.0.0.1/32 ident ## IPv6 local connections: host all all ::1/128 ident host:这指定了连接类型。host 表示该规则适用于通过 TCP/IP 进行的远程连接。如果是本地连接,通常会使用 1ocal。 a11:这定义了哪些数据库可以接受这个规则。a11表示这个规则适用于所有数据库。你也可以指定特定的数据库名,例如mydatabase。 a11:这定义了哪些用户可以接受这个规则。a11 表示这个规则适用于所有用户。你也可以指定特定的用户名,例如myuser。 0.0.0.0/0:这定义了哪些客户端 IP 地址或 IP 地址范围可以接受这个规则。0.0.0.0/0 是一个特殊的 CIDR 表示法,它表示任何 IP 地址(即没有 IP 地址限制)。你也可以指定具体的 IP 地址,如192.168.1.100,或者 IP 地址范围,如 192.168.1.0/24。 > trust:这定义了认证方法。trust 表示不需要密码或其他任何形式的认证,客户端可以直接连接。这通常只在本地或受信任的网络环境中使用,因为它允许任何人无需认证即可访问数据库。请注意,使用 trust 认证方法允许任何 IP 地址连接到你的数据库,而不需要任何认证,这是非常不安全的。这通常只在开发或测试环境中使用,并且应该始终确保数据库服务器不暴露在不受信任的网络中在生产环境中,你应该使用更安全的认证方法,如md5或password(对于较新版本的 PostgreSQL,建议使用 scram-sha-256) > > 如果不是设置的trust,而是选择了md5或password之类的,需要有密码才行,配置 PostgreSqL密码流程如下: ```shell postgres=# ALTER USER postgres WITH PASSWORD'123456*:ALTER ROLE ``` 重启服务 systemctl start postgresql 验证远程连接 使用其它主机远程连接本机数据库,设置的是 trust,无密码,可直接登录 ```shell [postgres@localhost] $ psql -h 192.168.10.102 psql(16.3,server 15.12) Type "help" for help. postgres=# ``` ​ 如果设置的是 md5 或 password 之类的需要有密码才行 ```shell [postgres@localhost]$ psql -h 192.168.10.102 Password for user postgres: psql(16.3,server 15.12) Type "help" for help. postgres=# ``` 重置密码 修改认证配置文件(pg hba.conf) .用文本编辑器打开该文件,找到本地连接的认证规则(通常是hostalal 127.0.0.1132或 nostall all::1/128),将认证方式从 md5 改为 trust(表示允许免密码登录): host all all 127.0.0.1/32 md5 host all all 127.0.0.1/32 trust 在 psq!命令行中,执行以下 SQL语句修改密码(将 new_password 替换为你的新密码): --修改超级用户 postgres 的密码 ALTER USER postgres WITH PASSWORD 'new password'; --若需修改其他用户密码(如 user1) ALTER USER uSer1 WITH PASSWORD "new password": 恢复 pg hba.conf配置井重启服务 将 pg hba.conf 中的认证方式改回 md5(或原来的值) 重启 PostgreSQL服务: /usr/local/pgsql/bin/pg ctl -D /usr/local/pgsql/data

相关推荐
skywalk816326 分钟前
超强人工智能解决方案套件InfiniSynapse:精准的业务理解、对各种数据源进行全模态联合智能分析--部署安装@Ubuntu22.04 & @Docker
数据库·人工智能·python·docker·infini-synapse
纪伊路上盛名在1 小时前
jupyter内核崩溃
前端·数据库·jupyter·生物信息·基因组·k-mer
曼汐 .1 小时前
Python实战应用-Python操作MySQL数据库
数据库·mysql
bcxwz6691 小时前
mysql 创建大写字母的表名失败
数据库·mysql
数据知道2 小时前
【系统分析师】第5章-基础知识:数据库系统(核心总结)
数据库·数据库系统·系统分析师
Mr_Xuhhh2 小时前
数据库期末
数据库·oracle
vace cc2 小时前
sql列中数据通过逗号分割的集合,对其中的值进行全表查重
数据库·sql
虾条_花吹雪3 小时前
5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇
数据库·人工智能·学习·spring·ai
一 乐9 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
美林数据Tempodata10 小时前
大模型驱动数据分析革新:美林数据智能问数解决方案破局传统 BI 痛点
数据库·人工智能·数据分析·大模型·智能问数