mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
bd18c50ba8
changed as per discussion on the patches list). This version should be a good bit better. It addresses all the issues pointed out by Neil Conway. Vacuum and Analyze are now handled separately. It now monitors for xid wraparound. The number of database connections and queries has been significantly reduced compared the previous version. I have moved it from bin to contrib. More detail on the changes are in the TODO file. I have not tested the xid wraparound code as I have to let my AthlonXP 1600 run select 1 in a tight loop for approx. two days in order to perform the required 500,000,000 xacts. Matthew T. O'Connor
86 lines
3.3 KiB
C
86 lines
3.3 KiB
C
/* pg_autovacuum.h
|
|
* Header file for pg_autovacuum.c
|
|
* (c) 2003 Matthew T. O'Connor
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
/* Includes that I added */
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <getopt.h>
|
|
#include <sys/time.h>
|
|
#include "../../interfaces/libpq/libpq-fe.h"
|
|
#include "lib/dllist.h"
|
|
|
|
#define AUTOVACUUM_DEBUG 1
|
|
#define BASETHRESHOLD 100
|
|
#define SCALINGFACTOR 2
|
|
#define SLEEPVALUE 1
|
|
#define SLEEPSCALINGFACTOR 0
|
|
#define UPDATE_INTERVAL 2
|
|
#define TABLE_STATS_ALL "select a.relfilenode,a.relname,a.relnamespace,a.relpages,a.reltuples,b.schemaname,b.n_tup_ins,b.n_tup_upd,b.n_tup_del from pg_class a, pg_stat_all_tables b where a.relfilenode=b.relid"
|
|
#define TABLE_STATS_USER "select a.relfilenode,a.relname,a.relnamespace,a.relpages,a.reltuples,b.schemaname,b.n_tup_ins,b.n_tup_upd,b.n_tup_del from pg_class a, pg_stat_user_tables b where a.relfilenode=b.relid"
|
|
#define FRONTEND
|
|
|
|
struct cmdargs{
|
|
int tuple_base_threshold,sleep_base_value,debug;
|
|
float tuple_scaling_factor,sleep_scaling_factor;
|
|
char *user, *password, *host, *port;
|
|
}; typedef struct cmdargs cmd_args;
|
|
|
|
/* define cmd_args as global so we can get to them everywhere */
|
|
cmd_args *args;
|
|
|
|
struct tableinfo{
|
|
char *schema_name,*table_name;
|
|
int insertThreshold,deleteThreshold;
|
|
int relfilenode,reltuples,relpages;
|
|
long InsertsAtLastAnalyze; /* equal to: inserts + updates as of the last analyze or initial values at startup */
|
|
long DeletesAtLastVacuum; /* equal to: deletes + updates as of the last vacuum or initial values at startup */
|
|
}; typedef struct tableinfo tbl_info;
|
|
|
|
/* Might need to add a time value for last time the whold database was vacuumed.
|
|
I think we need to guarantee this happens approx every 1Million TX's */
|
|
struct dbinfo{
|
|
int oid,age;
|
|
int insertThreshold,deleteThreshold; /* Use these as defaults for table thresholds */
|
|
PGconn *conn;
|
|
char *dbname,*username,*password;
|
|
Dllist *table_list;
|
|
}; typedef struct dbinfo db_info;
|
|
|
|
/* Functions for dealing with command line arguements */
|
|
static cmd_args *get_cmd_args(int argc,char *argv[]);
|
|
static void print_cmd_args(void);
|
|
static void free_cmd_args(void);
|
|
|
|
/* Functions for managing database lists */
|
|
static Dllist *init_db_list(void);
|
|
static db_info *init_dbinfo(char *dbname,int oid,int age);
|
|
static void update_db_list(Dllist *db_list);
|
|
static void remove_db_from_list(Dlelem *db_to_remove);
|
|
static void print_db_info(db_info *dbi,int print_table_list);
|
|
static void print_db_list(Dllist *db_list,int print_table_lists);
|
|
static int xid_wraparound_check(db_info *dbi);
|
|
static void free_db_list(Dllist *db_list);
|
|
|
|
/* Functions for managing table lists */
|
|
static tbl_info *init_table_info(PGresult *conn, int row);
|
|
static void update_table_list(db_info *dbi);
|
|
static void remove_table_from_list(Dlelem *tbl_to_remove);
|
|
static void print_table_list(Dllist *tbl_node);
|
|
static void print_table_info(tbl_info *tbl);
|
|
static void update_table_thresholds(db_info *dbi,tbl_info *tbl);
|
|
static void free_tbl_list(Dllist *tbl_list);
|
|
|
|
/* A few database helper functions */
|
|
static int check_stats_enabled(db_info *dbi);
|
|
static PGconn *db_connect(db_info *dbi);
|
|
static void db_disconnect(db_info *dbi);
|
|
static PGresult *send_query(const char *query,db_info *dbi);
|
|
static char *query_table_stats(db_info *dbi);
|
|
|
|
|