Postgres DBA 入门学习第一篇

本文详细介绍了如何从基础开始学习PostgreSQL,包括用户创建、数据库建置、用户授权、远程连接设置、表操作以及数据导出。重点讲解了pg_hba.conf配置和解决连接问题的方法,适合初学者快速上手。

主要内容有:

dba入门学习:数据库创建、用户创建、用户授权、远程连接、创建表、表数据导出

用户创建        

postgres=# create user test1 password 'test1';
CREATE ROLE

创建数据库

postgres=# create database test1;
CREATE DATABASE

用户授权

postgres=# grant all on database test1 to test1;
GRANT

pg_hba.conf修改

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    testdb             test             192.168.81.130/24           md5
host    test1             test1             192.168.81.130/24           md5

客户端登录时如提示psql: FATAL:  no pg_hba.conf entry for host失败如图:

[hadoop@hadoop ~]$ psql -h 192.168.81.130 -U test1 test1
psql: FATAL:  no pg_hba.conf entry for host "192.168.81.130", user "test1", database "test1"

在服务端用管理员执行如下命令重新加载配置文件:

postgres=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

在此在客户端登录连接数据库

第一种交互式登录,登录过程中输入密码

[hadoop@hadoop ~]$ psql -h 192.168.81.130 -U test1 test1
Password for user test1: 
psql (11.12)
Type "help" for help.

test1=> 

或者先把密码输出环境变量,再执行连接,如下:

[postgres@hadoop ~]$ export PGPASSWORD=test1
[postgres@hadoop ~]$ psql -h 192.168.81.130 -U test1 test1
psql (11.12)
Type "help" for help.

test1=> 

登录之后就可以创建表并入数据:

test1=> create table users (id int,username varchar(30),addr varchar(100));
test1=> \d
       List of relations
 Schema | Name  | Type  | Owner 
--------+-------+-------+-------
 public | users | table | test1
(1 row)

test1=> insert into users select generate_series(1,1000),'testuser','testaddr';
INSERT 0 1000
test1=> 

数据导出txt文件

test1=> \timing
Timing is on.
test1=> \copy users to '/home/hadoop/users.txt' delimiter '|';
COPY 1000
Time: 5.102 ms
test1=> 

导数数据文件时,分割符号只能用单个字符或者16进制描述的分隔符,分隔符以16进制描述导出如下:

test1=> \copy users to '/home/hadoop/users.txt' delimiter e'\x03';
COPY 1000
Time: 12.015 ms

