powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / навернулась табличка. как вытянуть часть данных?
63 сообщений из 63, показаны все 3 страниц
навернулась табличка. как вытянуть часть данных?
    #39482582
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT * FORM table

выдает ошибку чт оне может прочитать блок.

SELECT * FROM table LIMIT 10 - выполняется

SELECT * FROM table LIMIT 20 - не выполняется

SELECT * FROM table LIMIT 10 OFFSET 50 - не выполняется


Есть ли способ вытащить часть целых данных?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482588
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с order by вообще никакой запрос не выполняется
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482596
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркSELECT * FORM table

выдает ошибку чт оне может прочитать блок.

SELECT * FROM table LIMIT 10 - выполняется

SELECT * FROM table LIMIT 20 - не выполняется

SELECT * FROM table LIMIT 10 OFFSET 50 - не выполняется


Есть ли способ вытащить часть целых данных?

если есть primary key id какой нить - то выбирать перебирая id от 0 и до максимального значения
все те записи что получится выбрать
а вообще реплика и backups - наше все.

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482618
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич ДереркSELECT * FORM table

выдает ошибку чт оне может прочитать блок.

SELECT * FROM table LIMIT 10 - выполняется

SELECT * FROM table LIMIT 20 - не выполняется

SELECT * FROM table LIMIT 10 OFFSET 50 - не выполняется


Есть ли способ вытащить часть целых данных?

если есть primary key id какой нить - то выбирать перебирая id от 0 и до максимального значения
все те записи что получится выбрать
а вообще реплика и backups - наше все.

--
Maxim Boguk
dataegret.ru


А может быть есть готовый скрипт, с обработкой ошибок?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482648
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркSELECT * FORM table

выдает ошибку чт оне может прочитать блок.

SELECT * FROM table LIMIT 10 - выполняется

SELECT * FROM table LIMIT 20 - не выполняется

SELECT * FROM table LIMIT 10 OFFSET 50 - не выполняется


Есть ли способ вытащить часть целых данных?

попробуйте перебирать по 1-му ctid--у. если это ваш побитый файл, конечно. а не партицированная табличка.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482657
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqКонстантин Сергеевич ДереркSELECT * FORM table

выдает ошибку чт оне может прочитать блок.

SELECT * FROM table LIMIT 10 - выполняется

SELECT * FROM table LIMIT 20 - не выполняется

SELECT * FROM table LIMIT 10 OFFSET 50 - не выполняется


Есть ли способ вытащить часть целых данных?

попробуйте перебирать по 1-му ctid--у. если это ваш побитый файл, конечно. а не партицированная табличка.

тоже так думал, но там же формат (1 0)(1 1) и тд.

Наверное проще по id.

Проблема уже не срочная, т.к. табличку из экспорта востановили, хочу для себя скрипт сделать на будущее, с обработкой исключений.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482675
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерк,

https://dba.stackexchange.com/questions/65964/how-do-i-decompose-ctid-into-page-and-row-numbers

авторThis is the data type of the system column ctid. A tuple ID is a pair ( block number, tuple index within block ) that identifies the physical location of the row within its table.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482692
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цтид генерировать можно примерно так ~
Код: sql
1.
2.
3.
4.
5.
6.
SELECT ctid, cl.* FROM pg_class cl
JOIN (
	SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 10) b,generate_series(0, 70) n
	) ct
	--using(ctid) err 42703
ON cl.ctid = ct.ctid



-- обходить таблу в do, позаписно (или поблочно) {for loop}, с exception when для блока.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482726
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqцтид генерировать можно примерно так ~
Код: sql
1.
2.
3.
4.
5.
6.
SELECT ctid, cl.* FROM pg_class cl
JOIN (
	SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 10) b,generate_series(0, 70) n
	) ct
	--using(ctid) err 42703
ON cl.ctid = ct.ctid



-- обходить таблу в do, позаписно (или поблочно) {for loop}, с exception when для блока.

