一、启动和停止PostgreSQL
在安装完成PostgreSQL之后,有三种启停PostgreSQL的方式,需要进行配置一下,之前在安装PostgreSQL中也介绍过。
1、使用自带脚本方式启动【推荐】
(1)复制启动脚本
复制源码包里的脚本至etc/init.d目录下,并加执行权限
cd /root/postgresql-17.4
cp ./contrib/start-scripts/linux /etc/init.d/postgresql
chmod +x /etc/init.d/postgresql
chown -R postgres:postgres /usr/local/pgsql
(2)启动服务
su - postgres
service postgresql start
service postgresql status
使用postgres用户需要输入密码,root用户不需要,但建议使用postgres用户进行操作。
postgres
(3)设置开机启动
chkconfig --add postgresql
2、使用systemd进行管理【推荐】
(1)编辑postgresql.service文件
vim /etc/systemd/system/postgresql.service
添加如下内容:
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
After=network-online.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGDATA=/usr/local/pgsql/data
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA}
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -m fast
ExecReload=/home/postgres/bin/pg_ctl reload -D ${PGDATA}
TimeoutSec=300s
[Install]
WantedBy=multi-user.target
(2)加载以及启动
systemctl daemon-reload
systemctl start postgresql
systemctl status postgresql
3、直接使用命令行启动【不推荐】
su - postgres
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile status
二、登录和退出PostgreSQL
1、使用root用户登录
psql -U postgres
2、使用postgres用户登录
su - postgres
psql
三、常用的基础操作
1、修改密码
alter user pgtest3 with encrypted password '123456';
2、数据库相关
(1)查看有哪些数据库
\list
\l
\l+
SELECT datname FROM pg_database;
(2)创建数据库
create database mydb1;
create database mydb2;
create database mydb3;
再查看有哪些数据库
\l
\l+
(3)删除数据库
DROP DATABASE mydb2;
DROP DATABASE mydb3;
再查看有哪些数据库
\l
\l+
(4)切换数据库
\c mydb1
(5)查看当前在哪个数据库下
\c
\conninfo
SELECT current_database();
根据下面红色框位置也能看出来。
3、schema
Schema 是数据库内部的逻辑命名空间,类似于文件夹,用于组织和管理数据库对象(如表、视图、函数等)。
(1)创建schema
一般和用户名同名【租户】,实现多租户管理。
\c mydb1;
create schema pgtest1;
create schema pgtest2;
create schema pgtest3;
(2)查询schema
\dn
\dn+
或者,查询所有的schema:
SELECT nspname AS schema_name FROM pg_catalog.pg_namespace ORDER BY schema_name;
或者,只查询用户自定义的schema:
SELECT nspname AS schema_name FROM pg_catalog.pg_namespace WHERE nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast') AND nspname !~ '^pg_' ORDER BY schema_name;
(3)查询schema中的表、序列、索引
查看schema中的表
\dt pgtest1.*
\d pgtest1.*
查看schema中序列
\ds pgtest1.*
查看schema中的索引
\di pgtest1.*
(4)查看schema中是否有对象
例如:表、序列、索引,一般在删除schema前会查询一下。
SELECT COUNT(*) FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE n.nspname = 'pgtest1';
(5)删除schema
删除空的schema
DROP SCHEMA IF EXISTS pgtest2;
强制删除非空的schema
DROP SCHEMA IF EXISTS pgtest3 CASCADE;
再次查询有哪些schema
\dn
4、用户相关
PostgreSQL使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组,这取决于角色被怎样设置。角色可以拥有数据库对象(例如,表和函数)并且能够把那些对象上的权限赋予给其他角色来控制谁能访问哪些对象。此外,还可以把一个角色中的成员资格授予给另一个角色,这样允许成员角色使用被赋予给另一个角色的权限。
角色的概念把“用户”和“组”的概念都包括在内。在PostgreSQL版本 8.1 之前,用户和组是完全不同的两种实体,但是现在只有角色。任意角色都可以扮演用户、组或者两者。
(0)查看当前连接用户
\c
select user;
select current_user;
select current_database();
(1)创建用户
CREATE USER pgtest1 with password 'admin';
CREATE USER等同于CREATE ROLE, 但CREATE USER默认包含LOGIN,而CREATE ROLE不包含。
如下两者等价,创建具有登录权限的角色:
CREATE ROLE pgtest2 with password 'admin' LOGIN;
CREATE USER pgtest3 with password 'admin';
(2)查看用户
查看有哪些用户/角色
\du
\du+
select * from pg_roles;
(3)查询用户拥有的对象
一般在删除用户的时候会先查询一下,如下pgtest1是新创建的,没有任何对象
SELECT * FROM pg_tables WHERE tableowner = 'pgtest1';
SELECT * FROM pg_tables WHERE tableowner = 'postgres';
而管理员用户postgres用户下就有很多对象
(4)查询用户拥有的对象类型
SELECT nspname AS schema, relname AS object, relkind AS type FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relowner = (SELECT oid FROM pg_roles WHERE rolname = 'pgtest1');
SELECT nspname AS schema, relname AS object, relkind AS type FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relowner = (SELECT oid FROM pg_roles WHERE rolname = 'postgres');
(5)转移用户对象
将用户拥有的所有对象转移给其他用户(如pgtest2),一般在删除用户的时候,可能会用到,将要删除的对象转移给其他用户。
REASSIGN OWNED BY pgtest1 TO pgtest2;
DROP USER pgtest1;
(6)删除用户
DROP USER IF EXISTS pgtest2;
(7)用户授权
授权用户的schema所有权限,一般schema和用户同名,实现多租户管理。
GRANT ALL PRIVILEGES ON SCHEMA pgtest1 TO pgtest1;
授权用户schema下表的权限,注意,如果这个表不是pgtest1创建的,还要进行授权才行,例如授予表查询、更新、删除权限
GRANT SELECT, UPDATE, DELETE ON TABLE pgtest1.t2 TO pgtest1;
否则是没有权限进行增删改查操作的,只有授完权,才能进行查询,如下:
(8)回收权限
REVOKE ALL PRIVILEGES ON SCHEMA pgtest1 FROM pgtest1;
(9)普通用户登录
创建完普通用户后,可以使用普通用户进行登录。
psql -U pgtest1 -d mydb1
5、表相关
(1)创建表
不指定schem创建表的话,默认使用的是public这个schema
\c mydb1;
create table t1(id int primary key,name varchar(20));
指定schema创建表,指定schema为pgtest1
\c mydb1;
\dn
create table pgtest1.t2(id int primary key,name varchar(20));
\dt pgtest1.*
(2)查看当前数据库有哪些表
\dt
(3)查看表属于哪个schema
使用 information_schema.tables
SELECT table_schema, table_name FROM information_schema.tables WHERE table_name = 't1';
使用 pg_catalog.pg_tables
SELECT schemaname AS schema_name, tablename AS table_name FROM pg_catalog.pg_tables WHERE tablename = 't1';
使用 pg_catalog.pg_tables(模糊匹配)
SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tablename LIKE '%t1%';
(4)查看表属于哪个用户
\dt
(5)查看表结构
\d t1;
\d+ t1;
(6)插入数据
INSERT INTO t1 (id, name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David'),
(5, 'Eve'),
(6, 'Frank'),
(7, 'Grace'),
(8, 'Henry'),
(9, 'Ivy'),
(10, 'Jack');
(7)查询数据
select * from t1;
(8)删除数据
delete from t1 where id > 5;
select * from t1;
(9)删除表
select * from t4
DROP TABLE t4;
DROP TABLE IF EXISTS t4;
(9)清空表
select * from t5;
TRUNCATE t5;
清空表数据并重置自增 ID
TRUNCATE t5 RESTART IDENTITY;
(10)查询表有哪些字段
和查看表结构一样
\d t1;
\d+ t1;
(11)添加字段
alter table [表名] add column [字段名] [类型];
alter table t1 add column test1_column int;
(12)修改字段
alter table [表名] rename column [旧字段名] to [新字段名];
alter table t1 rename column test1_column to test1_column_change;
(13)删除字段
alter table [表名] drop column [字段名];
alter table t1 drop column test1_column_change;
四、其他
1、使用客户端进行连接
2、查看pg版本
pg_ctl --version
3、查询连接信息
select * from pg_stat_activity
4、查看连接数
SELECT datname, numbackends FROM pg_stat_database;
select count(*) from pg_stat_activity where datname='mydb1';
5、explain
EXPLAIN select * from t1;