Как создать хэш набора результатов в Postgress?

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

Решение одобрено - периодически посылать (скажем, ежечасно) выбор к обоим, генерировать хэш набора результатов и сравнивать их. Если они совпадают, то отлично, в противном случае генерируются некоторые сигналы тревоги.

В настоящее время я делаю это с помощью (сценария bash):

 log_table="SELECT column1, column2, column3 FROM log_table where to_char(timestamp, '$ts_format') = '$tx_moment'";
PSQL="psql -t -q -h $_gp_host -U $_gp_user -d log_schema -c ";
echo "`${PSQL} $tx_fix${log_table} | sort | cksum`";

Я хотел бы сделать cksum / hash на стороне postgres. Потому что в настоящее время он загружает весь набор результатов (который может иметь даже 25 МБ или более) и генерирует контрольную сумму на стороне сервера.

Google не помог.

Есть предложения?

Спасибо.

1
задан KullDox 20 August 2010 в 17:49
поделиться

2 ответа

Вы можете использовать md5 :

 log_table="
SELECT 
  md5(column1 || column2 || column3) AS hash,
  column1, column2, column3
FROM log_table where to_char(timestamp, '$ts_format') = '$tx_moment'";
1
ответ дан 2 September 2019 в 21:57
поделиться

Если вы хотите выполнить хеширование всего сразу, это также потребует много памяти на стороне сервера. И как только вы наберете 1 ГБ, это больше не будет работать, поскольку одна строка не может быть длиннее этой.

Возможно, сработает что-то вроде этого, которое в основном выполняет хеширование каждой строки, а затем хеширует эти хеши. Он все равно сломается, если длина хэшей превысит 1 ГБ - вам нужно будет написать собственный агрегат md5, чтобы обойти это.

SELECT md5(concat(md5(column1 || column2 || column3))) FROM log_table WHERE ...

Для этого необходимо, чтобы вы создали настраиваемый агрегат concat следующим образом:

CREATE AGGREGATE concat (
    BASETYPE = text,
    SFUNC = textcat,
    STYPE = text,
    INITCOND = ''
);
1
ответ дан 2 September 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: