原文链接

Postgres

PostgreSQL:TheWorld’sMostAdvancedOpenSourceRelationalDatabase

使用Deepin本机安装

deepin20官方库房中默认的是postgres11版本

安装postgres

# 首先卸载旧版本或配置错误的版本
sudo apt remove postgresql --purge # purge 连同配置文件一起删除
sudo apt install postgresql
# psql version 检查安装是否成功
# service psotgresql status 检查 postgres 状态

联接

postgres安装完成默认存在一个postgres数据库

psql -U postgres -h 127.0.0.1 -p 5432 -d postgres
# -U 用户名 -h 连接地址 -p 端口 -d 数据库名

假如联接失败或则说用户不存在则使用postgres用户登入

sudo su - postgres # 切换到 postgres 用户
psql # 登录
password postgres # 更改 postgres 用户的密码,然后输入两次密码
q # 退出控制台

再度联接

启动的英文_启动制冷_linux启动postgresql

这时,我们再通过前面的命令或则使用dbeaver进行联接都可以联接成功了。

新建用户

adduser dbuser # 系统中新建一个用户
psql -U postgres -h 127.0.0.1 -p 5432 -d postgres # 登录进控制台
CREATE USER dbuser WITH PASSWORD 'dbuser'; # 创建数据库用户 dbuser 为密码
CREATE DATABASE mydb OWNER dbuser; # 创建数据库,并指定所有者为 dbuser
GRANT ALL PRIVILEGES ON DATABASE mydb TO dbuser # 将 mydb 的所有权限赋予 dbuser 用户
q # 退出
psql -U dbuser -h 127.0.0.1 -p 5432 -d mydb # 登录验证

此时我们可以使用dbeaver联接,使用dbuser用户名mydb数据库。

导出sql文件

导入sql文件

pd_dump -U postgres -h 127.0.0.1 -p 5432 -d postgres > ./postgres.sql

导出sql文件

psql -U postgres -d postgres -h 127.0.0.1 -p 5432 < ./postgres.sql

使用postgres官方源安装postgres12

首先卸载旧版本或配置错误的版本

sudoaptremovepostgresql--purge#purge连同配置文件一起删掉

创建官方源配置文件

启动制冷_启动的英文_linux启动postgresql

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt buster-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

导出签名

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

更新本地软件库房

sudo apt update

安装

 apt-get install postgresql-12

postgres官方的库房包含下边的一些软件

pgadmin是postgres的一个顾客端,可以在deepin中使用。不过推荐一个linux上更好用的数据库管理软件dbeaver,可以联接大多数关系型数据库跟非关系型数据库,并且对于导出导入自我觉得没有navicat好用,不过可以使用命令行的导出导下来替代是一样的。

使用Docker安装

拉取postgres镜像

docker pull postgres
# 检查镜像是否拉取
docker images # 或者 docker image ls

运行

linux启动postgresql_启动的英文_启动制冷

docker run -d --name postgres-server -p 5432:5432 -e "POSTGRES_PASSWORD=progres"  postgres
# --name 容器运行的名称 -p 端口映射 -e 环境变量 postgres 镜像名

停止|重启

docker stop postgres-server
docker restart postgres-server

持久化

假如容器被删掉,这么容器中postgres的数据也会一并被删掉,所以我们要将数据保存到本机中,便捷数据的备份与恢复。

验证倘若不开启持久化是否会遗失数据

4.1首先以交互模式步入docker中的postgres,以上文运行的容器为根据。

docker exec -it postgres-server bash

此时早已步入了容器中的postgres,使用的是bash这个shell,接出来我们使用命令行步入数据库中,并添加几条数据,之后将容器停止运行,查看数据是否还在,假如数据还在,这么删掉掉这个镜像再查看数据是否还在,倘若不在则恰恰说明了容器中的数据并没有被持久化,所以我们须要配置本地的文件对应到容器中的数据储存文件,来实现持久化,保护我们的数据。

实验docker容器的非持久化

# 我们进入 docker 中的 bash, 登录到 postgres数据库
psql  # 输入这个命令会报错,说没有 root 用户,跟上面在本机上安装是一样的。我们直接切换到 postgres 用户,然后登录,密码是 镜像 -e配置的那个环境变量。
su - postgres
psql # 此时可以进入到数据库,此时会提醒我们使用 help 查看帮助命令
l # 查看当前的所有数据库
c postgres # 进入到 postgres 数据库中
dt # 查看所有的表,第一次查询为空
CREATE TABLE first (id int,name char(50)); # 创建一张表
dt # 现在可以查询到存在一张 first 表
select tabelname form pg_tables where schemaname='public' # 同样查询 public 下的表,更加直观
insert into first (id,name) values (1,'lili'); # 插入一条记录

