dados computacionais que são introduzidos durante a gravação, leitura, armazenamento, transmissão, ou processamento de dados. Em geral, arquivos contendo dados apresentarão resultados inesperados quando seus conteúdos corrompidos sejam acessados pelo sistema ou programa relacionado. Na wikipédia:
oid, datname from pg_database order by oid asc; oid | datname -------+------------ 1 | template1 13756 | template0 13757 | postgres 16384 | sistema_db (4 rows) Estrutura Física de um cluster PostgreSQL
Views são salvos num lugar misterioso que a pg_catalog.pg_get_viewdef(oid) sabe na tabela pg_catalog.pg_rewrite Estrutura Física de um cluster PostgreSQL
banco: atualiza shared_buffers e grava wal 3. user: Commit 4. banco: hey kernel: fsync() a. kernel: borá lá FS quero ver isso salvo! b. Filesystem: deixa pra mim. 5. banco: tudo certo user!
2022-08-22 05:07:23.637 UTC [39] ERROR: index "pg_toast_24722_index" contains unexpected zero page at block 0 2022-08-22 05:07:23.637 UTC [39] HINT: Please REINDEX it.limit 10; ◦ 2022-08-22 04:57:16.949 UTC [45] ERROR: unexpected chunk number 8 (expected 0) for toast value 24669 in pg_toast_24661 ◦ Qualquer entrada com PANIC • Toda vez que eu rodo query X, da um erro • Rodei a query Y e fica pendurada e parece não ser causado por um lock
UTC [26910] FATAL: invalid page in block 0 of relation base/16384/2662 -bash-4.2$ /usr/pgsql-14/bin/postgres --single sistema_db -D /var/lib/pgsql/14/data/ 2022-08-25 04:56:37.946 UTC [28310] FATAL: invalid page in block 0 of relation base/16384/2662 -bash-4.2$ /usr/pgsql-14/bin/postgres --single sistema_db -P -D /var/lib/pgsql/14/data/ PostgreSQL stand-alone backend 14.5 backend> REINDEX SYSTEM sistema_db; backend> Reparando um índice do sistema com problema Dificuldade: 😅 (2/5)
[OPTION]... # … Developer options: -P disable system indexes -T send SIGSTOP to all backend processes if one dies Options for single-user mode: --single selects single-user mode (must be first argument) DBNAME database name (defaults to user name) -d 0-5 override debugging level -j do not use newline as interactive query delimiter Reparando um índice do sistema com problema Dificuldade: 😅 (2/5)
UTC [3242] LOG: invalid primary checkpoint record 2022-08-25 06:46:24.429 UTC [3242] PANIC: could not locate a valid checkpoint record 2022-08-25 06:46:24.431 UTC [3234] LOG: startup process (PID 3242) was terminated by signal 6: Aborted 2022-08-25 06:46:24.431 UTC [3234] LOG: aborting startup due to startup process failure 2022-08-25 06:46:24.435 UTC [3234] LOG: database system is shut down -bash-4.2$ /usr/pgsql-14/bin/pg_resetwal -D /var/lib/pgsql/14/data/ Write-ahead log reset 2022-08-25 22:52:24.155 UTC [2924] LOG: database system was shut down at 2022-08-25 22:52:04 UTC 2022-08-25 22:52:24.166 UTC [2923] LOG: database system is ready to accept connections Dificuldade: 😱 (3/5)
access status of transaction 771 2022-08-26 00:18:36.822 UTC [28754] DETAIL: Could not open file "pg_xact/0000": No such file or directory. 2022-08-26 00:18:36.824 UTC [28753] LOG: startup process (PID 28754) exited with exit code 1 2022-08-26 00:18:36.824 UTC [28753] LOG: aborting startup due to startup process failure dd if=/dev/zero of=pg_xact/0000 bs=8k count=1 conv=notrunc 2022-08-26 00:23:23.708 UTC [28776] LOG: database system was shut down at 2022-08-26 00:18:29 UTC 2022-08-26 00:23:23.713 UTC [28775] LOG: database system is ready to accept connections sistema_db=# select * from vw_nasc_2000 ; ERROR: pg_attribute catalog is missing 3 attribute(s) for relation OID 16632 perdendo os dados das transações Dificuldade: 😱 (3/5)
id, nome, dt_nasc, pg_size_pretty(length(bio)::numeric) from cliente; ERROR: unexpected chunk number 3 (expected 2) for toast value 16643 in pg_toast_16386 sistema_db=# select * from check_cliente(); NOTICE: failed to work with the toast of id: 1 - (4294967295,0) check_cliente --------------- t (1 row) sistema_db=# vacuum full cliente; ERROR: unexpected chunk number 3 (expected 2) for toast value 16643 in pg_toast_16386 lidando com perda de dados Dificuldade: 🤯 (4/5)
cliente set bio=null where id=1; UPDATE 1 sistema_db=# select * from check_cliente(); check_cliente --------------- f (1 row) sistema_db=# vacuum full cliente; VACUUM lidando com perda de dados Dificuldade: 🤯 (4/5)
$$ DECLARE v_row record; found_error bool = false; BEGIN FOR v_row IN SELECT * FROM cliente order by 1 asc LOOP BEGIN perform length(v_row.bio); -- usar o toast causa o erro... EXCEPTION WHEN internal_error OR data_corrupted OR index_corrupted THEN RAISE NOTICE 'failed to work with the toast of id: % - %', v_row.id, v_row.ctid; found_error = true; END; END LOOP; RETURN found_error; END $$; lidando com perda de dados Dificuldade: 🤯 (4/5)
count=5 conv=notrunc sistema_db=# \d+ cliente; ERROR: cache lookup failed for type 1042 sistema_db=# select * from vw_nasc_2000; ERROR: cache lookup failed for function 296483811 sistema_db=# select ctid, id, nome, dt_nasc, pg_size_pretty(length(bio)::numeric) from cliente where id > 1; ERROR: cache lookup failed for function 296483811 Reparando o catálogo via engenharia reversa Dificuldade: 😵 (5/5)
em outro server se possível, se não for, utilize initdb e crie um novo cluster. restore nele. • Aproveite para documentar suas rotinas de backup - já que estamos aqui sofrendo por causa delas • Salve os logs, comandos, tudo que for evidência e faça uma análise de tudo o que aconteceu. • Simule seus backups e tente criar exercícios mensais para simular um restore no ambiente (similar ao) de de produção. • Lembre da máxima: Backup bom é o que restaura. Não confie no seu backup sem ter provas de que ele funciona!