引言(Introduction)
一、安装
本文介绍不同需求下的PostgreSQL安装:(1) 对安装版本无特定要求 (2) 需要安装特定版本
1. 对安装版本无特定要求
sudo apt install postgresql postgresql-contrib
2. 需要安装特定版本
2.1 Ubuntu版本被支持
PostgreSQL官网PostgreSQL: Linux downloads (Ubuntu)
如果您的Ubuntu/Debian是以下版本,则可以根据官网给出的方法进行安装,其中‘postgresql-15’可以被替换为官网支持的任意版本
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-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-get update
sudo apt-get -y install postgresql-15
2.2 Ubuntu版本不被支持
由于我的服务器系统是Ubuntu18.04,通过下述命令安装的PostgreSQL是默认版本10.6,而实验中需要使用到PostgreSQL的最新版本。而Ubuntu版本又不被支持,因此采用源码安装。
(1) 下载tar文件并解压
wget -i https://ftp.postgresql.org/pub/source/v15.2/postgresql-15.4.tar.gz
tar -zxvf postgresql-15.4.tar.gz
(2) 设置配置信息
解压后会得到一个postgresql-15.4的文件夹,进入该文件夹,其中configure是配置文件,可以通过以下指令查看如何进行配置
[指令执行路径:解压后的文件夹]
./configure --h
其配置信息如下:
* 通过'--prefix=xxxx'配置文件的安装位置,默认安装位置在'/usr/local/pgsql/bin', ''/usr/local/pgsql/lib'
其余配置这里就不全部展开,这里将配置安装位置和开启quiet(不开启不影响功能,就是在运行时会有大量形如‘checking ...'的信息,不便于获取运行结果),其中'home/PG/15.4'是我设定的安装路径。
./configure --prefix=/home/PG/15.4 --quiet
(3) 编译 make
[指令执行路径:解压后的文件夹]
make && make install
编译完成之后,可以通过’ls‘指令查看当前路径下的文件,可以看到生成了bin,share文件夹。如果想查看现有的配置信息,可以进入bin,运行pg_config文件
[指令执行路径:指定的安装位置]
cd bin
./pg_config
为了后面可以通过‘psql’命令连接服务器,要将该bin路径添加到PATH变量中。不添加也可以,可以通过在该路径下运行‘./psql’实现
(4) 创建数据库集群
[指令执行路径:指定的安装位置/bin]
运行initdb来初始化一个数据库集群,其概念见附录。可以通过以下指令查看该如何进行初始化
./initdb --help
其中 -D 用来指定集群目录所在的路径,这是必选的参数;
-U 指定数据库的超级管理员用户名,这是可选参数,默认与当前的系统用户名同名;
-W 提示输入密码,这个密码是超级管理员用户的登陆密码,默认为空;
./initdb -D /home/PG/DATA -U postgres
二、运行与登录
我们要进入某个数据库集群,首先要确保该集群在运行,然后将用户切换到该集群的用户,再执行psql连接该集群中的某个数据库
1.启动数据库集群
[指令执行路径:指定的安装位置/bin]
./pg_ctl -D /home/PG/DATA start
# 也可以不指定路径
./pg_ctl start
2.切换用户
如果当前账号就是postgres的用户,该步可以省略。其中’username'为postgres的用户名,一般为postgres或者你的系统用户名
su username
3.执行psql连接该集群中的某个数据库
当psql后面为空,会默认连接和当前用户名同名的数据库
如果你当前的用户名是‘postgres’,直接输入psql就可以进入postgres数据库,该数据库是创建数据集群时就自动带的默认数据库。如果你当前的用户名不是‘postgres’,但是数据库集群中有和你当前用户名同名的数据库,输入psql就会连接上和你当前同名的的数据库
psql
如果你当前的用户名不是‘postgres’,且数据库集群中没有和你当前用户名同名的数据库,就会报数据库不存在的错误,如何你数据集群里未创建任何数据库,就使用‘psql postgres’
psql database_name
如果你没有将bin的路径加入PATH,会出现Command 'psql’ not found的问题,你可将其加入PATH,或者在bin路径下执行‘./psql postgres ’
三、使用
1.常用命令
\d # 当前数据库中数据表信息
\d+
\d tablename
\du # 当前数据库所有用户
\db # 当前所有表空间
\c dbname # 切换到数据库dbname
\i file # 执行file文件中的sql语句
\q # 退出
\? # 帮助
create database dbname; # 创建数据库dbname
create table tablename; # 创建表tablename
drop table tablename; # 删除表tablename
copy tablename from 'path' with delimiter as '|' NULL '';
2.常见问题
2.1.无法启动服务器
(1) 报错信息
pg_ctl: another server might be running; trying to start server anyway
waiting for server to start....2024-03-26 15:12:31.539 CST [33788] FATAL: lock file "postmaster.pid" already exists
2024-03-26 15:12:31.539 CST [33788] HINT: Is another postmaster (PID 30917) running in data directory "/home/css/PostgreSQL15/DATA"?
stopped waiting
pg_ctl: could not start server
Examine the log output.
(2) 原因分析与解决
已经有另一个 PostgreSQL 服务器实例正在运行,由于在实验过程中我使用了Xshell远程连接服务器,通过其对服务器上的PG进行操作,同时我还通过pycharm远程连接了服务器,在程序中使用psycopg2进行连接时,使用的用户名也是超级用户,即使pycharm已经断开连接,还是会造成服务器实例的占用。
可以通过查看设定的集群路径下,是否含有postmaster.pid来确定。将其删去即可。
rm -r postmaster.pid
2.2. 端口被占用
(1) 报错信息
waiting for server to start....2024-07-13 22:57:20.255 CST [29825] LOG: starting PostgreSQL 15.4 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit
2024-07-13 22:57:20.255 CST [29825] LOG: could not bind IPv4 address "127.0.0.1": 地址已在使用
2024-07-13 22:57:20.255 CST [29825] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2024-07-13 22:57:20.255 CST [29825] WARNING: could not create listen socket for "localhost"
2024-07-13 22:57:20.255 CST [29825] FATAL: could not create any TCP/IP sockets
2024-07-13 22:57:20.257 CST [29825] LOG: database system is shut down
stopped waiting
pg_ctl: could not start server
Examine the log output.
(2) 原因分析与解决
由于在操作过程中,我同时在Pycharm上远程连接PostgreSQL,在代码运行后端口没有被释放,从而造成端口的占用
sudo netstat -nplt // 查看特定端口是否被占用
kill -9 pid_num // 要删除特定端口并查看
如果显示不允许该操作,可以切换到root用户下再试一次
附录
数据库集群(Database Cluster)是由单个PostgreSQL服务器管理的数据库集合。PostgreSQL服务器运行在单个主机上,并管理单个数据库集群。
数据库(Database)是数据库对象的集合。在关系数据库理论中,数据库对象是用来存储或引用数据的数据结构。堆表就是一个典型的例子,还有很多类似于索引(index)、序列(sequence)、视图(view)、函数(function)等。在PostgreSQL中,数据库本身也是数据库对象,并且在逻辑上彼此分离。所有其他数据库对象(例如表、索引等)都属于它们各自的数据库,虽然它们隶属于同一个数据库集群,但无法直接从集群中的一个数据库访问该集群中的另一个数据库中的对象