Chapter 21. �ճ����ݿ�ά������

Table of Contents
21.1. �ճ�����
21.1.1. �ָ����̿ռ�
21.1.2. ���¹滮��ͳ��
21.1.3. �������� ID �ص���ɵ�����
21.2. �����ؽ�����
21.3. ��־�ļ�ά��

Ϊ�˱�������װ�� PostgreSQL ������ƽ������, ���DZ�����һЩ�ճ��Ե�ά���������������������۵���Щ�������Ǿ����ظ������飬 ���Ժ����׵�ʹ�ñ�׼�� Unix ���ߣ�����cron �ű���ʵ�֡� ���������ú��ʵĽű��Լ���������Ƿ�ɹ�ִ���������ݿ����Ա�����Σ�

һ�������Ե�ά���������Ǿ����Եش������ݵı��ݿ����� ���û������ı��ݣ���ô���û�д������лָ��Ļ��ᣨ������̻��ˣ�ʧ����ɾ�˱�ȵȣ��� ������PostgreSQL ����ʹ�õı��ݺͻָ������� Chapter 22 �����бȽ���ϸ�����ۡ�

������Ҫ��ά������Ĺ������������Ե� "vacuuming" ���������ݿ⡣ ������������� Section 21.1�����ۡ�

������Ҫ������ע��Ķ�������־�ļ��Ĺ��� ������ Section 21.3 ��������������⡣

PostgreSQL ���������ݿ��Ʒ�Ƚ������ǵ�ά�����ġ� ���ǣ��ʵ�����Щ�����Ϸ�һЩע�⽫�����ܹ�ȷ�����ǵ���칤���ͻ�ȡ�����ϵͳ���г�Ч�ľ��顣

21.1. �ճ�����

�������¼���ԭ�򣬱������������� PostgreSQL �� VACUUM �����

  1. �ָ���Щ���Ѹ��µĻ���ɾ������ռ�ݵĴ��̿ռ䣮

  2. ���� PostgreSQL ��ѯ�滮��ʹ�õ�����ͳ����Ϣ��

  3. ������Ϊ���� ID �ص���ɵ��Ͼ����ݵĶ�ʧ��

������ÿ���������� VACUUM ������Ƶ�ʺͷ�Χ�� ��ͬ�Ľڵ����ͬ����ˣ����ݿ����Ա���������Щ���Ⲣ�� ���������ʵ�ά�����ԣ����ڵ��ص�ͷ��ڽ�����Щ�߼�������⣻ ���������﷨��ϸ�ڣ������ VACUUM �����ֲ�ҳ��

�� PostgreSQL 7.2 ��ʼ�� VACUUM �ı�׼��ʽ���Ժ���ͨ�����ݿ���� ��selects, inserts, updates, deletes, ��������������޸ģ��� ����ճ�������Ҳ��������ǰ�İ汾�������и����ԣ� Ҳ������ô�ر�Ҫ������ÿ��ĵ�ʹ�õ�ʱ������У�

�� PostgreSQL 8.0 ��ʼ����һЩ���ò����������ã� ������һ����С�������ĵ�����Ӱ�졣���� Section 16.4.3.4��

21.1.1. �ָ����̿ռ�

�������� PostgreSQL ����� ��һ�е�UPDATE��DELETE��δ����ɾ���ɰ汾�������С� ����������ڻ�ȡ��汾���п��Ƶĺô��DZ�Ҫ�ģ����� Chapter 12���� ���һ���еİ汾���п��ܱ��������񿴵�����ô��Ͳ���ɾ������ ��������󣬲������κ�����Թ��ڵĻ����Ѿ�ɾ����Ԫ�����Ȥ�� ����ռ�ݵĿռ����Ϊ��Щ�µ�Ԫ��ʹ�ö����գ� �Ա���Դ��̿ռ�����������ֹ�������������ͨ������ VACUUM ʵ�ֵġ�

�����ԣ���Щ�������»���ɾ��Ԫ��ı���Ҫ����Щ���ٸ��µı�����ĸ�Ƶ��һЩ�� ���ԣ�����һ�������Ե� cron ���� VACUUM ��Щѡ���ı���������Щ�Ѿ�֪���仯�Ƚ��ٵı� �������ֻ������ӵ�д�������Ƶ���ı�ʹ������ٸ��µı��ʱ�������� — ����һ��С��Ķ��⿪��������ֵ�õ��ģ�

