PostgreSQL数据库
PostgreSQL数据库是目前功能最强大的开源数据库之一,支持丰富的数据类型(如JSON和JSONB类型、数组类型)和自定义类型。PostgreSQL数据库是开源数据库,遵循BSD协议,它提供丰富的接口,具有较强的可扩展性,在使用和二次开发上基本没有限制。MapGIS平台可直接连接PostgreSQL数据源并创建数据库,下图为MapGIS使用PostgreSQL数据库的流程图:

目前MapGIS可支持的PostgreSQL数据库版本如下所示:
数据库 | 版本 | MapGIS支持情况 |
---|---|---|
PostgreSQL | 9.4及以下版本 | × |
9.5 | √ | |
9.6 | √ | |
10 | √ | |
11 | √ | |
12 | √ | |
13 | √ | |
14 | √ | |
15 | √ | |
PostgreSQL-XL | 9.5 | √ |
9.6 | √ | |
10 | √ |
PostgreSQL数据库包括windows和Linux版本,不同版本安装服务器端及配置数据库方法不同。其中Linux上PostgreSQL数据库配置方法可参考"MapGIS Desktop(九州)的PostgreSQL数据库"。
PostgreSQL服务器端及客户端的安装步骤可参考PostgreSQL数据库官方操作手册,这里就不做详细说明。下面会对配置PostgreSQL数据源及创建PostgreSQL数据库的操作步骤进行详细说明。
提示:
MapGIS DataStore提供了一键式PostgreSQL数据库创建能力,当用户通过MapGIS DataStore"创建PostgreSQL"地理数据库后,用户可直接配置数据源并使用PostgreSQL地理数据库,无需再进行其他操作。
配置数据库信息
功能说明
MapGIS使用PostgreSQL数据库时,要求数据库服务器已安装postgis和libxml2扩展,且网络可用。
检查postgis扩展
1. 通过数据库连接工具,如pgAdmin连接数据库,打开"查询编辑器",通过如下命令查看是否安装postgis和libxml2扩展。
select * from pg_available_extensions where name = 'postgis' or name = 'xml2';

2. 若无,用户需手动安装。
检查网络配置
为了保证其他客户机可正常访问PostgreSQL数据库,需要配置PostgreSQL数据库的网络信息。
1. 修改"C:\Program Files\PostgreSQL\12\data\PostgreSQL.conf"。参数“listen_addresses”表示监听的IP地址,默认是在localhost处监听,也就是127.0.0.1的ip地址上监听,只接受来自本机localhost的连接请求,这会让远程的主机无法登陆这台数据库,建议将注释#去掉,把这个地址改为*。

2. 修改"C:\Program Files\PostgreSQL\12\data\pg_hba.conf",配置对数据库的访问权限。

①如果要使所有可提供有效密码的用户都能使用 md5 连接从以 10.2.12 开头的地址连接到名为 test 的数据库,请向 pg_hba.conf 文件中添加如下内容:
host test all 10.2.12.0/24 md5
②如果要使所有可提供有效密码的用户均能从以 100 开头的地址连接到 PostgreSQL 实例中的任何数据库,则需要向 pg_hba.conf 文件添加如下内容:
host all all 100.0.0.0/8 md5
③如果要使所有可提供有效密码的用户均能从任意IP地址连接到 PostgreSQL 实例中的任何数据库,则需要向 pg_hba.conf 文件添加如下内容:
host all all 0.0.0.0/0 md5
新建数据库
新建数据库
功能说明
PostgreSQL数据库安装并初始化后,默认安装一个名为postgres的数据库。用户在业务应用中时,建议再新建数据库及用户。
操作说明
1. 通过数据库连接工具,如pgAdmin连接数据库,登录默认的postgres数据库。
2. 创建一个新的用户。如下用户及密码均为test,用户可自定义。
CREATE USER test PASSWORD 'test';

提示:
不要使用pgAdmin、Navicat等客户端工具通过可视化界面来创建带有任意大写字母的用户,这样创建的用户是严格区分大小写的,后续会导致MapGIS建库失败。
3. 创建一个新的数据库并属于新建的用户。如下数据库为testdb,用户可自定义。
create database testdb owner test;

启用postgis扩展
1. 通过数据库连接工具,如pgAdmin连接数据库,在刚才新建的testdb数据库中启动"查询编辑器"。
2. 启用postgis扩展。
create extension postgis;
提示:
普通用户无法创建postgis扩展,只能使用管理员用户。

3. 创建成功后,可通过如下命令查看postgis扩展是否正确加载。
select * from pg_extension;

