使用几何变换备份完整的postgis数据库

时间:2018-04-16 15:35:29

标签: postgresql postgis database-backups

我有一个PostGIS启用的PostgreSQL数据库,在生产中不再需要。我想备份它,但PostGIS的几何列应该转换为简单,长期稳定的文本格式,如WKT。

我了解ST_AsText功能。

SELECT road_id, ST_AsText(road_geom) AS geom, road_name FROM roads;

但是如何应用它来备份包含几个几何表的多个表的完整数据库呢?

1 个答案:

答案 0 :(得分:0)

这是我最终应用的备份策略:

<强> 1。使用pg_dump正常转储PostGIS-Postgres数据库。纯文本格式,以提高可读性。

<强> 2。所有表格的CSV备份

为此我创建了我的初始数据库的副本(&#34; la_as_text&#34;)并使用以下脚本将所有几何列转换为文本(感谢@Jim Jones)。它对我的情况非常具体,但无论如何我决定这样发布它。以防有人在问题中运行,就像我对依赖于几何列和gist索引的视图一样。如果您将数据类型更改为text和text列对于gist索引也无效,那么视图将无法工作。

#!/bin/bash

# has to be run by a user who has owner permissions for the database

rm delete_views.txt delete_views_mod.txt alter_script.txt alter_script_mod.txt

# delete all views - not necessary in long-term-backup and cause problems when altering geometry columns 
echo "select 'drop view ' ||table_name|| ';' from information_schema.views where table_schema not in ('pg_catalog', 'information_schema') and table_name "'!'"~ '^pg_';" | psql la_as_text >> delete_views.txt

cat delete_views.txt | tail -n +3 | head -n -2 >> delete_views_mod.txt

cat delete_views_mod.txt | psql la_as_text

# delete one particular gist index that depends on a geometry column -- text can't be indexed with gist 
echo "drop index idx_combined_points_the_geom;" | psql la_as_text

# change data type geometry (EWKB) to human readable text (WKT)
echo "select 'alter table '||table_schema||'.'||table_name||' alter column '||column_name||' type text USING ST_AsText('||column_name||');' from information_schema.columns where table_schema = 'public' and udt_name = 'geometry';" | psql la_as_text >> alter_script.txt

cat alter_script.txt | tail -n +3 | head -n -2 >> alter_script_mod.txt

cat alter_script_mod.txt | psql la_as_text

由于缺少几何数据类型,生成的数据库缺少很多初始功能,但它具有人类可读性。

我使用以下script将所有单独的表格导出为&#39;;&#39; - 分隔的文本文件,而不是普通的转储:

#!/bin/bash

SCHEMA="public"
DB="la_as_text"

psql -Atc "select tablename from pg_tables where schemaname='$SCHEMA'" $DB |\
  while read TBL; do
    psql -c "copy $SCHEMA.$TBL to stdout with csv delimiter ';'" $DB > $TBL.csv
  done

我非常有信心可以在将来重建此备份 - 如有必要。

相关问题