VACUUM �������������֡���һ����ʽ������"���� vacuum"����ֻ�� VACUUM�� �ڱ�������б�ǹ��ڵ�����Ϊ����ʹ�ã���������ͼ�����ָ���Щ��������ʹ�õĿռ䡣 ��ˣ����ļ�������С�������κ��ļ���û��ʹ�õĿռ䶼���᷵�ظ�����ϵͳ�� ������ֵ� VACUUM ���Ժ�ͨ�������ݿ��������ִ�С�

�ڶ�����ʽ�� VACUUM FULL ��� �����ʽʹ��һ�ָ��Ӽ������㷨���ָ����ڵĵ��а汾ռ�ݵĿռ䡣 �κ� VACUUM FULL �ͷŵĿռ䶼�������ظ�����ϵͳ�� ���ǣ������ʽ�� VACUUM �����ڽ��� VACUUM FULL һ�����ʱ��������Ҫ��һ���������� ��ˣ�����ʹ�� VACUUM FULL ��Բ������ݿ��ѯ���ŷdz�����Ӱ�졣

��׼��ʽ�� VACUUM ���ʺ�����ά���൱�̶ȵĴ����������ȶ�״̬�� �������Ҫ�Ѵ��̿ռ�黹������ϵͳ����ô�����ʹ�� VACUUM FULL — ��������ͷŵĴ��̿ռ��ֻ�ܿ��ٴα������������� ���ά������Ƶ���ı���ô�е�Ƶ�ʵĶ�α�׼ VACUUM ���з����Ⱥܵ�Ƶ�ʵ� VACUUM FULL ���á�

���ڴ�����ڵ���ԣ������Ƽ���ϰ������һ���еĵ�ʹ�õ�ʱ�ΰ���һ���������ݿ�� VACUUM�� ��Ҫʱ��ӶԸ���Ƶ���ı�ĸ����������� ����Щ�����£�����Щ���·dz�Ƶ���ı���ܻ�ÿ�����Ӿ� VACUUM һ�Ρ��� �����ļ�Ⱥ���ж�����ݿ⣬�����Ƕ�ÿ�����������vacuumdb �ű����ܻ�����æ��

��ʾ: contrib/pg_autovacuum �������ڸ�Ƶ�ʵ����������

�����֪���Լ���ɾ����һ�����д󲿷ֵ��У���ô���ǽ���ʹ��VACUUM FULL�� �����ñ���ȶ�̬�ߴ������ΪVACUUM FULL���������Եķ�����������С�� �ճ��Ĵ��̿ռ�������ʹ�� VACUUM�������� VACUUM FULL��

�������һ�����������ݾ�������ȫɾ������ô���Կ����� TRUNCATE�������Ǻ������ VACUUM �� DELETE�� TRUNCATE ����ɾ������������ݣ� ����Ҫ������ VACUUM ����VACUUM FULL ���ָ�����û���õĴ��̿ռ䡣

21.1.2. ���¹滮��ͳ��

PostgreSQL �IJ�ѯ�滮������һЩ�йر����ݵ�ͳ����Ϣ����Ϊ��ѯ���ɺõĹ滮�� ��Щͳ����ͨ��ANALYZE �����õģ������ֱ�ӵ���������� Ҳ���԰������� VACUUM ���һ����ѡ���������á� ӵ�к���׼ȷ��ͳ���Ƿdz���Ҫ�ģ�����ѡ���˶��ӵĹ滮�ܿ��ܽ������ݿ�����ܡ�

��Ϊ�˻��տռ�������һ������������ͳ����ϢҲ�ǶԸ���Ƶ���ı�����á� ��������ʹ�Ǹ��·dz�Ƶ���ı�����������ݵ�ͳ�Ʒֲ����������ı䣬��ôҲ����Ҫ����ͳ����Ϣ�� һ���򵥵�Ĵָ���ɾ�����������ֶε�������Сֵ�ı�ķ��ȡ� ���磬һ�������и���ʱ��� timestamp �ֶν��������е�׷�Ӻ͸����ȶ��������ֵ�ģ� �������ֶο�����Ҫ����Щ����������վ�� URL ���ֶθ�Ƶ��һЩ����ͳ����Ϣ�� ��Щ URL �ֶο��ܸı��һ��Ƶ������������ֵ��ͳ�Ʒֲ��ĸı����Ҫ�����öࡣ

