王培顺的博客&WangPeishun’s Blog

分类 读书笔记 下的文章

PostgreSQL 学习手册

第一部分:基础入门

1. 什么是 PostgreSQL?

  • 定义:PostgreSQL 是一个功能强大的、开源的对象-关系型数据库管理系统(ORDBMS)。它以其高可靠性、功能丰富、性能卓越和强大的扩展性而闻名。
  • 特点

    • 开源:完全免费,拥有活跃的社区支持。
    • 标准兼容:高度兼容 SQL 标准。
    • 可扩展:支持自定义函数、存储过程、数据类型、操作符、聚合函数等。
    • 并发性好:使用多版本并发控制(MVCC)来实现高并发,读写互不阻塞。
    • 可靠性高:支持事务的 ACID(原子性、一致性、隔离性、持久性)特性,支持预写式日志(WAL)来保证数据完整性。

2. 安装与配置

  • 下载:从官方站点 https://www.postgresql.org/download/ 选择对应操作系统(Windows, macOS, Linux)的版本。
  • 安装

    • Linux (Ubuntu/Debian)

      • sudo apt-get update
      • sudo apt-get install postgresql postgresql-contrib
    • macOS:推荐使用 Homebrewbrew install postgresql
    • Windows:运行图形化安装程序,按向导步骤进行。
  • 初始设置

    • 安装后会自动创建一个名为 postgres 的超级用户和一个同名的数据库。
    • 需要设置密码:sudo -u postgres psql,然后执行 \password 命令。
    • 创建新用户和数据库:createuser --interactivecreatedb mydb

3. 基本操作 (通过 psql 命令行工具)

  • 连接数据库psql -U username -d dbname -h host -p port
  • 常用元命令 (在 psql 中执行):

    • \l:列出所有数据库
    • \c dbname:切换到指定数据库
    • \dt:列出当前数据库中的所有表
    • \d table_name:描述表的结构
    • \du:列出所有用户角色
    • \?:查看所有元命令帮助
    • \q:退出 psql

第二部分:核心概念与 SQL 操作

1. 数据库与模式 (Schema)

  • 数据库 (Database):最顶层的逻辑容器,数据彼此隔离。
  • 模式 (Schema):数据库内部的命名空间,用于组织表、视图等对象。默认有一个 public 模式。

    • CREATE SCHEMA myschema;
    • 访问:SELECT * FROM myschema.mytable;

2. 数据定义语言 (DDL)

  • 创建表

    • CREATE TABLE users (
    • id SERIAL PRIMARY KEY, -- 自增主键
    • username VARCHAR(50) UNIQUE NOT NULL,
    • email VARCHAR(255) NOT NULL,
    • age INT CHECK (age > 0),
    • created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    • );
  • 修改表

    • ALTER TABLE users ADD COLUMN phone VARCHAR(15);
    • ALTER TABLE users ALTER COLUMN email TYPE TEXT;
    • ALTER TABLE users DROP COLUMN age;
  • 删除表DROP TABLE users;

3. 数据操作语言 (DML)

  • 插入数据 (INSERT)

    • INSERT INTO users (username, email, age)
    • VALUES ('alice', 'alice@example.com', 30);
  • 查询数据 (SELECT)

    • SELECT * FROM users; -- 查询所有
    • SELECT username, email FROM users WHERE age > 25; -- 条件查询
    • SELECT * FROM users ORDER BY created_at DESC; -- 排序
    • SELECT COUNT(*), age FROM users GROUP BY age; -- 分组聚合
  • 更新数据 (UPDATE)

    • UPDATE users SET age = 31 WHERE username = 'alice';
  • 删除数据 (DELETE)

    • DELETE FROM users WHERE username = 'alice';

4. 数据查询进阶

  • 多表连接 (JOIN)

    • INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN

      • SELECT o.order_id, u.username
      • FROM orders o
      • INNER JOIN users u ON o.user_id = u.id;
  • 子查询 (Subquery)

    • SELECT * FROM users
    • WHERE age > (SELECT AVG(age) FROM users);
  • 常用聚合函数COUNT(), SUM(), AVG(), MAX(), MIN()
  • 窗口函数 (Window Functions):用于对一组相关的行进行计算,同时保留各行信息。

    • SELECT username, age,
    • RANK() OVER (ORDER BY age DESC) as age_rank
    • FROM users;

第三部分:高级特性

1. 索引

  • 作用:大幅提高查询速度,但会增加写操作的开销。
  • 创建索引

    • CREATE INDEX idx_users_email ON users(email); -- B-tree 索引
    • CREATE INDEX idx_users_username ON users USING gin (to_tsvector('english', username)); -- GIN 索引(用于全文搜索)

2. 事务 (Transactions)

  • 特性:保证一系列操作要么全部成功,要么全部失败(ACID)。

    • BEGIN; -- 开始事务
    • UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
    • UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
    • COMMIT; -- 提交事务
    • -- 如果发生错误,可以执行 ROLLBACK; 来回滚

