构建电子地图网站——08 腾讯云javaweb环境搭载与PostSQL库与PostGIS数据导入导出
2022-11-25 22:27:06

2023年2月4日,距离上次打开这个项目已经过去了2个多月了,2个月前因为在腾讯云服务器上部署PostSQL数据库总是出各种错误,最后又因为疫情不得不提前回家,所有这个项目止步于此已经2个多月了。现在重新开启,把之前的步骤和出的错误做个简单总结。现在距离腾讯云到期还有近一个月的时间,希望能在那之前有个完美的答案!

继我们上一步把springboot项目打包且本地部署成功之后,接下来就是要将本地的这个项目部署到我们的腾讯云服务器上以便通过域名进行访问!

1 腾讯云预装

1.1 安装Xshell用来从本地上传数据到服务器

因为我安装的是“宝塔Linux面板”,可以直接在面板中上传本地数据,但是现在感觉有利也有弊,虽然直观,但是在面板中直接安装的软件,不知道为什么在终端却显示没有!所以接下来若要重新开始,我会换成centos系统试试!

1.2 开放安全组

在云主机页面,选择”安全组“==》”新建安全组“==》”放通全部端口“==》”管理实例“==》”新增关联“==》把实例添加进去

2 环境配置

2.1 安装jdk

安装的jdk版本要和项目开发中的版本一致

1
2
yum search jdk      # 查找镜像
yum -y install java-1.11.0-openjdk*

2.2 安装postgresql

安装的pg版本也得和程序中的版本一致

1
2
3
4
5
yum install postgresql
yum install postgresql-server
yum install postgresql-devel
yum install postgis
# 提示is this ok的时候,输入y
  • 查看版本信息:
1
rpm -qi postgresql
  • 查看安装位置:
1
rpm -ql postgresql

若安装的版本不一致,卸载pg:

1
2
3
4
5
yum remove postgresql
yum remove postgresql-server
yum remove postgresql-devel
yum remove postgis
# 提示is this ok的时候,输入y

重新安装pg10

1
yum install postgresql10-contrib postgresql10-server -y

2.3 配置文件夹权限和环境变量

  • home目录下,新建一个文件夹”postgresql_data“,把默认的postgresql的数据库移动到这个文件夹中

  • 配置该文件夹读写权限

    1
    2
    3
    mkdir /home/postgresql_data
    chown postgres:postgres /home/postgresql_data
    chmod 750 /home/postgresql_data
  • 配置环境变量

    1
    2
    3
    export PATH=/usr/pgsql-10/bin:$PATH
    export LD_LIBRARY_PATH=/usr/pgsql-10/lib
    export PGDATA=/home/postgresql_data
  • 修改文件**/usr/lib/systemd/system/postgresql-10.service:**

    把数据库目录改到**/home/postgresql_data下,这个可以用vim语句来改(i是插入,esc——:wq是保存修改并退出**),也可以用xftp将文件传输到本地,用写字板打开,修改好了,再传回到云主机中。

    1
    2
    3
    修改内容如下:
    #Location of database directory
    Environment=PGDATA=/home/postgresql_data

3 数据库初始化

  • 进入用户

    1
    su postgres
  • 初始化数据库

    1
    initdb
  • 退出

    1
    exit
  • 设置pg库开机启动

    1
    2
    systemctl enable postgresql-10.service
    service postgresql-10 start
  • 查看状态

    1
    service postgresql-10 status

    绿色的active(running)就说明初始化成功了

  • 将用户密码和数据库密码改为一致

    1
    2
    passwd postgres
    # 输入一遍新密码,再输入一遍确认
  • 修改用户密码

    在sql模式下:

    1
    2
    3
    su postgres
    psql
    ALTER USER postgres WITH PASSWORD '密码';

    退出:

    1
    2
    \q
    exit

4 安装PostGIS

  • 要选择合适的版本

    1
    2
    3
    4
    yum -y install epel-release
    yum install postgis24_10 postgis24_10-client
    yum install ogr_fdw10 -y
    yum install pgrouting_10 -y

