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),