Огляд табличних просторів (tablespace) та файлів даних

Ми розглянули процес взаємодії екземпляра та сесій: процеси та структури пам'яті. У цьому розділі ми розглядатимемо саму БД. Всі процеси обробки інформації відбуваються у пам'яті екземпляра БД, але зберігання даних відбувається у файлах бази даних на диску. База даних складається із трьох типів файлів: файл контролю, файли логів та файлів даних. Дані зберігаються у файлах даних.

Користувачі ніколи не бачать фізичного файлу даних. Вони вбачають логічні сегменти. Системні адміністратори нічого не знають про логічні сегменти - вони бачать файли. У базі даних Oracle фізична структура абстрагована від логічної. Це одна з вимог парадигми реляційних баз даних. Як DBA ви повинні знати зв'язок між логічною та фізичною структурою БД. Моніторинг та адміністрування цих структур – завдання часто зване як управління простором (space management) є великою частиною роботи DBA. Кошти передбачені в останніх версіях БД можуть автоматизувати завдання управління простором певною мірою, і вони, безумовно, дозволяють DBA налаштувати сховище таким чином, щоб максимально полегшити завдання обслуговування сервера.

Дані логічно зберігаються у сегментах (зазвичай таблицях), фізично у файлах даних. Табличне пространство абстрагує ці два поняття: в одному табличному просторі може зберігатися кілька сегментів і складатися з декількох файлів даних. Немає прямого взаємозв'язку між сегментом і файлом даних. Файли даних можуть бути файлами у файловій системі або (починаючи з версії 10g) пристроями Automatic Storage Management (ASM).

Модель зберігання даних Oracle

Поділ логічної та фізичної структур є необхідною частиною парадигми реляційних баз даних. Парадигма свідчить, що програмістиповинні працювати лише з логічними структурами та дозволяти базі даних керувати їхньою відповідністю фізичним структурам. Це означає, що фізична структура може бути перетворена, або, наприклад, повністю база даних переведена на нове апаратне забезпечення та операційну системи, а на роботу додатків це не повинно впливати.

На малюнку 5-1 відображено модель Oracle як діаграма сутність-зв'язок, з логічними структурами зліва та фізичними структурами праворуч.

На цьому малюнку одна лінія зв'язку відображена пунктирною лінією: зв'язок багато-багатьом між сегментами і файлами даних. Ця лінія виділена пунктиром, так як її не повинно бути, ставлення багато-багатьом не допускаються хорошими DBA. Перетворення цього взаємозв'язку до нормалізованого виду є завдання організації моделі зберігання.

Введення сутності табличного простору (tablespace) дозволяє взаємозв'язок багато-багатьом між сегментами і файлами даних. Один табличний простір може містити кілька сегментів і складатися з кількох файлів даних. Тобто. один сегмент може бути розділений між багатьма файлами даних, один файл даних може містити дані різних сегментів. Це вирішує багато проблем організації зберігання даних. У деяких старіших РСУБД використовувався зв'язок один до одного між сегментом і файлом даних: кожна таблиця або індекс зберігалася як окремий файл. Це викликало великі проблеми для великих систем.

просторів

По-перше, у додатку можуть використовуватися тисячі таблиць і ще більше індексів; керування тисячами файлів нелегке завдання для системних адміністраторів. По-друге, максимальний розмір таблиці обмежений максимальним розміром файлу. Навіть у сучасних ОС у яких немає обмежень за розміром файлу – можутьвиникнуть проблеми через обмеження на апаратному рівні. Використання табличних просторів вирішує обидві проблеми. Табличним просторам у базі даних надаються унікальні імена. Сутність сегмент (segment) являє собою будь-який об'єкт бази даних, який зберігає інформацію і таким чином потребує простору всередині табличного простору. Типовим прикладом сегмента є таблиця, але існують інші типи сегментів, індекси і сегменти undo. Сегмент може зберігатися тільки в одному табличному просторі, але сам табличний простір може бути розбитим між багатьма файлами, які складають цей табличний простір. Таким чином, розмір таблиці більше не обмежується максимальним розміром одного файлу. Так як багато сегментів можуть використовувати один табличний простір, стає можливим мати куди більше сегментів, ніж файлів даних. Сегменти – це об'єкти, які принадіять схемі та ідентифікуються вони ім'ям сегмента з ім'ям схеми-власника. Програмовані об'єкти схеми (такі як PL/SQL процедури, уявлення чи послідовності) є сегментами: вони зберігають дані і зберігаються у словнику даних.

