进阶数据库系列(三):PostgreSQL 常用管理命令

前面介绍了 PostgreSQL 基础概念及安装部署目录结构与配置文件 postgresql.conf 相关的知识点,今天我将详细的为大家介绍 PostgreSQL 常用管理命令 相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!

登录命令


   
   
  1. #连接指定服务器上的数据库
  2. psql -h IP -p 端口 -U 用户名 -d 数据库名 -W

psql是PostgreSQL的一个命令行交互式客户端工具,它具有非常丰富的功能,类似于Oracle的命令行工具sqlplus。


   
   
  1. -h #数据库所在的IP地址
  2. -p #(默认 5432)数据库的监听端口
  3. -U #用户名
  4. -d #数据库名称
常用命令说明

   
   
  1. \? #所有命令帮助
  2. \l #列出所有数据库
  3. \d #列出数据库中所有表
  4. \dt #列出数据库中所有表
  5. \d [table_name] #显示指定表的结构
  6. \di #列出数据库中所有 index
  7. \dv #列出数据库中所有 view
  8. \h #sql命令帮助
  9. \q #退出连接
  10. \c [database_name] #切换到指定的数据库
  11. \c #显示当前数据库名称和用户
  12. \conninfo #显示客户端的连接信息
  13. \du #显示所有用户
  14. \dn #显示数据库中的schema
  15. \encoding #显示字符集
  16. select version(); #显示版本信息
  17. \i testdb.sql #执行sql文件
  18. \x #扩展展示结果信息,相当于MySQL的\G
  19. \o /tmp/test.txt #将下一条sql执行结果导入文件中

用户管理

创建账号
创建用户

   
   
  1. create user 用户名 password  '密码';
  2. #设置只读权限
  3. alter user 用户名 set default_transaction_read_only = on;
  4. #设置可操作的数据库
  5. grant all on database 数据库名 to 用户名;
  6. #授权可操作的模式和权限
  7. -- 授权
  8. grant  select on all tables in schema public to 用户名;
  9. -- 授权
  10. GRANT ALL ON TABLE public.user TO mydata;
  11. GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.user TO mydata_dml;
  12. GRANT SELECT ON TABLE public.user TO mydata_qry;
删除账号

   
   
  1. #撤回在public模式下的权限
  2. revoke  select on all tables in schema public from 用户名;
  3. #撤回在information_schema模式下的权限
  4. revoke  select on all tables in schema information_schema from 用户名;
  5. #撤回在pg_catalog模式下的权限
  6. revoke  select on all tables in schema pg_catalog from 用户名;
  7. #撤回对数据库的操作权限
  8. revoke all on database 数据库名 from 用户名;
  9. #删除用户
  10. drop user 用户名;

更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

权限管理

授权

   
   
  1. #设置只读权限
  2. alter user 用户名 set default_transaction_read_only = on;
  3. #设置可操作的数据库
  4. grant all on database 数据库名 to 用户名;
  5. #设置可操作的模式和权限
  6. grant  select,insert,update, delete on all tables in schema public to 用户名;
撤回权限

   
   
  1. #撤回在public模式下的权限
  2. revoke  select on all tables in schema public from 用户名;
  3. #撤回在information_schema模式下的权限
  4. revoke  select on all tables in schema information_schema from 用户名;
  5. #撤回在pg_catalog模式下的权限
  6. revoke  select on all tables in schema pg_catalog from 用户名;
  7. #撤回对数据库的操作权限
  8. revoke all on database 数据库名 from 用户名;

模式 Schema

PostgreSQL 模式SCHEMA 可以看着是一个表的集合。一个模式可以包含视图、索引、数据类型、函数和操作符等。

相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。

使用模式的优势:

  • 允许多个用户使用一个数据库并且不会互相干扰。

  • 将数据库对象组织成逻辑组以便更容易管理。

  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

模式类似于操作系统层的目录,但是模式不能嵌套。更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

语法

我们可以使用 CREATE SCHEMA 语句来创建模式,语法格式如下:


   
   
  1. CREATE SCHEMA myschema.mytable (
  2. ...
  3. );
创建和当前用户同名模式(schema)

注意:用户名与 schema 同名,且用户具有访问改 schema 的权限,用户连入数据库时,默认即为当前 schema。

create schema AUTHORIZATION CURRENT_USER;
   
   

自定义创建模式(schema)

create schema 模式名称;
   
   

注意:如果不创建scheme,并且语句中不写scheme,则默认scheme使用内置的public。