5 创建空间数据库

  • 进入psql角色

    1
    2
    su postgres
    psql
  • 创建数据库

    1
    CREATE DATABASE gismap;
  • 进入数据库

    1
    \c gismap;
  • 空间扩展

    1
    2
    3
    CREATE EXTENSION postgis;
    CREATE EXTENSION postgis_topology;
    CREATE EXTENSION ogr_fdw;
  • 查看是否扩展成功

    1
    SELECT postgis_full_version();

    当出现以下内容说明扩展成功:

    1
    2
    3
    4
    POSTGIS="2.4.8 r17696" PGSQL="100" GEOS="3.7.1-CAPI-1.11.1 27a5e771" PROJ="Rel. 4.9.3, 1
    5 August 2016" GDAL="GDAL 2.3.2, released 2018/09/21" LIBXML="2.9.1" LIBJSON="0.11" LIBPR
    OTOBUF="1.0.2" TOPOLOGY RASTER
    (1 row)
  • 退出:\q

    exit

6 本地数据导入云主机pg库并连接

6.1 pg_dump转储和还原数据

  • 管理员权限打开本地cmd,切换到pg_dump目录下

    1
    cd C:\PostgreSQL\10\bin
  • 运行

    1
    2
    pg_dump -U postgres -d postgres -f dump.sql
    # -U 后面是用户名,-d 后面是数据库名,-f 是转储数据库的文件名

    完成之后,dump.sql就在C:\PostgreSQL\10\bin文件夹下

  • dump.sql传到云主机上

    • 在云服务器终端进入home目录下

      1
      cd /home
    • 运行

      1
      2
      psql -d gismap -U postgres -f dump.sql
      # gismap是之前新建的数据库
    • 检查是否成功导入

      1
      2
      3
      4
      su postgres
      psql
      \c gismap
      select * from v6_time_cnty_pts_utf_wgs84 limit 1;

      若能查出结果,就说明成功了!

    • 一些sql语句

      1
      2
      3
      SELECT current_user;           # 查当前数据库的用户名
      SELECT current_database(); # 查当前数据库名
      SELECT version(); # 查版本
    • 退出

      1
      2
      \q                             # 退出当前用户
      exit # 退出psql

6.2 设置数据库IP连接

  • 查数据IP和端口号

    1
    SELECT inet_server_addr(), inet_server_port();

    结果是:

    1
    2
    3
    4
    5
    postgres=# SELECT inet_server_addr(), inet_server_port();
    inet_server_addr | inet_server_port
    ------------------+------------------
    |
    (1 row)

    既没有IP,也没有端口号,说明数据库连接还是UDP,还不支持IP访问。

    UDP(User Datagram Protocol)用户数据报协议,为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务。TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;UDP 具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。

  • 查看本地的端口

    1
    2
    3
    4
    cd C:\PostgreSQL\10\bin
    psql -U postgres
    输入密码
    SELECT inet_server_addr(), inet_server_port();

    结果如下,是能查到IP和端口的

    1
    2
    3
    4
    5
    postgres=# SELECT inet_server_addr(), inet_server_port();
    inet_server_addr | inet_server_port
    ------------------+------------------
    ::1 | 5432
    (1 行记录)

    在程序中,我们是通过ip连接数据库的,所以现在要做的是,设置数据库的ip连接

  • 云服务器连接数据库IP

    • 修改postgresql.conf(/home/postgresql_data路径下)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      将这段:
      #listen_addresses = 'localhost' # what IP address(es) to listen on;
      # comma-separated list of addresses;
      # defaults to 'localhost'; use '*' for all
      # (change requires restart)
      #port = 5432 # (change requires restart)

      修改为:
      listen_addresses = '*' # what IP address(es) to listen on;
      # comma-separated list of addresses;
      # defaults to 'localhost'; use '*' for all
      # (change requires restart)
      port = 5432 # (change requires restart)
    • 修改pg_hba.conf

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      将这段:
      # TYPE DATABASE USER ADDRESS METHOD
      # "local" is for Unix domain socket connections only
      local all all trust
      # IPv4 local connections:
      host all all 127.0.0.1/32 trust
      # IPv6 local connections:
      host all all ::1/128 trust
      # Allow replication connections from localhost, by a user with the
      # replication privilege.
      local replication all trust
      host replication all 127.0.0.1/32 trust
      host replication all ::1/128 trust

      修改为:
      # TYPE DATABASE USER ADDRESS METHOD
      # "local" is for Unix domain socket connections only
      local all all md5
      # IPv4 local connections:
      host all all 127.0.0.1/32 md5
      # IPv6 local connections:
      host all all ::1/128 md5
      # Allow replication connections from localhost, by a user with the
      # replication privilege.
      #local replication all md5
      #host replication all 127.0.0.1/32 md5
      #host replication all ::1/128 md5
      host all all 0.0.0.0/0 md5
    • 重启服务

      1
      systemctl restart postgresql-10

      通过navicat通过实例的公网ip连接一下数据库,能连上,说明ip设置好了

