Нам для задачи потребовалось проанализировать поврежденный индекс, чтобы как то упростить себе задачу был написан простенький скрипт для генерации dot файла.
- Получить файл индекса.
- Путь до файла индекса можно получить запросом: select current_setting('data_directory') || '/' || pg_relation_filepath('pg_depend_reference_index'); /var/lib/postgresql/13/main/base/16385/2806156197
- С помощью pg_filedump и опций -i -f необходимо получить файл, который потом будет разбираться скриптом.
- Пример: pg_filedump -i -f 2806156197 > pgfiledump.txt
- С помощью скрипта pg_b_tree_visualization.py получить dot файл result.dot
- Пример: python3 pg_b_tree_visualization.py ./txt/pgfiledump.txt
- Получить svg файл с помощью graphviz
- Пример: dot -Tsvg result.dot > output.svg
Выводится несколько уровней блоков, слева направо:
- Самый левый - это корень
- Самый правый(Уровень 0) - это листы дерева
Могут встречаться серые блоки - это блоки, которые помечены как удалённые, но на них, по каким то причинам, всё ещё ссылаются.
Внутри блоков представлена информация о номере блока и элементах индекса. Элементы индекса ссылаются на другие блоки. В последнем уровне(уровень 0) не отображаются элементы т.к. они ссылаются на кортежи и это сильно засоряет вывод.
Соединения бывают 3х видов:
- Чёрные стрелки - соединяют элементы индекса с блоками, на которые элемент ссылается
- Красные стрелки - ссылка на предыдущий блок(Previous)
- Зелёные стрелки - ссылка на следующий блок(Next)
- Совсем поломанные индексы не получится визуализацировать. Необходимо проверить, чтобы файл сгенерированный pg_filedump был содержательный
- Для работы скрипта требуется pg_filedump и graphviz