Skip to content

安装 Postgresql

安装

Ubuntu

将最新版本的 PostgreSQL 添加到软件源中:

sh
# Create the file repository configuration:
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Import the repository signing key:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Update the package lists:
sudo apt-get update

安装最新版本的 PostgreSQL(截至 2024-04-16,版本是 16):

sh
# Install the latest version of PostgreSQL.
# If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
sudo apt-get -y install postgresql

为了让 pg_ctl 等命令可用,在 .zshrc 添加以下内容:

sh
export PATH=/usr/lib/postgresql/16/bin:$PATH

postgresql - pg_ctl: command not found, what package has this command? - Ask Ubuntu

Windows

点击、下载并安装:

假设 postgresql 安装路径为 D:\postgresql\16,那么需要将 D:\postgresql\16\bin 加到系统环境变量 Path 中。

See: PostgreSQL: Windows installers

Download PostgreSQL: Open source PostgreSQL packages and installers from EDB

可能的问题

可能会在安装过程中弹出下面的问题:

Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.

这个一般是因为安装时语言选项选成了 "Chinese",而一些环境不支持 "GBK" 编码。

所以需要手动初始化数据库:

sh
initdb -D "E:\postgresql\16\data" -U postgres

See: postgres installation the database cluster initialization failed ( Postgresql Version 9.4.4 ) - Stack Overflow

然后启动数据库:

sh
pg_ctl -D "E:\postgresql\16\data" -l logfile -o "-p 15432" start

查看状态:

sh
pg_ctl -D "E:\postgresql\16\data" status

postgres 用户登录 psql:

sh
psql --host=127.0.0.1 --port=15432 -U postgres

卸载

查看已安装的版本:

sh
ls /usr/lib/postgresql/

输出形如:

sh
14/ 16/

然后删除指定版本:

sh
sudo apt-get autoremove postgresql-14

指定数据目录

See: How To Move a PostgreSQL Data Directory to a New Location on Ubuntu 20.04 | DigitalOcean

How to change PostgreSQL’s data directory on Linux | fitodic’s blog

permissions - Changing Ownership: "Operation not permitted" - even as root! - Ask Ubuntu

查看数据目录

sh
sudo -u postgres psql -c "SHOW data_directory;"

输出形如:

sh
       data_directory
-----------------------------
 /var/lib/postgresql/16/main
(1 row)

停止服务

sh
sudo systemctl stop postgresql

创建并复制新数据目录

假设新的数据目录为 /media/data1/postgresql/16/main

那么创建目录,并赋予 postgres 用户权限:

sh
sudo mkdir -p /media/data1/postgresql/16/main
sudo chown -R postgres:postgres /media/data1/postgresql/16/main
# sudo chown -R postgres:postgres /media/data1/postgresql/16/main

如果 chown 遇到权限问题,并且 sudo chattr -i file 出现 Operation not supported 的问题,那么原因出在分区类型是 ntfsfat32。推荐的解决方案是重新格式化分区为 ext4

See: permissions - Changing Ownership: "Operation not permitted" - even as root! - Ask Ubuntu

permissions - How do I use 'chmod' on an NTFS (or FAT32) partition? - Ask Ubuntu

复制数据目录:

sh
sudo rsync -av /var/lib/postgresql/16/main/ /media/data1/postgresql/16/main

注意 rsync 的语法 rsync -a src/ destsrc 后面的 / 不要漏掉,否则会在 dest 下重复创建一个 src 目录。

See: How to rsync a directory to a new directory with different name? - Unix & Linux Stack Exchange

移动原数据目录,以避免冲突或误操作:(可选)
sh
sudo mv /var/lib/postgresql/16/main /var/lib/postgresql/16/main.bak
# # move back
# sudo mv /var/lib/postgresql/16/main.bak /var/lib/postgresql/16/main

修改 postgresql 配置

配置文件位于 <data_directory>/postgresql.conf

sh
sudo nano /etc/postgresql/16/main/postgresql.conf
# code /etc/postgresql/16/main/postgresql.conf

注释掉原来的数据目录,改成新的数据目录:

sh
# data_directory = '/var/lib/postgresql/16/main'		# use data in another directory
data_directory = '/media/data1/postgresql/16/main'		# use data in another directory

修改 systemd 配置

修改 /lib/systemd/system/postgresql.service

sh
sudo nano /lib/systemd/system/postgresql.service
# code /lib/systemd/system/postgresql.service

添加内容:

sh
[Service]
...
Environment=PGDATA=/media/data1/postgresql/16/main

重新加载 systemd 配置:

sh
sudo systemctl daemon-reload

重启服务

sh
sudo systemctl restart postgresql

查看服务状态:

sh
sudo systemctl status postgresql

查看数据目录是否正确:

sh
sudo -u postgres psql -c "SHOW data_directory;"

输出形如:

sh
         data_directory
---------------------------------
 /media/data1/postgresql/16/main
(1 row)

常见问题

可能遇到无法正常启动的问题,一般可能是:

  1. systemdEnvironment 没有配置好,建议重新配置和重启 systemd见上)。
  2. 重启 postgresql 服务时,没有正确停止服务,可以尝试 sudo systemctl stop postgresql 后再重启。
  3. 硬盘没有正确配置好,可以尝试重启系统,并重新格式化硬盘。

See: Can not connect to PostgreSQL listening on port 5432 - Ask Ubuntu

查看监听端口和配置文件

查看正在监听的端口:

sh
netstat -nlt

查看配置文件路径:

sh
sudo -u postgres psql -c "SHOW config_file;"

输出形如:

sh
               config_file
-----------------------------------------
 /etc/postgresql/16/main/postgresql.conf
(1 row)

允许远程访问 postgresql

修改配置文件 /etc/postgresql/16/main/postgresql.conf:

sh
listen_addresses = '*'

注意这里是 '*' 而不是 "*"

然后(这里需要 root 权限才能打开):

sh
sudo nano /etc/postgresql/16/main/pg_hba.conf`

添加:

sh
host    all             all             0.0.0.0/0               md5
host    all             all             ::/0                    md5

重启服务:

sh
sudo systemctl restart postgresql

安装 pgvector

sh
sudo apt install postgresql-server-dev-16
export PG_CONFIG=/Library/PostgreSQL/16/bin/pg_config

git clone --branch v0.6.2 https://githubfast.com/pgvector/pgvector.git
cd pgvector
sudo make
sudo make install

See: Open-source vector similarity search for Postgres