Перейти к основному содержимому

Программа oid2name

Выйдите из сеанса psql и в оболочке Bash работайте пользователем postgres.

postgres@ts_db=# \q
[postgres@ServerName ~]$

Получение oid по имени объекта​

  1. Получите командой oid2name список БД кластера, их oid и табличных пространств.

    [postgres@ServerName ~]$ oid2name
    All databases:
    Oid Database Name Tablespace
    ----------------------------------
    16390 koi8_db pg_default
    5 postgres pg_default
    16401 py_json_db pg_default
    16389 student pg_default
    4 template0 pg_default
    1 template1 pg_default
    16432 ts_db ts_lab
  2. Получите список всех имеющихся табличных пространств кластера.

    [postgres@ServerName ~]$ oid2name -s
    All tablespaces:
    Oid Tablespace Name
    ------------------------
    1663 pg_default
    1664 pg_global
    16431 ts_lab
  3. Определите названия файлов данных таблиц БД ts_db.

    [postgres@ServerName ~]$ oid2name -d ts_db
    From database "ts_db":
    Filenode Table Name
    ----------------------
    16433 i_f
    16436 i_t
  4. В подробном виде получите данные о таблице i_t базы данных ts_db.

    [postgres@ServerName ~]$ oid2name -d ts_db -t i_t -x
    From database "ts_db":
    Filenode Table Name Oid Schema Tablespace
    ---------------------------------------------------------
    16436 i_t 16436 public ts_lab
  5. Находясь в домашнем каталоге postgres, командой find ОС найдите файл данных таблицы i_t.

    [postgres@ServerName ~]$ find ~postgres/ -name 16436
    /var/lib/postgres/ts_data/PG_15_202310091/16432/16436
  6. Убедитесь, что каталог, в котором размещен этот файл, соответствует oid БД ts_db.

    [postgres@ServerName ~]$ oid2name | grep ts_db
    16432 ts_db ts_lab

Получение имени объекта по его oid​

  1. Найдите имя таблицы в БД, если известен ее oid.

    [postgres@ServerName ~]$ oid2name -f 16436 -d ts_db
    From database "ts_db":
    Filenode Table Name
    ---------------------------
    16436 i_t
  2. В каталоге с oid БД ts_db отфильтруйте все файлы с именами из цифр, отсортируйте полученный список по убыванию, выберите файл данных с максимальным oid и определите, какой это объект БД.

    [postgres@ServerName ~]$ oid2name -d ts_db -f $(ls ts_data/PG_15_202310091/16432/ | egrep '^[0-9]+$' | sort -nr | head -1)
    Разбор команды

    • ls ts_data/PG_15_202310091/16432/ — вывод списка файлов и каталогов в подкаталоге базы данных ts_db (16432 — это oid БД);
    • egrep '^[0-9]+$' — фильтрация списка, оставляющая только имена, состоящие целиком из цифр (файлы данных отношений, так как их имена в PostgreSQL — это oid объектов);
    • sort -nr — сортировка полученных oid в числовом порядке по убыванию (-n — число, -r — reverse);
    • head -1 — выбор первого (наибольшего) oid из отсортированного списка;
    • $(...) — командная подстановка, результат выполнения конвейера передается как аргумент команде oid2name;
    • oid2name -d ts_db -f <oid> — утилита для сопоставления файловой структуры PostgreSQL с объектами базы данных; опция -d указывает базу данных для анализа, -f запрашивает информацию о файле с заданным oid.
    From database "ts_db":
    Filenode Table Name
    --------------------------------
    16440 pg_toast_16436_index

    Это индекс для таблицы TOAST, для хранения длинных строк таблицы i_t.

Самопроверка​

Вопрос 1

В оболочке bash выполнена команда:

[postgres@ServerName ~]$ oid2name
All databases:
Oid    Database Name    Tablespace
----------------------------------
16390     koi8_db      pg_default
5         postgres     pg_default
16401     py_json_db   pg_default
16389     student      pg_default
4         template0    pg_default
1         template1    pg_default
16432     ts_db        ts_lab

Какой oid имеет база данных ts_db?

Вопрос 2

Что делает опция -s утилиты oid2name?

Вопрос 3

В оболочке bash выполнена команда:

[postgres@ServerName ~]$ oid2name -d ts_db -f $(ls ts_data/PG_15_202310091/16432/ | egrep '^[0-9]+$' | sort -nr | head -1)
From database "ts_db":
Filenode            Table Name
--------------------------------
     16440  pg_toast_16436_index

Чем является объект pg_toast_16436_index?

Вопрос 4

Какие опции поддерживает утилита oid2name?