| #!/usr/bin/env python | |
| # coding: UTF-8 | |
| # pt-tablespace-usage | |
| # | |
| # Copyright(c) 2015 Uptime Technologies, LLC. | |
| import sys, os | |
| libpath = os.path.abspath(os.path.dirname(sys.argv[0]) + "/../lib") | |
| sys.path.append(libpath) | |
| import getopt | |
| import PsqlWrapper | |
| import log | |
| class TablespaceUsage: | |
| def __init__(self, psql, debug=False): | |
| self.psql = psql | |
| self.debug = debug | |
| self.rs = [] | |
| return | |
| def get_database_names(self): | |
| query = "select datname from pg_database where datallowconn = true order by datname" | |
| d = [] | |
| rs = self.psql.execute_query(query) | |
| for r in rs[1:len(rs)-1]: | |
| d.append(r[0]) | |
| log.debug(d) | |
| return d | |
| def get_tablespace_per_database(self, dbname): | |
| p = PsqlWrapper.PsqlWrapper(host=self.psql.host, port=self.psql.port, username=self.psql.username, dbname=dbname, debug=self.debug) | |
| query = " \ | |
| SELECT coalesce(spcname, (select spcname from pg_database d left outer join pg_tablespace t on dattablespace = t.oid where datname = current_database())), \ | |
| ceil(sum(pg_relation_size)/1024/1024) \ | |
| FROM ( SELECT oid, \ | |
| pg_relation_size(oid), \ | |
| reltablespace \ | |
| FROM pg_class ) r \ | |
| LEFT OUTER JOIN pg_tablespace t \ | |
| on r.reltablespace = t.oid \ | |
| GROUP BY spcname;" | |
| rs = p.execute_query(query) | |
| log.debug(rs) | |
| for r in rs[1:len(rs)-1]: | |
| log.debug(r) | |
| a = [] | |
| a.append(r[0]) | |
| if r[0] == 'pg_global': | |
| a.append('') | |
| else: | |
| a.append(dbname) | |
| a.append(r[1]) | |
| self.rs.append(a) | |
| log.debug(a) | |
| def get(self): | |
| header = [] | |
| header.append(['TABLESPACE', 'DBNAME', 'SIZE (MB)']) | |
| d = self.get_database_names() | |
| for dbname in d: | |
| self.get_tablespace_per_database(dbname) | |
| log.debug(self.rs) | |
| found = False | |
| rs = [] | |
| for r in self.rs: | |
| if r[0] == 'pg_global': | |
| if found is False: | |
| rs.append(r) | |
| found = True | |
| else: | |
| rs.append(r) | |
| header.extend(sorted(rs)) | |
| log.debug(header) | |
| self.psql.print_result(header) | |
| return False | |
| def usage(): | |
| print "" | |
| print "Usage: " + os.path.basename(sys.argv[0]) + " [option...]" | |
| print "" | |
| print "Options:" | |
| print " -h, --host=HOSTNAME Host name of the postgres server" | |
| print " -p, --port=PORT Port number of the postgres server" | |
| print " -U, --username=USERNAME User name to connect" | |
| print " -d, --dbname=DBNAME Database name to connect" | |
| print "" | |
| print " --help Print this help." | |
| print "" | |
| if __name__ == "__main__": | |
| try: | |
| opts, args = getopt.getopt(sys.argv[1:], "h:p:U:d:", | |
| ["help", "debug", "host=", "port=", "username=", "dbname="]) | |
| except getopt.GetoptError, err: | |
| print str(err) | |
| usage() | |
| sys.exit(2) | |
| host = None | |
| port = None | |
| username = None | |
| dbname = None | |
| owner = None | |
| schema = None | |
| table = None | |
| debug = None | |
| for o, a in opts: | |
| if o in ("-h", "--host"): | |
| host = a | |
| elif o in ("-p", "--port"): | |
| port = int(a) | |
| elif o in ("-U", "--username"): | |
| username = a | |
| elif o in ("-d", "--dbname"): | |
| dbname = a | |
| elif o in ("--debug"): | |
| debug = True | |
| elif o in ("--help"): | |
| usage() | |
| sys.exit(0) | |
| else: | |
| print "unknown option: " + o + "," + a | |
| sys.exit(1) | |
| p = PsqlWrapper.PsqlWrapper(host=host, port=port, username=username, dbname=dbname, debug=debug) | |
| tu = TablespaceUsage(p, debug=debug) | |
| if tu.get() is False: | |
| sys.exit(1) | |
| sys.exit(0) |