【发布时间】:2014-08-14 06:53:30
【问题描述】:
我将 PostgreSQL 数据库用于我的 Ruby on Rails 应用程序(在 Mac OS X 10.9 上)。
有没有关于如何升级 PostgreSQL 数据库的详细说明?
我怕我会破坏数据库中的数据或者把它弄乱。
【问题讨论】:
-
无论如何都要备份。
标签: postgresql upgrade
我将 PostgreSQL 数据库用于我的 Ruby on Rails 应用程序(在 Mac OS X 10.9 上)。
有没有关于如何升级 PostgreSQL 数据库的详细说明?
我怕我会破坏数据库中的数据或者把它弄乱。
【问题讨论】:
标签: postgresql upgrade
我在 Windows 10 上从 Postgresql 11 升级到 Postgresql 12 的解决方案如下。
首先,您需要能够停止和启动 Postgresql 服务。您可以通过 Powershell 中的以下命令来执行此操作。
开始:
pg_ctl start -D “d:\postgresql\11\data”
停止:
pg_ctl stop -D “d:\postgresql\11\data”
状态:
pg_ctl status -D “d:\postgresql\11\data”
在升级之前进行备份是明智的。 Postgresql 11 实例必须正在运行。然后复制全局变量做
pg_dumpall -U postgres -g -f d:\bakup\postgresql\11\globals.sql
然后对于每个数据库
pg_dump -U postgres -Fc <database> > d:\backup\postgresql\11\<database>.fc
或
pg_dump -U postgres -Fc -d <database> -f d:\backup\postgresql\11\<database>.fc
如果尚未安装 Postgresql 12(因为 Postgresql 11 也已安装,这将在端口 5433 上)
然后进行如下升级:
1) 停止 Postgresql 11 服务(见上文)
2) 编辑d:\postgresql\12\data中的postgresql.conf文件,将port = 5433改为port = 5432
3)编辑windows用户环境路径(windows start然后输入env)指向Postgresql 12而不是Postresql 11
4) 通过输入以下命令运行升级。
pg_upgrade `
-b “c:\program files\postgresql\11\bin” `
-B “c:\program files\postgresql\12\bin” `
-d “d:\postgresql\11\data” `
-D “d:\postgresql\12\data” --username=postgres
(在 powershell 中使用反引号(或反引号)` 继续下一行的命令)
5) 最后启动新的 Postgresql 12 服务
pg_ctl start -D “d:\postgresql\12\data”
【讨论】:
更新:此过程与将 9.5 升级到至少 11.5 相同;只需修改命令以反映版本9.6 和10,其中9.6 是旧 版本,10 是新 版本。一定要相应地调整“旧”和“新”目录。
我刚刚在 Ubuntu 上将 PostgreSQL 9.5 升级到 9.6,我想分享一下我的发现,因为需要注意一些特定于操作系统/包的细微差别。
(我不想手动转储和恢复数据,所以这里的其他几个答案都不可行。)
简而言之,该过程包括在旧版本(例如,9.5 和 9.6)旁边安装新版本的 PostgreSQL,然后运行pg_upgrade 二进制文件,这在https://www.postgresql.org/docs/9.6/static/pgupgrade.html 的(一些)详细信息中进行了解释。
pg_upgrade 唯一的“棘手”方面是未能为参数传递正确的值,或者在执行命令之前未能以正确的用户或cd 登录到正确的位置,可能导致神秘的错误消息。
在 Ubuntu(也可能是 Debian)上,如果您使用的是“官方”存储库 deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main,并且您没有更改默认文件系统路径或运行时选项,那么以下过程应该可以完成这项工作。
安装新版本(注意我们明确指定9.6):
sudo apt install postgresql-9.6
一旦安装成功,两个版本将并行运行,但在不同的端口上。安装输出在底部提到了这一点,但很容易忽略:
Creating new cluster 9.6/main ...
config /etc/postgresql/9.6/main
data /var/lib/postgresql/9.6/main
locale en_US.UTF-8
socket /var/run/postgresql
port 5433
停止两个服务器实例(这将同时停止两个):
sudo systemctl stop postgresql
切换到专用 PostgreSQL 系统用户:
su postgres
移动到他的主目录(不这样做会导致错误):
cd ~
pg_upgrade 需要以下输入(pg_upgrade --help 告诉我们这一点):
When you run pg_upgrade, you must provide the following information:
the data directory for the old cluster (-d DATADIR)
the data directory for the new cluster (-D DATADIR)
the "bin" directory for the old version (-b BINDIR)
the "bin" directory for the new version (-B BINDIR)
这些输入可以用“长名称”指定,以使它们更易于可视化:
-b, --old-bindir=BINDIR old cluster executable directory
-B, --new-bindir=BINDIR new cluster executable directory
-d, --old-datadir=DATADIR old cluster data directory
-D, --new-datadir=DATADIR new cluster data directory
我们还必须通过--new-options 开关,因为不这样做会导致以下结果:
connection to database failed: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"?
这是因为在没有此开关的情况下应用了默认配置选项,这导致使用了不正确的连接选项,从而导致套接字错误。
从新 PostgreSQL 版本执行pg_upgrade 命令:
/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf
注销专用系统用户帐户:
exit
升级现已完成,但是,新实例将绑定到端口5433(标准默认值为5432),因此在尝试测试新实例时请记住这一点在“切换”到它之前。
正常启动服务器(同样,这将同时启动旧实例和新实例):
systemctl start postgresql
如果要将新版本设为默认版本,则需要编辑有效的配置文件,例如/etc/postgresql/9.6/main/postgresql.conf,并确保端口定义为:
port = 5432
如果您这样做,请同时将旧版本的端口号更改为5433(在启动服务之前),或者直接删除旧版本(这将不会删除您的实际的数据库内容;您需要使用 apt --purge remove postgresql-9.5 来实现):
apt remove postgresql-9.5
上述命令将停止所有实例,因此您需要最后一次启动新实例:
systemctl start postgresql
最后一点,不要忘记考虑pg_upgrade 的好建议:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
./analyze_new_cluster.sh
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
【讨论】:
sudo su postgres,在 pg_upgrade 之前将两个安装的 pg_hba.conf 中的所有 METHOD 更改为 trust,在 /private/tmp 中运行 pg_upgrade 不是 ~ 没有所以sudo mkdir /foobar 和chmod 777 /foobar 一起工作并在那里运行它。最后 pg_upgrade 命令:/Library/PostgreSQL/9.5/bin/pg_upgrade -b /Library/PostgreSQL/9.2/bin -B /Library/PostgreSQL/9.5/bin -d /Library/PostgreSQL/9.2/data -D /Library/PostgreSQL/9.5/data -o -cconfig_file=/Library/PostgreSQL/9.2/data/postgresql.conf -O -cconfig_file=/Library/PostgreSQL/9.5/data/postgresql.conf
尽管上面给出了所有答案,但我的 5 美分就到这里了。
它适用于任何操作系统和任何到任何 postgres 版本。
postgresql.conf -> port 从5432 更改为5433;cd到新版本bin文件夹;pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
【讨论】:
postgresql.conf 或 pg_hba.conf),您需要在新安装中手动复制这些更改。相反,如果您使用pg_upgradecluster,配置文件将被复制到新集群:manpages.ubuntu.com/manpages/precise/man8/…
pg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
Current releases of the dump programs can read data from any server version back to 7.0.
假设您已经使用 home-brew 安装和升级 Postgres,您可以执行以下步骤。
停止当前的 Postgres 服务器:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
初始化一个新的 10.1 数据库:
initdb /usr/local/var/postgres10.1 -E utf8
运行pg_upgrade (注意:如果您要从以下内容进行升级,请更改 bin 版本):
pg_upgrade -v \
-d /usr/local/var/postgres \
-D /usr/local/var/postgres10.1 \
-b /usr/local/Cellar/postgresql/9.6.5/bin/ \
-B /usr/local/Cellar/postgresql/10.1/bin/
-v 启用详细内部日志记录
-d旧数据库集群配置目录
-D新的数据库集群配置目录
-b 旧 PostgreSQL 可执行目录
-B 新的 PostgreSQL 可执行目录
将新数据移动到位:
cd /usr/local/var
mv postgres postgres9.6
mv postgres10.1 postgres
重启 Postgres:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
查看/usr/local/var/postgres/server.log 了解详细信息并确保新服务器正常启动。
最后重新安装railspggem
gem uninstall pg
gem install pg
我建议您花一些时间阅读PostgreSQL documentation,以准确了解您在上述步骤中所做的事情,以尽量减少挫折感。
【讨论】:
initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
delete_old_cluster.sh 命令。我首先手动删除了 /usr/local/postgres9.3 目录,然后运行了这个命令,似乎我丢失了整个 /usr/local/var/postgres 目录(我能够从 Time Machine 恢复它)
gem uninstall pg 删除 gem,然后让 bundler 通过运行 bundle 从 Gemfile.lock 重新安装正确的版本。
brew 现在还可以选择使用brew services stop postgresql 和brew services start postgresql,而不是直接调用launchctl unload 和launchctl load。
在 Windows 10 上,自从我有了 npm,我安装了 rimraf 包。 npm install rimraf -g
使用命令pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname一一备份所有数据库
然后安装了最新的 PostgreSQL 版本,即 11.2,这提示我这次使用端口 5433。
其次是卸载旧版本的 PostgreSQL 我的是 10。请注意,卸载程序可能会发出警告说不删除文件夹 C:\PostgreSQL\10\data。这就是我们下一步使用 rimraf 永久删除文件夹及其子文件夹的原因。
进入 PostgreSQL 安装目录并运行命令rimraf 10。 10 是目录名。请注意使用旧版本的 PostgreSQL,即 9.5 或其他版本。
现在将C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\lib 添加到 Windows 环境变量中。请注意,我新安装的版本是 11,因此我使用 pg11。
导航到C:\PostgreSQL\data\pg11 然后打开postgresql.conf 编辑port = 5433 到port = 5432
就是这样。打开cmd输入psql -U postgres
您现在可以使用命令pg_restore -U $username --dbname=$databasename $filename 一个一个恢复所有备份的数据库
【讨论】:
这是 Ubuntu 用户的解决方案
首先我们必须停止 postgresql
sudo /etc/init.d/postgresql stop
创建一个名为 /etc/apt/sources.list.d/pgdg.list 的新文件并添加以下行
deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main
按照以下命令进行操作
wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-9.4
sudo pg_dropcluster --stop 9.4 main
sudo /etc/init.d/postgresql start
现在我们什么都有了,只需要升级如下
sudo pg_upgradecluster 9.3 main
sudo pg_dropcluster 9.3 main
就是这样。大多数升级后的集群将在端口号 5433 上运行。使用以下命令检查它
sudo pg_lsclusters
【讨论】:
如果您使用的是自制和自制服务,您可能只需这样做:
brew services stop postgresql
brew upgrade postgresql
brew postgresql-upgrade-database
brew services start postgresql
如果您使用高级 postgres 功能,我认为这可能无法完全工作,但它对我来说非常有效。
【讨论】:
看起来该解决方案现在已融入 Homebrew:
$ brew info postgresql
...
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
brew postgresql-upgrade-database
....
【讨论】:
对于 Mac,通过自制软件:
brew tap petere/postgresql,
brew install <formula>(例如:brew install petere/postgresql/postgresql-9.6)
删除旧的 Postgres:
brew unlink postgresql
brew link -f postgresql-9.6
如果发生任何错误,请不要忘记阅读并遵循每个步骤中的 brew 说明。
【讨论】:
我认为这是您将 postgres 更新到 9.6 的解决方案的最佳链接
https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
【讨论】:
在 Windows 上,我在尝试使用 pg_upgrade 时总是遇到不同的错误消息。
为我节省了很多时间:
【讨论】:
我的解决方案是结合使用这两种资源:
https://gist.github.com/tamoyal/2ea1fcdf99c819b4e07d
和
http://www.gab.lc/articles/migration_postgresql_9-3_to_9-4
第二个比第一个帮助更多。此外,不要按照原样执行这些步骤,因为有些步骤是不必要的。 此外,如果您无法通过 postgres 控制台备份数据,您可以使用其他方法,并使用 pgAdmin 3 或其他程序进行备份,就像我在我的案例中所做的那样。
另外,链接:https://help.ubuntu.com/stable/serverguide/postgresql.html 帮助设置加密密码并设置 md5 用于验证 postgres 用户。
全部完成后,检查终端中运行的 postgres server 版本:
sudo -u postgres psql postgres
输入密码后在postgres终端运行:
SHOW SERVER_VERSION;
它会输出如下内容:
server_version
----------------
9.4.5
为了设置和启动 postgres,我使用了命令:
> sudo bash # root
> su postgres # postgres
> /etc/init.d/postgresql start
> /etc/init.d/postgresql stop
然后从文件中恢复数据库:
> psql -f /home/ubuntu_username/Backup_93.sql postgres
或者如果不起作用,试试这个:
> pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d name_of_database ~/your_file.dump
如果您使用的是 Rails,请在拉取代码后执行 bundle exec rake db:migrate :)
【讨论】:
站在其他可怜生物的肩膀上,我能够在升级到优胜美地后按照以下步骤重新站起来并继续奔跑:
假设您已经使用 home-brew 安装和升级 Postgres,您可以执行以下步骤。
停止当前的 Postgres 服务器:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
初始化一个新的 9.4 数据库:
initdb /usr/local/var/postgres9.4 -E utf8
安装 postgres 9.3(因为它不再出现在我的机器上):
brew install homebrew/versions/postgresql93
添加在优胜美地升级期间删除的目录:
mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep
运行pg_upgrade:
pg_upgrade -v -d /usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.5/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/
将新数据移动到位:
cd /usr/local/var
mv postgres postgres9.3
mv postgres9.4 postgres
重启 Postgres:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
查看/usr/local/var/postgres/server.log 了解详细信息并确保新服务器正常启动。
最后,重新安装相关库?
pip install --upgrade psycopg2
gem uninstall pg
gem install pg
【讨论】:
brew cleanup,导致 postgres9.3 被卸载。这有帮助。 :)
这是为我做的。
https://gist.github.com/dideler/60c9ce184198666e5ab4
简明扼要。老实说,我的目标不是了解 PostgreSQL 的精髓,我想把事情做好。
【讨论】:
jessie 上有它。拥有 10 多个数据库,并且在眨眼之间转换了大约 400MB 的数据库数据。再说一次,我在 SSD 上使用虚拟 Debian。
pg_upgradecluster 9.4 main 从 9.4 升级到 11,但出现错误 Error: specified cluster does not exist ... 我想,我必须先使用本指南再次安装 postgresql-9.4:@ 987654323@
user manual 深入探讨了这个主题。你可以:
pg_upgrade 就地;或
pg_dump 和pg_restore。
如果有疑问,请使用转储。不要删除旧的数据目录,只是保留它以防出现问题/您犯了错误;这样你就可以回到原来的 9.3 安装。
详情请参阅手册。
如果您遇到困难,请发布一个详细的问题,说明您遇到困难的原因、位置以及您首先尝试了什么。这也取决于您如何安装 PostgreSQL,因为 OS X 的 PostgreSQL 有几种不同的“发行版”(不幸的是)。所以你需要提供这些信息。
【讨论】: