Рейтинг: 0/5
У цьому пості піднімалося питання можливості отримання даних і пошкодженої таблиці минаючи зіпсований блок. Тут розглянемо можливість отримання даних таблиці безпосередньо з зіпсованого блоку.
Ця можливість стає реальною, якщо на все колонки таблиці існує індекс. Точніше - можна отримати з індексних сегментів інформацію, що зберігається в них, не дивлячись на те, що відповідні блоки таблиці пошкоджені.
У пості був показаний спосіб як знайти ROWID першого запису таблиці в пошкодженому блоці і ROWID першого запису в блоці, наступному за пошкодженим блоком:
select dbms_rowid.rowid_create (1, DATA_OBJECT_ID, номер_файла, номер_блока, 0) first_rowid from dual - знаходимо ROWID першого запису в пошкодженому блоці
select dbms_rowid.rowid_create (1, DATA_OBJECT_ID, номер_файла, номер_блока + 1,0) last_rowid from dual - знаходимо ROWID першого запису в блоці, наступному за пошкодженим.
Таким чином, ми отримали діапазон ROWID втрачених записів таблиці. А тепер, якщо у нас є індекси, виконаємо такі запити на вибірку, щоб їх виконання не потребувало читанні таблиці. Тобто, щоб для їх виконання було досить читання індексів. Запропоновані нижче запити потрібно використовувати для кожного існуючого індексу таблиці (було б добре, якби існували індекси для кожної колонки таблиці). Таким чином, ви зможете зберегти максимально можливу інформацію.
Якщо хоча б один ключ мав обмеження NOT NULL тоді можна використовувати метод fast full scan для доступу до індексних значень:
В іншому випадку ви не зможете використовувати fast full scan, а повинні взяти на озброєння range scan. Для цього потрібно, щоб ви знали мінімальне втрачене значення лідируючого ключа індексу (першої колонки індексу), що забезпечить вам індексне сканування