# Postgres # PostgreSQL on macOS ## Install PostgreSQL using brew ```bash brew install postgresql ``` List services maintained by brew ```bash $ brew services list Name Status User Plist postgresql started lr ... ``` If you don't want it running as service you can manually start it with ```bash postgres -D /usr/local/var/postgres ``` # Backslash commands
command
Toggle expanded display`\x`
Toggle tuples only`\t`
Connect to database`\c db_name`
List databases`\l`
Display table definition`\d table_name`
Display triggers`\dft`
# Cheatsheet ### Truncate/empty all tables ```sql SELECT 'TRUNCATE TABLE ' || tablename || ' CASCADE;' FROM pg_tables WHERE tableowner='acovix_devl'; ``` ### Show process / query list ```sql SELECT * FROM pg_stat_activity; -- active queries SELECT pid, age(query_start, clock_timestamp()), usename, query FROM pg_stat_activity WHERE query != '' AND query NOT ILIKE '%pg_stat_activity%' ORDER BY query_start desc; ``` ### Kill running query ```sql SELECT pg_cancel_backend(procpid); -- kill idle query SELECT pg_terminate_backend(procpid); ``` ### List databases size ```sql select datname, pg_size_pretty(pg_database_size(datname)) from pg_database order by pg_database_size(datname) desc; ``` ### Show all triggers from a schema ```sql SELECT event_object_table, trigger_name, event_manipulation, action_statement, action_timing FROM information_schema.triggers ORDER BY event_object_table, event_manipulation; ``` ### Rename database ```sql alter database old_name rename to new_name; ``` ### Set database owner ```sql alter database sample_name owner to david; ``` ### Rename role ```sql alter role role_name rename to new_role_name; ``` - set password, because after rename password is cleared ### List enum ```sql select n.nspname as enum_schema, t.typname as enum_name, string_agg(e.enumlabel, ', ') as enum_value from pg_type t join pg_enum e on t.oid = e.enumtypid join pg_catalog.pg_namespace n ON n.oid = t.typnamespace group by enum_schema, enum_name ``` # Queries with IPs ### Top networks ```sql CREATE TABLE ip ( id serial NOT NULL, addr cidr NOT NULL, hostname character varying(25) NOT NULL ); SELECT * FROM ip WHERE NOT EXISTS (SELECT addr FROM net n WHERE n.addr >> net.addr); ``` ### Bigint to IP ```sql create function bigint_to_inet(bigint) returns inet as $$ select (($1>>24&255)||'.'||($1>>16&255)||'.'||($1>>8&255)||'.'||($1>>0&255))::inet $$ language sql; ``` # Dump / Restore ### Dump All Functions (to a file) ```sql SELECT pg_get_functiondef(f.oid) FROM pg_catalog.pg_proc f INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid) WHERE n.nspname = 'public'; ``` - run `\o functions.sql` first to save the output to a file or - use `\copy (...) to` ### Dump database ```bash pg_dump -U username -h hostname databasename > dump.sql ``` ### Import info existing database ```bash psql -d newdb -f dump.sql ``` ### Dump and Restore Sperling Database ```bash pg_dump --no-owner -U sperling_prod -h mimir1.aco.net sperling_prod > dump.sql psql -h localhosst sperling_devel postgres -f dump.sql ``` # Major Version Upgrade on Debian - make a snapshot/backup of the machine - check the running clusters using `pg_lsclusters` command - drop the new cluster (the one running the target version) `sudo -u postgres pg_dropcluster --stop 15 main` - (optional) if you are ssh-ing from a macOS/Item2 the LC\_CTYPE is wrongly set - run `export LC_CTYPE=en_US.UTF-8 export LC_ALL=en_US.UTF-8` - upgrade the old cluster `sudo -u postgres pg_upgradecluster 13 main` - check the running clusters using `pg_lsclusters` command - drop the old cluster (be sure the upgrade was successful) `sudo -u postgres pg_dropcluster 13 main` - uninstall old postgresql packages