PostgreSQL

1.什么是 PostgreSQL?

PostgreSQL 是一个开源的对象关系型数据库管理系统,以其强大的功能、稳定性和扩展性著称。它支持标准 SQL 以及各种高级特性,如事务处理、外键、触发器、视图和多版本并发控制(MVCC)。PostgreSQL 的设计目标是提供高性能和可靠性,使其成为处理大规模数据和复杂查询的理想选择。

2.PostgreSQL与MySQL的比较

2.1 PostgreSQL相对于MySQL的优势
  • 在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨。
  • 对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强。
  • PG主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
  • PG的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小
  • PostgreSQL支持)SON和其他NoSQL功能华如本机XML支持和使用HSTORE的键值对。它还支持索引SON数据以加快访问速度,特别是10版本)SONB更是强大.
  • PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PeosgeSQL数据库不会被其它公司控制。相反,MySQL现在主要是被Oracle公司控制。
2.2 MySQL相对于PG的优势
  • innodb的基于回滚段实现的MVCc机制,相对PG新老数据一起存放的基于XID的MVCc机制,是占优的。新老数据一起存放,需要定时触发VACUM,会带来多余的O和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀。
  • MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束。
  • MyQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作。
  • MySQL相对于PG在国内的流行度更高,PG在国内显得就有些落寞了。
  • MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。
2.3 总结

从应用场景来说,PG更加适合严格的企业应用场景(比如金融、电信、ERP、CRM),但不仅仅限制于此,PostgreSQ.的ison , jsonb, hstore等数据格式,特别适用于一些大数据格式的分析;而MySsQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google 、facebook、alilaba),当然现在MySQL的在inodb引擎的大力发展,功能表现良好。

3 数据库安装

3.1widows版本安装
3.1.1 数据库下载

通过以下链接,下载大版本为12的PostgreSQL数据库:

PostgreSQL12下载

3.1,2 数据库安装

说明:

安装目录需是空目录,建议不要安装在C盘中

安装路径中不要有中文,否则会报错

下载安装包之后,双击exe文件,进入数据库安装流程。
请添加图片描述
Step1:选择安装路径
请添加图片描述
Step2:设置数据的存储地址

直接使用默认的即可
请添加图片描述请添加图片描述
Step3:设置数据库密码

数据库的用户名默认是postgres,自己设置数据库的密码并谨记密码。
请添加图片描述
Step4:设置监听端口

监听端口号默认是5432,若此端口被占用,可修改为别的。
请添加图片描述
Step5:设置locale

直接使用默认值
请添加图片描述
Step6:检测配置信息,安装数据库
请添加图片描述
请添加图片描述

Step7:取消附加软件安装

数据库安装完毕后,取消附加软件安装。
请添加图片描述
若未取消勾选,点击了finish,可在下一步点【取消】按钮。
请添加图片描述
至此,数据安装已完毕。

为了配合开发者工具使用,需要修改postgresql的配置参数,下面介绍配置参数的调整。

3.1.3 数据库参数调整

1)允许其他IP连接数据库

打开postgresql的数据存储目录(默认为数据库安装目录下的data文件夹),找到pg_hba.conf文件,默认情况下,只有127.0.0.1能连接数据库,若需要开放给其他IP连接,可以在pg_hba.conf文件最后添加一行:
host all all 0.0.0.0/0 md5请添加图片描述
2)调整最大连接数

在数据库安装目录中找到postgresql.conf文件,修改文件中的max_connections、wal_keep_segments两个参数:

将最大连接数max_connections调整为1000以上

找到wal_keep_segments,取消注释(即去掉#),修改wal的保留个数wal_keep_segments=3
请添加图片描述请添加图片描述

3.1.4 重启postgresql服务

配置修改完成后,打开开始菜单,输入“服务”,打开服务管理界面,搜索postgres,找到数据库服务,重启该服务。
请添加图片描述

注意:重启服务后,在其他电脑若还是连不上postgresql数据库。则查看系统防火墙,把防火墙关闭了。(也可以配置应用允许通过防火墙)

3.5 postgresql命令行及工具

请添加图片描述
pgAdmin 4工具
请添加图片描述
postgresql命令行
请添加图片描述
至此,postgresql数据库安装及参数配置已全部完成。

3.2Linux版本安装
3.2.1下载安装

访问官网下载地址
postgreSQL 12下载
请添加图片描述
选择相应的版本和平台,这里为适配金碟苍穹开发所以选择12:
请添加图片描述

#Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
#Install PostgreSQL:
sudo yum install -y postgresql12-server
#Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
sudo systemctl enable postgresql-12
sudo systemctl start postgresql-12

调入yum源

sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

安装PostgreSQL服务

sudo yum install -y postgresql12-server

初始化数据库

sudo /usr/pgsql-12/bin/postgresql-12-setup initdb

启动PostgreSQL服务

#设置PostgreSQL服务为开机启动
sudo systemctl enable postgresql-12
#启动PostgreSQL服务
sudo systemctl start postgresql-12

(2)修改postgres账号密码
PostgreSQL安装成功之后,会默认创建一个名为postgres的Linux用户,初始化数据库后,会有名为postgres的数据库,来存储数据库的基础信息,例如用户信息等等,相当于MySQL中默认的名为mysql数据库。
postgres数据库中会初始化一名超级用户postgres
为了方便我们使用postgres账号进行管理。我们可以修改该账号的密码

进入PostgreSQL命令行
通过su命令切换linux用户为postgres会自动进入命令行

su postgres

启动SQL Shell

psql

修改密码

alter user postgres with password 'NewPassword';

注意:这里要出现ALTER ROLE才算修改成功
请添加图片描述

(3)配置远程访问
开放端口

sudo firewall-cmd --add-port=5432/tcp --permanent
sudo firewall-cmd --reload

修改IP绑定

#修改配置文件
vi /var/lib/pgsql/12/data/postgresql.conf

#将监听地址修改为*
#默认listen_addresses配置是注释掉的,所以可以直接在配置文件开头加入该行 
listen_addresses = '*'

允许所以IP访问

#修改配置文件
vi /var/lib/pgsql/12/data/pg_hba.conf

#在问价尾部加入
host all all 0.0.0.0/0 md5

重启PostgreSQL服务

#重启PostgreSQL服务
sudo systemctl restart postgresql-12

(4)远程访问Prostgre数据库
请添加图片描述

4.PostgreSQL的基本使用

4.1 登录
#psql -h服务器-U用户名-d数据库-p端口地址//-U是大写
psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432


$ psql(连接致据库,默认用户和数据库都是postgres)
#相当于系统用户postgres以同名数据库用户的身份,登录数据库,这是不用输入密码的。如果一切正常,系统提示符会变为"postgrest",表示这时已经进入了数据库控制台。

#指定登录后默认指向数据库为mydb
psql -d mydb;
4.2 数据库操作
#创建数据库
CREATE DATABASE mydb;

#查看所有数据库
\l

#切换当前数据库
\c mydb

#删除数据岸
drop database <dbname>;
4.3 数据库表操作

创建表格时每列都必须使用数据类型。PotgreSQL中主要有三类数据类型;

-数值数据类型
字符串数据类型
日期/时间数据类型

数值
常见数值类型包括:

名字存储长度描述范围
smallint2字节小范围整数-32768到 +32767
integer4字节常用的整数-2147483648 到 +2147483647
bigint8字节大范围整数–9223372036854775808 到 +9223372036854775807
decimal可变长用户指定的精度,精确小数点前131072位;小数点后16383位
numeric可变长用户指定的精度,精确小数点前131072位;小数点后16383位
real4字节可变精度,不精确6位十进制数字精度
double8字节可变精度,不精确15位十进制数字精度

字符串字符串类型包括

  • char(size),character(size):固定长度字符串,size规定了需存储的字符数,由右边的空格补齐;
  • varchar(size),character varying(size):可变长度字符串,size规定了需存储的字符数;
  • text:可变长度字符串。

日期/时间
表示日期或时间的数据类型有:

  • timestamp:日期和时间;
  • date:日期,无时间;
  • time:时间;

其他数据类型类型还有布尔值 boolean (true或 false),货币数额 money和几何数据等。

#创建表
CREATETABLE test(id int , body varchar(100));

#在表中插入数据
insert into test(id , body ) walues(1 , " hello,postgresql');

#查看当前数据库下所有表
\d

#查看表结构,相当于desc
\d test

PostgreSQL使用序列来标识字段的自增长,数据类型有smallserial、serial 和 bigserial,这些属性类似于MySQL数据库支持的 AUTO_INCREMENT属性。
SMALLSERIAL、SERIAL和 BIGSERIAL范围:

伪类型存储大小范围
SMALLSERIAL2字节1 到 32,767
SERIAL4字节1 到 2,147,483,647
BIGSERIAL8字节1 到 922,337,2036,854,775,807

示例

#创建表
create table(
	id serial primary key,
	name varchar(255)
);

#插入数据
insert into test(name) values('jack');

#删除数据
delete from test where id = '1';

#修改数据
update test set name='mark' where id='1';

#查询数据
select * from test;
4.4 Schema

PostgreSQL模式(SCHEMA)可以看着是一个表的集合。
一个模式可以包含视图、索引、数据类型、函数和操作符等。
相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1和myschema都可以包含名为mytable的表。
使用模式的优势:

  • 允许多个用户使用一个数据库并且不会互相干扰。
  • 将数据库对象组织成逻辑组以便更容易管理。
  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

模式类似于操作系统层的目录,但是模式不能嵌套。

#创建schema:
create schema myschema;

create table myschema.company (
	ID INT				NOT NULL,
	NANE VARCHAR(20)	NOT NULL,
	AGE INT				NOT NULL,
	ADDRESS CHAR(25),
	SALARY DECIMAL(18,2),
	PRIMARY KEY (ID)
);
	
#删副除schema:
drop schema myschema;

#删除一个模式以及其中包含的所有对象:
DROP SCHEMA myschema CASCADE;
4.5 如何备份PostgreSQL数据库

如果您在生产环境中使用PostgreSQL,请务必采取预防措施以确保用户的数据不会丢失。
单数据库
PostgreSQL提供了pg_dump实用程序来简化备份单个数据库的过程。必须以对要备份的数据库具有读取权限的用户身份运行此命令。
postgres用户身份登录:

sudo su - postgres

通过运行以下命令将数据库的内容转储到文件中。替换dbname为要备份的数据库的名称。

pg_dump dbname > dbname.bak

生成的备份文件dbname.bak可以使用scp传输到另一台主机,也可以存储在本地以供以后使用。
要演示恢复丢失的数据,请删除示例数据库并在其位置创建一个空数据库:
使用psql恢复数据库

psql test < dbname.bak

备份格式有几种选择:
*.bak:压缩二进制格式
*.sql:明文转储
*.tar:tarball

注意:默认情况下,PostgreSQ将忽略备份过程中发生的任何错误,这可能导致备份不完整。要防止这种情况,您可以使用-1选项运行p_dump命令,这会将整个备份过程视为单个事务,这将在发生错误时阻止部分备份。

所有数据库
由于pg_dump一次只创建一个数据库的备份,因此它不会存储有关数据库角色或其他群集范围配置的信息。要存储此信息并同时备份所有数据库,可以使用pg_dumpall。
创建备份文件:

pg_dumpall > pg_backup.bak

从备份还原所有数据库:

psql -f pg_backup.bak postgres
#备份数据库
$ pg_dump -U postgres -f /tmp/postgres.sql postgres (导出postgres数据库保存postgres.sql)
$ pg_dump -U postgres -f /tmp/postgres.sql -t test postgres (导出postgres数据库中表test的数据)
$ pg_dump -U postgres -F t -f /tmp/postgres.tar postgres (导出postgres数据库以tar形式压缩保存为postgres.tar)

#恢复数据库
$ psql -U postgres -f /tmp/postgres.sql bk01(恢复postgres.sql数据到bk01数据库)
#pg_restore -- 从pg_dump创建的备份文件中恢复PostgreSQL数据库,用于恢复由pg_dump转储的任何非纯文本格式中的PostgreSQL数据库;
$ pg_restore -U postgres -d bk01/tmp/postgres.tar(恢复postgres.tar数据到bk01数据库)
4.6用户操作
#创建用户并设置密码
CREATE USER ' username'  WITH PASSwORD 'passweord';
CREATE USER test WITH PASSNORD 'test';

#修改用户密码
$ ALTER USER 'username' WITH PASSwORD 'password';


#数据库授权,赋予指定账户指定数据库所有权限
$GRANT ALL PRIVILEGES ON DATABASE 'dbname' TO 'username';
#将数据库 mydb 权限授权于 test
GRANT ALL PRIVILEGES ON DATABASE mydb TO test;
#但此时用户还是没有读写权限,需要继续授权表
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO xxx;
#注意,该 sql 语句必须在所要操作的数据库里执行


#移除指定账户指定数据库所有权限,在那个数据库授权就在那个数据库执行移除权限指令
REVOKE ALL PRIVILEGES ON DATABASE mydb from test;
#移除指定账户指定表所有权限,,在那个表授权就在那个表执行移除权限指令
revoke all privileges on all tables in schema public from test;
#删除用户,需先移除数据库和表的所有授权才能删除
drop user test
4.7 PostgreSQL角色管理

在PostgreSQl里没有区分用户和角色的概念,"CREATE USER” 为 CREATE ROLE”的别名,这两个命令几乎是完全相同的,唯一的区别是CREATE USE"命令创建的用户默认带有LIOGIN属性,而"CREATE ROLE”命令创建的用户默认不带LOGIN属性

创建david 角色和sandy 用户

postgres=# CREATE ROLE david;			//默认不带LOGIN属性
CREATE ROLE
postgres=# CREATE USER sandy;		//默认具有LOGIN属性
CREATE ROLE
postgres=# \du;
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 david     | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 sandy     |                                                            | {}

postgres=# 
postgres=# SELECT rolname from pg_roles;
          rolname          
---------------------------
 pg_monitor
 pg_read_all_settings
 pg_read_all_stats
 pg_stat_scan_tables
 pg_read_server_files
 pg_write_server_files
 pg_execute_server_program
 pg_signal_backend
 postgres
 david
 sandy
(11 rows)

postgres=# SELECT usename from pg_user;			//角色david 创建时没有分配login权限,所以没有创建用户
 usename  
----------
 postgres
 sandy
(2 rows)

postgres=# 

角色属性

属性说明
login只有具有LOGIN属性的角色可以用做数据库连接的初始角色名。
superuser数据库超级用户
createdb创建数据库权限
createrole允许其创建或删除其他普通的用户角色(超级用户除外)
replication做流复制的时候用到的一个用户属性,一般单独设定。
password在登录时要求指定密码时才会起作用,比如 md5 或者 password 模式,跟客户端的连接认证方式有关
inherit用户组对组员的一个继承标志,成员可以继承用户组的权限特性

创建用户时赋予角色属性
如果要在创建角色时就赋予角色一些属性,可以使用下面的方法。首先切换到 postgres 用户。
创建角色 bella 并赋予其 CREATEDB 的权限。

postgres=# CREATE ROLE bella CREATEDB;
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 bella     | Create DB, Cannot login                                    | {}
 david     | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 sandy     |                                                            | {}

postgres=# 

创建角色renee并赋予其创建数据库及带有密码登录的属性。

postgres=# CREATE ROLE renee CREATEDB PASSWORD 'abc123' LOGIN;
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 bella     | Create DB, Cannot login                                    | {}
 david     | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 renee     | Create DB                                                  | {}
 sandy     |                                                            | {}

postgres=# 

测试renee角色

bash-4.2$ psql -U renee -d mydb;
could not change directory to "/root": 权限不够
Password for user renee: 	//需输入登录密码
psql (12.20)
Type "help" for help.

mydb=> 

给已存在用户授予各种权限
赋予登录权限

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 bella     | Create DB, Cannot login                                    | {}		//无登录权限
 david     | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 renee     | Create DB                                                  | {}
 sandy     |                                                            | {}

postgres=# ALTER ROLE bella WITH LOGIN;		//授予登录权限
ALTER ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 bella     | Create DB                                                  | {}		//拥有登录权限
 david     | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 renee     | Create DB                                                  | {}
 sandy     |                                                            | {}

postgres=# 

赋予 renee 创建角色的权限

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 bella     | Create DB                                                  | {}
 david     | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 renee     | Create DB                                                  | {}		//无创建角色的权限
 sandy     |                                                            | {}

postgres=# ALTER ROLE renee WITH CREATEROLE;		//授予创建角色的权限
ALTER ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 bella     | Create DB                                                  | {}
 david     | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 renee     | Create role, Create DB                                     | {}		//拥有创建角色的权限
 sandy     |                                                            | {}

postgres=# 
4.8 控制台常用命令总结
\password命令 (设置密码)
\q命令(退出)
\h:查看sQL命令的解释,比如\h select。
\?:查看psql命令列表。
\l:列出所有数据库。
\c [database_name]:连接其他数据库。
\d:列出当前薮据库的所有表格。
\d [table_name]:列出某一张表格的结构。
\du:列出所有用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值