Блоки Oracle – це базова одиниця операцій читання та запису для бази даних. Файли даних форматовані на послідовно пронумеровані блоки Oracle. Розмір блоку визначається для табличного простору (загалом він єдиний для всіх табличних просторів у межах бази даних), за умовчанням (версія 11g) використовується значення 8Кб. Рядок може займати всього кілька сотень байт, тому всередині одного блоку може зберігатися кілька рядків, але коли сесія хоче отримати рядок, вичитуватиметься цілий блок з диска і поміщатиметься в кеш буфера. Також якщо змінилося значення одного стовпця для одного рядка в буферікеша - DBWn перезапише на диск весь блок у файл даних, звідки він був рахований затерлий старий. Розмір блоку Oracle може бути від 2 до 16 Кб на операційних системах Linux або Windows і до 32 Кб в деяких інших системах. Розмір блоку контролюється параметром DB_BLOCK_SIZE. Після створення бази даних не можна змінити значення цього параметра, оскільки він використовується для форматування файлів даних табличного простору SYSTEM. Якщо пізніше виявилося, що необхідно змінити значення цього параметра, єдиним рішенням буде створити нову базу і скопіювати в неї всі вже створені. Блок всередині файлу можна ідентифікувати за його унікальним номером.

Управління дисковим простором по одному блоку за раз було б дуже трудомістким завданням, тому блоки групуються екстенти (extent). Екстентом називається набір послідовних блоків усередині одного файлу даних. Кожен сегмент складається з одного або більше екстентів, пронумерованих послідовно. Ці екстенти можуть знаходитися в будь-якому або у всіх доступних для табличного простору файлів даних. Екстент можна ідентифікувати як усередині сегмента (екстенти послідовно пронумеровані в межах сегмента починаючи з нуля) так і всередині файлу даних (кожен сегмент знаходиться лише в одному файлі даних, починаючи з певного блоку Oracle).

Файл даних складається фізично з блоків операційної системи. Як структуровані блоки операційної системи всередині файлу даних повністю залежить від файлової системи операційною системою, що використовується. Деякі файлові системи мають загальновідомі обмеження і тому не використовуються в сучасних системах (наприклад, стара файлова система MS-DOS FAT підтримує файли розміром до 4 Гб і всього 512 файлів в одній директорії). Більшість баз данихвстановлюється на файлові системи без практичних обмежень, такі як NTFS у Windows або ext3 у Linux. Альтернативною файловою системою є зберігання файлів даних на raw device-ах або Automatic Storage Management (ASM).

Блок операційної системи є базовим елементом операція запису читання для файлової системи. Якщо процес хоче прочитати один байт з диска, підсистема введення-виведення все одно вважає системний блок цілком. Розмір блоку операційної системи можна настроювати на деяких ОС (наприклад, коли форматується диск під файлову систему NTFS можна вказати розмір блоку від 512 байт до 64 Кб), але зазвичай системні адміністратори залишають значення за замовчуванням (512 Б для NTFS і 1Кб для ext3). Ось чому зазвичай відношення між блоками Oracle і блоками ОС зазвичай одним-багатьом, як показано на малюнку 5-1. Нічого не заважає зробити розмір блоку ОС рівним розміру блоку Oracle, якщо ваша операційна система дозволяє зробити це. Єдина конфігурація якої варто уникати це коли розмір системного блоку більший за розмір блоку Oracle.

Сегменти, екстенти, блоки та рядки

Дані зберігаються у сегментах. Подання словника даних DBA_SEGMENTS зберігає інформацію про всі сегменти в базі даних. Запит нижче відображає всі типи сегментів у простій БД

просторів

