百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

第五章 Linux常用服务介绍-5.4 postgresql数据库服务

sinye56 2024-11-18 16:41 2 浏览 0 评论

数据库介绍

数据库,其实是很复杂的,光讲数据库,就可以单独写一本书,记得大学里,计算机专业就有一门数据库的课程需要学。我在这里,只是简单介绍,让大家对数据库有个概念,有一个初步的入门。

针对初学者来讲,什么是数据库,怎样理解数据库呢,这里先举一个不一定完全恰当的例子:每个人家里都会有冰箱,冰箱是用来干什么的?冰箱是用来存放食物的地方。同样的,数据库是存放数据的地方,有了数据库后,在我们需要的时候,就可以查找和使用这些数据。你可能会问了:我的数据就存放在自己电脑的excel表里就可以了,为什么还要搞个数据库呢?这是因为数据库比excel有更多的优势,数据库可以存放大量的数据,可以是各种各样的数据,允许很多人同时使用里面的数据。再举个例子,Excel好比是一个移动硬盘,你使用了这个移动硬盘其他人就用不了了。数据库好比是网盘,很多人可以同时访问里面里的数据,而且网盘比移动硬盘能放更多的数据,更多的类型,Excel文件本身,也可以放到网盘里面。当然,数据库还有很多其他的优势,这里就不一一举例了。

数据库也有很多种类,不同的使用场景,就需要选用不一样的数据库,这里我们重点学习使用最广泛的关系型数据库,一般学习数据库,都是从关系型数据库开始。关系数据库是由多个表组成的。如果你用过Excel,就会知道Excel是一张一张的二维表。每个表都是由行和列组成的。同样的,关系数据库里存放的也是一张一张的表,只不过各个表之间是有联系的。所以,简单来说:

关系数据库=多张表+各表之间的关系。

那么,我们通过什么工具来操作数据库里的数据呢?这个工具就是SQL。

SQL是为操作数据库而开发的一种语言,它可以对数据库里的表进行操作,比如插入数据,修改数据,查找数据,更新数据等。举个例子来说,把数据库比如一碗米饭,里面放的米是数据。现在我们要吃碗里的米饭,怎么取出碗里的米饭呢?这时候我们拿一双筷子,用筷子操作碗里的米饭。这里的筷子就是SQL,用来操作数据库里的数据。

Linux下最常用的关系型数据库,就是PostgreSQL 和MySQL。

MySQL是目前最受欢迎的开源数据库,PostgreSQL则是我认为最先进的开源数据库。MySQL是C/C++混合开发,PostgreSQL则是完全的C语言开发。另外MySQL现在是让人生厌的Oracle控制的,尽管MySQL现在依然是开源免费的,可是在Oracle手里总是会让人担心。PostgreSQL则是诞生于加州伯克利,伯克利还是对计算机技术有过突出贡献的高校,PostgreSQL、FreeBSD都是非常有代表性的,这也是我再这里选择PostgreSQL进行介绍的原因。

其实作为初学者,学习PostgreSQL 或MySQL,并没有太大的差别,一个学好了,使用另一个也基本就会了。

安装PostgreSQL数据库

PostgreSQL 是一个开源的,多用途的关系型数据库管理系统。它有很多高级特性,可以允许你构建容错的环境或者复杂的应用。在这篇指南中,我们将会讲解如何在 Ubuntu 20.04 上安装 PostgreSQL 数据库服务器,并且探索 PostgreSQL 数据库管理的基础操作。

(1) 前提条件

想要安装软件包,以 root 或者其他有 sudo 权限的用户身份登录。

(2) 在 Ubuntu 上安装 PostgreSQL

在写这篇文章的时候,PostgreSQL 在 Ubuntu 官方软件源中的最新可用版本为 10.4。运行下面的命令,在 Ubuntu 上安装 PostgreSQL:

#sudo apt update
#sudo apt install postgresql postgresql-contrib

