这段时间要使用PostgreSQL数据库,这里记录一下安装方面的一些内容。
操作系统:Ubuntu 20.04
在Ubuntu 20.04下,PostgreSQL的默认版本已经达到12.2。于我而言,这个版本已经足够新,所以不再使用官方介绍的方法来安装更新的版本,直接使用以下命令安装。
sudo apt install postgresql
PostgreSQL安装后会提供一些很有用的命令,但是并不能直接调用,需要我们编辑配置文件,把这些命令所在路径添加进去。可以先用find或者下面这个命令来查询这些postgresql命令所在目录:
locate initdb
如果还没有安装locate命令(通过名称发现文件)的话,可以用sudo apt install mlocate来安装。
以上命令会列出下面的内容:
/etc/alternatives/initdb.1.gz
/usr/lib/postgresql/12/bin/initdb
/usr/share/man/man1/initdb.1.gz
/usr/share/postgresql/12/man/man1/initdb.1.gz
当然,这个结果大家不一定相同。从结果中我们很容易就发现第2行正是我们需要的。编辑/etc/profile文件(因为其他账号也会使用这些命令,所以修改这个文件,而不是当前账号下的配置文件。),加入以下内容:
# PostgreSQL
export PATH=$PATH:/usr/lib/postgresql/12/bin
保存后注销、重新登录。这时每个账号都可以调用许多有用的PostgreSQL命令了。此外,这里也介绍一个查询当前PostgreSQL相关目录的命令:
ps auxw | grep postgres | grep -- -D
在我的电脑上显示的结果为:
postgres 11041 0.0 0.2 227072 29408 ? Ss 20:01 0:00 /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf
PostgreSQL安装后,会生成一个默认的数据库存储区域。如果不想用默认的,那就自己创建一个新的区域(集簇)吧。比如,有的时候我们希望数据库是保存在移动介质上,需要使用时才挂到当地的PostgreSQL上。虽然可以使用备份还原来处理,但是相对麻烦。原来在使用MSSQL时,可以很方便的把数据库文件脱离或挂载到数据库上,但因为我刚接触PostgreSQL,还没有发现类似的功能。
使用下面的命令创建,注意后面的路径,根据自己的习惯进行设置。创建集簇的方法有好几种,这里暂时只介绍这一种。
initdb -D ~/tree/public/clover/data/pgsql/data
创建完成后,并不能马上使用,还需要启用。虽然创建后,上面会提示如何启用,但提示的命令并不能直接生效,还需要下面的设置。
在创建新的数据库集簇后不能直接启用的原因,通常有两点。一是默认启动时,当前正在运行的PostgreSQL服务占用了默认的端口;二是创建锁文件的权限问题。
第一个问题可以有两种方式解决,一是把当前的PostgreSQL服务停止;二是在新的端口启动。
第二个问题的原因是,锁文件所在目录的权限属于postgres账户。可以根据提示把这个目录的权限修改成当前账户,但在下次重启电脑后这个权限又会恢复给postgres,所以这种方法不可取。解决的方法之一就是把新建的数据库集簇所在文件夹权限授予postgres账号,然后通过postgres账号启动新的数据库集簇。
我通常只使用一个数据库服务,所以我的做法是先暂停默认的postgresql服务,然后用postgres账号启动新数据库集簇。
修改默认启动数据库集簇的方法我还不清楚,所以每次重启电脑后都需要处理,以后找到配置方法后再来修改这里。
以上步骤的命令如下:
sudo chown -R postgres:postgres /home/starry/tree/public/clover/data/pgsql/
sudo service postgresql stop
sudo su - postgres
postgres -D /home/starry/tree/public/clover/data/pgsql/data
最后一行命令运行后会有以下提示:
2020-06-12 23:23:22.528 CST [23021] LOG: starting PostgreSQL 12.2 (Ubuntu 12.2-4) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-8ubuntu1) 9.3.0, 64-bit
2020-06-12 23:23:22.528 CST [23021] LOG: listening on IPv4 address "127.0.0.1", port 5432
2020-06-12 23:23:22.561 CST [23021] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-06-12 23:23:22.688 CST [23022] LOG: database system was shut down at 2020-06-12 23:17:01 CST
2020-06-12 23:23:22.736 CST [23021] LOG: database system is ready to accept connections
这样就表示已经成功启动,这个终端窗口就这样开着吧,如果用ctrl-c中断的话,服务也就停止了。我们另开一个窗口,用另一个命令查询一下当前postgresql的状态:
ps auxw | grep postgres | grep -- -D
运行结果如下:
postgres 23021 0.0 0.2 226780 27644 pts/0 S+ 23:23 0:00 postgres -D /home/starry/tree/public/clover/data/pgsql/data
从结果上可以看见,当前指向的数据库集簇正是我们新建的集簇。
PostgreSQL安装后,会有一个默认的账号:postgres。但我习惯创建一个与当前使用的操作系统账号相同的数据库账号,例如我在Ubuntu 20.04下使用的starry账号。按照以下步骤创建,并且在创建时赋予相应权限。
sudo su - postgres
psql
CREATE ROLE starry WITH LOGIN CREATEDB ENCRYPTED PASSWORD '2020-Jun';
\q
exit
现在就可以使用新账号在新的数据库集簇下工作了。
为了操作方便,我把当前操作系统用户(例如starry)加入到postgres用户组中。并且把新建数据库集簇所在文件夹的权限改为750。要注意的是,集簇文件夹的权限只能是700或者750,否则不能启动。
sudo adduser starry postgres
sudo chmod -R 750 /home/starry/tree/public/clover/data/pgsql/data
需要重新登录操作系统。有了这个权限后,当前用户就可以对此目录使用git管理了。