[PostgreSQL] Работаем руками

Привет, %username%! Иногда бывает необходимо поработать ручками с базой данных PostgreSQL, но не для всех бывает очевидно что и как там делать. Поэтому ниже будет список из нескольких полезных примеров команд, которые помогу быстро разобраться и начать. Главное помнить: не тестируйте на production-серверах!

Начнем с простого, а именно коннекта к базе данных PostgreSQL под самым главным пользователем postgres:

1
psql -U postgres -p SecretPassword

После этой команды нас встретит приветствие PostgreSQL. Далее мы вольны делать абсолютно всё (в пределах разумного). Для начала посмотрим список всех баз данных которые у нас крутятся на сервере. Делается это следующим образом:

1
postgres=# \l

или

1
postgres=# \list

На вывод нам поступит список всех БД которые созданы на сервере, после чего мы можем подключиться к нужной нам базе и работать с ней — для примера посмотрим все таблицы в ней:

1
2
postgres=# \CONNECT testdb
testdb=# \dt

Как можно догадаться из примера — до знака решетки (#) у нас будет наименование базы данных с которой мы сейчас работаем. Подключившись к базе testdb мы посмотрели все таблицы в этой БД. Далее мы можем посмотреть самую большую таблицу в БД:

1
# SELECT relname AS "table_name", relpages AS "size_in_pages" FROM pg_class ORDER BY relapses DESC LIMIT 1;

В результате нам будет показана самая большая таблица (размер указывается в страницах):

1
2
3
   TABLE_NAME   | size_in_pages
----------------+---------------
testtb1     |        299211

Следующий вопрос: как посмотреть размер все базы данных. Ответ — легко:

1
# SELECT pg_database_size( 'testdb' );

В результате нам покажется размер всей БД:

1
2
3
 pg_database_size
------------------
27641546936

И снова размер нам представлен в непонятном виде, но мы можем легко это исправить следующим образом:

1
# SELECT pg_size_pretty( pg_database_size( 'testdb' ) );

Результат:

1
2
3
pg_size_pretty
----------------
26 GB

Логичным продолжением будет просмотр всех БД в таком нормально виде:

1
# SELECT pg_database.datname AS "database_name", pg_size_pretty(pg_database_size(pg_database.datname)) AS SIZE FROM pg_database ORDER BY pg_database_size(pg_database.datname) DESC;

Результат:

1
2
3
4
5
    database_name     |  SIZE
----------------------+---------
sampledb             | 45 GB
loremdb_001          | 21 GB
ipsumdb              | 3358 MB

Посмотрим размер таблицы в базе данных:

1
# SELECT pg_size_pretty( pg_total_relation_size( 'testtb1' ) );

Результатом будет размер таблицы testtable1, включая индексы. Результат будет отображен сразу в удобном для чтения формате, а не в байтах.

1
2
3
 pg_size_pretty
----------------
4872 MB

Если вам нужно узнать размер таблицы без индексов, тогда следует выполнить такой запрос:

1
# SELECT pg_size_pretty( pg_relation_size( 'testtb1' ) );

Результат:

1
2
3
 pg_size_pretty
----------------
2338 MB

Как узнать текущую версию сервера PostgreSQL?

1
# SELECT version();

Результат будет подобным этому:

1
2
3
                                           version
----------------------------------------------------------------------------------------------
PostgreSQL 9.3.1 ON x86_64-unknown-linux-gnu, compiled BY gcc (Debian 4.7.2-5) 4.7.2, 64-bit

Как выполнить SQL-файл в PostgreSQL?
Для данной цели существует специальная команда в консольной утилите:

1
# \i /path/TO/file.sql

Где /path/to/file.sql — это путь к вашему SQL-файлу. Обратите внимание, что он должен лежать в доступной для чтения пользователя postgres директории.

Как показать структуру, индексы и прочие элементы выбранной таблицы в PostgreSQL?
Для данной цели существует специальная команда в консольной утилите:

1
# \d testtb1

Где testtb1 — имя таблицы
Результат:

1
2
3
4
5
6
7
8
9
10
11
12
               TABLE "public.testtb1"
COLUMN    |          TYPE          | Modifiers
--------------+------------------------+-----------
begin_ip     | ip4                    | NOT NULL
end_ip       | ip4                    | NOT NULL
begin_num    | BIGINT                 | NOT NULL
end_num      | BIGINT                 | NOT NULL
country_code | CHARACTER(2)           | NOT NULL
country_name | CHARACTER VARYING(255) | NOT NULL
ip_range     | ip4r                   |
Indexes:
"testtable1_iprange_index" gist (ip_range) WITH (fillfactor=100)

Как отобразить время выполнения запроса в консольной утилите PostgreSQL?

1
# \timing

После чего все запросы станут отображаться в консольной утилите со временем выполнения.
Отключаются эти уведомления точно так же, как и включаются — вызовом:

1
# \timing

Как отобразить все команды консольной утилиты PostgreSQL?

1
# \?

Это наверное самый важный пункт, т.к. любой DBA должен знать как вызвать эту справку! Далее будет несколько примеров более сложных запросов, которые так же могу предоставить ту или иную информацию. Например для сопоставления OID номеров и имен баз и таблиц в contrib есть утилита oid2name.

Для просмотра размера таблиц для текущей базы:

1
2
3
4
SELECT relname AS name, relfilenode AS oid, (relpages * 8192 / (1024*1024))::INT AS size_mb, reltuples AS COUNT
FROM pg_class
WHERE relname NOT LIKE 'pg%'
ORDER BY relpages DESC;

Для просмотра общего размера баз можно использовать скрипт:

1
2
3
4
5
6
7
8
9
#!/bin/sh
oid2name=/usr/local/pgsql/bin/oid2name
pg_data_path=/usr/local/pgsql/data/base
{
$oid2name| grep '='| while read oid delim name; do
size=`du -s $pg_data_path/$oid|cut -f1`
echo "$size $name"
done
}|sort -rn

Если нужно без индексов, тогда запрос другой:

1
2
3
4
# SELECT pg_size_pretty( pg_relation_size( 'table' ) );
pg_size_pretty
----------------
1341 MB

Полный размер таблицы и сопутствующих индексов:

1
# SELECT pg_total_relation_size('table_name');

Размер столбцов:

1
# SELECT pg_column_size('column_name') FROM 'testtb1';

Состояние всех настроек можно посмотреть через функцию pg_show_all_settings().

Думаю на этом можно пока притормозить. На первое время хватит и этих данных. На этом всё!

Опубликовано 12.07.2018 в 16:15 · Автор JTProg_ru · Ссылка
Рубрики: PostgreSQL · Теги: , , , ,