我们同时安装 PostgreSQL contrib 软件包,它可以提供 PostgreSQL 数据库系统的一些额外特性。一旦安装完成, PostgreSQL 服务将会自动启动,同时会自动创建一个用户组postgres,并且在这个用户组底下创建一个Linux用户postgres。我们可以使用psql工具来尝试连接 PostgreSQL 数据库,并且打印它的版本来验证安装是否成功:

#sudo -u postgres psql -c "SELECT version();"

上面语句表示用postgres用户来调用psql工具,让psql来执行查看版本并打印出版本信息

输出:

version
---------------------------------------------------------------------------------------
PostgreSQL 14.9 (Ubuntu 14.9-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit
(1 row)

可以看到,安装了 PostgreSQL 14.19的版本,表示安装是成功的,接下来,你可以开始使用它了。

创建PostgreSQL用户和数据库

在使用数据库之前,我们先要创建用户和数据库,当然,刚才提到,安装数据库的时候,已经默认创建了一个postgres的用户,我们可以现用这个用户,当前还可以创建其他用户,并且使用新创建的用户来访问数据库,也是可以的。另外解释一下,postgre是一个数据库软件服务,不过但它里面是可以创建和管理多个数据库的,每个数据库都可以独立赋予不用用户权限。

默认情况下,postgre只开放本地连接,就是本机的用户才能访问数据库,远程通过网络没有权限访问,如要远程访问,需要开放相关权限的设定,我们这里先讲解本地访问,至于远程访问,下个章节在专门介绍。为了以postgres用户身份登录 PostgreSQL 服务器,首先切换当前用户,变更帐号为 postgres。

sudo su - postgres

这时候,用户已经改变和postgres这个用户了,然后使用psql工具,进入postgreSQL的shell,

psql

这时候,进入了postgre的shell,不是Linux 系统的shell了,在postgre shell底下,只能执行postgre数据相关的命令。如果你再去执行一个Linux shell命令,是没有用的。

从这里开始,你可以与 PostgreSQL 数据库进行交互了。如果要退出 PostgreSQL Shell,返回Linux shell,可以输入\q退出:

\q

刚才上面是现切换到postgres用户,然后执行psq进入postgre shell, 不过也可以通过下面一条命令,直接进入到postgres 的shell:

sudo -u postgres psql

通常,postgres用户仅仅在本地被使用。

登录成功后,命令就会在postgres=# 下运行了,在这里就可以输入SQL命令来操作数据库了。只要进入了postgre数据库shell(postgres=#)之后,就可以使用SQL语句进行操作,但使用SQL语句时,一定不能漏掉末尾的分号,它代表语句结束,开始执行。

你可以输入 \q 以退出,输入 \? 获取帮助。

刚才说默认安装后,默认给系统添加了postgres用户, 其实另外还默认创建一个名为postgres的数据库和一个名为postgres的数据库用户。就是说,初次安装成功后,会自动添加一个名为postgres的系统用户,密码随机。并自动生成一个名为postgres的数据库,用户名为postgres,密码随机。

#我们先来修改postgres 的密码, 以下内容内容都是在 postgres=# (即postgre的shell下)下输入

ALTER USER postgres WITH PASSWORD '123456'; # 密码设置为123455,有分号才会执行命令

这里修改的是postgres数据库用户的密码,不是系统postgres用户的密码,这个要分清,不要混淆系统postgres和数据库postgres两个用户

\q #退出客户端

返回Linux系统shell后,我们可以给系统的postgres用户修改密码。

#exit //退出到标准用户下
#sudo //进入超级用户权限
#passwd postgres //修改系统postgres用户密码

这样,两个postgres用户的密码都修改了。

在下面的例子中,我们再来创建一个新的名称为john的角色,一个名称为johndb的数据库,并且授予数据库上的权限:

创建一个新的 PostgreSQL 角色,下面语句表示切换到postgres系统用户,并通过执行createuser创建一个postgres的用户john。

sudo su - postgres -c "createuser john"

创建一个新的 PostgreSQL 数据库:下面语句表示切换到postgres系统用户,并通过执行createdb创建一个postgres的数据库johndb。

sudo su - postgres -c "createdb johndb"

createuser 命令和createdb 命令都是PostGRE数据库的专有命令,用于创建用户和数据库。是需要再系统shell命令行下执行的,而不是在psql shell下执行。

想要授权用户操作数据库,则需要连接到 PostgreSQL shell:

sudo -u postgres psql

并且再postgresql shell下运行下面的 query:

grant all privileges on database johndb to john;

登录PostgreSQL数据库

添加新用户和新数据库以后,就要以新用户的名义登录数据库,这时在postgre shell下使用的是psql命令。

psql -U john -d johndb -h 127.0.0.1 -p 5432

上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。

输入上面命令以后,系统会提示输入john 用户的密码。输入正确,就可以登录控制台了。

另外要说明一下,psql命令存在简写形式。如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)。举例来说,我的Linux系统用户名为james,且PostgreSQL数据库存在同名用户,则我以James身份登录Linux系统后,可以直接使用下面的命令登录数据库,且不需要密码。

