Как создать хэш набора результатов в Postgress? - PullRequest
1 голос
/ 20 августа 2010

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

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

В настоящее время я делаю это с помощью (сценария 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 не помог.

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 августа 2010

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

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

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

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

CREATE AGGREGATE concat (
    BASETYPE = text,
    SFUNC = textcat,
    STYPE = text,
    INITCOND = ''
);
1 голос
/ 20 августа 2010

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

 log_table="
SELECT 
  md5(column1 || column2 || column3) AS hash,
  column1, column2, column3
FROM log_table where to_char(timestamp, '$ts_format') = '$tx_moment'";
...