powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Непонятное поведение sequence
3 сообщений из 3, страница 1 из 1
Непонятное поведение sequence
    #38986683
dezconnect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, всем.

Есть непонятная ситуация которая случилась сегодня ночью на боевом сервере.

Дано:
Сервер с входящим потоком INSERT с частотой примерно 2000-4000 tps ( в зависимости от нагрузки )
Всё это счастье пишется в таблицу, на которой есть SERIAL поле с первичным ключем.

Работало это всё стабильно, несколько месяцев, логика не менялась, ночью внезапно, запись в таблицу остановилась, а в лог посыпалась куча ошибок вида:
2015/06/17 23:33:30 [error] 438#0: *4337002441 postgres: failed to receive result: PGRES_FATAL_ERROR: ERROR: duplicate key value violates unique constraint "rawlogs_2_pkey"
DETAIL: Key (id)=(108797936) already exists.

На каждый инсерт. Вообщем-то спасло ситуацию, перенесении записи на другую такую же таблицу и дальнейший рестарт сиквенса.

Из дополнительного: если совсем вдаваться в особенности то таблиц у нас таких две и они подменяются раз в час, после чего данные с неактивной таблицы сливаются в аггрегированном виде в другие таблицы, и происходит truncate с рестартом сиквенса

В логах выудить что либо более конкретное не удалось.

Кто нибудь может предположить что произошло ? Данных в таблице с такими ID (выборочно взяли несколько из логов) не оказалось. Могли ли так "слететь" индексы ? или что могло инициировать подобное поведение ?

PS: версия 9.4.3
...
Рейтинг: 0 / 0
Непонятное поведение sequence
    #38986697
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dezconnect,

расскажите по подробнее про
" то таблиц у нас таких две и они подменяются раз в час, после чего данные с неактивной таблицы сливаются в аггрегированном виде в другие таблицы, и происходит truncate с рестартом сиквенса"
так как это не подробное описание и даже не поверхностное.
Подробное - все sql запросы которые в этом процессе проходят и структура таблиц.
Так как косяк где то на этом уровне.
Особенно меня смущает "truncate с рестартом сиквенса".

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Непонятное поведение sequence
    #38986740
dezconnect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Немного наврал, с описанием процесса =\

есть две таблицы rawlogs_1 и rawlogs_2 идентичной структуры, есть вью rawlogs (который указывает на одну из двух этих таблиц) в который происходит запись, есть хранимки вызываемые раз в сутки, которые:
1) меняет во вьюхе, имя таблицы куда происходит вставка(rawlogs_1 или rawlogs_2) - change_current_rawlogs_table()
2) бекапит переименовывает текующую таблицу из вьюхи, в таблицу с суточными данными, и делает собственно рестарт сиквенса - backup_rawlogs_table()

Инсерт типовой, как указанный тут.

Разве что еще таблицы rawlogs_1/rawlogs_2 наследуются от шаблонной таблицы.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
CREATE TABLE rawlogs_1
(
  id integer NOT NULL DEFAULT nextval('rawlogs_template_id_seq_2'::regclass),
  rawlogs_timestamp timestamp with time zone DEFAULT now(),
  rawlogs_type smallint,
  unq boolean,
  action_key bytea,
  placement_id integer,
  landing_id integer,
  ip inet,
  useragent text,
  browser smallint,
  os smallint,
  device smallint,
  country smallint,
  device_id integer,
  params jsonb,
  CONSTRAINT rawlogs_1_pkey1 PRIMARY KEY (id)
);

CREATE OR REPLACE VIEW rawlogs AS 
 SELECT rawlogs_1.id,
    rawlogs_1.rawlogs_timestamp,
    rawlogs_1.rawlogs_type,
    rawlogs_1.unq,
    rawlogs_1.action_key,
    rawlogs_1.placement_id,
    rawlogs_1.landing_id,
    rawlogs_1.ip,
    rawlogs_1.useragent,
    rawlogs_1.browser,
    rawlogs_1.os,
    rawlogs_1.device,
    rawlogs_1.country,
    rawlogs_1.device_id,
    rawlogs_1.params
   FROM rawlogs_1;

CREATE OR REPLACE FUNCTION change_current_rawlogs_table()
  RETURNS void AS
$BODY$
                        declare
                            next_rawlog text;

                        Begin
                        select p_value into next_rawlog from tmp_parameters where p_name = 'next_rawlog';
                        if next_rawlog is null then
                            next_rawlog = 'rawlogs_1';
                            insert into tmp_parameters (p_name,p_value) values ('current_rawlog','rawlogs_2'), ('next_rawlog','rawlogs_1');
                        end if;
                        execute 'create or replace view rawlogs as select * from ' || next_rawlog;
                        end;
                        $BODY$
  LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION backup_rawlogs_table()
  RETURNS void AS
$BODY$
                    declare
                        next_rawlog text;
                        current_rawlog text;
			tmpTable text;
			curD date;
			today_date text;

                    Begin
			curD := now()::date - 1;
			today_date := to_char(curD,'YYYYMMDD');
			tmpTable := 'rawlog_'||today_date;
			select p_value into next_rawlog from tmp_parameters where p_name = 'next_rawlog';
			select p_value into current_rawlog from tmp_parameters where p_name = 'current_rawlog';
			EXECUTE $$ALTER TABLE $$||current_rawlog||$$ RENAME TO $$||tmpTable;
			EXECUTE $$ALTER TABLE $$||tmpTable||$$ SET TABLESPACE sata_space$$;
			execute $$CREATE TABLE IF NOT EXISTS $$|| current_rawlog||$$ (LIKE rawlogs_template INCLUDING ALL) $$ ;
			ALTER SEQUENCE rawlogs_template_id_seq RESTART;
			update tmp_parameters set p_value = next_rawlog where p_name = 'current_rawlog';
			update tmp_parameters set p_value = current_rawlog where p_name = 'next_rawlog';
			end;
			$BODY$
  LANGUAGE plpgsql;


INSERT INTO rawlogs (rawlogs_timestamp, rawlogs_type, unq, action_key, placement_id, landing_id, ip, useragent, browser, os, device, country, params, device_id) VALUES
  (now(), 2, TRUE, NULL, 477, 19118, '105.156.57.114',
   'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36', 44, 4, 1,
   134, NULL, 43241);
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Непонятное поведение sequence
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]