postgresql 的懵圈问题

562 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情


前言

之前用过 postgresql ,当时没注意碰到的一些问题,也没总结。

最近的一个项目又开始使用 postgresql 了。
安装使用碰到了几个懵圈的问题。
有几个问题也不是第一次碰到,但是之前没有记录下来解决方法,然后每次还要再去搜索。
还是及时记录一下,下次碰到时也能节省时间,提高效率。

问题及解决方法

  1. 备份的数据无法导入。

    不知道是步骤不对还是什么原因,用 大象 备份的数据,然后再用 大象 的 恢复 ,却恢复不了。
    找了半天也没到啥原因,也不知道该怎么操作。
    有人说命令导入可行,最后只好用命令导入数据了。

    psql -U postgres -f dump.sql
    

    指定数据库使用下面的命令

    psql -U postgres -d hello_db -f dump.sql
    
  2. 提示 找不到 psql 命令。

    用上面的命令试着导入数据,结果提示 找不到 psql 命令。
    用的是 Mac ,找到的原因是 Mac 的环境变量中没有 postgresql 。
    需要把 postgresql 的 bin 目录添加到环境变量中。
    首先要确认 postgresql 的安装位置,一般是下面的位置。

    /Library/PostgreSQL/13
    

    可以跳转到该目录确认一下:

    $ cd /Library/PostgreSQL/13
    

    不同的版本,后面的数据不同,13/14/15 这样。

    修改 Mac 环境变量的方法,网上很好找。
    添加的内容如下:

    export PATH="/Library/PostgreSQL/13/bin:$PATH"
    

    需要使环境变量生效后才能使用,生效的方法也很好找。

  3. 无法从另外一台终端连接 postgresql 。

    网上的解决方案一大堆,都是修改安装目录下的 data/pg_hba.conf 的内容,添加上允许连接的 IP 。

    允许所有 IP :

    # IPv4 local connections:
     host    all             all             0.0.0.0/0            trust
    

    允许指定 IP :

    # IPv4 local connections:
     host    all             all             192.168.9.12/32            trust
    

    不过修改这个文件时还是碰到了一个小问题,就是 Mac 下进入不到 data 目录里,用 sudo 也进不去,感觉很神奇。

    只能在 postgresql 的安装路径下执行下面的命令直接打开 data/pg_hba.conf 后再编辑。

    $ sudo vim data/pg_hba.conf
    
  4. Windows 上的 postgresql ,在 data/pg_hba.conf 中添加上了允许连接的 IP 还是不能访问。

    这个问题整得都快崩溃了,总以为哪里设置得不对。
    看了看 Windows 里的防火墙规则,也没有相关的设置。
    但是想来想去只能是防火墙屏蔽了。
    最后都快抓狂了,还是通过 添加防火墙规则 后解决的。
    做法是允许连接 postgresql 的端口,一般是 5432 。

  5. 删除了表中的数据,占用的表空间却没有减少

    查看表占用的空间大小:

    select pg_size_pretty(pg_relation_size('表名'));
    

    释放多余的表空间:

    vacuum FULL 表名;
    

    可再次执行上面的查看表占用空间的命令确认一下是否真正释放。

    下面这个链接里有更详细的说明:
    Postgresql中删除大量数据优化表空间_Hello Bug的博客-CSDN博客

  6. 函数 uuid_generate_v4() 不存在

    错误信息:

    bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: function uuid_generate_v4() does not exist
     
    nested exception is org.postgresql.util.PSQLException: ERROR: function uuid_generate_v4() does not exist
    

    原因:

    uuid_generate_v4() 是在 Postgresql 的扩展中,需要安装。

    解决方案:

    sql查询中执行

    create extension pgcrypto;
    

    然后添加 uuid 扩展

    create extension "uuid-ossp";
    

    添加完运行命令确认是否添加成功:

    select uuid_generate_v4()
    

    全过程:

    Server [localhost]:
    Database [postgres]:
    Port [5432]:
    Username [postgres]:
    psql (13.7)
    输入 "help" 来获取帮助信息.
    
    postgres=# create extension pgcrypto;
    CREATE EXTENSION
    postgres=# create extension "uuid-ossp";
    CREATE EXTENSION
    postgres=# select uuid_generate_v4();
               uuid_generate_v4
    --------------------------------------
     33780031-1cf3-49cb-80f4-e516a97a1b45
    (1 行记录)
    
    
    postgres=#
    

    如果还提示不存在,则先删除掉已有的 'pgcrypto' 和 'uuid-ossp' 扩展后,再次添加即可。