PG的物理存储结构、版本控制、空间回收

  1. PG的物理存储结构


     采用堆表的形式,区别于mysql的聚集索引组织表。


     2. PG的版本控制


实现MVCC的方法有两种:

1)写数据时,将旧数据移到一个单独的地方,比如回滚段中,从回滚段把旧数据读回来

2)写数据时,旧数据不删除,而是插入新数据,旧数据写文件。


MySQL,Oracle基本上是通过第一种方式操作,而PostGres则通过第二种操作,

针对第一种来说第二种的劣势:旧版本的数据块需要清理,旧版本的数据因为在文件中,访问可能会造成I/O及扫描更多的数据块,


优势:数据可以进行很多更新,不必担心没有回滚段或者回滚段装不下数据,

         事物回滚可以立即完成,无论事物进行了多少操作,


针对多版本并发介绍几个要的术语, 表中的隐含字段:

oid tableoid ctid xmin xmax cmin cmax 后四个字段实现控制数据行是否对用户可见


        

    

     3. 空间回收


         vacuum整理空间


       

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25380026/viewspace-2646895/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25380026/viewspace-2646895/

<think>好的,我现在需要帮助用户了解如何回收数据库中的剩余表空间。首先,用户的问题是关于回收“剩余的表空间”,这可能指的是数据库中的碎片或未使用的空间。我需要先确定用户指的是哪种数据库系统,比如Oracle、MySQL还是PostgreSQL,因为不同的数据库管理方式不同。但用户没有明确说明,所以我应该覆盖常见的情况,或者询问他们使用的数据库类型。不过用户可能没有提到,所以我需要给出一般性的建议,然后分情况讨论。 首先,我应该解释表空间的概念,表空间数据库中通常是用来存储数据的逻辑结构,物理上对应数据文件。当数据被删除或更新后,可能会留下空闲空间,这些空间可以被回收以提高性能和管理存储。 接下来,针对不同的数据库系统,我需要给出不同的方法。例如,在Oracle中,可以使用ALTER TABLE ... SHRINK SPACE命令,或者重新组织表。在MySQL的InnoDB中,可以通过OPTIMIZE TABLE来重建表,回收空间。对于PostgreSQL,可能需要使用VACUUM FULL或者pg_repack工具。 另外,用户可能遇到的场景包括:删除大量数据后,表占用的物理空间没有释放,导致磁盘浪费。这时候需要收缩表空间,但要注意锁表和性能影响,尤其是在生产环境中。 还需要提到一些注意事项,比如回收操作可能会锁定表,影响业务运行,建议在低峰期进行。另外,对于某些数据库,自动化的机制如自动扩展或自动收缩可能已经存在,需要检查配置。 可能还需要解释一些术语,比如高水位线(HWM)在Oracle中的概念,以及为什么删除数据后空间不会自动回收,因为数据库保留空间以备未来插入,避免频繁分配和释放的开销。 最后,总结步骤:确定数据库类型,选择合适的方法,执行回收操作,并注意备份和监控。同时提醒用户谨慎操作,避免数据丢失或服务中断。 现在需要将这些思路整理成结构化的回答,分点说明,确保覆盖主要数据库系统的方法,并给出注意事项和建议。</think>回收数据库中的剩余表空间通常是指释放因数据删除或更新而产生的碎片化、未利用的存储空间。以下是针对不同数据库系统的通用方法和注意事项: --- ### **一、表空间回收的核心原理** - **数据碎片**:删除或更新数据后,数据库可能保留空闲空间(碎片),以便未来快速插入新数据。 - **高水位线(HWL/HWM)**:某些数据库(如Oracle)标记已分配空间的最高点,即使下方存在空闲空间,文件大小也不会自动缩小。 - **物理文件管理**:表空间通常对应物理数据文件,直接收缩文件大小才能释放磁盘空间。 --- ### **二、常见数据库操作方法** #### **1. Oracle** - **收缩表空间**: ```sql -- 启用行移动(允许数据重组) ALTER TABLE 表名 ENABLE ROW MOVEMENT; -- 收缩表(重组数据并释放空间) ALTER TABLE 表名 SHRINK SPACE; ``` - **重建表**:通过`ALTER TABLE ... MOVE`或`DBMS_REDEFINITION`在线重定义表。 - **数据文件调整**: ```sql -- 缩小数据文件到实际需要的大小 ALTER DATABASE DATAFILE '文件路径' RESIZE 100M; ``` #### **2. MySQL (InnoDB)** - **优化表结构**: ```sql OPTIMIZE TABLE 表名; -- 重建表并释放未使用空间 ``` - **配置`innodb_file_per_table`**:确保每个表使用独立表空间(`.ibd`文件),避免共享文件难以回收。 - **手动重建表**: ```sql ALTER TABLE 表名 ENGINE=InnoDB; -- 通过引擎重建释放空间 ``` #### **3. PostgreSQL** - **VACUUM 命令**: ```sql VACUUM FULL 表名; -- 完全回收空间(需锁表,影响业务) ``` - **pg_repack 工具**:无锁表空间重组,适合生产环境。 - **调整表空间路径**:重新定位表空间并清理旧文件。 #### **4. SQL Server** - **收缩数据库文件**: ```sql DBCC SHRINKDATABASE (数据库名); -- 收缩整个数据库 DBCC SHRINKFILE (文件逻辑名); -- 收缩单个文件 ``` - **重建索引**:碎片化索引会占用额外空间,重建可优化空间使用。 --- ### **三、注意事项** 1. **锁表风险**:`OPTIMIZE TABLE`、`VACUUM FULL`等操作可能阻塞读写,建议在维护窗口执行。 2. **空间预留**:过度收缩可能导致后续插入操作频繁触发文件扩容,影响性能。 3. **备份优先**:操作前务必备份数据,避免意外丢失。 4. **监控分析**:使用工具(如Oracle的AWR报告、MySQL的`SHOW TABLE STATUS`)定期分析空间使用情况。 --- ### **四、自动化管理建议** - **定期维护任务**:设置定时任务执行`VACUUM`(PostgreSQL)或索引重建(SQL Server)。 - **合理配置参数**:例如调整InnoDB的`innodb_purge_threads`或PostgreSQL的`autovacuum`设置。 - **使用云服务工具**:AWS RDS、阿里云等提供的自动空间优化功能。 --- 若需具体数据库的详细步骤,请提供您使用的数据库类型(如Oracle、MySQL等),可进一步为您定制方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值