3. 视图 (Views)

  • 作用:将复杂的查询保存为一个虚拟表,简化操作。

    • CREATE VIEW active_users AS
    • SELECT * FROM users WHERE is_active = true;
    • SELECT * FROM active_users;

4. 存储过程与函数

  • 使用 PL/pgSQL 语言编写。
  • 函数示例

    • CREATE OR REPLACE FUNCTION get_user_count()
    • RETURNS integer AS $$
    • DECLARE
    • count integer;
    • BEGIN
    • SELECT COUNT(*) INTO count FROM users;
    • RETURN count;
    • END;
    • $$ LANGUAGE plpgsql;
    • SELECT get_user_count();

第四部分:管理与维护

1. 用户与权限管理

  • 角色 (Roles):PostgreSQL 中用户和组统称为角色。

    • 创建角色CREATE ROLE myrole WITH LOGIN PASSWORD 'mypassword';
    • 授予权限

      • GRANT SELECT, INSERT ON TABLE users TO myrole;
      • GRANT ALL PRIVILEGES ON DATABASE mydb TO myrole;

2. 备份与恢复

  • 逻辑备份 (pg_dump)

    • # 备份单个数据库
    • pg_dump -U username -d dbname -f backup.sql
    • # 备份所有数据库
    • pg_dumpall -U username -f alldbs.sql
  • 恢复

    • psql -U username -d dbname -f backup.sql

3. 性能优化

  • 使用 EXPLAIN:分析查询执行计划,找出性能瓶颈。

    • EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'alice@example.com';
  • Vacuum:清理“死元组”,回收存储空间,是 MVCC 的必要维护操作。autovacuum 通常自动运行,也可手动执行 VACUUM FULL;

第五部分:扩展与实践

1. 常用扩展 (Extensions)

  • PostGIS:为 PostgreSQL 添加地理空间对象支持,使其成为地理信息系统(GIS)数据库。
  • pgcrypto:提供加密函数,如密码哈希。
  • uuid-ossp:生成 UUID(通用唯一识别码)。

    • CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
    • SELECT uuid_generate_v4();

2. 编程接口

  • 几乎所有主流编程语言都支持连接 PostgreSQL:

    • Python:使用 psycopg2asyncpg 库。
    • Java:使用 JDBC 驱动。
    • Node.js:使用 pg 库。
    • Go:使用 pqpgx 库。

3. 学习资源


总结

学习 PostgreSQL 的最佳路径是:

  1. 安装体验:先动手安装,熟悉 psql 基本操作。
  2. 掌握 SQL:扎实学习标准 SQL 的 CRUD 操作、连接和聚合。
  3. 深入特性:理解事务、索引、MVCC 等核心机制。
  4. 实践管理:尝试用户授权、备份恢复等运维任务。
  5. 探索扩展:根据项目需求,学习如 PostGIS 等特定扩展。

以下是一份详细的Docker使用手册目录及核心内容概要,涵盖从基础到进阶的实践指南,供您学习参考。


目录

  1. Docker 简介
  2. 安装与配置
  3. 核心概念
  4. 基础命令操作
  5. 镜像管理与Dockerfile
  6. 容器网络
  7. 数据持久化
  8. Docker Compose
  9. Docker Swarm 集群
  10. 安全与最佳实践
  11. 常见问题与调试

1. Docker 简介

  • 容器化技术:轻量级虚拟化,共享内核,隔离进程和资源。
  • Docker 优势

    • 快速部署
    • 环境一致性
    • 资源高效利用
    • 易于扩展
  • 核心组件

    • Docker Daemon(守护进程)
    • Docker Client(客户端)
    • Images(镜像)
    • Containers(容器)
    • Registry(镜像仓库,如Docker Hub)

2. 安装与配置

Ubuntu/CentOS 安装

  • # 卸载旧版本
  • sudo apt-get remove docker docker-engine docker.io containerd runc
  • # 安装依赖
  • sudo apt-get update
  • sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • # 添加Docker官方GPG密钥
  • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • # 添加仓库
  • sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • # 安装Docker Engine
  • sudo apt-get update
  • sudo apt-get install docker-ce docker-ce-cli containerd.io
  • # 验证安装
  • sudo docker run hello-world

Windows/macOS

配置镜像加速器(国内用户)

  • // 编辑 /etc/docker/daemon.json
  • {
  • "registry-mirrors": ["https://registry.docker-cn.com", "https://mirror.ccs.tencentyun.com"]
  • }

重启服务:sudo systemctl restart docker


3. 核心概念

  • 镜像 (Image):只读模板,包含运行环境和应用程序。
  • 容器 (Container):镜像的运行实例,具有可写层。
  • 仓库 (Registry):存储和分发镜像的服务(如Docker Hub、阿里云镜像仓库)。

4. 基础命令操作