查看数据库下的所有(schema)

select * from information_schema.schemata;
   
   

数据库管理

查询所有数据库
select datname from pg_database;
   
   
创建数据库
create database 数据库名 owner 所属用户 encoding UTF8;
   
   

注意:创建完数据库,需要切换到数据库下,创建和当前用户同名scheme,删除数据库后schema也会一并删除:


   
   
  1. -- 重新登陆到新数据库下,执行如下语句
  2. create schema AUTHORIZATION CURRENT_USER;
删除数据库
drop database 数据库名;
   
   

注意:删库前需要关闭所有会话,不然会提示:


   
   
  1. ERROR:  database  "mydb" is being accessed by other users
  2. DETAIL:  There are  8 other sessions using the database.
关闭数据库所有会话

   
   
  1. SELECT pg_terminate_backend(pg_stat_activity.pid)
  2. FROM pg_stat_activity
  3. WHERE datname= 'mydb' AND pid<>pg_backend_pid();

更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

表管理

建表模板语句

   
   
  1. create table  "t_user" (
  2.   "id" bigserial not null,
  3.   "username" varchar ( 64) not null,
  4.   "password" varchar ( 64) not null,
  5.   "create_time" timestamp not null  default current_timestamp,
  6.   "update_time" timestamp not null  default current_timestamp,
  7.  constraint t_user_pk primary key (id)
  8. );
  9. comment on column  "t_user". "id" is  '主键';
  10. comment on column  "t_user". "username" is  '用户名';
  11. comment on column  "t_user". "password" is  '密码';
  12. comment on column  "t_user". "create_time" is  '创建时间';
  13. comment on column  "t_user". "update_time" is  '更新时间';
查询schema中所有表
select table_name from information_schema.tables where table_schema = 'myuser';
   
   
创建表

   
   
  1. CREATE TABLE public.t_user (
  2.    "id" BIGSERIAL NOT NULL,
  3.    "username" VARCHAR( 64) NOT NULL,
  4.    "password" VARCHAR( 64) NOT NULL,
  5.    "create_time" TIMESTAMP( 0default CURRENT_TIMESTAMP not null,
  6.    "update_time" TIMESTAMP( 0default CURRENT_TIMESTAMP not null
  7. );
  8. -- 注释
  9. COMMENT ON TABLE public.t_user IS  '用户表';
  10. COMMENT ON COLUMN public.t_user.id IS  '主键';
  11. COMMENT ON COLUMN public.t_user.username IS  '用户名';
  12. COMMENT ON COLUMN public.t_user.password IS  '密码';
  13. COMMENT ON COLUMN public.t_user.create_time IS  '创建时间';
  14. COMMENT ON COLUMN public.t_user.update_time IS  '更新时间';
  15. -- 创建自增序列
  16. alter sequence  "t_user_ID_seq" restart with  1 increment by  1;
  17. -- 创建主键序列
  18. drop index  if exists  "t_user_pkey";
  19. alter table  "t_user" add constraint  "t_user_pkey" primary key ( "ID");
根据已有表结构创建表
create table if not exists 新表 (like 旧表 including indexes including comments including defaults);
   
   
删除表
drop table if exists "t_template" cascade;
   
   
查询注释

   
   
  1. SELECT
  2. a.attname as  "字段名",
  3. col_description(a.attrelid,a.attnum) as  "注释",
  4. concat_ws( '',t.typname,SUBSTRING(format_type(a.atttypid,a.atttypmod) from  '(.*)')) as  "字段类型"
  5. FROM
  6. pg_class as c,
  7. pg_attribute as a,
  8. pg_type as t
  9. WHERE
  10. c.relname =  't_batch_task'
  11. and a.atttypid = t.oid
  12. and a.attrelid = c.oid
  13. and a.attnum> 0;

索引管理

创建索引

   
   
  1. drop index  if exists t_user_username;
  2. create index t_user_username on t_user (username);
创建唯一索引

   
   
  1. drop index  if exists t_user_username;
  2. create index t_user_username on t_user (username);
查看索引
\d t_user
   
   

查询SQL

注意:PostgreSQL中的字段大小写敏感,而且只认小写字母,查询时需注意。其他与基本sql大致相同。

to_timestamp() 字符串转时间

   
   
  1. select * from t_user
  2. where create_time >= to_timestamp( '2023-01-01 00:00:00''yyyy-mm-dd hh24:MI:SS');
to_char 时间转字符串
select to_char(create_time, 'yyyy-mm-dd hh24:MI:SS') from t_user;
   
   
时间加减

   
   
  1. -- 当前时间加一天
  2. SELECT NOW()::TIMESTAMP +  '1 day';
  3. SELECT NOW() + INTERVAL  '1 DAY';
  4. SELECT now()::timestamp + ( '1' ||  ' day')::interval
  5. -- 当前时间减一天
  6. SELECT NOW()::TIMESTAMP +  '-1 day';
  7. SELECT NOW() - INTERVAL  '1 DAY';
  8. SELECT now()::timestamp - ( '1' ||  ' day')::interval
  9. -- 加 111111
  10. select NOW()::timestamp +  '1 year 1 month 1 day 1 hour 1 min 1 sec';
like 模糊查询
SELECT * FROM 表名 WHERE 字段 LIKE ('%关键字%');
   
   
substring字符串截取

   
   
  1. --从第一个位置开始截取,截取 4个字符,返回结果:Post
  2. SELECT SUBSTRING ( 'PostgreSQL'14);
  3. -- 从第 8个位置开始截取,截取到最后一个字符,返回结果:SQL
  4. SELECT SUBSTRING ( 'PostgreSQL'8);
  5. --正则表达式截取,截取 'gre'字符串
  6. SELECT SUBSTRING ( 'PostgreSQL''gre');

更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

执行sql脚本

方式一:先登录再执行

\i testdb.sql
   
   

方式二:通过psql执行

psql -d testdb -U postgres -f /pathA/xxx.sql
   
   

导出数据到SQL文件

pg_dump -h localhost -p 5432 -U postgres --column-inserts -t table_name -f save_sql.sql database_name
   
   

   
   
  1. --column-inserts #以带有列名的  `INSERT` 命令形式转储数据。
  2. -t #只转储指定名称的表。
  3. -f #指定输出文件或目录名。

JDBC 连接串常用参数

  • PostgreSQL JDBC 官方驱动下载地址:https://jdbc.postgresql.org/download/

  • PostgreSQL JDBC 官方参数说明文档:https://jdbc.postgresql.org/documentation/use/

  • 驱动类:driver-class-name=org.postgresql.Driver

单机 PostgreSQL 连接串

   
   
  1. url: jdbc:postgresql: //10.20.1.231:5432/postgres?
  2. binaryTransfer= false&forceBinary= false&reWriteBatchedInserts= true
  • binaryTransfer=false:控制是否使用二进制协议传输数据,false 表示不适用,默认为 true

  • forceBinary=false:控制是否将非 ASCII 字符串强制转换为二进制格式,false 表示不强制转换,默认为 true

  • reWriteBatchedInserts=true:控制是否将批量插入语句转换成更高效的形式,true 表示转换,默认为 false

例如:


   
   
  1. insert into foo (col1, col2, col3) values( 1, 2, 3);
  2. insert into foo (col1, col2, col3) values( 4, 5, 6);

会转换成:

insert into foo (col1, col2, col3) values(1,2,3), (4,5,6);
   
   

如果使用正确,reWriteBatchedInserts 会提升批量 insert 性能 2-3 倍。db6f0c509f80bad93943eeb0c3d4ba90.png

集群PostgreSQL 连接串

集群PostgreSQL,连接串如下:


   
   
  1. url: jdbc:postgresql: //10.20.1.231:5432/postgres?
  2. binaryTransfer= false&forceBinary= false&reWriteBatchedInserts= true&targetServerType=master&loadBalanceHosts= true
  • 单机 PostgreSQL 连接串的所有参数。

  • targetServerType=master:只允许连接到具有所需状态的服务器,可选值有:

    • any:默认,表示连接到任何一个可用的数据库服务器,不区分主从数据库;

    • master:表示连接到主数据库,可读写;

    • slave:表示连接到从数据库,可读,不可写;

    • 其他不常用值:primary, master, slave, secondary, preferSlave, preferSecondary and preferPrimary。

  • loadBalanceHosts=true:控制是否启用主从模式下的负载均衡,true 表示启用,开启后依序选择一个 ip1:port 进行连接,默认为 false

更多关于大数据 PostgreSQL 系列的学习文章,请参阅:PostgreSQL 数据库,本系列持续更新中。

参考文章:https://blog.csdn.net/qq_33204709/article/

details/128772173  https://blog.csdn.net/qq_33204709

/article/details/130622750

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值