文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

pg_repack

pg_repack简介

插件pg_repack用于在线清理表空间,有效解决因对全表大量更新等操作引起的表膨胀问题。pg_repack无需获取排它锁,相比CLUSTER或VACUUM FULL更加轻量化。


pg_repack安装

手动安装

  1. 访问MogDB下载页面,下载所需版本的pg_repack插件。

  2. 解压插件包,例如:

    tar -xzvf pg_repack-1.4.6-3.1.0-01-CentOS-x86_64.tar.gz
  3. 进入插件所在目录下,执行make install命令。

    cd pg_repack/
    make install

PTK安装

参见插件安装


pg_repack参数说明

  • -d dbname

    数据库名

  • -h test.repack_test -h hostip

    服务端IP地址

  • -U user

    用户名

  • -p port

    端口号

  • -w, --no-password

    不提示密码

  • -W, --password

    强制提示密码

  • -a, --all

    repack所有库里的所有表和索引

  • -t, --table=TABLE

    repack指定的单个表

  • -I, --parent-table=TABLE repack

    指定的父表和继承该父表的所有子表

  • -c, --schema=SCHEMA repack

    指定schema下的所有表和索引

  • -s, --tablespace=TBLSPC

    把repack的多个或单个表迁到指定表空间

  • -S, --moveidx

    把repack的索引迁移到指定表空间

  • -o, --order-by=COLUMNS

    用order by columns替换cluster keys

  • -n, --no-order

    执行vacuum full替换cluster

  • -N, --dry-run

    输出repack执行了所有内容

  • -j, --jobs=NUM

    指定并发job数量。如果在处理索引时,插件会根据表的索引数量与-j指定的并发数量,取其中最小值来作为实际的并发job数量。

  • -i, --index=INDEX

    处理指定的索引

  • -x, --only-indexes

    只处理指定表的所有索引

  • -T, --wait-timeout=SECS

    设置后台冲突的生命周期,当有冲突时,超过指定时间只直接结束程序(单位秒)

  • -D, --no-kill-backend

    当插件执行超时,不杀死其他后台进程和线程。

  • -Z, --no-analyze

    在repack处理完表后,不执行analyze table操作

  • -k, --no-superuser-check

    在客户端中跳过超级用户的检查

  • -C, --exclude-extension

    不repack那些属于指定extension的表

  • -e, --echo

    输出插件pg_repack执行的所有sql语句

  • -E, --elevel=LEVEL

    输出对应的日志级别(debug,warning等)

  • --help

    显示帮助信息

  • --version

    输出版本信息


pg_repack使用示例

  1. 连接数据库并且创建用户。

    gsql -r
    CREATE USER test PASSWORD 'Test123456' login sysadmin;
  2. 在SQL端执行:

    CREATE EXTENSION pg_repack;
  3. 在数据库中创建repack_test表,必须包含主键。

    CREATE TABLE repack_test(id int primary key, name name);
  4. 检查pg_repack是否创建成功。

    \dx
  5. 在repack_test表中插入2000000条数据。

    INSERT INTO repack_test SELECT generate_series(1,2000000),'a';
  6. 查询表repack_test的大小。

    SELECT pg_size_pretty(pg_relation_size('repack_test'));

    回显如下:

     pg_size_pretty
    ----------------
     193 MB
    (1 row)
  7. 删除部分数据,然后查询表大小。

    MogDB=> DELETE FROM repack_test WHERE id>1000000;
    DELETE 1000000
    MogDB=> SELECT pg_size_pretty(pg_relation_size('repack_test'));
     pg_size_pretty
    ----------------
     193 MB
    (1 row)

    删除1000000条数据成功之后,可以看表大小并没有改变。这时需要使用pg_repack工具。

  8. 退出数据库,使用pg_repack工具清理表空间。

    pg_repack -d postgres -t test.repack_test -h 127.0.0.1 -U test -p 5001

    回显如下:

    INFO: repacking table "repack_test"
    WARNING:  Trigger function with non-plpgsql type is not recommended.
    DETAIL:  Non-plpgsql trigger function are not shippable by default.
    HINT:  Unshippable trigger may lead to bad performance.
    NOTICE: Waiting for 1 transactions to finish. First PID: 22534796859136
    NOTICE: Waiting for 1 transactions to finish. First PID: 22534796859136
    NOTICE: Waiting for 1 transactions to finish. First PID: 22534796859136
    INFO: repacking table "repack_test" End.
  9. 在SQL端查看repack_test表大小,表空间释放成功。

    MogDB=> SELECT pg_size_pretty(pg_relation_size('repack_test'));
     pg_size_pretty
    ----------------
     96 MB
    (1 row)
Copyright © 2011-2024 www.enmotech.com All rights reserved.