暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL16新特性之pg_dump增强

pg_dump是我们在使用PostgreSQL时常用的数据导出和逻辑备份工具,PostgreSQL16对pg_dump进行了一系列增强,主要体现在:

对子表和分区表的支持

pg_dump添加了导出子表和分区的功能。
新增了如下选项:

  • —table-and-children=PATTERN 导出指定表,包括子表和分区表

  • —exclude-table-and-children=PATTERN 不导出指定表,子表和分区表也不导出

  • —exclude-table-data-and-children=PATTERN 不导出指定表的数据,子表和分区表也不导出

示例:

  1. #创建相关表

  2. dump1=# CREATE TABLE person (

  3. dump1(# id serial PRIMARY KEY,

  4. dump1(# first_name text,

  5. dump1(# last_name text

  6. dump1(# );

  7. CREATE TABLE

  8. dump1=# CREATE TABLE employee (

  9. dump1(# employee_id serial PRIMARY KEY,

  10. dump1(# salary int

  11. dump1(# ) INHERITS (person);

  12. CREATE TABLE


  13. #插入测试数据

  14. dump1=# insert into person(first_name, last_name) values('张','三');

  15. INSERT 0 1

  16. dump1=# insert into person(first_name, last_name) values('李','四');

  17. INSERT 0 1

  18. dump1=# select * from person;

  19. id | first_name | last_name

  20. ----+------------+-----------

  21. 1 | |

  22. 2 | |

  23. (2 rows)

  24. dump1=# insert into employee(first_name, last_name, salary) values('王','五', 3000);

  25. INSERT 0 1

  26. dump1=# select * from employee;

  27. id | first_name | last_name | employee_id | salary

  28. ----+------------+-----------+-------------+--------

  29. 3 | | | 1 | 3000

  30. (1 row)


  31. #使用pg_dump导出person的数据

  32. pg_dump -U postgres -d dump1 --table-and-children=person > /data/backup/postgres/person.sql


  33. #恢复数据

  34. postgres=# create database restore3;

  35. CREATE DATABASE


  36. $ psql -U postgres restore3 < /data/backup/postgres/person.sql

  37. SET

  38. SET

  39. SET

  40. SET

  41. SET

  42. set_config

  43. ------------


  44. (1 row)


  45. SET

  46. SET

  47. SET

  48. SET

  49. SET

  50. SET

  51. CREATE TABLE

  52. ALTER TABLE

  53. CREATE TABLE

  54. ALTER TABLE

  55. CREATE SEQUENCE

  56. ALTER SEQUENCE

  57. ALTER SEQUENCE

  58. CREATE SEQUENCE

  59. ALTER SEQUENCE

  60. ALTER SEQUENCE

  61. ALTER TABLE

  62. ALTER TABLE

  63. ALTER TABLE

  64. COPY 1

  65. COPY 2

  66. setval

  67. --------

  68. 1

  69. (1 row)


  70. setval

  71. --------

  72. 3

  73. (1 row)


  74. ALTER TABLE

  75. ALTER TABLE


  76. #验证恢复结果

  77. postgres=# \c restore3

  78. You are now connected to database "restore3" as user "postgres".

  79. restore3=# \d

  80. List of relations

  81. Schema | Name | Type | Owner

  82. --------+--------------------------+----------+----------

  83. public | employee | table | postgres

  84. public | employee_employee_id_seq | sequence | postgres

  85. public | person | table | postgres

  86. public | person_id_seq | sequence | postgres

  87. (4 rows)


  88. restore3=# select * from employee;

  89. id | first_name | last_name | employee_id | salary

  90. ----+------------+-----------+-------------+--------

  91. 3 | | | 1 | 3000

  92. (1 row)


  93. #可以看到子表也被导出和恢复了

增加新的压缩方式

PostgreSQL16中pg_dump的-Z选项新增了lz4和zstd压缩算法,压缩效率得到了提升。
示例:

  1. pg_dump -U postgres -d dump1 -F p --compress=lz4 -f /data/backup/postgres/dump1_lz4

  2. pg_dump -U postgres -d dump1 -F p --compress=zstd -f /data/backup/postgres/dump1_zstd

  3. #注意:需要在configure时指定--with-lz4和--with-zstd选项,否则会提示如下错误

  4. pg_dump: error: invalid compression specification: this build does not support compression with LZ4


  5. #初始化1000万数据进行导出操作

  6. dump1=# create table mytb1(id int, name varchar(30));

  7. CREATE TABLE

  8. dump1=# insert into mytb1 values(generate_series(1, 10000000), 'aaAA123..');

  9. INSERT 0 10000000


  10. cd /data/backup/postgres/

  11. # du -sh *

  12. 24M dump1_gzip

  13. 41M dump1_lz4

  14. 171M dump1_uncompress

  15. 4.0M dump1_zstd


  16. #我们可以看到在不同的压缩模式下,不同的的压缩算法的压缩效率各不相同,其中新增的zstd的压缩效率最高

增加压缩长模式支持

PostgreSQL16中pg_dump的增加了long模式的支持
示例

  1. pg_dump -U postgres -d dump1 -F p --compress=zstd:long -f /data/backup/postgres/dump1_long

  2. 长模式可以提高压缩比,但代价是增加了内存使用。


  3. #查看导出文件

  4. # du -sh *

  5. 24M dump1_gzip

  6. 3.9M dump1_long

  7. 41M dump1_lz4

  8. 171M dump1_uncompress

  9. 4.0M dump1_zstd

  10. # 可以看到使用long模式的压缩比更大,这里提升有限可能是与我们文本本身大小的基数较小有关,生产环境可能提升更大。

增加更多的压缩级别

PostgreSQL16中pg_dump可以拥有更多的压缩级别,如—compress=lz4:1。

示例:

  1. #级别1

  2. pg_dump -U postgres -d dump1 -F p --compress=lz4:1 -f /data/backup/postgres/dump1_lz4_lv1


  3. #级别9

  4. pg_dump -U postgres -d dump1 -F p --compress=lz4:9 -f /data/backup/postgres/dump1_lz4_lv9

  5. #某些压缩算法的级别是确定的,如gzip一共有1-9九个级别,如果我们使用其他级别,则会得到一个报错

  6. $ pg_dump -U postgres -d dump1 --compress=gzip:10 -F c -f /data/backup/postgres/dump_lv10.dmp

  7. pg_dump: error: invalid compression specification: compression algorithm "gzip" expects a compression level between 1 and 9 (default at -1)


  8. #级别越高,压缩比越高,但是可能也更耗时和占用更多资源,我们查看压缩后的文件

  9. du -sh dump1_lz4_lv*

  10. 41M dump1_lz4_lv1

  11. 39M dump1_lz4_lv9


  12. # 压缩时间测试

  13. # level 1

  14. date ; pg_dump -U postgres -d dump1 -F p --compress=lz4:1 -f /data/backup/postgres/dump1_lz4_lv1;date

  15. Thu Mar 14 20:14:43 CST 2024

  16. Thu Mar 14 20:14:47 CST 2024


  17. #level 9

  18. date ; pg_dump -U postgres -d dump1 -F p --compress=lz4:9 -f /data/backup/postgres/dump1_lz4_lv9; date

  19. Thu Mar 14 20:14:57 CST 2024

  20. Thu Mar 14 20:15:14 CST 2024


  21. #可以看到level 1的压缩级别只需要4s,而level 9的压缩级别需要多达17s



文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论