如何解决ubuntu focal wsl中的postgresql升级权限被拒绝?

qxsslcnc  于 2023-10-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

我只是不明白在Linux发行版上升级程序怎么会这么难。我正在经历从PostgreSQL-12升级到PostgreSQL-16的最困难的时期。我目前的发行版是Linux的Windows子系统中的Ubuntu 20.04.6 LTS(Focal Fossa)
我一直在遵循这个来源的步骤:how to upgrade postgresql database
我卡在第三步了。

/usr/lib/postgresql/16/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/12/main \
--new-datadir=/var/lib/postgresql/16/main \
--old-bindir=/usr/lib/postgresql/12/bin \
--new-bindir=/usr/lib/postgresql/16/bin \
--old-options '-c config_file=/etc/postgresql/10/main/postgresql.conf' \
--new-options '-c config_file=/etc/postgresql/12/main/postgresql.conf'

运行此命令会导致以下错误:

could not create directory "/var/lib/postgresql/16/main/pg_upgrade_output.d": Permission denied
Failure, exiting

请帮忙,提前谢谢。

zynd9foi

zynd9foi1#

我最初对Ubuntu和这个Linux发行版的每个版本中包含的默认服务器应用程序了解不多。我知道的还不多,但我现在知道得更多了。
每个Ubuntu版本都有一个预安装的PostgreSQL数据库服务器应用程序版本。我目前的Ubuntu版本是20.04.6 LTS Focal Fossa,它附带了PostgreSQL-12。当我想运行这个服务器应用程序的数据库会话时,我通过端口5432上的localhost连接到它。这是通过使用命令/ service manager sudo service PostgreSQL start 以及其他方法来实现的。
这将在默认端口5432上启动服务器。我可以使用命令 psql 输入PostgreSQL数据库,假设我当前的用户配置文件也有一个定义的PostgreSQL角色和同名的数据库。
当然,随着时间的推移,可能需要使用PostgreSQL-12中不存在的功能。这可能需要我安装一个更新的/主要版本的PostgreSQL。PostgreSQL的最新版本是16。由于版本16是从我发出的wget请求下载的存储库中提取的,因此我决定使用版本16。
我使用了命令 sudo apt updatesudo apt upgrade postgresql-16,安装了16版和12版。Ubuntu有允许多个版本的PostgreSQL一起运行的软件包。我假设在安装版本16之后,它会升级到版本12,导致只有一个版本,最新的版本16,但是,正如前面提到的,Ubuntu没有这样做,并且有很好的理由:数据是非常敏感的,事情可能会出错。不去管以前的安装,创建一个单独的示例来隔离问题。这对我来说现在是有意义的,但最初让我感到沮丧,因为我需要连接到postgresql-16服务器来使用postgresql-client-16功能。
这给像我这样的新手提出了一个新的问题,“我如何让我的数据库在版本12中存在于版本16中:(XD?“
解决方案是使用pg_dump备份版本12中的数据库,使用命令

  • pg_dumpall > outputfilehere*

比如说,

  • pg_dumpall >所有数据库.dump*

或者,如果我想针对一个特定的数据库,而不是所有的数据库,那么我可以使用

  • pg_dump > my_specific_database.dump*

在将数据库“恢复”到与版本12一起安装的最新版本之前,我必须切换端口。版本16位于端口5433,因为版本12占用端口5432,这是默认端口。我得换个端口号。这是通过在每个版本的服务器应用程序配置或设置文件中进行更改来实现的。
在Ubuntu和其他Linux发行版中,服务器应用程序配置文件(通常是扩展名为 .config 的文件)位于 /etc 目录中。以下是每个版本的配置文件位置:

  • /etc/postgresql/12/main/postgresql.conf*
  • /etc/postgresql/16/main/postgresql.conf*

我可以使用以下命令更改到版本12的配置目录
/etc/postgresql/12/main
现在我在主目录中,我可以键入命令

  • 是-啦 *

查看是否存在名为postgresql. conf的文件。我可以通过使用文本编辑器(如nano或Vim)更改此文件中的端口号。我通过输入以下命令来使用Vim:

  • sudo Vim postgresql.conf*
  • 确保包含 sudo,因为您需要超级用户权限来写入/编辑服务器应用程序配置文件。这将在Vim编辑器中打开文件,我可以看到当前端口号是5432。我把端口改成了5433。然后我按照相同的步骤将/etc/postgresql/16/main中的端口从5433更改为5432。

快到了安装更新版本的PostgreSQL会创建用户postgres,因此为了对数据库进行更改,您必须通过切换用户(su)在Ubuntu中以用户postgres登录:

  • su - postgres*

  • sudo -i -u postgres*

无论哪种方式,都可以使用以下命令启动PostgreSQL服务:

  • sudo service PostgreSQL start*

(you可以省略sudo)
这将启动版本16和版本12服务器,但如果您想启动特定的服务器,只需在命令的末尾添加您想要启动的版本:

  • sudo service PostgreSQL start 16*

如果要停止特定版本:

  • sudo service PostgreSQL stop 16*

最后,输入命令 psql 您将进入postgres数据库。然后键入

  • 创建用户your_desired_ubuntu_username_here WITH LOGIN CREATEDB CREATEROLE SUPERUSER*
  • 您可能想或不想添加超级用户权限,您的选择。

现在键入 exit 离开数据库
最后,将用户切换回原用户:

  • su - your_ubuntu_username_here*

最后,在这里输入命令ddb your_ubuntu_username。
创建另一个数据库来还原备份:

  • creatdb database_name_here*

终于可以将版本12数据库迁移到版本16了:
输入命令 psql database_name_here < backupfile_here
通过输入数据库检查移动是否成功:
类型 psql
然后键入 \c database_name_here

然后键入 *\d以查看关系 *
如果你看到了预期的行数,那么它是成功的。

相关问题