如今镜像中早已存在了一个表,其中有一条数据,我们可以在宿主机使用命令登陆进去查询,也可以使用可视化工具,如dbeaver,pgadmin等。

如今停止掉运行的容器

docker stop postgres-server 
docker ps -a # 检查所有的容器, exited说明已经停止,通过命令或者可视化工具也会连接失败。

现今重新启动容器

linux启动postgresql_启动的英文_启动制冷

docker start postgres-server

此时发觉,数据跟表都还在。所以容器的停止并不会遗失数据,如今我们将容器删掉掉试试,由于当前容器被创建后有自己的储存位置,而这种文件的生命周期是与docker容器相同的,即时被停止也依然报存在容器中,当容器被销毁则数据也被删掉。所以对于临时的应用使用默认的储存形式即可linux启动postgresql,对于要求数据的完整及稳定性的应用,应该使用持久化的形式进行报存。

# 删除运行的容器会报错,首先将容器停止
docker stop postgres-server
docker rm postgres-server # 删除容器
docker ps -a # 发现 postgres-server 没有了,说明删除成功。

此次我们重新运行一个新容器,再度查看容器內数据,从而验证标题。

docker run -d --name postgres-server -p 5432:5432 -e "POSTGRES_PASSWORD=progres"  postgres # 返回一串 id 说明运行成功

此时,我们使用可视化工具或则命令行linux伊甸园论坛,又或则步入docker的交互bash,都可以见到创建的数据不在了,由于容器早已改变了。是一个新的容器。

进行持久化

持久化数据也就是使用本地的一个目录来储存容器中的数据,由于数据在本地,所以容器的删掉不会影响本地的数据,并且假如本地文件删掉掉那就没办法了,所以对于重要数据要定时进行备份。

创建本地卷

docker volume create pgdata

启动容器

docker run -d --name postgres-server -v pgdata:/var/lib/postgresql/data -p 5432:5432 -e "POSTGRES_PASSWORD=root" postgres
# -v 指定本地卷,用容器中的 /var/lib/postgresql/data 目录来盛放数据,因为这是 postgres 的数据存放文件,我们需要将这个文件映射到我们的主机上,实现持久化。
docker volume inspect pgdata # 使用这个命令我们可以查看 pgdata 卷的详细信息
# 一下是输出
[
  {
       "CreatedAt": "2020-11-26T22:03:19+08:00",
       "Driver": "local",
       "Labels": null,
       "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
       "Name": "pgdata",
       "Options": null,
       "Scope": "local"
  }
]
# Mountpoint 就是我们主机上的目录,与 docker 容器共享,并且当容器被删除,主机上的数据依旧存在,我们可以在主机中查看 /var/lib/docker/volumes/pgdata/_data 文件中的内容,我们对此目录內进行文件的操作在容器中是会同步更新的。所以可以实现容器內数据库操作,删除容器数据保留。

测试持久化

docker exec -it postgres-server bash
su - postgres
c postgres
postgres=# create table test1(id int,name char(50));
postgres=# insert into test1 (id,name) values (1,'lisa');

如今跟前面测试一样,添加了数据。之后继续删掉容器。

# 删除运行的容器会报错,首先将容器停止
docker stop postgres-server
docker rm postgres-server # 删除容器
docker ps -a # 发现 postgres-server 没有了,说明删除成功。

这时容器早已被删掉了linux启动postgresql,而且我们发觉主机上的文件依然是存在的,所以我们运行新容器时指定这个卷就可以使用原先的数据了。

之后使用指定卷持久化的形式进行运行容器

docker run -d --name postgres-server -v pgdata:/www/docker/volumes/pgdata -p 5432:5432 -e "POSTGRES_PASSWORD=root" postgres

卧槽,数据库跟文件又回去了。it’s

删掉持久化文件

对数据进行持久化后,我们可能早已备份了数据,想要删掉到主机上的文件,可以执行下边的命令

在docker中卷volume是一等公民,可以直接使用命令操作。

docker volume rm pgdata

这个时侯主机上的目录也没有了,数据就被删掉了。

我们假如须要使用持久化的方法复原一个容器是可以实现的linux 论坛,并且不要删掉卷volume否则持久化的数据都会遗失。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复