В первом сообщении этой серии я проследил вызовы DocDB с помощью yb_debug_log_docdb_requests
. Журнал идет в лог-файл PostgreSQL, но не через функции PostgreSQL. Это означает, что при установке client_min_messages
их нельзя получить в клиенте. Вот почему я подключался с сервера, к которому был подключен, получая имя файла с помощью pg_current_logfile()
, но затем переходя к ОС. Однако мы можем получить доступ к ОС из сессии PostgreSQL, и вот пример с file_fdw
.
Я подключен к YugabyteDB и создаю сервер file_fdw
для доступа к файлам через внешнюю таблицу FDW. Я выполняю сценарий awk
, который декодирует временную метку (ts
) и добавляет номер linne (nr
), чтобы иметь порядок. Он также преобразует информацию в формат csv
. Когда я делаю запрос, я возвращаю все строки в одно значение (с помощью string_add
), чтобы получить одну строку с последней меткой времени as last_ts
. Я делаю это, чтобы использовать gset
для отслеживания, чтобы при следующем вызове отображались только новые строки >:'last_ts'
.
Вот что я запускаю, чтобы создать все это и подготовить запрос:
# create privileges, extension, and FDW server
do $do$ begin execute $sql$ grant yb_extension,yb_fdw to $sql$ || user; end; $do$;
create extension if not exists file_fdw;
create server if not exists file_fdw foreign data wrapper file_fdw;
# create FDW table on current logfile
drop foreign table current_logfile ;
create foreign table current_logfile (ts timestamptz, nr int, log text) server file_fdw options ( program $bash$ awk '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]*/ { t=$1" "$2}
/^.[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]*/ { t=d" "$2}
{gsub(/"/,q q);print q t q "," q NR q "," q $0 q}
' q='"' d=$(date +%Y-%m-%d) '/home/opc/10.0.0.61/var/data/yb-data/tserver/logs/postgresql-2022-07-20_000000.log'
$bash$, format 'csv');
#
select now() as last_ts
gset
deallocate logfile;
prepare logfile(timestamp) as
select
max(ts) as last_ts,e'n'||string_agg(log,e'n' order by ts,nr) log
from current_logfile where log like 'I%' and ts>$1
;
pset format unaligned
С помощью log like 'I%'
я фильтрую, чтобы получить только информационное сообщение YugabyteDB. Вы можете убрать это, чтобы показать все строки, включая сообщения PostgreSQL.
Теперь я могу показать новые строки с момента последнего вызова:
execute logfile(:'last_ts');gset
Пример
-- set start timestamp and enable log docdb requests
select now() as last_ts;gset
set yb_debug_log_docdb_requests=true;
-- run query
select count(*) from demo;
-- show log since start timestamp and reset to last time
pset format unaligned
execute logfile(:'last_ts');
gset
pset format aligned
Здесь показан запрос на чтение к DocDB
Я использую это в лабораторной работе, чтобы лучше понять вызовы от уровня запросов YSQL к распределенному хранилищу DocDB и транзакциям