psql johndb

此时,如果PostgreSQL内部还存在与当前系统用户同名的数据库,则连数据库名都可以省略。比如,假定存在一个叫做james的数据库,则直接键入psql就可以登录该数据库。

psql

(1) 控制台命令

除了前面已经用到的\q命令(退出)以外,postgre控制台还提供一系列其他命令。

\h:查看SQL命令的解释,比如\h select。
\?:查看psql命令列表。
\l:列出所有数据库。
\c [database_name]:连接数据库。
\d: 列出当前数据库的所有表格。
\d [table_name]:列出某一张表格的结构。
\du:列出所有用户。
\e:打开文本编辑器。
\conninfo:列出当前数据库和连接的信息。

比如\l来列出所有的数据库,可以看到:

这里面有我们创建的数据库johndb,也有默认安装时自动创建的数据库postgres。

(2) 启用远程访问 PostgreSQL 服务器

前面讲到,postgre 默认只支持本地访问,但实际应用中,很多系统都是分布是的,比如有一台机器当做 web服务器,提供web服务,另外一台机器专门当时数据库服务器,但web服务有很多信息需要记录到数据库里面,这是就需要远程对数据库进行访问和操作,所以接下里,我介绍一下如何开放数据的远程访问。

默认情况下,PostgreSQL 服务器仅仅监听本地网络接口:127.0.0.1。为了允许远程访问你的 PostgreSQL 服务器:

l 第一步:打开配置文件postgresql.conf并且在CONNECTIONS AND AUTHENTICATION一节添加listen_addresses = '*'。

sudo nano /etc/postgresql/12/main/postgresql.conf
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;

保存文件并且重启 PostgreSQL 服务:

sudo service postgresql restart

使用ss工具验证修改:

ss -nlt | grep 5432

输出显示 PostgreSQL 服务器正在监听所有的网络接口(0.0.0.0):

LISTEN 0 244 0.0.0.0:5432 0.0.0.0:* LISTEN 0 244 [::]:5432 [::]:*

l 下一步就是配置PostgreSQL 支持身份认证方式

PostgreSQL 客户端身份验证通常被定义在pg_hba.conf文件中,在initdb初始化数据目录时,它会安装一个默认的pg_hba.conf文件。pg_hba.conf默认路径/etc/postgresql/<pg_version>/main/pg_hba.conf

pg_hba.conf文件的常用格式是一组记录,每行一条。空白行将被忽略, #注释字符后面的任何文本也被忽略。记录不能跨行。

一条记录由若干用空格/或制表符分隔的域组成。如果域值用双引号包围,那么它可以包含空格。在数据库、用户或地址域中 引用一个关键字(例如,all或replication) 将使该词失去其特殊 含义,并且只是匹配一个有该名字的数据库、用户或主机。

下面是一些例子,显示不同的用户场景:

# TYPE   DATABASE   USER    ADDRESS      METHOD
# The user john can access all databases from all locations using md5 password
  host        all              john     0.0.0.0/0         md5