(0, 70) - потенциально мало... максимально 255-292 (смотря от архитектуры там кажется align есть до 28 или 32 байт в самом минимуме)
но по сути - да.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39482727
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркSELECT * FORM table

выдает ошибку чт оне может прочитать блок.

SELECT * FROM table LIMIT 10 - выполняется

SELECT * FROM table LIMIT 20 - не выполняется

SELECT * FROM table LIMIT 10 OFFSET 50 - не выполняется


Есть ли способ вытащить часть целых данных?

Вы лучше расскажите как вы этого добились. За 15 лет работы и больше 500 серверов с postgresql - не помню чтобы такое было хоть 1 раз. Это или очень постараться надо или совсем уж из говна и палок сервер собирать.

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495161
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь перелить данные из поврежденной таблички - не получается.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495166
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркПытаюсь перелить данные из поврежденной таблички - не получается.

Берите платную поддержку если сами не можете разобраться :).
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495173
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь так:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR REPLACE FUNCTION repaired_table_func() RETURNS integer AS '

DECLARE 
	tid_var tid;
BEGIN
FOR tid_var IN
        SELECT ct.ctid  FROM corrupted_table cl JOIN (SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 1024) b,generate_series(0, 10240) n) ct ON cl.ctid = ct.ctid
    LOOP
	BEGIN
INSERT INTO kdv_repaired_table
SELECT *  FROM corrupted_table cl
WHERE  cl.ctid=tid_var;
    EXCEPTION
    --WHEN undefined_column THEN
    WHEN OTHERS THEN
    RAISE NOTICE ''SQLSTATE: %'', SQLSTATE;
    END;
        END LOOP;
return 0;
END;
' LANGUAGE plpgsql;




Отваливается с ошибкой:


Код: sql
1.
2.
3.
4.
dbprod=# SELECT repaired_table_func();

ERROR:  could not read block 1181 of relation base/16385/16807: read only 4096 of 8192 bytes
CONTEXT:  PL/pgSQL function "repaired_table_func" line 5 at FOR over SELECT rows
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495176
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как эту ошибку подваить?

точнее надо как-то пропустить поврежденные записи, вызывающие эту ошибку.

и встаивть только целые записи в новую таблицу.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495194
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерккак эту ошибку подваить?

точнее надо как-то пропустить поврежденные записи, вызывающие эту ошибку.

и встаивть только целые записи в новую таблицу.

так вам написали line 5 блин
line 5 это
SELECT ct.ctid FROM corrupted_table cl JOIN (SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 1024) b,generate_series(0, 10240) n)

вот там и лечите (и заодно учитесь читать что вам база пишет думать головой).


--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495226
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич Дерерккак эту ошибку подваить?

точнее надо как-то пропустить поврежденные записи, вызывающие эту ошибку.

и встаивть только целые записи в новую таблицу.

так вам написали line 5 блин
line 5 это
SELECT ct.ctid FROM corrupted_table cl JOIN (SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 1024) b,generate_series(0, 10240) n)

вот там и лечите (и заодно учитесь читать что вам база пишет думать головой).


--
Maxim Boguk
dataegret.ru


ну конечно селект не идет, т.к. данные повреждены!

как обойти это?

чтобы только здоровые данные прочлись?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495265
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, вроде заработало.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495282
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukqwwqцтид генерировать можно примерно так ~
Код: sql
1.
2.
3.
4.
5.
6.
SELECT ctid, cl.* FROM pg_class cl
JOIN (
	SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 10) b,generate_series(0, 70) n
	) ct
	--using(ctid) err 42703
ON cl.ctid = ct.ctid



-- обходить таблу в do, позаписно (или поблочно) {for loop}, с exception when для блока.

(0, 70) - потенциально мало... максимально 255-292 (смотря от архитектуры там кажется align есть до 28 или 32 байт в самом минимуме)
но по сути - да.


А скажите, можно как-нибудь определить пределы

SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 10 ) b,generate_series(0, 70 ) n


