Postgresql日常使用
**Postgresql日常使用
一、基础操作指南
-
安装与配置
- PostgreSQL 官网安装指南
-
连接数据库
- 使用
psql
命令行工具 - 常用连接参数(用户名、密码、主机、端口)
- 使用
-
数据库管理
- 创建 / 删除数据库
- 切换数据库(
\c
命令)
-
表操作
- 创建 / 修改 / 删除表
- 定义字段类型、约束(主键、外键、唯一键)
二、SQL 操作示例
一、数据库连接
命令行语法
psql -U username -d database_name -h host -p port
-
-U:U是user的缩写,用于指定连接数据库的用户名,例如postgres是 PostgreSQL 默认的超级用户。
-
-d:d代表database,用来指定要连接的具体数据库名称。
-
-h:h表示host,用于指定数据库服务器的主机地址,localhost表示本地主机,若数据库部署在其他服务器,需填写对应 IP 地址或域名。
-
-p:p是port的缩写,指定数据库服务器的端口号,PostgreSQL 默认端口为5432 ,若修改过端口,则需填写实际端口。
示例
psql -U admin -d mydb
此命令表示以用户admin的身份连接到名为mydb的数据库,由于未指定-h和-p参数,默认连接本地主机的5432端口。连接成功后,可在命令行输入 SQL 语句操作数据库,输入\q即可退出连接。
二、用户与权限管理
1. 创建用户
CREATE USER new_user WITH PASSWORD 'password';
这条 SQL 语句用于在 PostgreSQL 中创建新用户。CREATE USER是创建用户的关键字,new_user是自定义的新用户名,WITH PASSWORD用于设置用户的登录密码,'password’为具体密码,实际使用时应设置强密码以保证安全性。
2. 赋予权限
- 授予表查询权限
GRANT SELECT ON table_name TO new_user;
GRANT用于授予权限,SELECT表示要授予的权限类型,即查询权限;ON table_name指定权限作用的对象为名为table_name的表;TO new_user表示将该权限授予new_user用户。
- 授予数据库所有权限
GRANT ALL PRIVILEGES ON DATABASE database_name TO new_user;
ALL PRIVILEGES表示所有权限,包括创建、删除、修改等操作;ON DATABASE database_name指定权限作用于名为database_name的数据库;TO new_user将数据库的所有权限授予new_user,此操作需谨慎,避免用户误操作导致数据问题。
3. 回收权限
REVOKE SELECT ON table_name FROM new_user;
REVOKE用于回收权限,SELECT指定要回收的查询权限;ON table_name表明权限作用的表;FROM new_user表示从new_user用户处回收对table_name表的查询权限。
三、数据库与表操作
1. 创建数据库
CREATE DATABASE my_databaseWITH OWNER = postgresENCODING = 'UTF8'LC_COLLATE = 'C'LC_CTYPE = 'C'TABLESPACE = pg_defaultCONNECTION LIMIT = -1;
-
CREATE DATABASE my_database:创建名为my_database的数据库。
-
OWNER = postgres:指定数据库的所有者为postgres用户。
-
ENCODING = ‘UTF8’:设置数据库的编码格式为 UTF-8,支持多种语言字符。
-
LC_COLLATE = 'C’和LC_CTYPE = ‘C’:分别设置数据库的排序规则和字符分类,C是默认的简单排序和字符分类方式。
-
TABLESPACE = pg_default:指定数据库使用的表空间为默认表空间pg_default。
-
CONNECTION LIMIT = -1:设置数据库的最大连接数,-1表示不限制连接数 。
2. 创建表
CREATE TABLE employees (id SERIAL PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100) UNIQUE,hire_date DATE
);
-
CREATE TABLE employees:创建名为employees的表。
-
id SERIAL PRIMARY KEY:SERIAL是一种自增数据类型,用于生成唯一的标识符,PRIMARY KEY指定该列为主键,确保数据的唯一性和完整性。
-
first_name VARCHAR(50)和last_name VARCHAR(50):创建两个字段,用于存储员工的名和姓,VARCHAR(50)表示可变长度字符串,最大长度为 50 个字符。
-
email VARCHAR(100) UNIQUE:创建存储员工邮箱的字段,UNIQUE约束确保该列的值在表中唯一,不允许重复。
-
hire_date DATE:创建存储员工入职日期的字段,数据类型为DATE,只存储日期信息。
3. 修改表结构
- 添加新列
ALTER TABLE employees ADD COLUMN phone_number VARCHAR(20);
ALTER TABLE employees指定要修改的表为employees;ADD COLUMN表示添加新列;phone_number VARCHAR(20)定义新列名为phone_number,数据类型为可变长度字符串,最大长度 20 个字符。
- 修改列的数据类型
ALTER TABLE employees ALTER COLUMN phone_number TYPE VARCHAR(25);
ALTER TABLE employees指定目标表;ALTER COLUMN phone_number指定要修改的列;TYPE VARCHAR(25)将phone_number列的数据类型修改为最大长度 25 的可变长度字符串。
- 删除列
ALTER TABLE employees DROP COLUMN phone_number;
ALTER TABLE employees指定表;DROP COLUMN phone_number删除employees表中的phone_number列。
四、数据操作
1. 插入数据
INSERT INTO employees (first_name, last_name, email, hire_date)
VALUES ('John', 'Doe', 'johndoe@example.com', '2023-01-01');
INSERT INTO employees指定要插入数据的表为employees;(first_name, last_name, email, hire_date)列出要插入数据的列;VALUES后面括号内对应的值,按列顺序依次插入到表中。
2. 查询数据
- 使用 JOIN 查询关联表数据
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
SELECT e.first_name, e.last_name, d.department_name指定要查询的列,分别从employees表(别名e)和departments表(别名d)中选取。
FROM employees e指定主表为employees,并为其取别名e。
JOIN departments d ON e.department_id = d.id通过department_id和id列的关联关系,将employees表和departments表进行连接,以便获取关联数据。
- 使用聚合函数
SELECT COUNT(*), AVG(salary)
FROM employees;
COUNT(*)统计employees表中的记录总数;AVG(salary)计算employees表中salary列的平均值。聚合函数常用于统计和分析数据。
3. 更新数据
UPDATE employees
SET email = 'newemail@example.com'
WHERE id = 1;
UPDATE employees指定要更新数据的表为employees;SET email = 'newemail@example.com’设置要更新的列和新值,将email列的值更新为newemail@example.com;WHERE id = 1是筛选条件,仅对id等于 1 的记录进行更新操作。
4. 删除数据
DELETE FROM employees WHERE id = 1;
DELETE FROM employees指定从employees表中删除数据;WHERE id = 1为删除条件,仅删除id等于 1 的记录,若不添加WHERE条件,将删除表中所有数据。
五、索引优化
1. 创建索引
- 创建 B-tree 索引
CREATE INDEX idx_employees_email ON employees (email);
CREATE INDEX用于创建索引,idx_employees_email是自定义的索引名称;ON employees指定索引作用的表为employees;(email)表示基于email列创建索引,B-tree 索引适用于等值查询和范围查询,可提升查询性能。
- 创建 GiST 索引
CREATE INDEX idx_employees_fulltext ON employees USING GIST (to_tsvector('english', first_name ||'' || last_name));
CREATE INDEX idx_employees_fulltext创建名为idx_employees_fulltext的索引;ON employees指定作用表;USING GIST表示使用 GiST 索引类型;to_tsvector(‘english’, first_name ||‘’ || last_name)将first_name和last_name列合并后转换为全文搜索向量,GiST 索引常用于全文搜索等复杂查询场景。
2. 查看索引使用情况
SELECT relname, idx_scan
FROM pg_stat_user_indexes
ORDER BY idx_scan;
pg_stat_user_indexes是 PostgreSQL 系统提供的视图,用于存储用户创建索引的相关统计信息。SELECT relname, idx_scan从该视图中选取索引名称(relname)和索引扫描次数(idx_scan)两列数据;ORDER BY idx_scan按索引扫描次数对结果进行排序,方便查看哪些索引使用频繁,哪些索引可能未被有效利用。
六、备份与恢复
1. 全库备份
pg_dump -U username -d database_name -f full_backup.sql
pg_dump是 PostgreSQL 的备份工具。-U username指定执行备份操作的用户名;-d database_name指定要备份的数据库;-f full_backup.sql指定备份文件的名称和路径,将数据库备份到名为full_backup.sql的文件中。
2. 增量备份
- 配置归档模式
wal_level = replica
archive_mode = on
archive_command = 'test! -f /path/to/archive/%f && cp %p /path/to/archive/%f'
wal_level = replica设置 WAL(Write-Ahead Logging,预写式日志)级别为replica,支持复制和归档。archive_mode = on开启归档模式,使事务日志可以被归档。archive_command定义归档命令,test! -f /path/to/archive/%f && cp %p /path/to/archive/%f表示如果归档目录下不存在同名文件,则将事务日志文件复制到归档目录中,%f代表日志文件名,%p代表日志文件路径。
- 执行基础备份
pg_basebackup -U username -h host -D /backup/directory -P
pg_basebackup用于创建基础备份。-U username指定用户名;-h host指定数据库主机地址;-D /backup/directory指定备份文件存放的目录;-P显示备份进度。
3. 恢复数据
- 全库恢复
pg_restore -U username -d target_database backup_file.sql
pg_restore是恢复工具。-U username指定恢复操作的用户名;-d target_database指定要恢复到的目标数据库;backup_file.sql是之前备份的文件,将备份数据恢复到目标数据库中。
- 基于基础备份和归档日志恢复到指定时间点
pg_basebackup -U username -h host -D /restore/directory -Xs -P
-Xs参数表示在基础备份时包含 WAL 归档文件,以便后续基于归档日志进行时间点恢复;-D /restore/directory指定恢复文件存放目录。
restore_command = 'cp /path/to/archive/%f %p'
recovery_target_time = '2024-01-01 12:00:00'
在recovery.conf文件中配置恢复参数,restore_command定义从归档目录恢复事务日志文件的命令;recovery_target_time指定恢复的目标时间点,数据库将恢复到该时间点的状态。
七、日常维护
1. 定期清理事务日志
VACUUM ANALYZE;
VACUUM命令用于回收已删除数据占用的磁盘空间,并更新数据库的统计信息。ANALYZE子句会收集表和索引的统计信息,帮助查询优化器生成更高效的查询计划。执行该命令可防止事务日志文件过大,提升数据库性能。
2. 监控数据库性能
SELECT * FROM pg_stat_activity;
pg_stat_activity是系统视图,包含当前数据库中所有活动进程的信息,如连接用户、执行的 SQL 语句、查询开始时间等。通过查询该视图,可以实时监控数据库的运行状态,及时发现长时间运行的查询、阻塞问题等性能瓶颈。
3. 更新数据库版本
关注 PostgreSQL 官方发布的版本更新,新版本通常会修复已知的安全漏洞、性能问题,并添加新功能。按照官方提供的升级指南进行操作,确保数据库安全、高效运行 。
以上对 PostgreSQL 日常使用中各类代码的详细解释,希望能帮助你深入理解每个操作背后的逻辑和作用。
这份解释涵盖了 PostgreSQL 日常操作代码的核心要点。若你对某部分代码还有疑问,或想了解更多相关拓展知识,欢迎随时与我交流。