Oracle
 sql >> база данни >  >> RDS >> Oracle

Изхвърляне на блокове от данни

Наскоро работех върху някои повреди на блокове от данни и трябваше да изхвърля някои блокове данни, за да проверя съдържанието му. Трябваше да отметна една книга, която написах преди много време, която показваше как се прави това. Това, което следва, е част от този документ:

За да изхвърлите блок, принадлежащ на таблица, ще трябва да знаете номера на файла и номера на блока на този блок. Ако вече знаете номера на файла и блока, значи сте готови. Ако не знаете номера на файла и блока, можете да потърсите DBA_EXTENTS за тази информация. Сега, когато знаем кой файл и блокове държат нашата таблица, нека изхвърлим примерен блок от таблицата. Това се прави по следния начин:

ORA9I SQL> променя системния файл с данни за дъмп 3 блок 10;

Системата е променена.

Можете да изхвърлите набор от блокове със следната команда:

ORA9I SQL> промяна на системния файл с данни за дъмп 3 блок мин. 10 блок макс. 12;

Системата е променена.

Нека сега да разгледаме съдържанието на изхвърлянето на един блок.

Стартиране на блокове с данни за изтегляне tsn:3 file#:3 minblk 10 maxblk 10
буфер tsn:3 rdba:0x00c0000a (3/10)
scn:0x0000.00046911 seq:0x0 tail :0x69110602
frmt:0x02 chkval:0x579d тип:0x06=trans data
Изхвърляне на заглавка на блока:0x00c0000a
Идентификатор на обект в блок? Y
seg/obj:0x6d9c csc:0x00.46911 ic:2 flg:O typ:1 - DATA
fsl:0 fnx:0x0 ver:0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 xid:0x0005.02f.0000010c uba:0x00806f10.00ca.28 C--- 0 scn 0x0000.00246900x00046900x00000000000 00000101 uba:0x00800033.0099.04 C--- 0 scn 0x0000.00046906

Това е началото на дъмпа на блока от данни. Първият ред ни казва, че изхвърляме файл №3, започвайки от блок № 10 (minblk) и завършващ с блок № 10 (maxblk). Ако бяхме изхвърлили повече от един блок данни, тези стойности биха представлявали диапазон. Относителният адрес на блок от данни (rdba) е 0x00c0000a. За повече информация относно rdba вижте по-късен раздел в тази статия. В края на този ред можем да видим в скоби, че rdba съответства на файл № 3, блок № 10 (3/10).

Третият ред описва SCN на блока данни. В нашия случай SCN е 0x0000.00046911. Опашката на блока от данни се състои от последните два байта на SCN (6911), добавени с типа (06) и последователността (02). Ако разлагането на опашката не съответства на тези три стойности, тогава системата знае, че блокът е непоследователен и трябва да бъде възстановен. Докато тази стойност на опашката се показва в началото на изхвърлянето на блока, тя се съхранява физически в края на блока с данни.

Типът на блока се показва на четвъртия ред. Някои от валидните типове отговарят на следната таблица:

Тип Значение
0x02 блок за отмяна
0x06 таблица или индексен блок с данни
0x0e отмяна на заглавка на сегмента
0x10 блок на заглавката на сегмента от данни
0x17 заглавка на сегмент с растерни данни

„Идентификатор на обект на блок?“ линията ни казва дали този обект е в SYS.OBJ$ или не. От Oracle 6 това винаги трябва да бъде „Y“. Ако погледнете следващия ред, стойността seg/obj ни казва идентификатора на обекта на сегмента (в шестнадесетичен). В нашия пример това е 0x6d9c. Hex „6D9C“ е „28060“ в десетичен знак. Можем да проверим дали това е нашата таблица със следната заявка:

ORA9I SQL> изберете собственик,обект_име от dba_objects
2 където object_id=28060;

ИМЕ_ОБЕКТ НА СОБСТВЕНИК
-------------- ------------------------------
PEASLAND EMP

Както се надявахме, това е нашата маса.

Стойността csc е номерът за промяна на системата за почистване. Тази стойност ни казва кога е извършено почистване на блок върху този блок. Надяваме се, че съответства на SCN на блока от данни. Стойността на itc е броят на списъка с заинтересовани транзакции. В нашия случай има две транзакции, заинтересовани от този блок. Тези заинтересовани транзакции се появяват в края на нашия пример. Можем да видим идентификатора на транзакцията (Xid) на тези две транзакции. Тези идентификатори на транзакции съответстват на сегменти за връщане назад, които се използват за обработка на нашите транзакции.

Флагът (flg) е или "-" или "O", използва се за указване дали този блок е в списък със свободни. Ако блокът е в свободен списък, флагът ще бъде „0“. Ако не е в свободен списък, тогава флагът ще бъде „-“. Въпросният ни блок е в списъка с безплатни.

Е, това беше доста информация и всъщност не сме разгледали твърде много от сметището. Нека разгледаме следващия раздел от дъмп на блока от данни.