���ǿ������ض��ı������DZ����ض����ֶ������� ANALYZE�� ����������Ӧ��������Ļ��������ǿ��Զ�ijЩ��Ϣ���µñ�������Ϣ��Ƶ���ġ� ��������ʵ���У�������������������ֵ�û��ɵġ� �� PostgreSQL 7.2 ��ʼ�� ANALYZE ��һ���൱��IJ�������ʱ�ڴ����Ҳ�ܿ죬 ��Ϊ��ʹ����ͳ��ѧ�ϵ���������ķ��������в����� �����ǰ�ÿһ�ж���ȡ��������ˣ�ÿ��һ��ʱ����������ݿ�����һ������������ܸ��򵥡�

��ʾ: ������ ANALYZE ���ֶν����ھ�ķ�ʽ���ܲ��Ǻ�ʵ�ã� ������ܻ��ǻᷢ��ֵ�ð��ֶζ� ANALYZE �ռ���ͳ����Ϣ����ϸ������е����� ��Щ������WHERE�Ӿ���ʹ�õ��ֶ�����зdz�����������ݷֲ��� ��ô�Ϳ�����Ҫ�������ֶθ�ϸ�µ�����ͼ������ ALTER TABLE SET STATISTICS��

���ǶԴ�����ڵ㶼������ÿ��ĵ�ʹ��ʱ�ΰ���һ�����ݿⷶΧ�� ANALYZE�� ������������Ч�غ�ÿ��� VACUUM �����һ�� �����������Щ��ͳ����Ϣ�ı���Ի����Ľڵ���ܻ���ڿ��ţ� ������һЩ�� ANALYZE Ҳ�㹻�ˡ�

21.1.3. �������� ID �ص���ɵ�����

PostgreSQL �� MVCC �������������ڱȽ����� ID(XID)����ֵ�� һ�����д��ڵ�ǰ����� XID �IJ��� XID ���а汾��"����δ����"�� ���Ҳ�ӦΪ��ǰ����ɼ���������Ϊ���� ID �Ĵ�С���ޣ�������д��Щ��ʱ���� 32 λ�������һ�μ�Ⱥ������е�ʱ��ܳ������� 4 ǧ�״����񣩣� ��ô����Ҫ�ܵ����� ID �ص�����ĥ��XID �������ص���λ�� Ȼ��ͻȻ��������ǰ������ͱ�ɿ���ȥ���ڽ����� --- ����ζ�����ǵ��������ÿɼ��� �����֮�����µ����ݶ�ʧ����ʵ����������Ȼ���������������޷���ȡ���ݣ���ô˵Ҳֻ�������ֻ�����

�� PostgreSQL 7.2 ֮ǰ�� ���� XID �ص���Ψһ�취��������ÿ4ǧ�������������һ��initdb�� ���������Ը������Ľڵ���Ե�Ȼ�������������������������������˸��õķ����� �µķ�������ij����������Ȼ��������״̬������Ҫ initdb �����κ����͵������� ���۾�������������ά��Ҫ�� ���ݿ��е�ÿ����������ÿʮ�ڴ���������������һ�� ��

��ʵ�ʽǶȳ��������Ҫ����һ���ܷ��ص�Ҫ�� ������Ϊ�������û���������Ҫ��ĺ����ȫ�����ݵĶ�ʧ�����������Ǵ��̿ռ���˷ѻ������ܵ��½����� ����������һЩ����Ķ������������ݿ����Ա�������ϴ�VACUUM ������ʱ�䡣����ʣ��IJ��ָ�����Щϸ�ڡ�

XID �Ƚϵ��·����������������� XID������ 1 �� 2 ��BootstrapXID �� FrozenXID���� ������ XID ���DZ���Ϊ���κ���ͨ�� XID �ɡ���ͨ�� XID����Щ���� 2 �ģ�ʹ��ģ-231������бȽϡ� �����ζ�Ŷ���ÿ����ͨ�� XID�������ж�ʮ�ڸ� XID ��"����"�Լ���ʮ�ڸ� XID"����"�� ��������˼������һ����������ͨ�� XID �ռ���û���յ�Ļ��� ��ˣ�һ��һ��Ԫ������ض�����ͨ XID ������������ô��Ԫ�� �����Ժ�Ķ�ʮ�ڴ������б��ֵ���"�ڹ�ȥ"������������˵�����ĸ���ͨ XID�� �����Ԫ���ڳ�����ʮ�ڴ�����֮����Ȼ���ڣ� ��ô���ͻ�ͻȻ����ڽ�����Ԫ�顣Ϊ�˱������ݶ�ʧ���ϵ�Ԫ������ڵ����ʮ�ڴ����������֮ǰ��ij��ʱ���� XID FrozenXID�� һ�������������������� XID����ô������������ͨ������ǰ����Ϊ "�ڹ�ȥ"������������ ID �Ƿ��ص��� ���������Ԫ��ֱ��ɾ��֮ǰ������ã�����Ҫ����೤ʱ�䣮��� XID �����¸�ֵ��VACUUM ���Ƶģ�

