IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【PostgreSQL】PG_DUMP的文件大小元小于库占用物理空间统计 -> 正文阅读

[大数据]【PostgreSQL】PG_DUMP的文件大小元小于库占用物理空间统计

PG_DUMP的文件大小元小于库占用物理空间统计

现象描述

使用pg_dump做pg库备份的时候,发现导出的数据量大小远小于统计出来的占用空间大小:

spark_db=# select pg_size_pretty(pg_database_size('spark_db'));      
 pg_size_pretty 
----------------
 19 GB
(1 row)

接下来是pg_dump出来的数据量大小:

[postgres@gsqzj11184 ~]$ pg_dump -h127.0.0.1 -p5832 -Upostgres spark_db -f /tmp/spark.sql
Password: 
[postgres@gsqzj11184 ~]$ du -sh /tmp/spark.sql 
626M    /tmp/spark.sql

问题复现

创建一个测试库dump_test:

create database dump_test;
/ ======================================
postgres=# \l
                                  List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
------------+----------+----------+-------------+-------------+-----------------------
 dump_test  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 promanager | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
            |          |          |             |             | postgres=CTc/postgres+
            |          |          |             |             | prom=CTc/postgres
 template0  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres
 template1  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres

创建测试表t1并插入测试数据:

postgres=# \c dump_test 
You are now connected to database "dump_test" as user "postgres".
dump_test=# create table t1(id int);
CREATE TABLE
dump_test=# insert into t1 select generate_series(1,400000000);
INSERT 0 400000000
dump_test=# 

查看数据库物理空间大小,此时是14个G:

dump_test=# select pg_size_pretty(pg_database_size('dump_test'));
 pg_size_pretty 
----------------
 14 GB
(1 row)

接下来模拟日常对数据库进行频繁删除的情况,这里直接删除大量数据,大小并没有发生变化:

dump_test=# delete from t1 where id <> 40000000;
DELETE 399999999
dump_test=# select pg_size_pretty(pg_database_size('dump_test'));
 pg_size_pretty 
----------------
 14 GB
(1 row)

此时表中也只有1条数据:

dump_test=# select count(1) from t1;
 count 
-------
     1
(1 row)

此时使用pg_dump备份数据,查看大小,只有4.0K:

[root@vmax67029 ~]# pg_dump -h127.0.0.1 -p5832 -Upostgres dump_test -f /tmp/dump_test.sql
Password: 
[root@vmax67029 ~]# du -sh /tmp/dump_test.sql 
4.0K    /tmp/dump_test.sql

查看t1表的大小,是不是没有变化:

dump_test=# SELECT table_schema , table_name AS table_full_name, pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables 
 where table_name ='t1'
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;
 table_schema | table_full_name | size  
--------------+-----------------+-------
 public       | t1              | 14 GB
(1 row)

也就是说,数据虽然删除了,但是统计出来的大小依旧存在,这就是因为触发了高水位,简单来说就是插入1-1000的数据,删除了1-999,这部分空间不会马上释放。

接下来手动做表收缩:

dump_test=# vacuum full t1;
VACUUM
dump_test=# SELECT table_schema , table_name AS table_full_name, pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables 
 where table_name ='t1'
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;
 table_schema | table_full_name |    size    
--------------+-----------------+------------
 public       | t1              | 8192 bytes
(1 row)

再次查看表的大小,只有8192 bytes大小了,而在备份出来的sql文件中,也是只有一条和库内一样的数据:

COPY public.t1 (id) FROM stdin;
40000000
\.

结论

pg_dump备份的数据不会考虑高水位,因此远小于pg内查出来的空间大小是正常的,并不会造成数据丢失。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:35:41  更:2022-09-21 00:39:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:56:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码