背景
PostgreSQL目前12版本只支持本地临时表不支持全局临时表特性,会话退出后临时表定义和数据被删除,在我们PG迁移之后业务需要用到全局临时表,为了完成这个需求,我们是采用PG的一个全局临时表插件pgtt-2.1来实现的。

全局临时表插件的安装部署
一. 安装
▼▼▼
[root@test-telepg-01 ~]#su-telepg
[telepg@test-telepg-01 ~]$cd/tmp
[telepg@test-telepg-01 tmp]$wgethttps://codeload.github.com/darold/pgtt/tar.gz/v2.1
[telepg@test-telepg-01 tmp]$tar-zxvfpgtt-2.1.tar.gz
[telepg@test-telepg-01 tmp]$cdpgtt-2.1
临时生效环境变量
▼▼▼
export POSTGRES_HOME=/app/pg/pg_2_18803/postgresql
export ORACLE_HOME=/opt/oracle/product/18c/dbhome_1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$POSTGRES_HOME/lib:$POSTGRES_HOME/lib/postgresql:$POSTGRES_HOME/plugin:$ORACLE_HOME/lib
export PROJ_LIB=”$POSTGRES_HOME/share/proj”
export PATH=$PATH:$POSTGRES_HOME/bin
编译安装
▼▼▼
[telepg@test-telepg-01 pgtt-2.1]$make
[telepg@test-telepg-01 pgtt-2.1]$makeinstall
查看三个pgtt相关文件(有证明编译安装好了,可以下一步,否则没有编译安装好,需要重新编译安装)
▼▼▼
[telepg@test-telepg-01 pgtt-2.1]$ll /app/pg/pg_2_18803/postgresql/share/postgresql/extension/pgtt*
-rw-r–r–1 telepgtelepg824 Apr2 14:47 /app/pg/pg_2_18803/postgresql/share/postgresql/extension/pgtt–2.1.0.sql
-rw-r–r–1 telepgtelepg177 Apr2 14:47 /app/pg/pg_2_18803/postgresql/share/postgresql/extension/pgtt.control
[telepg@test-telepg-01 pgtt-2.1]$ll /app/pg/pg_2_18803/postgresql/lib/postgresql/pgtt.so
-rwxr-xr-x 1 telepgtelepg43520 Apr2 14:47 /app/pg/pg_2_18803/postgresql/lib/postgresql/pgtt.so
二. 配置非超级用户使用临时表需做如下设置
▼▼▼
[telepg@test-telepg-01 pgtt-2.1]$exportlibdir=$(pg_config–pkglibdir)
[telepg@test-telepg-01 pgtt-2.1]$sudomkdir$libdir/plugins/
[telepg@test-telepg-01 pgtt-2.1]$cd$libdir/plugins/–进不去就用root用户进/app/pg/pg_2_18803/postgresql/lib/postgresql/plugins/
▼▼▼
[telepg@test-telepg-01 pgtt-2.1]$sudoln -s../pgtt.so/
[root@test-telepg-01 plugins]#ll pgtt.so lrwxrwxrwx1 rootroot10 Apr2 14:58 pgtt.so ->../pgtt.so
三. 运行单元测试用例
▼▼▼
$makeinstallcheck
四. 创建扩展插件
▼▼▼
csscyycreate extensionpgtt;
全局临时表的使用
1.创建全局临时表ONCOMMITPRESERVE
▼▼▼
CREATE/*GLOBAL*/ TEMPORARYTABLEtest(idinteger,lbltext)ONCOMMITPRESERVEROWS;
再打开一个session连接查看
▼▼▼
postgres=#setsearch_pathtopublic,pgtt_schema;SET
postgres=#ckslkslksl=>select *from test;id|lbl‐‐‐‐+‐‐‐‐‐(0 rows)
2.创建全局临时表ONCOMMITDELETE
▼▼▼
CREATE/*GLOBAL*/ TEMPORARYTABLEtest2 (idinteger,lbltext)ONCOMMITDELETEROWS;
3.删除全局临时表与删除普通表没有任何区别,需要超级用户权限
▼▼▼
ksl#load’$libdir/plugins/pgttLOAD
ksl=#droptabletest2;DROPTABLE
同时需要检查下pg_global_temp_tables表是否删除成功
select *from pg_global_temp_tableswhere relname=test2;
4.创建索引需要超级用户权限
▼▼▼
ksl=#CREATEINDEXONtest(id);CREATEINDEX
5. 添加约束
▼▼▼
ksl=>load$libdir/plugins/pgtt’LOADCREATE/*GLOBAL*/ TEMPORARYTABLEtest3(c1serialPRIMARYKEY,c2VARCHAR(50)UNIQUENOTNULL,c3booleanDEFAULTfalse);但不支持外键(也不支持分区表)
总结
普
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6039.html