<think>嗯,用户这次聚焦在PostgreSQL的relation锁类型上,看来是个深入的技术问题。结合之前的对话历史,用户已经对会话阻塞(红色会话)有了基础理解,现在想进一步探究锁机制的核心细节。 从引用内容看,用户提供的资料质量很高:引用[1]和[3]明确了锁的存在意义(保证数据一致性),引用[4]展示了锁在系统表pg_locks中的存储结构,引用[5]则提到relation锁的实际调用场景。特别是引用[3]那个电商案例很典型——全表锁死的惨痛教训正好能用来强调锁机制的重要性。 用户身份推测是DBA或后端开发,需要解决实际生产环境中的并发问题。深层需求可能是:理解不同锁模式的行为特征,以便设计更健壮的数据库方案,或快速定位线上锁冲突。 在组织回复时要注意三点:第一,锁强度分级是关键线索(ACCESS SHARE→ACCESS EXCLUSIVE),必须用阶梯图直观展示;第二,每个锁类型要配具体SQL触发示例,像ACCESS EXCLUSIVE锁对应ALTER TABLE就很实用;第三,最后要回归到监控手段(pg_locks视图)和避坑指南,与之前PGAdmin4的红色会话监控形成闭环。 另外用户给的引用[2]提到咨询锁,虽然不属于relation锁范畴,但可以放在最后作为延伸知识点——毕竟用户表现出对高级特性的兴趣。 待生成的三个相关问题要覆盖梯度:锁冲突检测(实践)、锁升级场景(理论)、监控工具链(运维),这样能全面满足用户后续探索需求。 </think>PostgreSQL中的**表级锁(Relation Lock)** 是控制并发访问的核心机制,其类型按冲突强度和用途可分为以下八种(强度由弱到强排列): --- ### 🔒 一、Relation锁类型详解 #### 1. **ACCESS SHARE(访问共享锁)** - **行为**:仅与 `ACCESS EXCLUSIVE` 锁冲突 - **触发场景**:`SELECT` 查询时自动获取 - **示例**: ```sql SELECT * FROM orders; -- 自动加ACCESS SHARE锁 ``` #### 2. **ROW SHARE(行共享锁)** - **行为**:与 `EXCLUSIVE` 和 `ACCESS EXCLUSIVE` 冲突 - **触发场景**:`SELECT FOR UPDATE/SHARE` 时自动获取 - **示例**: ```sql SELECT * FROM orders FOR UPDATE; -- 自动加ROW SHARE锁 ``` #### 3. **ROW EXCLUSIVE(行排他锁)** - **行为**:与 `SHARE`、`SHARE ROW EXCLUSIVE`、`EXCLUSIVE`、`ACCESS EXCLUSIVE` 冲突 - **触发场景**:数据修改类语句(`INSERT/UPDATE/DELETE`) - **示例**: ```sql UPDATE orders SET status=2 WHERE id=100; -- 自动加ROW EXCLUSIVE锁 ``` #### 4. **SHARE UPDATE EXCLUSIVE(共享更新排他锁)** - **行为**:与 `SHARE UPDATE EXCLUSIVE`、`SHARE`、`SHARE ROW EXCLUSIVE`、`EXCLUSIVE`、`ACCESS EXCLUSIVE` 冲突 - **触发场景**:`VACUUM FULL`、`CREATE INDEX CONCURRENTLY`、`ALTER TABLE VALIDATE` 等 - **示例**: ```sql CREATE INDEX CONCURRENTLY idx_orders ON orders(status); ``` #### 5. **SHARE(共享锁)** - **行为**:与 `ROW EXCLUSIVE`、`SHARE UPDATE EXCLUSIVE`、`SHARE ROW EXCLUSIVE`、`EXCLUSIVE`、`ACCESS EXCLUSIVE` 冲突 - **触发场景**:`CREATE INDEX`(非并发模式) - **示例**: ```sql CREATE INDEX idx_orders ON orders(id); -- 非并发模式加SHARE锁 ``` #### 6. **SHARE ROW EXCLUSIVE(共享行排他锁)** - **行为**:与 `ROW EXCLUSIVE` 及以上所有锁冲突 - **触发场景**:`CREATE TRIGGER`、`ALTER TABLE` 部分操作 - **示例**: ```sql ALTER TABLE orders DISABLE TRIGGER ALL; ``` #### 7. **EXCLUSIVE(排他锁)** - **行为**:阻塞所有写入操作(`INSERT/UPDATE/DELETE`) - **触发场景**:`REFRESH MATERIALIZED VIEW CONCURRENTLY` - **示例**: ```sql REFRESH MATERIALIZED VIEW CONCURRENTLY order_summary; ``` #### 8. **ACCESS EXCLUSIVE(访问排他锁)⭐** - **行为**:与**所有锁类型冲突**(最强锁) - **触发场景**: - DDL操作(`DROP TABLE`、`ALTER TABLE ... ADD COLUMN`) - `VACUUM FULL`、`CLUSTER` - 事务中未提交的 `TRUNCATE` - **风险案例**: ```sql UPDATE orders SET status=2 WHERE status=1; -- 若status无索引,全表加ACCESS EXCLUSIVE锁! ``` 引用[3]的电商事故即因此锁导致全表阻塞30分钟。 --- ### 🔍 二、锁冲突矩阵(简化版) | 请求锁 \ 持有锁 | ACCESS SHARE | ROW EXCLUSIVE | ... | ACCESS EXCLUSIVE | |------------------------|--------------|---------------|-----|------------------| | **ACCESS SHARE** | ✓ | ✓ | ... | ❌ | | **ROW EXCLUSIVE** | ✓ | ✓ | ... | ❌ | | **ACCESS EXCLUSIVE** | ❌ | ❌ | ... | ❌ | > ✓: 兼容, ❌: 冲突 > 完整矩阵见[官方文档](https://www.postgresql.org/docs/current/explicit-locking.html) --- ### ️ 三、监控与诊断工具 1. **动态视图 `pg_locks`** 查看当前锁状态: ```sql SELECT locktype, relation::regclass, mode, granted FROM pg_locks WHERE relation = 'orders'::regclass; ``` 输出示例: ``` locktype | relation | mode | granted ---------|----------|----------------|--------- relation | orders | RowExclusive | t -- 已授予 relation | orders | AccessExclusive| f -- 等待中(阻塞!) ``` 2. **阻塞会话查询** 定位阻塞源: ```sql SELECT blocked_pid, blocking_pid, blocked_query FROM pg_blocking_pids(pid) JOIN pg_stat_activity ON pid = blocking_pid; ``` --- ### 💎 四、核心结论 1. **锁强度阶梯**: $$ACCESS SHARE \prec ROW SHARE \prec \cdots \prec ACCESS EXCLUSIVE$$ 2. **高风险操作**: - DDL 默认使用 `ACCESS EXCLUSIVE`(如 `ALTER TABLE`) - 无索引的 `UPDATE/DELETE` 触发全表 `ACCESS EXCLUSIVE` 锁[^3] 3. **优化建议**: - 为高频过滤字段添加索引(避免全表锁) - 将 `ALTER TABLE` 等DDL置于低峰期执行 - 使用 `CREATE INDEX CONCURRENTLY` 减少阻塞 > 通过合理设计索引和操作时序,可显著降低锁冲突概率[^1][^3]。 --- ### ⚠️ 血泪教训复盘(引用[3]) > **某电商事故**: > ```sql > UPDATE orders SET status=2 WHERE status=1; -- status字段无索引 > ``` > **结果**:全表被 `ACCESS EXCLUSIVE` 锁阻塞30分钟! > **根因**:无索引导致逐行扫描并加锁,触发全表锁。 > **解决方案**: > ```sql > CREATE INDEX idx_orders_status ON orders(status); -- 事后补救 > ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pentiumcpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值