如何删除 pgstatspack 中超过 15 天的快照?
How to delete older than 15 days snapshots in pgstatspack?
这是 delete.sh 的样子:
#!/bin/bash
#db call to get database name
PSQL="psql -q"
pushd `dirname [=10=]`
for dbname in `$PSQL -t -f "../sql/db_name.sql"`
do
echo "Results for database ${dbname}"
$PSQL -d "${dbname}" -c "select pgstatspack_delete_snap ();"
echo ""
echo ""
done
popd
我在哪里指定应该删除快照的天数?
http://pgfoundry.org/frs/?group_id=1000375
pgstatspack_version_2.3.1.tar.gz 有 pgstatspack\sql\pgstatspack_delete_old_stats.sql
和:
CREATE OR REPLACE FUNCTION pgstatspack_delete_snap () returns varchar(512) AS $$
DECLARE
old_snap_time TIMESTAMP;
old_snap_id BIGINT;
message VARCHAR(512);
BEGIN
SELECT current_timestamp - interval '30 days' INTO old_snap_time;
SELECT max(snapid) INTO old_snap_id FROM pgstatspack_snap WHERE ts < old_snap_time;
SELECT 'Deleted '||count(snapid)||' snapshots older than '||old_snap_time
INTO message
FROM pgstatspack_snap
WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_snap WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_database WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_tables WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_indexes WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_sequences WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_settings WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_statements WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_bgwriter WHERE snapid <= old_snap_id;
RETURN message;
END;
$$ LANGUAGE plpgsql;
所以只需创建您的函数:
CREATE OR REPLACE FUNCTION pgstatspack_delete_snap (_d interval default '30 days') returns varchar(512) AS $$
DECLARE
old_snap_time TIMESTAMP;
old_snap_id BIGINT;
message VARCHAR(512);
BEGIN
SELECT current_timestamp - _d INTO old_snap_time;
SELECT max(snapid) INTO old_snap_id FROM pgstatspack_snap WHERE ts < old_snap_time;
SELECT 'Deleted '||count(snapid)||' snapshots older than '||old_snap_time
INTO message
FROM pgstatspack_snap
WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_snap WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_database WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_tables WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_indexes WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_sequences WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_settings WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_statements WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_bgwriter WHERE snapid <= old_snap_id;
RETURN message;
END;
$$ LANGUAGE plpgsql;
并将其命名为:
$PSQL -d "${dbname}" -c "select pgstatspack_delete_snap ('15 days');"
这是 delete.sh 的样子:
#!/bin/bash
#db call to get database name
PSQL="psql -q"
pushd `dirname [=10=]`
for dbname in `$PSQL -t -f "../sql/db_name.sql"`
do
echo "Results for database ${dbname}"
$PSQL -d "${dbname}" -c "select pgstatspack_delete_snap ();"
echo ""
echo ""
done
popd
我在哪里指定应该删除快照的天数?
http://pgfoundry.org/frs/?group_id=1000375
pgstatspack_version_2.3.1.tar.gz 有 pgstatspack\sql\pgstatspack_delete_old_stats.sql
和:
CREATE OR REPLACE FUNCTION pgstatspack_delete_snap () returns varchar(512) AS $$
DECLARE
old_snap_time TIMESTAMP;
old_snap_id BIGINT;
message VARCHAR(512);
BEGIN
SELECT current_timestamp - interval '30 days' INTO old_snap_time;
SELECT max(snapid) INTO old_snap_id FROM pgstatspack_snap WHERE ts < old_snap_time;
SELECT 'Deleted '||count(snapid)||' snapshots older than '||old_snap_time
INTO message
FROM pgstatspack_snap
WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_snap WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_database WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_tables WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_indexes WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_sequences WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_settings WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_statements WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_bgwriter WHERE snapid <= old_snap_id;
RETURN message;
END;
$$ LANGUAGE plpgsql;
所以只需创建您的函数:
CREATE OR REPLACE FUNCTION pgstatspack_delete_snap (_d interval default '30 days') returns varchar(512) AS $$
DECLARE
old_snap_time TIMESTAMP;
old_snap_id BIGINT;
message VARCHAR(512);
BEGIN
SELECT current_timestamp - _d INTO old_snap_time;
SELECT max(snapid) INTO old_snap_id FROM pgstatspack_snap WHERE ts < old_snap_time;
SELECT 'Deleted '||count(snapid)||' snapshots older than '||old_snap_time
INTO message
FROM pgstatspack_snap
WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_snap WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_database WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_tables WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_indexes WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_sequences WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_settings WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_statements WHERE snapid <= old_snap_id;
DELETE FROM pgstatspack_bgwriter WHERE snapid <= old_snap_id;
RETURN message;
END;
$$ LANGUAGE plpgsql;
并将其命名为:
$PSQL -d "${dbname}" -c "select pgstatspack_delete_snap ('15 days');"