安装启用mapgis3d_pg扩展
功能说明
mapgis3d_pg扩展主要用于支持MapGIS三维面体数据使用。MapGIS 10.7.0.10及之前版本,必须执行此步骤才能正常使用MapGIS三维面/体数据。自MapGIS 10.7.2.10开始,初始化PostgreSQL地理数据库后,该数据库即可正常使用MapGIS三维面/体,用户无需再手动安装mapgis3d_pg扩展。
提示:
对于Postgres-XL分布式数据库,若用户要安装mapgis3d_pg扩展,需在每个服务器节点上安装mapgis3d_pg扩展,方法类似。
操作说明
mapgis3d_pg扩展文件在"MapGIS安装目录\Program\Support\SDE\PostgreSQL"文件夹中,用户可根据数据库及操作系统版本,选择对应版本的扩展文件。如windows的客户机上PostgreSQL 12对应的扩展文件在"MapGIS安装目录\Program\Support\SDE\PostgreSQL\12\Windows\x86_64"文件夹中,包括如下几个文件:

1. 将mapgis3d_pg--1.0.sql、mapgis3d_pg--1.0--1.1.sql、mapgis3d_pg--1.1.sql、mapgis3d_pg.control四个文件拷贝到"PostgreSQL安装目录/share/extension"中,将mapgis3d_pg.dll文件拷贝到"PostgreSQL安装目录/lib"中;
2. 通过数据库连接工具,如pgAdmin连接数据库,在刚才新建的testdb数据库中启动"查询编辑器"。启用mapgis3d_pg扩展。
create extension mapgis3d_pg;

3. 创建成功后,可通过如下命令查看postgis扩展是否正确加载。
select * from pg_extension;

配置PostgreSQL数据源
功能说明
在服务机上安装配置PostgreSQL客户端后,客户机只要安装了MapGIS,就可以在MapGIS中配置PostgreSQL数据源,用来管理PostgreSQL数据库。
操作说明
1. 在MapGIS GDBCatalog面板,点击"客户端配置管理"功能,弹出如下所示对话框:

2. 点击"添加",选择“PostgreSQL数据源”,服务名称格式为:"[ip]:[端口]/[数据库名]",如“192.168.11.100:5432/testdb”,进行服务配置;

提示:
一般情况下,PostgreSQL数据库默认端口为5432,通过MapGIS DataStore配置的PostgreSQL数据库默认端口为30001.
数据源名称用户可自定义。在配置地图文档(*.mapx)时,记录数据的URL信息时包含了数据源名称。因此多台客户机间使用同一套地图文档(*.mapx)时,应保证数据源名称是一致的。
3. "确定"后,在MapGIS GDBCatalog中可添加该PostgreSQL数据源节点信息:

创建PostgreSQL地理数据库
功能说明
在MapGIS中配置PostgreSQL数据源后,需初始化PostgreSQL地理数据库。初始化成功后,用户即可基于该地理数据库进行数据转换、创建等数据管理相关操作。
操作说明
1. 在MapGIS GDBCatalog中,连接PostgreSQL数据源,需输入用户名密码信息;

2. 连接成功后,在PostgreSQL数据源节点,右键"创建地理数据库",即可初始化PostgreSQL地理数据库。


- 【完成后显示创建日志】:勾选时,可显示创建日志信息;
- 【支持Z值】:勾选时,初始化的PostgreSQL地理数据库中数据版本为8.3,其中点/线/区简单要素类可支持z值;
- 【支持解析弧段】:勾选时,初始化的PostgreSQL地理数据库中数据版本为8.5,其中线/区简单要素类可支持弧段。
- 【类名和表名一致】:勾选时,PostgreSQL数据库中存储GIS数据类名和表名是一致的。由于PostgreSQL数据库中表名存在长度、特殊字符的限制,MapGIS默认PostgreSQL数据库中数据存储名称和实际名称是通过"mpdbmaster"->"mpdb_item"表存储对应关系。
- 【面体Blob存储】:勾选时,新建的地理数据库可支持面体,无需用户再手动安装mapgis3d_pg扩展。

3. 初始化成功后,用户即可基于该数据库进行GIS数据转换、创建等数据管理相关操作。
性能优化配置
服务端配置
PostgreSQL 的数据库配置文件是数据库存储目录下的 PostgreSQL.conf 文件。该文件下参数的设置对 PostgreSQL 数据库的性能影响极大,需要注意以下参数配置。

