Размер самых больших таблиц, dump, json, jsonb (SQL-шпаргалка)

Узнать размер самых больших таблиц в базе PostgreSQL, создать дамп БД

Узнать размер таблиц

Размер самых больших 20 таблиц

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_relation_size(C.oid)) AS "size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  ORDER BY pg_relation_size(C.oid) DESC
  LIMIT 20;

Размер всех таблиц

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_relation_size(C.oid)) AS "size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  ORDER BY pg_relation_size(C.oid) DESC;

Общий размер таблиц

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
    AND C.relkind <> 'i'
    AND nspname !~ '^pg_toast'
  ORDER BY pg_total_relation_size(C.oid) DESC
  LIMIT 20;

Дамп БД

Создание дампа

pg_dump dbname > outfile

Восстановление из файла

psql --set ON_ERROR_STOP=on dbname < infile

или для отображения лога и остановки при ошибке

psql -v ON_ERROR_STOP=1

Копирование данных с одной ДБ в другую

pg_dump -h host1 dbname | psql -h host2 dbname

Создание дампа с сжатием GZ

pg_dump dbname | gzip > filename.gz

Восстановление из архива

gunzip -c filename.gz | psql dbname

или

cat filename.gz | gunzip | psql dbname

Ошибка permission_denied при создании расширений бд (добавление прав пользователю)

например ошибка:

permission denied to create extension "uuid-ossp"

$psql (зайти от root)

ALTER USER username WITH SUPERUSER;

Восстановление в docker

docker exec -i posgres_1 psql -v -d dbname -U username < ./sqlscript.sql

Создание копии (бэкапа) таблицы

create table table_name_backup as table table_name -- копирование только схемы, без индексов
insert into table_name_backup select * from table_name

Json, jsonb

Поиск по полю типа json:

json:

{
  "items": {
     "component": {
       "ca0c2211-c660-4255-a976-ef046ffda2ca": {
          "name": "GridComponent"
       }
     }
  }
}
select data->'items'->'component'

Поиск по полю c json типа text

select data::json->'items'->'component'

Поиск по ключу в объекте для любого ключа

select data->'items'->'component', e.value->'name' from contents
    join json_each(data->'items'->'component') e on true
    where type = 'content' and components <> '[]';

json_each создает таблицу вида ключ-значение из json

Сделать копию базы данных

CREATE DATABASE [new_database] WITH TEMPLATE [source_db] owner [OWNER]

при выполнении команды возможна ошибка из-за текущих подключений. Для сброса подключений можно их сбросить

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();

Источники

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.