У меня есть две базы данных для журналирования, который я хочу проверить на синхронизацию.
Решение одобрено - периодически посылать (скажем, ежечасно) выбор к обоим, генерировать хэш набора результатов и сравнивать их. Если они совпадают, то отлично, в противном случае генерируются некоторые сигналы тревоги.
В настоящее время я делаю это с помощью (сценария 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 не помог.
Есть предложения?
Спасибо.
Вы можете использовать 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 ГБ, это больше не будет работать, поскольку одна строка не может быть длиннее этой.
Возможно, сработает что-то вроде этого, которое в основном выполняет хеширование каждой строки, а затем хеширует эти хеши. Он все равно сломается, если длина хэшей превысит 1 ГБ - вам нужно будет написать собственный агрегат md5, чтобы обойти это.
SELECT md5(concat(md5(column1 || column2 || column3))) FROM log_table WHERE ...
Для этого необходимо, чтобы вы создали настраиваемый агрегат concat следующим образом:
CREATE AGGREGATE concat (
BASETYPE = text,
SFUNC = textcat,
STYPE = text,
INITCOND = ''
);