以上这些步骤是按照知乎专栏(从零开始,构建电子地图网站—-索引目录 - 知乎 (zhihu.com))实行的,但是由于我本身的电脑安装是jdk11、PostSQL12,所以云服务器安装的版本和上面的操作步骤不同下面部分是我操作过程所遇到的一些问题!



Problems(有些问题还待解决!)

1 服务器上安装PostgreSQL 12

  • 参考链接

在CentOS 7上安装&配置PostgreSQL 12 - 腾讯云开发者社区-腾讯云 (tencent.com)

CentOS7环境安装Postgresql12教程_凝望深蓝的博客-CSDN博客_centos7安装postgresql12

Centos 7 在线安装 PostgreSQL 12_蒜丶的博客-CSDN博客_centos在线安装postgresql

PostgreSQL12+PostGIS安装(一) - 简书 (jianshu.com)

PostgreSQL:修改数据库用户的密码 - 简书 (jianshu.com)

2 操作数据库

  • pg_dump转储数据库

    1
    pg_dump -U postgres -d postgres -f dump.sql

    报错:

    1
    pg_dump: 错误: 无法打开输出文件"dump.sql": Permission denied
  • 导出数据库

    1
    pg_dump -h localhost -p 5432 -U postgres -d postgres> d:\postgres.sql
  • 腾讯云运行测试数据库:

    • 导入数据库

    psql -U postgres(用户名) 数据库名(缺省时同用户名) < /data/dum.sql

    • 导出整个数据库

    pg_dump -h localhost -U postgres(用户名) 数据库名(缺省时同用户名) >/data/dum.sql

3 服务器的一些其他问题

​ 腾讯云CPU爆满:终止进程

  1. 根据分析的占用资源的进程情况,记录需要终止的进程 PID。

  2. 输入 k

  3. 输入需要终止进程的 PID ,按Enter

参考链接:云服务器 Linux 实例:CPU 或内存占用率高导致无法登录-故障处理-文档中心-腾讯云 (tencent.com)

4 截图

整个过程遇到了各种问题,有些操作过程自己也迷糊了,当时操作的时候也没有记录,只截下了部分步骤

su

image-20221126231544229

image-20221126231601483

1
Environment=PGDATA=/var/lib/pgsql/12/data/
image-20221127220854447

1
select rolname,rolpassword from pg_authid;
image-20221127225726266

image-20221128161705124

image-20221128161729907

image-20221128161748954

image-20221128161801406

image-20221128162734639

image-20221128163701418

1
10.0.16.8:5432/gismap

查看nginx配置文件

image-20221129170359969

1
2
3
thymeleaf:
check-template: false
check-template-location: false

image-20221130131255966

image-20221130131307566

image-20221130131320708