Розглянемо ці сегменти:

  • Таблиця (Table) - це структура, яка зберігає рядки даних. Незважаючи на те, що сегмент, що найчастіше зустрічається, це таблиця, ніколи не можна плутати таблицю і сегмент, і що існують набагато більш складені в організації таблиці які використовують інший тип сегмента
  • Індекс (Index) – це сортований список ключів-значень, кожна з яких зранить покажчик ROWID на фізичне розташування рядка. ROWID визначає у якомублоці Orace якого файлу даних знаходиться рядок, і номер рядка всередині блоку.
  • TYPE2 UNDO Це сегменти undo які зберігають дані перед змінами для забезпечення транзакційної цілісності: скасування транзакій, цілісності читання даних та забезпечення ізоляції
  • ROLLBACK сегменти rollback не повинні використовуватись у нормальному режимі роботи починаючи з версії 9i. Починаючи з версії 9i використовується автоматичне управління скасування операцій, засноване на сегментах TYPE2 UNDO (або просто undo). Завжди існуватиме один rollback сегмент для підтримки транзакцій у момент створення БД (бо в момент створення ще не існують undo сегменти) але він не повинен використовуватися після створення БД
  • Партиція таблиці( TABLE PARTITION) Таблиця може бути розбита кілька партицій. Якщо це налаштовано, кожна партиція буде окремим сегментом, а сама партицированная таблиця нічого очікувати сегментом: вона існуватиме як результат всіх партицій. Кожна партиція буде таблицею окремим сегментом. Так як кожен сегмент може бути в окремому табличному просторі, то з'являється можливість розбити таблицю між кількома табличними просторами
  • Партиція індексу (INDEX PARTITION) за замовчуванням індекс це один сегмент, але індекси як і таблиці можуть бути партиковані. Якщо ви партикуєте таблицю, зазвичай необхідно також партицірувати та індекс
  • Сегменти великих об'єктів (LOBSEGMENT, LOBINDEX, LOB PARTITION) Якщо стовпець оголошено з типом large object, тоді таблиці зберігається лише покажчик запис у окремому сегменті де зберігаються дані цього стовпця. Великі об'єкти можуть бути індексовані для швидшого доступу до даних всередині об'єкта та партиковані
  • Кластер (CLUSTER) – це сегмент яких містить кілька таблиць. На відміну відпартикування яке дозволяє розподіляти таблиці між різними сегментами, кластеризація дозволяє зібрати багато таблиць в один сегмент
  • Вкладені таблиці (NESTED TABLE) Якщо стовпець всередині таблиці оголошений як об'єкт, що визначається користувачем (user defined object) який у свою чергу містить стовпці, то такі стовпці зберігаються в окремому сегменті, як вкладена таблиця.

Кожен сегмент складається з одного або кількох екстентів. Коли сегмент створюється, Oracle виділяє ініціалізаційний екстент у вказаному табличному просторі. Коли дані буде додано екстент буде заповнюватися, і Oracle виділить інший екстент, в тому ж табличному просторі, але не обов'язково в тому ж файлі даних. Якщо ви знаєте, що сегменту потрібно більше дискового простору, ви можете вручну виділити екстент для цього сегмента. На малюнку 5-2 показано, як визначити розташування сегмента. Спочатку створюється таблиця HR.NEWTAB, використовуючи параметри за замовчуванням. Потім результат виконання запиту DBA_EXTENTS відображає, що сегмент складається з одного екстенту з номером нуль. Цей екстент знаходиться у файлі номер чотири та займає 8 блоків. Перший з восьми блоків має номер 1401. Розмір екстенту 64 Кб, що говорить про те, що розмір блоку 8 Кб. Наступна команда вказує Oracle, що необхідно виділити ще один сегмент для цього сегмента незважаючи на те, що перший екстент ще не заповнений. Наступний запит відображає, що номер нового екстенту дорівнює одиниці, файл даних також з номером чотири і блоки виділені відразу після блоків першого екстенту.

просторів

Зазначимо, що з цього прикладу не зовсім зрозуміло, скільки файлів складається з табличного простору, тому що алгоритм вибору файлу для створення наступного екстенту не просто черга. Якщо табличнепростір складається з декількох файлів даних ви можете вказати в якому конкретно файлі виділити екстент використовуючи наступний синтаксис

ALTER TABLE tablename ALLOCATE EXTENT STORAGE (DATAFILE 'filename');

Останній запит на малюнку 5-2 звертається до подання DBA_DATA_FILES для знаходження імені файлу, в якому був виділений екстент, і назва табличного простору, якому належить файл даних. Для визначення табличного простору таблиці можна використовувати подання DBA_SEGMENTS.

Екстент складається із набору послідовно пронумерованих блоків. Кожен блок має область заголовок і область даних. Область заголовка має фіксований розмір і записується від початку блока. Крім іншого, заголовок містить інформацію про рядки (звідки в блоці починається кожен рядок) та інформацію про блокування. Область даних заповнюється з кінця блоку. Між цими двома областями може бути (або не бути) пусте місце. Подіями, які призведуть до збільшення області заголовка, є вставка даних і блокування рядка. Область даних спочатку пуста і потім заповнюється в міру того, як записуються нові рядки (або ключі індексу, якщо це блок сегмента індексу). Порожній простір буде фрагментовано в міру вставки, видалення та зміни (що може призвести до зміни розміру рядка) рядків, але це не важливо, оскільки всі операції з даними проводяться в кеші буфера. Фрагментований простір об'єднується, коли це необхідно, зазвичай перед записом блоку назад у файл даних процесом DBWn.