镜像管理

  • docker pull ubuntu:20.04 # 拉取镜像
  • docker images # 查看本地镜像
  • docker rmi <image_id> # 删除镜像

容器操作

  • docker run -d -p 80:80 --name mynginx nginx # 后台运行容器并映射端口
  • docker ps -a # 查看所有容器
  • docker start/stop/restart <container_id> # 启停容器
  • docker exec -it <container_id> /bin/bash # 进入容器终端
  • docker logs <container_id> # 查看日志
  • docker rm <container_id> # 删除容器

5. 镜像管理与Dockerfile

Dockerfile 示例

  • FROM python:3.8-slim
  • WORKDIR /app
  • COPY requirements.txt .
  • RUN pip install -r requirements.txt
  • COPY . .
  • CMD ["python", "app.py"]

构建镜像

  • docker build -t myapp:v1 .

推送镜像到仓库

  • docker tag myapp:v1 username/myapp:v1
  • docker push username/myapp:v1

6. 容器网络

  • 网络模式bridge(默认)、hostnone、自定义网络。
  • 创建自定义网络

    • docker network create my_network
    • docker run --network=my_network --name app1 myapp

7. 数据持久化

Volume 数据卷

  • docker volume create my_volume
  • docker run -v my_volume:/data --name db mysql

Bind Mount 目录挂载

  • docker run -v /host/path:/container/path nginx

8. Docker Compose

docker-compose.yml 示例

  • version: '3'
  • services:
  • web:
  • image: nginx:alpine
  • ports:
  • - "80:80"
  • volumes:
  • - ./html:/usr/share/nginx/html
  • db:
  • image: mysql:5.7
  • environment:
  • MYSQL_ROOT_PASSWORD: example

常用命令

  • docker-compose up -d # 启动服务
  • docker-compose down # 停止并删除容器
  • docker-compose logs # 查看日志

9. Docker Swarm 集群

  • docker swarm init --advertise-addr <MANAGER_IP>
  • docker service create --replicas 3 -p 80:80 --name web nginx
  • docker service scale web=5

10. 安全与最佳实践

  • 最小化镜像:使用Alpine基础镜像,多阶段构建。
  • 非root用户运行容器

    • RUN useradd -m myuser
    • USER myuser
  • 定期更新镜像:修复安全漏洞。
  • 限制资源

    • docker run -m 512m --cpus 1.5 myapp

11. 常见问题

容器无法启动

  • docker inspect <container_id> # 查看详细配置
  • docker logs <container_id> # 检查日志

清理无用资源

  • docker system prune -a # 删除停止的容器、未使用的镜像和网络

附录


今天早上上班路上,看了头条的一个关于本、硕、博区别的文章,虽然不知道其观点背后的数据支撑是否靠谱,但自认为它说的有道理。

请不要再对毕业后不从事本专业的大学生们说三道四。


1.本科学习与研究生学习的区别:

本科是素质教育,是从未成年到成人的教育,是让他们完成文明教育的过程。本科教育是培养学生做人的品格和个人修养的过程,同时本科教育也是培养学生获得继续学习和终生学习能力的一个重要阶段。

研究生教育不是素质教育,而是专业教育,研究生的学习带有研究性质,学习的方向具有单一指向性,学习的内容专业性比较强。

本科生毕业后终生从事其所学专业的人数比例一般不是超过10%。硕士生毕业后终生从事其硕士专业的比例会在15%左右。而博士生以博士专业为终生职业的人数不会低于三分之二。

2.硕士生学习与博士生学习的区别

硕士研究生和博士研究生的区别是专业水平的区别,也就是研究技能的区别,而不是素质的区别。硕士生培养的是工作技能,毕业后从事事务性工作,博士生培养的是学术技能,毕业后一般从事教学科研工作和学术研究。硕士生注重的是学习普遍性的研究技能,完成上级交代下来的任何一项事务性工作,调查了解基本情况,判断问题的性质、设计解决问题的方案,找到实施的方法与路径。博士生注重学术能力的培养,寻求真理、发现规律、探索人类尚不知道的知识,要具有扎实的研究能力,高昂的学术激情和学术奉献精神。

 

“人可以被消灭,但不可以被打倒。”


这是很多读者,看完《老人与海》后便奉为经典的一句话。

我比较感性,也无法体会到“老人”那个时代背景下更深的东西,

但我仍十分认可这句话,更是佩服“老人”的坚韧。

 

不过,给我感觉最深刻的却是孩子对老人的感情,

那种发自内心、纯真又淳朴的真挚的感情。

孩子对老人的一些行为,超出了接济与照顾的范畴,

我并没有发现老人和孩子有什么十分特别的关系,(以现在的价值观来看)。

但老人与孩子的关系确实那么的和谐,

似乎超越了现在的“爷孙”的关系。

 

也许老人与孩子的那段情感并不是那么令人动容,

只是我在现在的社会上见得太少的缘故。