powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / навернулась табличка. как вытянуть часть данных?
25 сообщений из 63, страница 1 из 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
25 сообщений из 63, страница 1 из 3
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / навернулась табличка. как вытянуть часть данных?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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