для конкретной таблицы (которая повреждена) ?


а то время выполнения завистит от этих параметров в геометрической прогрессии...
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495319
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT MAX(ctid) FROM таблица


вызывает ошибку


ERROR: could not read block 1181 of relation base/16385/16807: read only 4096 of 8192 bytes
SQL-состояние: XX001
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495346
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркMaxim Bogukпропущено...


(0, 70) - потенциально мало... максимально 255-292 (смотря от архитектуры там кажется align есть до 28 или 32 байт в самом минимуме)
но по сути - да.


А скажите, можно как-нибудь определить пределы

SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 10 ) b,generate_series(0, 70 ) n


для конкретной таблицы (которая повреждена) ?


а то время выполнения завистит от этих параметров в геометрической прогрессии...
см выше :
автор(0, 70) - потенциально мало... максимально 255-292 (смотря от архитектуры там кажется align есть до 28 или 32 байт в самом минимуме)
но по сути - да.

геометрическую вы сильно получили.

вам надо 2 вложенных
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
FOR i=0..10 LOOP
 begin --savepoint here -- блок целиком
   FOR k =0..70 LOOP

   END LOOP;
 exception when
   .......
 end;-- begin block
END LOOP;


и никаких генераций и геометрических.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495355
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqКонстантин Сергеевич Дереркпропущено...



А скажите, можно как-нибудь определить пределы

SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 10 ) b,generate_series(0, 70 ) n


для конкретной таблицы (которая повреждена) ?


а то время выполнения завистит от этих параметров в геометрической прогрессии...
см выше :
автор(0, 70) - потенциально мало... максимально 255-292 (смотря от архитектуры там кажется align есть до 28 или 32 байт в самом минимуме)
но по сути - да.

геометрическую вы сильно получили.

вам надо 2 вложенных
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
FOR i=0..10 LOOP
 begin --savepoint here -- блок целиком
   FOR k =0..70 LOOP

   END LOOP;
 exception when
   .......
 end;-- begin block
END LOOP;


и никаких генераций и геометрических.



10 и 70 мало.

на 1024 и 1024 достает 15 тыс записей.


Запустил на 2048 - выполняется уже два часа.



Как можно определить необходимый и достаточный максимум для этого длиапазона?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495446
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну или можно как-то ускорить процесс?

уже несколько часов фигачит.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495448
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерк10 и 70 мало.

на 1024 и 1024 достает 15 тыс записей.


Запустил на 2048 - выполняется уже два часа.



Как можно определить необходимый и достаточный максимум для этого длиапазона?
кол-во записей в блоке ограничено сверху размером блока и минимальным размером записи

как писали выше:
автормаксимально 255-292

спросить where ctid >.... не получится -- план сваливается в фуллскан.

можете идти не позаписно , а поблочно, т.к. на where ctid =any(ARRAY[...]) даёт в плане примерно такое

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT *
  FROM XXXXXX
  WHERE ctid = ANY(array((
	SELECT (point(10000,n))::text::tid AS ctid FROM generate_series(0, 270) n
	)))
;




"Tid Scan on XXXXXX  (cost=25.02..65.12 rows=10 width=336) (actual time=0.505..0.569 rows=24 loops=1)"
"  TID Cond: (ctid = ANY ($0))"
"  InitPlan 1 (returns $0)"
"    ->  Function Scan on generate_series n  (cost=0.00..25.00 rows=1000 width=4) (actual time=0.073..0.415 rows=271 loops=1)"




как получить оценку сверху на колв-во блоков -- хз. присмотритесь к
Код: sql
1.
2.
3.
4.
SELECT relpages FROM pg_class where relname = ...;

--OR
SELECT relpages FROM pg_class where oid='XXXXXX'::regclass


можно конечно на пи умножить, для верности.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495450
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot qwwq]
автормаксимально 255-292


т.е. это второе число из скобочек?


Просто первое точно около 500 есть.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495451
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дереркну или можно как-то ускорить процесс?