VACUUM �����������Ǹ��κ�����ͨ XID �г���ʮ�ڴ��ѹ�ȥ�����а汾���¸�ֵΪ FrozenXID�� ������Ա�����ԭ���IJ��� XID ֱ������ֵ�������˸���ȤΪֹ�� ��ʵ���ϣ�������а汾�������ڻ�û��"����"֮ǰ���������������ˣ��� ����������£��κα������� VACUUM ����֮������İ�ȫ�����ʮ�ڴ����� �����ȵ�ʱ���������ô���Ϳ��ܾͻ���һ�������ϵ��а汾�����¸�ֵʱ��ɱȶ�ʮ�ڴ�������ϣ� ������ص�����δ�� — Ҳ����˵����ʧȥ���ˡ�����Ȼ�����������ʮ�ڴ�����֮������³��֣���������Ҳ�޼����¡���

��Ϊ�����ԭ��������Ҫ�����Ե����� VACUUM�� ���Ժ������ĸ���ᵽʮ�ڴ�����û������������ǣ�Ϊ�˰�������Աȷ�����������Ҫ�� VACUUM ��ϵͳ��pg_database ��洢������ ID ͳ�ơ� ������һ�����ݿ�� pg_database ���е� datfrozenxid �ֶ����κ����ݿⷶΧ�� VACUUM ������Ҳ����û�������κα��VACUUM��֮�󽫻ᱻ���¡� ����ֶ���洢����ֵ�Ǹ� VACUUM ����ʹ�õĶ�����ֹ�� XID�� ϵͳ��֤�ڸ����ݿ������б������ֹ XID �ϵ���ͨ XID ���� FrozenXID ���档 ��������Ϣ��һ�������ķ�����ִ������IJ�ѯ

SELECT datname, age(datfrozenxid) FROM pg_database;

age �ֶ����ڲ�������ֹ XID ����ǰ����� XID ����Ŀ��

ʹ�������ֱ�׼�Ķ�����ԣ���һ��������������ݿ���ԣ� age �ֶν���ʮ�ڴ���ʼ����age�����ʮ�ڴε�ʱ�� ���ݿ�����ٴ������Ա��������ʶ�ص���ɵ����⡣ ���ǽ���IJ���������ÿ���ʮ�ڴΣ�5�ڴΣ����� VACUUM һ�����ݿ⣬ �����Ϳ��Ա�֤�㹻�İ�ȫ�߽緶Χ��Ϊ�˰��������������� ������κ� pg_database ��¼��ʾ������15�ڴ������ age�� ��ôÿ�����ݿⷶΧ��VACUUM �����Զ�����һ�����棬���磺

play=# VACUUM;
WARNING:  Some databases have not been vacuumed in 1613770184 transactions.
        Better vacuum them within 533713463 transactions,
        or you may have a wraparound failure.
VACUUM

���� FREEZE ѡ��� VACUUM ʹ���˸��󵨵Ķ�����ԣ� ����а汾�Ѿ��ϵñ����д򿪵������������õģ� ��ô�Ͷ����ᣮ�ر��������һ�����е����ݿ������� VACUUM FREEZE����ô�ͱ�֤�����ݿ����������а汾�������ᡣ ��ˣ�ֻҪ�����ݿ�û�������ı仯����ô���Ͳ���Ҫ�����������Ա������� ID �ص����⡣ ������ɱ� initdb ����׼�� template0���ݿ⡣ ����ҲӦ������������������� pg_database�������� datallowconn = false�����ݿ���г�ʼ���� ��Ϊ���ǻ�û���κα����ķ��� VACUUM һ�����޷����ӵ����ݿ⡣ ��ע�⣬VACUUM ��������Щpg_database ��¼���� datallowconn = false �������й�δ�������ݿ���Զ�������Ϣ�� �Ա������������Щ���ݿ����ٵľ�����Ϣ�� ��ˣ�ȷ�����������ݿ������������������Ρ�

Warning

Ҫ��ȷ�����������ص������⣬ ���DZ�������ÿʮ�ڴ���������һ��ÿ�����ݿ��е�ÿ��������ϵͳ�� �����Ѿ��й���Ϊû�����������ݿⷶΧ�� vacuum �����ֻ�������û��Լ���Ծ���û�������µ����ݶ�ʧ�����ӡ� ֻ�����û����ݱ���ȥ���У���ֻ��һ��ʱ������ˡ