# The user john can access only the janedb from all locations using md5 password
  host        johndb      john     0.0.0.0/0         md5
# The user john can access all databases from a trusted location (192.168.1.134) without a password
  host        all              john   192.168.1.134  trust
# The user john can access all databases from a trusted location (192.168.1.134) without a password
  local       all              all                                ident

其最常用的方式如下:

① trust - 只要满足pg_hba.conf定义的条件,一个角色就可以不使用密码就能连接服务器

② password - 通过密码,一个角色可以连接服务器。密码可以被存储为 scram-sha-256, md5, 和 password(明文)。

③ ident - 仅仅支持 TCP/IP 连接。它通常通过一个可选的用户名映射表,获取客户端操作系统用户名。

④ peer - 和 ident 一样,仅仅支持本地连接。

重新加载配置:在更改pg_hba.conf文件后,需要重新加载PostgreSQL服务器的配置,才能使更改生效。

如果是在linux以服务的形式安装的,那么执行:

命令:

service postgresql reload

l 最后一步就是在你的防火墙上打开端口5432端口。

假设你正在使用UFW来管理你的防火墙,并且你想允许从172.21.73.0/24子网过来的访问,你应该运行下面的命令:

sudo ufw allow proto tcp from 172.21.73.0/24 to any port 5432

确保你的防火墙被配置好,并仅仅接受来自受信任 IP 范围的连接。

最后,就可以远程连接了:

找一台另外的Linux机器:

安装

#apt install postgresql-client-common postgresql-client-14

然后执行

#psql -U john -d johndb -h 172.21.73.165 -p 5432

连上后,就可以像本地一样访问了。

操作PostgreSQL数据库

在PostgreSQL里面可以建多个数据库,每个数据库中又可以建多个表,每个表里面可以存很多数据,在PostgreSQL shell,除了上面介绍的命令,还可以通过SQL语言来操作数据库,另外,在编程的时候,也可以在程序中用代码来访问数据库,以下是一些例子:

(1) 基本的数据库操作,就是使用一般的SQL语言。

# 创建新表
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);

# 插入数据
INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');

# 选择记录
SELECT * FROM user_tbl;

# 更新数据
UPDATE user_tbl set name = '李四' WHERE name = '张三';

# 删除记录
DELETE FROM user_tbl WHERE name = '李四' ;

# 添加栏位
ALTER TABLE user_tbl ADD email VARCHAR(40);

# 更新结构
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;

# 更名栏位
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;

# 删除栏位
ALTER TABLE user_tbl DROP COLUMN email;

# 表格更名
ALTER TABLE user_tbl RENAME TO backup_tbl;

# 删除表格
DROP TABLE IF EXISTS backup_tbl;

(2) 通过编程访问数据库

现在我们可以理解支付宝的背后的运行原理了,用户把钱存放到支付宝数据库里,当用户查看支付宝余额的时候,后台使用SQL这个工具操作支付宝的数据库,把里面的数据查找出来,然后返回给用户,这样用户就可以看到存放到支付宝里的钱和每天的收益了。只不过,这个过程用户看不到,都是在支付宝后台来完成的,用户看到的只是最后的一个查询结果。

下一章介绍C语言编程时,我们会介绍如果通过C语言编程访问PostgreSQL数据库,如果你已经掌握Linux C的开发,也可以直接跳过去先学习一下。

小结

通过上面学习,相信大家对数据库有了基本的了解,对关系型数据库也有了基本的操作入门。不过除了关系型数据库,也还有其他种类的非关系型数据库,操作和使用上会有些差异,这里就不再介绍了。对数据客户有兴趣的同学,可以再深入去专门学习数据相关知识。如果你是从事嵌入式式开发的,可能不太会使用到数据库,但是如果你是要做web系统开发,企业各种信息系统开发,那就必须精通数据库相关知识。

可以去这个网站看看最流行数据库的排名:

DB-Engines Ranking - popularity ranking of database management systems

