It is a good idea to do a general reconcilliation before and after a database dump and restore to peform some sense check as to whether restoration has completed successfully.
SELECT datname AS database_name, pg_size_pretty(pg_database_size(datname)) AS size FROM pg_database ORDER BY pg_database_size(datname) DESC;
And here is a further breakdown of numbers in a database
DO $$ DECLARE rec RECORD; rec_count bigint; total_rows bigint := 0; total_items int := 0; BEGIN -- Create a temporary table to store individual counts CREATE TEMP TABLE temp_table_counts ( table_name text, row_count bigint ) ON COMMIT DROP; -- Loop through each user table and view (exclude system schemas) FOR rec IN SELECT table_schema, table_name, table_type FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') AND table_type IN ('BASE TABLE', 'VIEW') ORDER BY table_name LOOP BEGIN -- Dynamically count the rows for the current table/view EXECUTE format('SELECT count(*) FROM %I.%I', rec.table_schema, rec.table_name) INTO rec_count; EXCEPTION WHEN OTHERS THEN -- In case of error (for example, if the view is not countable), set to NULL rec_count := NULL; END; -- Insert the result into our temporary table. INSERT INTO temp_table_counts(table_name, row_count) VALUES (rec.table_schema || '.' || rec.table_name, rec_count); -- Accumulate totals (if count succeeded) IF rec_count IS NOT NULL THEN total_rows := total_rows + rec_count; END IF; total_items := total_items + 1; END LOOP; -- Return the per-table results RAISE NOTICE 'Table Name | Row Count'; FOR rec IN SELECT table_name, row_count FROM temp_table_counts ORDER BY table_name LOOP RAISE NOTICE '% | %', rec.table_name, rec.row_count; END LOOP; -- Return the summary totals RAISE NOTICE '--------------------------------------'; RAISE NOTICE 'Total Rows: %, Total Tables/Views: %', total_rows, total_items; END $$;
And on running this is the kind of result it should return