第五章 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文件系统访问存储在硬盘中的文件。如果你...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- 关闭防火墙linux (53)