Проверка блоков. Параметры DB_BLOCK_CHECKSUM, DB_BLOCK_CHECKING, _db_always_check_system_ts

dbstalker, 27 июня

Для чего нужны эти параметры, и чем они отличаются?

Прочитав документацию по параметрам DB_BLOCK_CHECKSUM и DB_BLOCK_CHECKING, как-то ясности не было. Пришлось выискивать дополнительную информацию. Вот результаты поисков.

База данных постоянно перемещает данные - из пользовательского сеанса в буферный кэш, из кэша на диск и наоборот. Все эти передвижения могут сделать блок данных восприимчивым к искажению.

При установке параметра DB_BLOCK_CHECKING в значение отличное от OFF блок считывается в буферный кэш, производится его анализ. Этот анализ включает в себя проверку, что считан именно требуемый блок, а также проверку информации в заголовках. Если эта проверка не прошла, тогда и возникает ошибка:

ORA-01578: ORACLE data block corrupted

(file # %s, block # %s)

Если включен параметр db_block_checksum, то дополнительно производится проверка контрольной суммы блока. В этом случае вычисляется контрольная сумма значений данных перед записью блока на диск. Это значение контрольной суммы также записывается на диск. Когда блок читается с диска, процесс считывания снова вычисляет контрольную сумму, а затем сравнивает ее с сохраненным значением. Если данные разрушены, контрольные суммы будут отличаться, тем самым выявляется повреждение.

Применение этих параметров позволяет выявлять нарушения целостности данных непосредственно в памяти и сразу же сообщает об ошибках, что является очень полезным для предотвращения нарушения целостности данных на дисковом уровне, также как и для предотвращения его прохождения в резервную (standby) базу данных.

DB_BLOCK_CHECKING эквивалентно следующим событиям 10210 (check data block integrity), 10211 (check index block integrity), and 10212 (check cluster integrity), 10235 ("check memory manager internal structures") and 10049 ("Use the OS memory protection (if available) to protect library cache memory heaps that are pinned.")...

Есть недокументированный параметр "_db_always_check_system_ts" имеющий по умолчанию значение TRUE, вызывающий проверку (DB_BLOCK_CHECKING) для SYSTEM tablespace.

select KSPPINM,KSPPDESC,KSPPSTVL,KSPPSTDVL,KSPPSTDF from X$KSPPSV a,x$ksppi b
where a.indx=b.indx and KSPPINM like '_db_always_check_system_ts'

KSPPINM                                                                          KSPPDESC                                                                                                                                                                                                                                                        KSPPSTVL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         KSPPSTDVL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        KSPPSTDF  
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------
_db_always_check_system_ts                                                       Always perform block check and checksum for System tablespace                                                                                                                                                                                                   TRUE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             TRUE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             TRUE       

А теперь почти по Тому Кайту:

checksum-гарантирует, что прочитаете то, что было записано. Помогает определить повреждение в процессе операций ввода-вывода (плохой диск, плохой кабель, плохие аппаратные средства), а также ошибки связанные с программным обеспечением (bad interaction between Oracle and file system drivers, logical volume manager, raid software, whatever). Но не определит, что блок был уже поврежден в памяти ( плохие чипы памяти, плохое пз). Полезна при поиске некорректных дисковых операций. Выполняется следующим образом:

  • рассчитывается контрольная сумма для грязного блока
  • контрольная сумма записывается в блок
  • блок сбрасывается на диск
  • позже блок считывается
  • снова рассчитывается контрольная сумма и сравнивается с имеющейся в блоке контрольной суммой.

block checking- проверяется не искажен ли блок. Эта логическая проверка подтверждает целостность блока. Когда оракл находит поврежденный блок, то пытается его восстановить. Для такого восстановления не нужны редо-файлы или что-то еще. Хотя это выявление ошибок случившихся в памяти, но ошибки носителя также будут выявлены. Так, например, при переброске на диск изменился бит в длине поля - это логическое повреждение блока.

Эти два параметра устанавливают различные проверки в различное время. И упрощенно говоря, checksum проверяет работу аппаратных средств, block checking - программных.

Документация

DB_BLOCK_CHECKING controls whether or not Oracle performs block checking for database blocks. The checking that is performed depends on the value you supply, as follows:

OFF - no block checking is performed for blocks in the user tablespaces. However, semantic block checking for SYSTEM tablespace blocks is always turned on.

LOW - basic block header checks are performed after block contents change in memory (for example, after UPDATE or INSERT statements, on-disk reads, or inter-instance block transfers in RAC)

MEDIUM - all LOW checks are performed, as well as semantic block checking for all non-index-organized table blocks

FULL - all LOW and MEDIUM checks are performed, as well as semantic checks for index blocks (that is, blocks of subordinate objects that can actually be dropped and reconstructed when faced with corruption)

Oracle checks a block by going through the data in the block, making sure it is logically self-consistent. Block checking can often prevent memory and data corruption. Block checking typically causes 1% to 10% overhead, depending on workload and the parameter value. The more updates or inserts in a workload, the more expensive it is to turn on block checking. You should set DB_BLOCK_CHECKING to FULL if the performance overhead is acceptable. For backward compatibility the use of FALSE (implying OFF) and TRUE (implying FULL) is preserved.

DB_BLOCK_CHECKSUM determines whether DBWn and the direct loader will calculate a checksum (a number calculated from all the bytes stored in the block) and store it in the cache header of every data block when writing it to disk. Checksums are verified when a block is read - only if this parameter is TYPICAL or FULL and the last write of the block stored a checksum. In FULL mode, Oracle also verifies the checksum before a change application from update/delete statements and recomputes it after the change is applied. In addition, Oracle gives every log block a checksum before writing it to the current log.

If this parameter is set to OFF, DBWn calculates checksums only for the SYSTEM tablespace, but not for user tablespaces.

Checksums allow Oracle to detect corruption caused by underlying disks, storage systems, or I/O systems. If set to FULL, DB_BLOCK_CHECKSUM also catches in-memory corruptions and stops them from making it to the disk. Turning on this feature in TYPICAL mode causes only an additional 1% to 2% overhead. In the FULL mode it causes 4% to 5% overhead. Oracle recommends that you set DB_BLOCK_CHECKSUM to TYPICAL. For backward compatibility we preserve use of TRUE (implying TYPICAL) and FALSE (implying OFF) values.

Литература

http://www.oracle.com/global/ru/oramag/september2005/admin_nanda_top22.html

http://dsvolk.msk.ru/oracle/faq/dba.php

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1094433279412

2 комментария

Прокоментировать

meluzov
24 июля 2008 г. в 15:39

А запрос то надо проверять на вшивость:

select KSPPINM,KSPPDESC,KSPPSTVL,KSPPSTDF,KSPPSTVF from X$KSPPSV a,x$ksppi b
where a.indx=b.indx and KSPPINM like '_db_always_check_system_ts';

dbstalker
24 июля 2008 г. в 16:16

Этот запрос отрабатывает на ORA10g без проблем. На 9-ке попробуйте так:select KSPPINM,KSPPDESC,KSPPSTVL,KSPPSTDF from X$KSPPSV a,x$ksppi b
where a.indx=b.indx and KSPPINM like '_db_always_check_system_ts'

 

Новый комментарий

Я не спамер: введите суму 4+2



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Досуг для взрослых
19 июня, 1 ответа
авто
19 июня, 1 ответа
Отдых
18 июня, 2 ответа