data_block_dump
===============
tsiz:0x1fa0
hsiz:0x2e
pbl:0x024d015c
bdba:0x00c0000a
флаг=------------
ntab=1
nrow=14
frre=9
fsbo=0x2e
fseo=0x1b18
avsp=0x1d8a
tosp=0x1d8a
0xe:pti[0] nrow=14 offs=0
0x12:pri[0] offs=0x1c30
0x14:pri[1] offs=0x1f4f
0x16:pri[2] offs=0x1f24
0x18:pri[3] offs=0x1efb
0x1a:pri[4] offs=0x1ece
0x1c:pri[5] offs=0x1ea5
0x1e:pri[6] offs=0x1e7c
0x20:pri[7] offs=0x1e54
0x22:pri[8] offs =0x1e2e
0x24:pri[9] sfll=13
0x26:pri[10] offs=0x1ca4
0x28:pri[11] offs=0x1cf1
0x2a:pri[12 ] offs=0x1b18
0x2c:pri[13] sfll=-1

Стойността tsiz ни показва количеството налично място в блока за данни. Тук получаваме „1fa0“, което означава 8 096 байта използваема стая. Останалата част от нашия блок от 8 192 байта се използва за допълнителни разходи, като например заглавката на блока.

Стойността ntab ни показва колко таблици се съхраняват в този блок. Освен ако този блок не принадлежи към клъстер, тази стойност ще бъде „1“. Стойността nrow ни казва колко реда данни се съхраняват в този блок. Нашият блок с данни има 14 реда данни.

Започвайки от адрес „0xe“, получаваме директория към всеки ред. Можем да видим, че първият ред (запис в индекса нула) започва с изместен адрес към блока „0x1c30“. Всеки от редовете на блоковете следва от тук. По този начин един ред може да бъде намерен много бързо. Не забравяйте, че ROWID е основно указател към уникален ред. В Oracle 8+, ROWID е от формата O.F.B.R (или objectno,relativefno,blockno,rowno). Така че, когато системата бързо сочи към конкретен блок в конкретен файл, номерът на реда сочи към слот в тази директория. След това директорията сочи към определено място в блока. Това е началото на този ред.

Сега, когато имаме пътна карта към нашия блок от данни, нека разгледаме останалата част от файла за проследяване, за да видим действителните редове с данни в блока.

block_row_dump:
раздел 0, ред 0, @0x1c30
tl:39 fb:--H-FL-- lb:0x0 cc:8
col 0:[ 3] c2 4a 46
кол 1:[ 5] 53 4d 49 54 48
кол 2:[ 5] 43 4c 45 52 4b
кол 3:[ 3] c2 50 03
кол 4:[ 7] 77 b4 0c 11 01 01 01
кол 5:[ 3] c2 09 19
кол 6:*NULL*
кол 7:[ 2] c1 15

Действителните данни за ред започват с фразата „block_row_dump:“. След това се дава ред с данни. Тук съм показал само един ред данни, тъй като останалите са подобни. Можем да видим, че този ред принадлежи на таблица „0“ (tab) на нашия клъстер. Тъй като в нашия пример няма клъстер, ние нямаме повече от една таблица, така че тази стойност ще бъде нула. Можем също да видим, че това е ред „0“ и е даден адресът на този ред. Този адрес трябва да съответства на нашата пътна карта, отбелязана по-горе.

Стойността „tl“ ни дава общия брой байтове за този ред, включително всички допълнителни разходи. Виждаме, че този ред заема 39 байта. Стойността „cc“ ни дава брой колони. В този ред имаме осем колони. Това може лесно да се провери, като направите ОПИСВАНЕ на таблицата и преброите колоните или като направите заявка за USER_TAB_COLUMNS.

Стойността „fb“ ни дава знамена за реда. „H“ означава, че имаме главата на реда. „F“ означава, че имаме първото парче от реда. „L“ означава, че имаме и последното парче от реда. Тъй като това е първото и последното парче от реда, редът не е окован. Тъй като това е и главата на реда, редът не е мигриран.

Останалата информация за реда са данните за всяка колона. Например, в колона 1 имаме следните ASCII символни кодове, „53 4d 49 54 48“. Бърз поглед към ASCII диаграма за преобразуване ще ни каже, че тези знаци са „SMITH“. Ако сте запознати с примерната EMP таблица, ще знаете, че SMITH е един от нашите служители. Забележете, че колона 6 е NULL. Колона 4 е колоната HIREDATE. Това е тип данни DATE. От този блок можете лесно да проверите дали типът данни DATE изисква седем байта за съхранение. Колона 0 съдържа число. Трите байта тук са представянето на това число.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle (ORA-02270) :няма съвпадащ уникален или първичен ключ за тази грешка в списъка с колони

  2. Вмъкване в Oracle Nested Table в Java

  3. функция to_date със sysdate

  4. Създайте и конфигурирайте Oracle Linked Server в SQL Server

  5. Oracle:Какво прави „(+)“ в клауза WHERE?