Kingbase V8R6(PostgreSQL模式)的数据库配置文件为kingbase.conf。具体信息可参考:PGTune
提示:
1. 上图配置仅考虑了单机版本的PostgreSQL数据库安装在一台独立的机器上。如果该机器上还有其它软件运行,需要综合考虑其它软件对内存的影响再综合设置。强烈建议PostgreSQL数据库安装在一台独立的机器上。
2. 如果该机器上安装的是PostgreSQL集群,则每个coordinator、datanode节点都需要同步设置,上述涉及到内存的参数值都需要平分设置。
共享缓冲区shared_buffers
PostgreSQL 通过共享缓冲区和内核以及磁盘打交道,因此对该参数的设置应该尽可能大,从而能让更多的数据在共享缓冲区中。
共享缓冲区对应 PostgreSQL.conf 中 shared_buffers 这个参数,默认值是1024KB,不得小于 128KB。通常设置为实际 RAM 的 25%。通常 8GB 的内存,可以设置为2GB。
工作内存work_mem
执行排序操作时,会根据工作内存的大小决定是否将一个大的结果集拆分为几个与工作内存差不多大小的临时文件,显然拆分的结果降低了排序的速度。增加工作内存的大小有助于提高排序速度。
工作内存对应 PostgreSQL.conf 中 work_mem 这个参数, 默认值是 1024KB,通常设置为实际 RAM 的 2%-4%,根据需要排序结果集的大小而定。
有效缓存effective_cache_size
有效缓存是 PostgreSQL 能够使用的最大缓存,这个数字对于独立的 PostgreSQL 服务器而言应该尽量大。
有效缓存对应 PostgreSQL.conf 中 effective_cache_size 这个参数,通常 8GB 的内存,可以设置为 6GB。
维持工作内存maintence_work_mem
维持工作内存只是在 CREATE INDEX、VACUUM 等时用到,因此使用频率不高,但是往往这些指令会消耗较多资源,因此应该尽快让这些指令快速执行完毕。
维持工作内存对应 PostgreSQL.conf 中 maintence_work_mem 这个参数,通常需给maintence_work_mem 大的内存,通常 8GB 的内存,可以设置为 512M。
最大连接数max_connections
- 设置最大连接数的目的:
- “最大连接数 *工作内存”超出了实际内存大小。比如,如果将 work_mem 设置为实际内存的 2% 大小,则在极端情况下,如果有 50 个查询都有排序要求,而且都使用 2% 的内存,则会导致 swap 的产生,系统性能就会大大降低。
- 增加客户端的连接数,提高并发度。 最大连接数对应 PostgreSQL.conf 中 max_connections 这个参数,默认值是100。
- max_connections的最大值
- 通过大数据产品安装的PostgreSQL-XL产品,max_connections参数最大配置不能超过1024,否则会出现无法启动。
- 自行安装的PostgreSQL数据库,max_connections参数最大值受系统、硬件配置等影响。设置过大可能会导致出现服务器端PostgreSQL数据库无法启动。一般不建议配置超过1024个。
- max_connections的最优值 大规模并发时,默认的100肯定不是最优。建议往大调整,但是也不是越大越好。遵循以下原则:
- 一般机器最优值没有明确值,有说400-600之间。
- 至少应该保证需要大于所有客户端需要的连接数。以该条原则为主。MapGIS所需连接数计算方法可参考"PG数据源单用户占用连接数"。
- max_connections的查询和修改
--查询总的连接数
show max_connections;
--修改总的连接数。每个coordinator、datanode节点都要设置;修改连接数后需要重启数据库
alter system set max_connections=600;
客户端配置
PG数据源单用户占用连接数
1、概念介绍
MapGIS客户端操作PostgreSQL数据源时使用了连接池概念,对应配置参数“PG数据源单用户占用连接数”N,用以支持高并发请求。
- 一个连接池以“数据源名称+登录用户”作为区分,故同一个连接池表示数据源名称相同、登录用户相同。
- 同一个连接池在一个进程内部仅有一个。
- 该配置参数作用于所有的PostgreSQL数据源,对应一个连接池中连接的总数。
- 在连接一个具体的PostgreSQL数据源时,会直接创建N个到PostgreSQL数据库的连接。