уже несколько часов фигачит.код покажите.
интересно посмотреть.
могабыть что и подскажется
/*мы в цырке не смеёмса*/
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495456
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Константин Сергеевич Дерерк]qwwqпропущено...



т.е. это второе число из скобочек?


Просто первое точно около 500 есть.
мальтчик, ты дуяк ?

пейвое чисьо -- это номей бьока, он, номер, могабыть очень бальшоой
втайое -- это номей запейси в блоке
блок обычно 8кб
запись не менее .... (спросить у максима, оверхед немного от версии пж плавает)
т.е. запейсей на блоке не более ....
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495462
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqпропущено...

мальтчик, ты дуяк ?

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



Правельно ли понял что максимальная может быть

(8000,292)

?


чет запутался
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495467
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq ,на счет кода, там в цикле выполняются эти действия:

[quot Константин Сергеевич Дерерк]

INSERT INTO kdv_repaired_table
SELECT * FROM corrupted_table cl
WHERE cl.ctid=tid_var;
EXCEPTION
--WHEN undefined_column THEN
WHEN OTHERS THEN
RAISE NOTICE ''SQLSTATE: %'', SQLSTATE;
END;
[/src]
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495473
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дереркqwwq ,на счет кода, там в цикле выполняются эти действия:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO kdv_repaired_table
SELECT *  FROM corrupted_table cl
WHERE  cl.ctid=tid_var;
    EXCEPTION
    --WHEN undefined_column THEN
    WHEN OTHERS THEN
    RAISE NOTICE ''SQLSTATE: %'', SQLSTATE;
    END;


блок не читается целиком, думается.
зачем вам 292 нотиса на блок выдавать ?

т.ч. покажите весь код.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495478
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqКонстантин Сергеевич Дереркqwwq ,на счет кода, там в цикле выполняются эти действия:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO kdv_repaired_table
SELECT *  FROM corrupted_table cl
WHERE  cl.ctid=tid_var;
    EXCEPTION
    --WHEN undefined_column THEN
    WHEN OTHERS THEN
    RAISE NOTICE ''SQLSTATE: %'', SQLSTATE;
    END;


блок не читается целиком, думается.
зачем вам 292 нотиса на блок выдавать ?

т.ч. покажите весь код.








Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION repaired_table_func() RETURNS integer AS '

DECLARE 
	tid_var tid;
BEGIN
FOR tid_var IN
        SELECT (point(b,n))::text::tid AS ctid FROM generate_series(0, 2048) b,generate_series(0, 300) n
    LOOP
	BEGIN
INSERT INTO repaired_table
SELECT *  FROM table cl
WHERE  cl.ctid=tid_var;
    EXCEPTION
    WHEN OTHERS THEN
    RAISE NOTICE ''SQLSTATE: %'', SQLSTATE;
    END;
        END LOOP;
return 0;
END;
' LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495479
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>зачем вам 292 нотиса на блок выдавать ?


а сколько лучше сделать максимально?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495481
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерк,

А еще очень интересно прикинуть сколько там в транзакции savepoints получается (там будет со временем сильно нелинейное замедление от количества savepoints).
И подумать почему такие вещи не делают в транзакции или хранимке а вызывают запросы внешним приложением.

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495488
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич Дерерк,

А еще очень интересно прикинуть сколько там в транзакции savepoints получается (там будет со временем сильно нелинейное замедление от количества savepoints).
И подумать почему такие вещи не делают в транзакции или хранимке а вызывают запросы внешним приложением.

--
Maxim Boguk
dataegret.ru


можно ли там commit впихнуть после каждого инсерта и ускорит ли это процедуру?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495495
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркMaxim BogukКонстантин Сергеевич Дерерк,

А еще очень интересно прикинуть сколько там в транзакции savepoints получается (там будет со временем сильно нелинейное замедление от количества savepoints).
И подумать почему такие вещи не делают в транзакции или хранимке а вызывают запросы внешним приложением.

--
Maxim Boguk
dataegret.ru


