使用 pg_dump 转储数据库,忽略我们无权访问的表
Dump database with pg_dump, ignoring tables that we don't have access to
我有一个脚本,其中 pg_dump
失败并显示如下消息:
pg_dump -h db1 --format plain --encoding UTF8 --schema=public --schema-only --no-owner me
pg_dump: [archiver (db)] query failed: ERROR: permission denied for relation notmytable
pg_dump: [archiver (db)] query was: LOCK TABLE public.notmytable IN ACCESS SHARE MODE
这导致整个转储中止。
有没有办法:
- 忽略不属于我们用户的表?
- 忽略错误?
我真的不希望转储中有这些表,所以即使我们可以访问它们,也不能完全解决问题。
(Postgres 9.6.3)
似乎没有标准的方法来做到这一点,但使用 --exclude-table
标志,我们可以使用一个解决方法:
export EXCLUDETABLE=$(psql -t -h $HOST -d $DBNAME -c "select '--exclude-table=' || string_agg(tablename,' --exclude-table=') FROM pg_catalog.pg_tables WHERE tableowner NOT LIKE 'myuser';" )
这会将 EXCLUDETABLE 设置为 --exclude-table=foo --exclude-table=blah
现在我们将其传递给 pg_dump
:
echo Excluding these tables from dump: $EXCLUDETABLE
pg_dump -h $HOST --format plain --encoding UTF8 --schema=public --schema-only --no-owner $EXCLUDETABLE $DBNAME > public-schema.sql
我有一个脚本,其中 pg_dump
失败并显示如下消息:
pg_dump -h db1 --format plain --encoding UTF8 --schema=public --schema-only --no-owner me
pg_dump: [archiver (db)] query failed: ERROR: permission denied for relation notmytable
pg_dump: [archiver (db)] query was: LOCK TABLE public.notmytable IN ACCESS SHARE MODE
这导致整个转储中止。
有没有办法:
- 忽略不属于我们用户的表?
- 忽略错误?
我真的不希望转储中有这些表,所以即使我们可以访问它们,也不能完全解决问题。
(Postgres 9.6.3)
似乎没有标准的方法来做到这一点,但使用 --exclude-table
标志,我们可以使用一个解决方法:
export EXCLUDETABLE=$(psql -t -h $HOST -d $DBNAME -c "select '--exclude-table=' || string_agg(tablename,' --exclude-table=') FROM pg_catalog.pg_tables WHERE tableowner NOT LIKE 'myuser';" )
这会将 EXCLUDETABLE 设置为 --exclude-table=foo --exclude-table=blah
现在我们将其传递给 pg_dump
:
echo Excluding these tables from dump: $EXCLUDETABLE
pg_dump -h $HOST --format plain --encoding UTF8 --schema=public --schema-only --no-owner $EXCLUDETABLE $DBNAME > public-schema.sql