Имя: Пароль:
1C
 
Обслуживание конкретной таблицы-ц в PostgreSQL
0 Leonidius
 
02.11.24
10:22
Здравствуйте.
Подскажите, может есть у кого-то bash или Powershell скрипт
для обслуживания не всего списка баз, а конкретной таблицы в конкретной базе. (PostgreSQL)


Заранее благодарен.
1 formista2000
 
02.11.24
10:28
(0) А что значит "обслуживание таблицы"? О.о
2 Волшебник
 
02.11.24
10:36
3 Leonidius
 
02.11.24
10:50
Как пример.
Есть скрипт. Активируется по заданию. В нём указывается конкретная база. Когда скрипт запускается, он перебирает всю базу. Мне нужно этот перебор превратить в конкретные цели.

echo off
for /f "delims=." %%i in ('wmic.exe OS get LocalDateTime ^| find "."') do set sDateTime=%%i
set f_year=%sDateTime:~0,4%
set f_month=%sDateTime:~4,2%
set f_day=%sDateTime:~6,2%
set f_hour=%sDateTime:~8,2%
set f_min=%sDateTime:~10,2%
set f_sec=%sDateTime:~12,2%

set f_name_log=C:\logs\PG\Zup\logs_%f_year%.%f_month%.%f_day%

echo on
echo start: %f_year%.%f_month%.%f_day% - %f_hour%:%f_min%:%f_sec% >>%f_name_log%_vacuum.log

SET PGPASSWORD=?


"C:\Program Files\PostgreSQL 1C\15\bin\vacuumdb.exe" --dbname zup --host 127.0.0.1 --port 5432 --username postgres --echo --full --analyze >>%f_name_log%_vacuum.log

echo end: %f_year%.%f_month%.%f_day% - %f_hour%:%f_min%:%f_sec% >>%f_name_log%_vacuum.log


echo start: %f_year%.%f_month%.%f_day% - %f_hour%:%f_min%:%f_sec% >>%f_name_log%_reindex.log

"C:\Program Files\PostgreSQL 1C\15\bin\reindexdb.exe" --dbname zup --host 127.0.0.1 --port 5432 --username postgres --echo >>%f_name_log%_reindex.log

echo end: %f_year%.%f_month%.%f_day% - %f_hour%:%f_min%:%f_sec% >>%f_name_log%_reindex.log
4 formista2000
 
02.11.24
10:39
(2) Да, для базы, это я знаю. А чтобы про конкретную таблицу - слышу впервые.
5 Волшебник
 
02.11.24
10:51
(3)(4)
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ таблица_и_столбцы [, ...] ]

https://postgrespro.ru/docs/postgresql/14/sql-vacuum
6 osa1C
 
02.11.24
10:51
(3) Какой то бред. "Обслуживание отдельной таблицы".... Таблица является частью базы данных, имеет ссылки на другие таблицы, что значит обслужить ее отдельно? Просто сломать? Так сломай сразу всю базу, зачем мелочиться
7 Garykom
 
02.11.24
11:17
(6) это не бред а реальность
вероятно плохие знания работы субд на низком уровне
8 Garykom
 
02.11.24
11:21
(3)
Утилита vacuumdb представляют собой обёртку SQL-команды VACUUM

Утилита reindexdb представляет собой обёртку SQL-команды REINDEX


объясни нахрена вызывать снаружи?
и это долго
просто написать хранимку с нужными командами sql (VACUUM, REINDEX, etc) внутри
и вызывать ее как тебе нравится

хоть по триггеру через GUI для PostgreSQL 1C linux тут 17 пост
9 Garykom
 
02.11.24
11:27
(8)+ настройки как часто выполнять хранимку можно прямо в базе хранить
в итоге никаких левых внешних скриптов, которые легко потеряются при переезде
все в самой базе
и кроссплатформенно!
10 Волшебник
 
02.11.24
11:33
(6)
В PostgreSQL команды UPDATE или DELETE не вызывают немедленного удаления старой версии изменяемых строк. Этот подход необходим для реализации эффективного многоверсионного управления конкурентным доступом (MVCC, см. Главу 13): версия строки не должна удаляться до тех пор, пока она остаётся потенциально видимой для других транзакций. Однако в конце концов устаревшая или удалённая версия строки оказывается не нужна ни одной из транзакций. После этого занимаемое ей место должно быть освобождено и может быть отдано новым строкам, во избежание неограниченного роста потребности в дисковом пространстве. Это происходит при выполнении команды VACUUM.

Обычная форма VACUUM удаляет неиспользуемые версии строк в таблицах и индексах и помечает пространство свободным для дальнейшего использования. Однако это дисковое пространство не возвращается операционной системе, кроме особого случая, когда полностью освобождаются одна или несколько страниц в конце таблицы и можно легко получить исключительную блокировку таблицы. (VACUUM FULL возвращает)
11 Leonidius
 
02.11.24
12:44
Через внутренние запросы получается отработать по одной таблице.
VACUUM (VERBOSE, FULL, ANALYZE) public._bprpoints713; (пример)

И запрос можно сохранить даже в виде файла .sql.

Мне просто необходимо по расписанию запустить этот .sql
Руками он через PG Admin понятное дело запускается.
Мне бы просто вариант с автоматизацией этого процесса.
12 Garykom
 
02.11.24
12:49
(11) https://stackoverflow.com/questions/57865426/how-to-execute-a-procedure-call-in-postgresql-using-shell-script
если хочешь хранимку снаружи это пример для shell скрипта в линуксе
как это на винде из bat/cmd хз но думаю можно
13 Garykom
 
02.11.24
12:52
14 vbus
 
02.11.24
14:46
chcp 1251

set PGUSER=postgres
set PGPASSWORD=123456
set PGDATABASE=datebase
set PGHOST=localhost
set PGPORT=5432

rem Путь к psql
set PSQL_PATH="C:\Program Files\PostgreSQL\13\bin\psql.exe"

rem Выполнение VACUUM (VERBOSE, FULL, ANALYZE)
%PSQL_PATH% -U %PGUSER% -h %PGHOST% -p %PGPORT% -d %PGDATABASE% -c "VACUUM (VERBOSE, FULL, ANALYZE)  public.authentication_contact;"

pause

-------------------------------
BOSE, FULL, ANALYZE)  public.authentication_contact;"
ИНФОРМАЦИЯ:  очистка "public.authentication_contact"
ИНФОРМАЦИЯ:  "authentication_contact": найдено удаляемых версий строк: 0, неудаляемых - 1, просмотрено страниц: 1
ПОДРОБНОСТИ:  В данный момент нельзя удалить "мёртвых" строк 0.
CPU: пользов.: 0.00 с, система: 0.00 с, прошло: 0.00 с.
ИНФОРМАЦИЯ:  анализируется "public.authentication_contact"
ИНФОРМАЦИЯ:  "authentication_contact": просканировано страниц: 1 из 1, они содержат "живых" строк: 1, "мёртвых" строк: 0; строк в выборке: 1, примерное общее число строк: 1
VACUUM
15 Leonidius
 
02.11.24
14:56
(13) Спасибо, получилось.
16 Leonidius
 
02.11.24
14:56
(14) Спасибо, тоже работает.