можно ли там commit впихнуть после каждого инсерта и ускорит ли это процедуру?

Нельзя... транзакции внутри pl/pgsql (да и прочих pl/*) - не поддерживаются.
Я не зря про внешнее приложение написал :).

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495500
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич Дереркпропущено...



можно ли там commit впихнуть после каждого инсерта и ускорит ли это процедуру?

Нельзя... транзакции внутри pl/pgsql (да и прочих pl/*) - не поддерживаются.
Я не зря про внешнее приложение написал :).

--
Maxim Boguk
dataegret.ru


а как вызвать внешнее приложение из кода? о_О
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495501
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич Дереркпропущено...



можно ли там commit впихнуть после каждого инсерта и ускорит ли это процедуру?

Нельзя... транзакции внутри pl/pgsql (да и прочих pl/*) - не поддерживаются.
Я не зря про внешнее приложение написал :).

--
Maxim Boguk
dataegret.ru
use dblink ,Luke
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495503
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерк
а как вызвать внешнее приложение из кода? о_О
CREATE EXTENSION dblink;
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495505
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqКонстантин Сергеевич Дерерка как вызвать внешнее приложение из кода? о_О
CREATE EXTENSION dblink;

он установлен, просто там куча разных вызовов.

dblink_build_sql_insert

например.
но описание там мутное какое-то

Как лучше вызвать инсерт в данном случае?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495509
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дереркqwwqпропущено...

CREATE EXTENSION dblink;

он установлен, просто там куча разных вызовов.

dblink_build_sql_insert

например.
но описание там мутное какое-то

Как лучше вызвать инсерт в данном случае?
как напишешь, так и лучше

я бы dblink_exec дергал, думается. а чтобы не обрабатывать ошибки в головной -- fail_on_error:=true , и вперед
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495528
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqКонстантин Сергеевич Дереркпропущено...


он установлен, просто там куча разных вызовов.

dblink_build_sql_insert

например.
но описание там мутное какое-то

Как лучше вызвать инсерт в данном случае?
как напишешь, так и лучше

я бы dblink_exec дергал, думается. а чтобы не обрабатывать ошибки в головной -- fail_on_error:=true , и вперед

вот тако вылезло

Код: sql
1.
Подробности: FATAL:  sorry, too many clients already




как закрывать грамотно соединения, чтобы коннекты не висели?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495551
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерк,

а незачем их открывать бессчётно.
открыли одно, именное. и в него ходитя
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495786
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqКонстантин Сергеевич Дерерк,

а незачем их открывать бессчётно.
открыли одно, именное. и в него ходитя




ERROR: duplicate connection name
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39495847
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркqwwqКонстантин Сергеевич Дерерк,

а незачем их открывать бессчётно.
открыли одно, именное. и в него ходитя




ERROR: duplicate connection name
example dblink--connection
Код: 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.
do
$dod$
declare
	conname CONSTANT text := 'test';
	res	text;
begin
	IF conname = any(dblink_get_connections()) 
	then --do nothing
	else
		PERFORM dblink_connect (conname,'dbname='||current_database());		
	end if;

	FOR i IN 1..10 
	LOOP
		if i % 2 =0 then
			res:= dblink_exec(conname
				,$dbl$
					do
					$dbld$
					BEGIN
						RAISE EXCEPTION 'yoptel`';
					END;
					$dbld$;
				$dbl$::text
				,false);
		else
			res:= dblink_exec(conname,
				$dbl$create table if not exists test as SELECT 1 as a;
					INSERT INTO test SELECT 2; $dbl$::text
				,false);
		end if;
		raise notice '	i %	%' ,i,res;
	END LOOP;
	PERFORM dblink_disconnect (conname);
end;
$dod$

...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496164
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqКонстантин Сергеевич Дереркпропущено...





ERROR: duplicate connection name
example dblink--connection
Код: 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.
do
$dod$
declare
	conname CONSTANT text := 'test';
	res	text;
begin
	IF conname = any(dblink_get_connections()) 
	then --do nothing
	else
		PERFORM dblink_connect (conname,'dbname='||current_database());		
	end if;

	FOR i IN 1..10 
	LOOP
		if i % 2 =0 then
			res:= dblink_exec(conname
				,$dbl$
					do
					$dbld$
					BEGIN
						RAISE EXCEPTION 'yoptel`';
					END;
					$dbld$;
				$dbl$::text
				,false);
		else
			res:= dblink_exec(conname,
				$dbl$create table if not exists test as SELECT 1 as a;
					INSERT INTO test SELECT 2; $dbl$::text
				,false);
		end if;
		raise notice '	i %	%' ,i,res;
	END LOOP;
	PERFORM dblink_disconnect (conname);
end;
$dod$




Благодарю.


Получилось реализовать через дблинки, но работает еще медленнее чем инсерт напрямую.
судя по сообщениям о невозможности считать строку.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496186
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще жаль что в постгресс нет стандартного механизма востановления таблички при повреждении
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496191
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерк<>
Получилось реализовать через дблинки, но работает еще медленнее чем инсерт напрямую.
судя по сообщениям о невозможности считать строку.
код всё такой же ? позаписный ?

идите поблочно. == есть такая мысль, если блок не читается -- он не читается целиком. могу врать. (проверьте на каком либо точно битом блоке -- сможете ли найти хоть одну запись в нем, адресуясь ctid-ом)
тогда при первой ошибке в блоке переходите к новому.

и писать можно сразу весь блок . -- я же писал ( 20677291 ) примерно :

Код: sql
1.
2.
3.
4.
5.
6.
SELECT *
  FROM XXXXXX
  WHERE ctid = ANY(array((
	SELECT (point(10000,n))::text::tid AS ctid FROM generate_series(0, 270) n
	)))
;



где 10000 -- номер блока. 0--270 номера записей в блоке. (если табличка широкая -- можно взять уже. и кажется они (строки) таки с 1 идут. блоки -- как положено -- с 0 ).
но в любом случае это забавный способ ковырять землю мелкоскопом. имхо.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496195
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерквообще жаль что в постгресс нет стандартного механизма востановления таблички при повреждении

если вы теряете записи -- кто ж вам сторож, злобному буратинию.
выковыривать куски из обломков -- это не дело в любом случае.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496198
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqесть такая мысль, если блок не читается -- он не читается целиком. могу врать.


судя по всему, так и есть.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496203
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, автовакуум блоки меняет местами?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496267
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерккстати, автовакуум блоки меняет местами?

Нет. И даже записи местами не меняет.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496272
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич Дерерккстати, автовакуум блоки меняет местами?

Нет. И даже записи местами не меняет.

Хорошо, однако его на всякий случай отключил.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496274
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, по наблюдениям, обработка идет очень неравномерно.

Некоторые строки висят по несколько минут.
А иногда сотня строк в секунду обрабатывается.

С блокировками не связано.

Наверное диск вот вот развалится просто.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496275
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркНекоторые строки висят по несколько минут.
А иногда сотня строк в секунду обрабатывается.


из существующих естественно.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496276
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дерерквообще жаль что в постгресс нет стандартного механизма востановления таблички при повреждении

Стандартный механизм восстановления называется hot standby реплика (или base backup + wal archive).

--
Maxim Boguk
dataegret.ru - лучшая русскоязычная поддержка PostgreSQL
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496279
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич Дерерквообще жаль что в постгресс нет стандартного механизма востановления таблички при повреждении

Стандартный механизм восстановления называется hot standby реплика (или base backup + wal archive).

--
Maxim Boguk
dataegret.ru - лучшая русскоязычная поддержка PostgreSQL

На каждую кофемолку hot standby не сделать...

было бы очень удобно что-то типа DBCC CHECK TABLE.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496313
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич ДереркMaxim Bogukпропущено...


Стандартный механизм восстановления называется hot standby реплика (или base backup + wal archive).

--
Maxim Boguk
dataegret.ru - лучшая русскоязычная поддержка PostgreSQL

На каждую кофемолку hot standby не сделать...

было бы очень удобно что-то типа DBCC CHECK TABLE.

На кофемолке надо sqlite держать :).
Или хотя бы ежедневный pg_dump куда то на другой сервер.

--
Maxim Boguk
dataegret.ru - лучшая русскоязычная поддержка PostgreSQL
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496427
Фотография mefman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
и будет тот же плач на форуме про sqllite.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496435
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mefmanMaxim Boguk,
и будет тот же плач на форуме про sqllite.

Это уже не жалко совсем :). Баба с возу - кобыле легче.

--
Maxim Boguk
dataegret.ru - лучшая русскоязычная поддержка PostgreSQL
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496601
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает :)


Спасибо за помощь.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496607
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqкак получить оценку сверху на колв-во блоков -- хз. присмотритесь к
Код: sql
1.
2.
3.
4.
SELECT relpages FROM pg_class where relname = ...;

--OR
SELECT relpages FROM pg_class where oid='XXXXXX'::regclass


можно конечно на пи умножить, для верности.




А скажите, если заполненный блок начинается на с 0-с а 100000-го, например, до этого все пустые.

relpages в запросе это учитывает? Т.е. он выдает примерное количество с учетом незаполненных блоков?
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496731
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дереркqwwqкак получить оценку сверху на колв-во блоков -- хз. присмотритесь к
Код: sql
1.
2.
3.
4.
SELECT relpages FROM pg_class where relname = ...;

--OR
SELECT relpages FROM pg_class where oid='XXXXXX'::regclass


можно конечно на пи умножить, для верности.




А скажите, если заполненный блок начинается на с 0-с а 100000-го, например, до этого все пустые.

relpages в запросе это учитывает? Т.е. он выдает примерное количество с учетом незаполненных блоков?

replapages выдает точное значение исходя из размера файла на диски с т.з. базы. Так что ему без разницы на заполненные блоки или нет.

--
Maxim Boguk
dataegret.ru - лучшая русскоязычная поддержка PostgreSQL
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496741
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Сергеевич Дереркqwwqкак получить оценку сверху на колв-во блоков -- хз. присмотритесь к
Код: sql
1.
2.
3.
4.
SELECT relpages FROM pg_class where relname = ...;

--OR
SELECT relpages FROM pg_class where oid='XXXXXX'::regclass


можно конечно на пи умножить, для верности.




А скажите, если заполненный блок начинается на с 0-с а 100000-го, например, до этого все пустые.

relpages в запросе это учитывает? Т.е. он выдает примерное количество с учетом незаполненных блоков?
это вопрос скорее о системном кодинге.
файло растет минимум на блок. скорее -- на кучку блоков фикс. размера.
думается это происходит так -- прирезали ("низким" образом) к файлу кучку блоков -- переписали значение в системной табле.
если не скучно изучать системное -- дерзайте .

а пустой блок -- забит либо пустыми записями (0), либо удаленными. но табличке-то (её файлу) он принадлежит.
...
Рейтинг: 0 / 0
навернулась табличка. как вытянуть часть данных?
    #39496742
Константин Сергеевич Дерерк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukКонстантин Сергеевич Дереркпропущено...





А скажите, если заполненный блок начинается на с 0-с а 100000-го, например, до этого все пустые.

relpages в запросе это учитывает? Т.е. он выдает примерное количество с учетом незаполненных блоков?

replapages выдает точное значение исходя из размера файла на диски с т.з. базы. Так что ему без разницы на заполненные блоки или нет.

--
Maxim Boguk
dataegret.ru - лучшая русскоязычная поддержка PostgreSQL

получается можно ориентироваться на это значение из запроса как максимальное - круто!
...
Рейтинг: 0 / 0
63 сообщений из 63, показаны все 3 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / навернулась табличка. как вытянуть часть данных?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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