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数据源连接池”相关设置,用以支持高并发数据查询/出图请求。
- 每个PostgreSQL数据库实例都有数据库连接总数(max_connections)上限,当所有客户端总连接数超出该数值后,新加入的客户端连接会失败。
- PostgreSQL数据库连接时通过"{IP}:{端口号}/{数据库名}"+"用户名"模式进行使用。每个参数的变化都会生成一个连接池;
- 当"IP"或"端口号"不一样时,隶属于不同PostgreSQL实例,无需考虑连接数总和冲突;
- 当"数据库名"或"用户名"不同时,都会生成一个新的连接池,如Desktop中同时连接同一个PostgreSQL实例中的两个数据库,创建2个连接池。Desktop通过admin和user两个用户连接同一个数据库时,也会创建2个连接池。
- MapGIS中一个进程会创建一个连接池。一个MapGIS Desktop属于1个进程,至少创建1个连接池;一个IGServer的DCS属于一个进程,若一个IGServer开启了4个DCS进程,至少会创建4个连接池。
- MapGIS 10.7.0.10及之后版本,通过"PG数据源连接池的最大/最小空闲/初始连接数"三个参数来动态调整每个连接池中的连接数。用户需根据业务场景,调整最优值。
提示:
连接PostgreSQL数据库后,用户可通过如下命令查询总连接数和已使用的连接数。
show max_connections;
select * from pg_stat_activity;
select * from pg_stat_activity where not pid = pg_backend_pid();

2、参数配置参考
对比 | MapGIS 10.6.0.10以前版本 | MapGIS 10.6.0.10至10.6.8.10 | MapGIS 10.7.0.10及以后版本 | ·
---|---|---|---|
参数设置 | PG数据源单用户占用连接数,默认值为机器CPU线程数*5 | PG数据源单用户占用连接数,默认值为2 | PG数据源连接池的最大连接数,默认值为20 PG数据源连接池的最小空闲连接数,默认值为10 PG数据源连接池的初始连接数,默认值为1 |
占用连接数 | 假设: 服务器A上PostgreSQL数据库连接总数(max_connections)为a; 服务器A上使用的地理数据库个数为b; MapGIS Desktop个数为c, MapGIS IGServer服务器个数为d,每个服务器开启的DCS进程个数为e。 | ||
PG数据源单用户占用连接数为n | PG数据源连接池的最大连接数为n1; 最小空闲连接数为n2; 初始连接数为n3; | MapGIS占用的连接总数为:(c*n+d*e*n)*b; | MapGIS全部进程启动后并未进行查询/出图操作,占用的连接总数为:(c*n3+d*e*n3)*b MapGIS全部进程都在进行高并发的查询/出图操作,占用的连接总数为:(c*n1+d*e*n1)*b MapGIS Desktop启动后并未进行查询/出图操作,IGServer在进行高并发的查询/出图操作,占用的连接总数为(c*n3+d*e*n1)*b |
已知问题 | 设置不够大而查询并发很高时,容易出现卡死现象。请调大“PG数据源单用户占用连接数”值,或则升级mapgis版本 | 暂无 |
提示:
1. “PG数据源连接池”相关设置完成后需要断开PostgreSQL数据源连接后重新连接才起效。重启MapGIS Desktop或IGServer服务可达到同等效果。
2. “PG数据源连接池”相关设置记录在"MapGIS安装目录\Program\Config\DataManage\DataManage.ini"文件中。同一个环境的Desktop和IGServer产品共用一套参数配置信息。
3. MapGIS中客户端“PG数据源连接池的最大连接数”值越大,高并发数据查询/出图时效率越高,但若各客户端连接数之和超出PostgreSQL数据库连接总数(max_connections),会导致部分客户端连接失败,反而影响了查询/出图效果。因此用户需根据实际应用场景设置相关参数。
4. MapGIS Desktop在进行数据查询/出图时一般为单进程,占用连接数为1。用户手动开启MapGIS Desktop快显高性能出图时,PG数据源连接池占用连接数可增加。
5. 假设PG数据源连接池的最大/最小空闲/初始连接数分别为20/10/1。某个DCS进程初次连接使用该PostgreSQL中某个数据库时,连接池占用的连接数为1;该DCS进行普通数据查询/出图时,由于数据量不大,连接池个数可能只需占用6;15分钟内(超出PG数据源连接池的最长空闲时间)不再进行任何查询/出图操作,连接池占用连接数还是6;该DCS进行大数据的查询/出图时,DCS连接池占用的连接数可达到20;15分钟内(超出PG数据源连接池的最长空闲时间)不再进行任何查询/出图操作,连接池占用的连接数降为10;该DCS进行大数据的查询/出图时,若此时PostgreSQL数据库空闲连接数只余15,DCS连接池占用的连接数最大为15。
6. 假设某个业务应用中分别在服务器A和服务器B上安装了PostgreSQL数据库实例,连接总数均为1000。由于服务器A和服务器B中PostgreSQL实例的连接总数是各自独立计算的,无需一起考虑。
7. 假设服务器A上PostgreSQL数据库连接总数(max_connections)为1000。其中,创建了A1和A2两个地理数据库。日常业务应用中,有5个MapGIS IGServer服务器和3个MapGIS Desktop桌面在使用,每个IGServer服务器启动4个DCS进程。Desktop及IGServer中当前PG占用连接数为n。PostgreSQL的max_connections最小值为 (n*4*5+n*3)*2=46n,因此n最大值为1000/46取整等于21。
8. MapGIS 10.7.0.10及之后版本针对PostgreSQL数据库连接池控制提供了PG数据源连接池的最大/最小空闲/初始连接数三个参数设置。对于7中假设情况,若5个IGServer和3个Desktop一直处于高并发的数据查询/出图状态,"PG数据源连接池的最大连接数"为21;但若3个Desktop只是处于启动状态,并未进行数据查询/出图操作,其PG占用连接数只是初始连接数,默认为1,那么5个IGServer可设置的最大连接数为(1000-3*2)/(4*5*2)取整等于24。
常见问题
- 创建库失败,提示“创建数据字典表: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个参数。