上图中relational表示关系型数据库,可以看到,前10名,有7种是关系型数据库。

相关推荐

Linux两种光驱自动挂载的方法

环境:CentOS6.4西昆云服务器方式一修改fstab文件/etc/fstab是系统保存文件系统信息?静态文件,每一行描述一个文件系统;系统每次启动会读取此文件信息以确定需要挂载哪些文件系统。参...

linux系统运维,挂载和分区概念太难?在虚机下操作一次全掌握

虚拟机的好处就是可以模拟和学习生产环境的一切操作,假如我们还不熟悉磁盘操作,那先在虚机环境下多操作几次。这次来练习下硬盘扩容操作。虚拟机环境:centos8vm11linux设备命名规则在linux中...

Linux 挂载 NFS 外部存储 (mount 和 /etc/fstab)

mount:手工挂载,下次重启需再重新挂载,操作命令:mount-tnfs-ooptionsserver:/remote/export/local/directory上面命令中,本地目录...

在Linux中如何设置自动挂载特定文件系统(示例)

Linux...

Linux环境中的绑定挂载(bind mount)

简介:Linux中的mount命令是一个特殊的指令,主要用于挂载文件目录。而绑定挂载(bindmount)命令更为特别。mount的bind选项将第一个目录克隆到第二个。一个目录中的改变将会在...

Linux挂载CIFS共享 临时挂载 1. 首先

如何解决服务器存储空间不足的问题?大家好,欢迎回来。在上一期视频中,我为大家介绍了如何利用Linux挂载来扩容服务器存储空间。这一期视频,我将以Linux为例,教大家如何进行扩容。群辉使用的是Linu...

Linux 硬盘挂载(服务器重启自动挂载)

1、先查看目前机器上有几块硬盘,及已挂载磁盘:fdisk-l能够查看到当前主机上已连接上的磁盘,以及已经分割的磁盘分区。(下面以/dev/vdb磁盘进行分区、挂载为例,挂载点设置为/data)df...

linux 挂载磁盘

在Linux中挂载硬盘的步骤如下:...

笨小猪教您Linux磁盘挂载

本教程针对Linux系统比较熟悉或者想学习Linux基础的用户朋友,本教程操作起来比较傻瓜式,跟着步骤就会操作,本文使用的工具是XShell同时多多注意空格(文中会有提示)。【问答】什么是磁盘挂载?答...

Linux 磁盘挂载和docker安装命令

本篇给大家介绍Linux磁盘挂载和docker安装的相关内容,Linux服务器的操作是一个手熟的过程,一些不常用的命令隔断时间就忘记了,熟话说好记性不如烂笔头,还需在平时的工作中多练习记录。...

Linux设置开机自动挂载分区

有时候,我们在安装完Linux系统之后,可能在使用过程中添加硬盘或者分区进行使用,这时候就需要手动把磁盘分区挂载到某个路径,但是开机之后就会消失,需要重新挂载,非常麻烦,那么我们应该如何设置开机自动挂...

在linux挂载一个新硬盘的完整步骤

以下是在Linux中挂载新原始磁盘的完整步骤,包括分区、创建文件系统以及使用UUID在/etc/fstab中启动时挂载磁盘:将新的原始磁盘连接到Linux系统并打开电源。运行以下命令,...

Linux系统如何挂载exFAT分区

简介:Linux系统中不能像Windows系统那样自动识别加载新设备,需要手动识别,手动加载。Linux中一切皆文件。文件通过一个很大的文件树来组织,文件树的根目录是:/,从根目开始录逐级展开。这些文...

Linux系统挂载硬盘

fdisk-l查看可挂载的磁盘都有哪些df-h查看已经挂载的磁盘...

WSL2发布,如何在Win10中挂载Linux文件系统

WSL2是最新版本的架构,它为Windows子系统提供支持,使其能够在Windows上运行ELF64Linux二进制文件。通过最近的更新,它允许使用Linux文件系统访问存储在硬盘中的文件。如果你...

取消回复欢迎 发表评论: