Amazon RDS for PostgreSQL 教程

1. PostgreSQL 简介和特性

PostgreSQL 是一个强大的开源关系型数据库管理系统(RDBMS),以其可靠性、功能丰富和扩展性著称。它支持复杂的查询、事务处理、并发控制和多种数据类型。

主要特性

  • ACID 兼容:确保数据的完整性和一致性。
  • 扩展性:支持自定义数据类型、函数和操作符。
  • 并发控制:使用 MVCC(多版本并发控制)来处理并发事务。
  • 丰富的数据类型:包括数组、JSON、几何类型等。

2. 安装和环境配置

在本地安装 PostgreSQL 可以通过以下步骤完成:

# 在 Ubuntu 上安装 PostgreSQL
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

# 启动 PostgreSQL 服务
sudo systemctl start postgresql

3. 创建第一个数据库

使用 psql 命令行工具创建和管理数据库。

-- 连接到 PostgreSQL
psql -U postgres

-- 创建新数据库
CREATE DATABASE myfirstdb;

-- 连接到新数据库
\c myfirstdb

4. 基本 SQL 语句

SELECT 语句

SELECT * FROM users;

INSERT 语句

INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');

UPDATE 语句

UPDATE users SET email = '[email protected]' WHERE name = 'John Doe';

DELETE 语句

DELETE FROM users WHERE name = 'John Doe';

5. psql 命令行工具使用

psql 是 PostgreSQL 的交互式终端。

# 连接到数据库
psql -U postgres -d myfirstdb

# 列出所有数据库
\l

# 列出所有表
\dt

# 退出 psql
\q

6. 数据类型

PostgreSQL 支持多种数据类型,包括:

  • 基本类型:整数、浮点数、字符串、布尔值等。
  • 复合类型:数组、JSON、几何类型等。
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    price NUMERIC(10, 2),
    tags TEXT[]
);

7. 表和约束

创建表

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE
);

添加约束

ALTER TABLE users ADD CONSTRAINT email_check CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');

8. 索引

索引用于加速查询。

CREATE INDEX idx_users_email ON users (email);

9. 视图

视图是虚拟表,基于查询结果。

CREATE VIEW active_users AS
SELECT * FROM users WHERE status = 'active';

10. 模式(Schema)

模式用于组织数据库对象。

CREATE SCHEMA myschema;
CREATE TABLE myschema.users (id SERIAL PRIMARY KEY, name VARCHAR(100));

11. 事务和 ACID

事务确保数据库操作的原子性、一致性、隔离性和持久性。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

12. 子查询

子查询是嵌套在其他查询中的查询。

SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

13. 连接(JOIN)

连接用于组合多个表的数据。

SELECT users.name, orders.amount
FROM users
JOIN orders ON users.id = orders.user_id;

14. 集合操作(UNION, INTERSECT, EXCEPT)

集合操作用于组合查询结果。

SELECT name FROM users
UNION
SELECT name FROM customers;

15. 窗口函数

窗口函数用于计算排名、累计和等。

SELECT name, salary,
       RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

16. 公共表表达式(CTE)

CTE 是临时结果集,用于简化复杂查询。

WITH sales AS (
    SELECT user_id, SUM(amount) AS total_sales
    FROM orders
    GROUP BY user_id
)
SELECT users.name, sales.total_sales
FROM users
JOIN sales ON users.id = sales.user_id;

17. 范式化

范式化是数据库设计的过程,减少数据冗余。

CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(id),
    amount NUMERIC(10, 2)
);

18. ER 图

ER 图用于可视化数据库设计。

erDiagram
    CUSTOMERS ||--o{ ORDERS : places
    ORDERS }|--|{ ORDER_ITEMS : contains
    PRODUCTS ||--|{ ORDER_ITEMS : includes

19. 主键和外键

主键唯一标识表中的行,外键引用其他表的主键。

CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(id),
    amount NUMERIC(10, 2)
);

20. 继承

继承允许一个表继承另一个表的列。

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE admins (
    is_superuser BOOLEAN
) INHERITS (users);

21. 分区表

分区表将大表分成多个小表。

CREATE TABLE sales (
    id SERIAL,
    sale_date DATE,
    amount NUMERIC(10, 2)
) PARTITION BY RANGE (sale_date);

CREATE TABLE sales_2023 PARTITION OF sales
    FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');

22. 查询计划分析

使用 EXPLAIN 分析查询计划。

EXPLAIN SELECT * FROM users WHERE email = '[email protected]';

23. 索引优化

优化索引以提高查询性能。

CREATE INDEX idx_users_email ON users (email);

24. 查询优化

优化查询以提高性能。

SELECT name FROM users WHERE email = '[email protected]';

25. 配置调优

调整 PostgreSQL 配置以提高性能。

# 编辑 postgresql.conf
shared_buffers = '2GB'
work_mem = '128MB'

26. VACUUM 和 ANALYZE

VACUUM 清理死行,ANALYZE 更新统计信息。

VACUUM ANALYZE users;

27. 存储过程和函数

存储过程和函数用于封装业务逻辑。

CREATE FUNCTION get_user_orders(user_id INT) RETURNS TABLE (order_id INT, amount NUMERIC) AS $$
BEGIN
    RETURN QUERY SELECT id, amount FROM orders WHERE user_id = $1;
END;
$$ LANGUAGE plpgsql;

28. 触发器

触发器在特定事件发生时自动执行。

CREATE TRIGGER update_user_status
AFTER INSERT ON orders
FOR EACH ROW
EXECUTE FUNCTION update_user_status();

29. 事件触发器

事件触发器在数据库级别事件发生时执行。

CREATE EVENT TRIGGER log_ddl_changes
ON ddl_command_start
EXECUTE FUNCTION log_ddl_changes();

30. 全文搜索

全文搜索用于搜索文本数据。

CREATE INDEX idx_users_name ON users USING gin (to_tsvector('english', name));

31. JSON 和 JSONB 支持

PostgreSQL 支持 JSON 和 JSONB 数据类型。

CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    data JSONB
);

32. 锁机制

锁用于控制并发访问。

BEGIN;
LOCK TABLE users IN ACCESS EXCLUSIVE MODE;
UPDATE users SET email = '[email protected]' WHERE name = 'John Doe';
COMMIT;

33. MVCC(多版本并发控制)

MVCC 允许多个事务并发执行。

BEGIN;
UPDATE users SET email = '[email protected]' WHERE name = 'John Doe';
COMMIT;

34. 死锁处理

死锁是并发事务的常见问题。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

35. 隔离级别

隔离级别控制事务的可见性。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

36. pg_dump 和 pg_restore

pg_dump 用于备份数据库,pg_restore 用于恢复。

pg_dump -U postgres myfirstdb > myfirstdb.sql
pg_restore -U postgres -d myfirstdb myfirstdb.sql

37. 连续归档和时间点恢复(PITR)

PITR 用于恢复到特定时间点。

# 配置连续归档
archive_mode = on
archive_command = 'test ! -f /path/to/archive/%f && cp %p /path/to/archive/%f'

38. 复制和流复制

流复制用于主从复制。

# 配置主服务器
wal_level = replica
max_wal_senders = 5

39. 故障转移和高可用性

高可用性配置确保系统持续运行。

# 配置从服务器
hot_standby = on

40. 用户和角色管理

管理用户和角色权限。

CREATE ROLE admin WITH LOGIN PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE myfirstdb TO admin;

41. 权限控制

控制数据库对象的访问权限。

GRANT SELECT, INSERT ON users TO admin;

42. SSL 连接

配置 SSL 以加密连接。

# 生成 SSL 证书
openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=myfirstdb"

43. 行级安全性

行级安全性控制行级访问。

CREATE POLICY user_policy ON users
FOR SELECT
USING (current_user = name);

44. 常用扩展介绍(如 PostGIS, pgcrypto)

扩展提供额外功能。

CREATE EXTENSION postgis;
CREATE EXTENSION pgcrypto;

45. 自定义扩展开发

开发自定义扩展。

CREATE FUNCTION my_function() RETURNS VOID AS $$
BEGIN
    -- 函数体
END;
$$ LANGUAGE plpgsql;

46. 外部数据包装器(FDW)

FDW 允许访问外部数据源。

CREATE SERVER my_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'remotehost', dbname 'remotedb');

47. 日志管理

管理数据库日志。

# 配置日志
log_destination = 'stderr'
logging_collector = on

48. 性能监控

监控数据库性能。

SELECT * FROM pg_stat_activity;

49. 连接池(如 PgBouncer)

连接池管理数据库连接。

# 安装 PgBouncer
sudo apt-get install pgbouncer

50. 数据库集群管理

管理数据库集群。

# 初始化集群
pg_ctlcluster 14 main start

51. JDBC 和 ODBC 驱动

JDBC 和 ODBC 驱动用于连接数据库。

// JDBC 示例
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/myfirstdb", "postgres", "password");

52. ORM 工具(如 Hibernate, SQLAlchemy)

ORM 工具简化数据库操作。

# SQLAlchemy 示例
from sqlalchemy import create_engine
engine = create_engine('postgresql://postgres:password@localhost:5432/myfirstdb')

53. 连接池最佳实践

优化连接池配置。

# PgBouncer 配置
max_client_conn = 100
default_pool_size = 20

54. 并行查询

并行查询提高查询性能。

SET max_parallel_workers_per_gather = 4;

55. 物化视图

物化视图存储查询结果。

CREATE MATERIALIZED VIEW mv_users AS
SELECT * FROM users;

56. 数据仓库设计

设计数据仓库。

CREATE TABLE sales_fact (
    id SERIAL PRIMARY KEY,
    product_id INT,
    customer_id INT,
    sale_date DATE,
    amount NUMERIC(10, 2)
);

57. 与 Hadoop 生态系统集成

集成 Hadoop 生态系统。

# 安装 PostgreSQL-Hadoop 连接器
sudo apt-get install postgresql-hadoop

58. Amazon RDS for PostgreSQL

Amazon RDS 是托管的 PostgreSQL 服务。

# 创建 RDS 实例
aws rds create-db-instance --db-instance-identifier myfirstdb --db-instance-class db.t3.micro --engine postgres --master-username postgres --master-user-password password --allocated-storage 20

59. Azure Database for PostgreSQL

Azure Database 是托管的 PostgreSQL 服务。

# 创建 Azure PostgreSQL 实例
az postgres server create --resource-group myResourceGroup --name myfirstdb --location eastus --admin-user postgres --admin-password password --sku-name B_Gen5_1

60. Google Cloud SQL for PostgreSQL

Google Cloud SQL 是托管的 PostgreSQL 服务。

# 创建 Google Cloud SQL 实例
gcloud sql instances create myfirstdb --database-version=POSTGRES_14 --cpu=1 --memory=4GB --region=us-central1

61. 主要版本特性介绍

介绍 PostgreSQL 主要版本的新特性。

-- PostgreSQL 14 新特性
CREATE STATISTICS my_stats (dependencies) ON a, b FROM my_table;

62. 升级策略

升级 PostgreSQL 数据库。

# 升级 PostgreSQL
pg_upgrade -b oldbindir -B newbindir -d olddatadir -D newdatadir

63. 从其他数据库迁移到 PostgreSQL

迁移数据库到 PostgreSQL。

# 使用 pgloader 迁移 MySQL 到 PostgreSQL
pgloader mysql://user:password@localhost/mydb postgresql://user:password@localhost/myfirstdb

64. 设计和实现一个博客系统数据库

设计博客系统数据库。

CREATE TABLE posts (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255),