2、使用场景
当单个进程需要多线程使用同一个登录用户读写同一个PostgreSQL数据源的数据时,建议调大“PG数据源单用户占用连接数”,该值越大并发度越高。
在MapGIS IGServer中可能对应以下操作: 1) 高并发要素查询; 2) 高并发地图文档出图;
3、参数配置参考
对比 | MapGIS 10.6.0.10以前版本 | MapGIS 10.6.0.10及以后版本 |
---|---|---|
默认值 | 机器CPU线程数*5 | 2 |
最大值 | 1、假设: 1)PostgreSQL数据库服务器端连接总数(max_connections)A 2)客户端进程(单个DCS就是一个进程、一个workspace也是一个进程)数目B 3)配置的PostgreSQL数据源个数C 4)单个数据源的连接数(PG数据源单用户占用连接数)D 2.限制: 1)A <=1000(可能更小) 2)A > B*C*D 3.计算D最大值 A=600 B=9 C=16 则D<(600/9/16=4.16),即D最大配置4 | |
问题 | 设置不够大而查询并发很高时,容易出现卡死现象。请调大“PG数据源单用户占用连接数”值,或则升级mapgis版本 | 无 |
提示:
1. “PG数据源单用户占用连接数”设置完成后需要断开PostgreSQL数据源连接后重新连接才有效。对应实际功能可能需要重启mapgis桌面软件或则IGServer服务。
2. “PG数据源单用户占用连接数”值需要和服务器端PostgreSQL数据库连接总数(max_connections)配合使用。至少满足 “服务器端PostgreSQL数据库连接总数 > 所有客户端占用的连接数之和”,才能保证各个客户端能够正常使用,否则会出现某个客户端连接失败的情况。
3. “PG数据源单用户占用连接数”值并不是设置的越大越好,请根据实际需要设置。
4. 假设某个业务应用中使用PostgreSQL数据源,空间数据存储在DBA和DBB两个数据库中。日常业务应用中,有4个MapGIS IGServer服务器和3个MapGIS Desktop桌面在使用,每个IGServer服务器启动2个DCS进程。Desktop及IGServer中PG最大连接数为10。PostgreSQL的max_connections最小值为 (10*2*4+10*3)*2=220。
常见问题
- 创建库失败,提示“创建数据字典表:MPDB_GDBINFO 失败”

答:可能是因为用户名带有大写导致,用户名需全部小写。
- 连接pg数据源失败,提示创建连接池失败

答:服务器端PostgreSQL数据库最大连接数不够导致。需要调大服务器端PostgreSQL数据库连接个数,以满足所有客户端的连接。可以在配置文件 PostgreSQL.conf 中修改最大连接数。
- 创建字典表MPDB_SFCLS 失败

答:MapGIS 10.6.2.10版本判断PostgreSQL是否为集群环境存在问题,需要更新MapGIS环境。
- IGServer请求操作出现卡住现象
答:MapGIS 10.6.0.10之前的版本,受限于实现。当“PG数据源单用户占用连接数”值设置很小时,如果单个进程中同时存在多个线程读写同一个数据PostgreSQL数据源的数据,可能出现卡死现象。这种场景下请升级MapGIS 版本到10.6.0.10及之后的版本。
- MapGIS 10.6.0.10之前的版本:一个完整的查询或则数据上载逻辑,会逐步占用3-4个连接,完成后再一起释放连接。高并发时,会因为连接不够导致所有线程一直等待获取新的连接,从而出现卡死现象。
- MapGIS 10.6.0.10及以后的版本:一个完整的查询或则数据上载逻辑,只会占用一个连接。高并发场景下,不会出现多线程都等待获取新连接造成死锁。
- 连接失效无法出图
连接PostgreSQL数据源后没有任何操作,等待了很长一段时间,MapGIS Desktop加载PostgreSQL数据源中任何数据,无法浏览到图形。
TCP长连接,心跳机制导致。
调整数据库服务器端的配置参数keepalives_idle,keepalives_interval、keepalives_count,使得数据库服务器端定时主动检测客户端连接的有效性。只要tcp_keepalives_idle参数的值小于防火墙检测空闲连接的时间,就能够解决改问题。
PostgreSQL 的数据库配置文件是数据库存储目录下的 PostgreSQL.conf 文件。Kingbase V8R6(PG模式)的数据库配置文件为kingbase.conf。 下述示例参数语义如下:客户端连接空闲600秒(tcp_keepalives_idle)后,服务器端开始验证客户端连接的有效性,每间隔1秒(tcp_keepalives_interval)检测一次,最多检测1次(tcp_keepalives_count)。
tcp_keepalives_idle = 600
tcp_keepalives_interval = 1
tcp_keepalives_count = 1
提示:
1、 tcp_keepalives_idle参数,该值需要小于防火墙检测空闲连接的时间,值并不是越小越好。防火墙检测空闲连接的时间,可以通过以下方式确定:
1)观察下客户端连接空闲多久失效;
2)主动询问下客户防火墙的设置规则;
如果实在不知道防火墙检测空闲连接的时间,可以不断尝试设置tcp_keepalives_idle的值,由小到大进行验证测试,最后设置成合适的值即可。
2、tcp_keepalives_interval、tcp_keepalives_count,可以考虑下实际网络情况设置。如果网络经常波动的话,2个参数的值可以考虑增加些,不建议使用默认值0。
3、如果安装的是PostgreSQL集群,则每台机器上的每个coordinator、datanode节点都需要同步设置这3个参数。