Postgresql:如何应用 pg_dump --exclude-table-data 补丁?

Posted

技术标签:

【中文标题】Postgresql:如何应用 pg_dump --exclude-table-data 补丁?【英文标题】:Postgresql: How to apply pg_dump --exclude-table-data patch? 【发布时间】:2015-09-07 06:20:33 【问题描述】:

我有一个带有 Django 应用程序和 Postgresql 数据库的生产服务器 (ec2)。 我每晚都使用 pg_dump 备份表数据。

sudo -u postgres pg_dump --column-inserts --data-only mydb > mybackup.sql

Postgres 提供了忽略某些要备份的表的可能性(表架构 + 数据:--exclude-table=TABLE)

但是我有一些表,我想备份他们的架构而不是他们的数据,我只想用空数据转储表,​​旧数据根本不重要,但是如果转储它们会使备份文件变得很大.

有一个补丁“exclude-table-data=TABLE”允许用户拥有 pg_dump 排除数据但不排除表的 DDL。一个用例是非常 不经常更改的大表,并为其转储数据 经常是浪费和不必要的。

我想知道如何在不丢失生产服务器上数据库的任何内容的情况下应用此补丁。

【问题讨论】:

pg_dump --schema-only 将转储所有 DDL,通常这不是很大,几百千字节。拥有它总是很好,也可以用于跟踪架构更改。 【参考方案1】:

exclude-table-data 现在是 PostgreSQL 9.2+ 中pg_dump 的常规选项,因此如果您的服务器是最新版本,则它已经可用(请参阅文档页面:http://www.postgresql.org/docs/9.2/static/app-pgdump.html

【讨论】:

感谢您的回复。我的 PostgresSQL 版本是 9.1.14 ! 最明智和最简单的方法是计划升级到更新的 PostgreSQL 版本。 pg_upgrade 让这变得容易多了。虽然您可以从 9.2(或 9.4)安装 pg_dump 并在 9.1 数据库上使用它,但在 9.1 db 上恢复使用 pg_dump 9.2 制作的转储时可能会遇到问题。【参考方案2】:

我找到了一个更好的解决方案,将 PostgreSQL 升级到 9.2 或更高版本,我找到了一种安全的方法:(在 Ubuntu 12.04 上将 PostgreSQL 9.1 升级到 9.3)

echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" | sudo tee /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 install postgresql-9.3 postgresql-server-dev-9.3 postgresql-contrib-9.3 -y
sudo su - postgres -c "psql template1 -p 5433 -c 'CREATE EXTENSION IF NOT EXISTS hstore;'"
sudo su - postgres -c "psql template1 -p 5433 -c 'CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";'"
sudo su - postgres -c "service postgresql stop"
sudo su - postgres -c '/usr/lib/postgresql/9.3/bin/pg_upgrade -b /usr/lib/postgresql/9.1/bin -B /usr/lib/postgresql/9.3/bin -d /var/lib/postgresql/9.1/main/ -D /var/lib/postgresql/9.3/main/ -O "-c config_file=/etc/postgresql/9.3/main/postgresql.conf" -o "-c config_file=/etc/postgresql/9.1/main/postgresql.conf"'
sudo apt-get remove postgresql-9.1 -y
sudo sed -i "s:5433:5432:g" /etc/postgresql/9.3/main/postgresql.conf
sudo service postgresql restart 

注意:这将同时安装 PostgreSQL 9.3 和 9.4,因此无论是在完成后删除 PostgreSQL 9.4 还是更改上述代码以升级到版本 9.4。

Reference.

后来我意识到,由于我使用的是--data-only,--exclude-table 和--exclude-table-data 会产生相同的效果,因为我忽略了架构!

【讨论】:

以上是关于Postgresql:如何应用 pg_dump --exclude-table-data 补丁?的主要内容,如果未能解决你的问题,请参考以下文章

postgresql如何备份数据库

pg_restore - 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。

pg_dump实例详解(备份postgresql和greenplum数据库)

PostgreSQL数据库备份和还原

Postgresql 9.2执行pg_dump命令问题[重复]

PostgreSQL逻辑备份恢复--pg_dump导出及psql导入案例