Наиболее безопасный прицип для для определения доступа к компьютерным системам это принцип минимума прав (least privilege): никто не должен иметь доступ больше, чем абсолютный минимум необходимый для выполнения работы и доступно только то – что разрешено, всё остальное недосутпно. Oracle придерживается этого принципа. По умолчанию никто (за исключением системных аккаунтов SYSTEM и SYS) не имеют прав ни на что. Ни один аккаунт не может даже подключиться. В дополнение к использованию профилей, лучшей практикой в достижении принципа наименьших привилегий рекомендуется ограничивать права роли PUBLIC и устанавливать параметр экземпляра.
Права PUBLIC
Роль PUBLIC назначается всем пользователям. Любые права назначенные PUBLIC назначаются всем кто может подключиться к БД. По умолчанию у роли PUBLIC достаточно много прав. В частности у этой роли есть права на выполнение PL/SQL пакетов, как показано на рисунке 6-9.
Вы должны рассматривать возможность отзыва прав на выполнение UTL пакетов, но помнить что некоторые приложения рассчитывают на наличие этих прав. Права на выполнение могут быть отозваны к примеру таким запросом
У профиля два назначения: управление использованием пароля и ограничением на кол-во используемых ресурсов сессии. Проверка использования пароля всегда включена, проверка использования ресурсов доступна только при включенном параметре RESOURCE_LIMIT=TRUE (по-умолчанию выключено). Профили используются по умолчанию, но профили по умолчанию (применяются ко всем пользователям, в том числе и к SYS и SYSTEM) проверяют очень мало.
EXAM TIP
Profile password limits are always enforced; profile resource limits
are enforced only if the instance parameter RESOURCE_LIMIT is TRUE.
Управление паролями
К паролю могут быть применены следующие ограничения
FAILED_LOGIN_ATTEMPTS – устанавливает число последовательно неправильных вводов пароля перед блокировкой аккаунта. Если вводится корректный пароль до блокировки, счётчик обнуляется
PASSWORD_LOCK_TIME – устанавливает количество (в днях) до блокировки аккаунта после FAILED_LOGIN_ATTEMPTS
PASSWORD_LIFE_TIME – количество (в днях) до окончания жизни пароля. После этого пароль ещё может быть активным какое-то время в зависимости от PASSWORD_GRACE_TIME
PASSWORD_GRACE_TIME – количество (в днях) после первой успешной попытки подключения после окончания жизни пароля пока будет выводиться предложение сменить пароль. Старый пароль действителен в этом время
PASSWORD_REUSE_TIME – Количество дней перед тем как пароль может быть использован заново (значение пароля)
PASSWORD_REUSE_MAX – устанавливает сколько раз может быть использован один и тот же пароль
PASSWORD_VERIFY_FUNCTION – имя функции для выполнения при смене пароля. Целью предполагается проверка нового пароля на необходимый уровень безопасности, но вы можете использовать для любых целей.
Ограничение ресурсов
Ограничениями накладывами на использование ресурсов сервера (kernel limits) являются
SESSION_PER_USER количество параллельных подключений которые может создать один и тот же аккаунт. Сессии по достижении этого значения будут блокироваться
CPU_PER_SESSION – время процессора (в сентисекундах) которое серверный процесс сессии может использовать до принудительного завершения
CPU_PER_CALL — время процессора (в сентисекундах) которое серверный процесс может использовать для выполнения одной SQL команды до принудительной остановки выполнения запроса
LOGICAL_READS_PER_SESSION – количество блоков которое может считать сессия (независимо из буффера или с диска) перед принудительным отключением сессии
LOGICAL_READS_PER_CALL – количество блоков которое может считать запрос (независимо из буффера или с диска) перед принудительной остановкой выполнения запроса
PRIVATE_SGA – для сессий подключенных используя архитектуру общего сервера, количесво килобайт которое сессия может использоватья в SGA
CONNECT_TIME – в минутах, масимальная длительность сессии
IDLE_TIME – в минутах, длительность бездействия по достижении которой сессия принудительно отключается
COMPOSITE_LIMIT – взвешенная сумма других атрибутов. Не рассматриваем в этом курсе
Все ограничения по использования ресурсов не будут выполняться до установки параметра экземпляра RESOURCE_LIMIT. По умолчанию значение FALSE. Включить можно выполнив запрос
ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;
Когда сессия отключается из-за достижения лимита, если была неподтвержденная транзакция – она отменяется. Если останавливается выполнение запроса – то изменения сделанные этим запросом отменяются, но все выполненные команды до этого остаются в силе и неподтверждёнными.
TIP
Profiles can be used to limit resource usage, but a much more
sophisticated tool is the Resource Manager
Создание и назначение профилей
Управлять профилями можно через Database Control или SQL *Plus. Для просмотра текущих профилей пользователей выполните запрос
select username,profile from dba_users;
По умолчанию все аккаунты (за исключением двух внутренних аккаунтов DBSNMP и WKSYS) будут использовать профиль DEFAULT. Запрос для просмотра профиля
select * from dba_profiles where profile=’DEFAULT’;
Профиль DEFAULT не имеет ограничений на ресурсы, но существуют несколько ограничения на пароли
Эти ограничения не слишком сильные: пароль может вводится неверно 10 раз перед блокировкой аккаунта на один день, и пароль истекает через полгода с грейс периодом в неделю. Простейший способ применить более строгие ограничения к паролям это выполнить скрипт поставляемый с Oracle $ORACLE_HOME/rdbms/admin/utlpwdmg.sql. Этот скрипт создаст функции VERIFY_FUNCTION и VERIFY_FUNCTION_11G и затем выполните запрос
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_VERIFY_FUNCTION verify_function_11G;
Эта команда изменит профиль DEFAULT. Все пользователи с профилем DEFAULT (все пользователи по умолчанию) сразу подхватят новые значения. Единственным изменение будет использование функции verify_function_11G. Эта функция будет проверять пароль на соответствие определённым критериям, а именно
Новый пароль должен быть длинной не менее 8 символов
Пароль не должен совпадать с именем пользователя
Часто использумые простые пароли (к примеру oracle) будут отклонены
Новый пароль должен содержать минимум одну заглавную букву и одну цифру
Пароль должен отличаться минимум в три символа от предыдущего
Можно рассмотреть эту функцию как пример и изменить согласно вашим требованиям. Вообще желательно создать отдельные профили для разныз групп пользователей.
Для создания профиля используется команду CREATE PROFILE, устанавливая необходимые ограничения. Неустановленные значения будут выставлены в зависимости от значений в профиле DEFAULT. Например рассмотрим сценарий где пользователи могут открывать только одну сессию, администраторы могут создавать сколько угодно сессий и должны менять пароль раз в неделю с грейс периодом в день, а программисты могут открывать две сессии. Для этого можно выполнить команды
alter profile default limit sessions_per_user 1;
Затем создать профиль dba_profile и назначить его пользователю system
Для вступления ограничений по ресурсам в силу необходимо установить параметр экземпляра
alter system set resource_limit=true;
Если экземпляр использует SPFILE это изменение применится к файлу параметров и будет использоваться даже после перезапуска.
Профиль нельзя удалить если он назначен какому-либо пользователю. Можно либо вначале перевести пользователей на другой профиль, либо использовать директиву CASCADE использование которой автоматически переназначит пользователей использующих удаляемый профиль назад на профиль DEFAULT.
Управление безопасностью через назначение прав напрямую пользователям имеет место быть но имеет два недостатка. Во первых это может быть затратной задачей: приложения с тысячами таблиц и пользователей требуют миллионов разрешений. Во вторых, если права были выданы пользователю, то они работают всегда вне зависимости от обстоятельств. Обе эти проблемы решаются использованием ролей (roles). Роль – это набор системных и объектных прав, которые могут быть выданы и отозваны как единое целое, и после добавления этой роли, могут временно быть активированы и деактивированы во время существования сессии.
Создание и назначение ролей
Роль – это не объект схемы: у них нет владельца и поэтому нет префикса владельца. Но они используют ту же область хранения как и пользователи: поэтому невозможно создать роль с именем уже существующего пользователя и наоборот.
Для создания роли используется команды
CREATE ROLE rolename;
Затем права назначаются для роли используя обычные синтаксис команд включая WITH ADMIN или WITH GRANT OPTION если нобходимо.
Например преположим что схема HR используется как хранидище данных для трех групп пользователей. Управляющие персонал имеет полные доступ, менеджера среднего звена имеют ограниченный доступ, и менеджмент низшего уровня имеет очень ограниченный доступ. Для начала создадим роль для низшего уровня: всё что они могут делать это выполнять запросы к таблицам
create role hr_junior;
grant create session to hr_junior;
grant select on hr.regions to hr_junior;
grant select on hr.locations to hr_junior;
grant select on hr.countries to hr_junior;
grant select on hr.departments to hr_junior;
grant select on hr.job_history to hr_junior;
grant select on hr.jobs to hr_junior;
grant select on hr.employees to hr_junior;
Каждый пользователь назначенный на эту роль имеет доступ для подключения к БД и выполнению SELECT команд к таблицам HR. Затем создадим роль для среднего звена, кто также может изменять данные в таблицах EMPLOYEES и JOB_HISTORY
create role hr_senior;
grant hr_junior to hr_senior with admin option;
grant insert, update, delete on hr.employees to hr_senior;
grant insert, update, delete on hr.job_history to hr_senior;
Эта роль вначале наследует роль HR_JUNIOR (можно наследовать роль от роли) с возможностью назначать роль junior другим аккаунтам или ролям. Затем назначаются права на выполнение DML команд для двух таблиц. И наконец создадим роль топ менеджмента, которая может изменять все таблицы
create role hr_manager;
grant hr_senior to hr_manager with admin option;
grant all on hr.regions to hr_manager;
grant all on hr.locations to hr_manager;
grant all on hr.countries to hr_manager;
grant all on hr.departments to hr_manager;
grant all on hr.job_history to hr_manager;
grant all on hr.jobs to hr_manager;
grant all on hr.employees to hr_manager;
Третья роль наследует роль HR_SENIOR с возможностью назначения, и затем получает контроль над данными во всех таблицах. Единственная системная привелегия для этой роли это CREATE_SESSION, полученная от HR_SENIOR, которая в свою очередь получила этот доступ от HR_JUNIOR. Даже эта роль не может создавать или удалять таблицы: это может быть сделано либо аккаунтом HR, либо аккаунтом с правами CREATE ANY TALBE или DROP ANY TABLE.
Синтаксис WITH ADMIN OPTION работает так же как и для системных прав. Не хранится кто назначил эту роль и для кого и удаление не будет каскадным.
И назначение ролей для аккаунтов может быть к примеру таким: если SCOTT это топ-менеджер, SUE – менеджер среднего звена и JON и ROOP рядовые сотрудники, то назначение ролей может быть как показано на рисунке 6-8.
Предопределённые роли
Существует как минимум 50 предопределённых ролей в БД (может быть и больше в зависимости от установки). Роли которые должен знать каждый DBA это
CONNECT – эта роль существует только для обратной совместимости. Раньше эта роль содержала системные привелении необходимые для хранения объектов. Теперь у этой роли только CREATE SESSION права.
RESOURCES – также используетя для обратной совместимости. Эта роль может создавать объекты и PL/SQL объекты. Также эта роль влючает UNLIMITED TABLESPACE права.
DBA – роль с наибольшим количеством системных привилегий, и некоторыми объектными правами и ролями. Любой пользователь с ролью DBA может управлять работой БД, за исключением команд STARTUP и SHUTDOWN.
SELECT_CATALOG_ROLE – роль имеет более двух тысяч объектных прав над словарём данных, но не имеет системных привилегий и привилегий над пользовательскими данными. Используется для младшего административного персонала к примеру выполнения задач мониторинга и отчётности.
SCHEDULER_ADMIN – роль владеет системными правами необходимыми для управления выполнением задач по расписанию.
Также существует предопределённая роль PUBLIC, которая назначается по умолчанию всем аккаунтам БД. Отсюда и следует что если права назначены для PUBLIC, то эти права автоматически доступны всем пользователям. После выполнение команды
grant select on hr.regions to public;
все пользователи смогут выполнять select к таблице HR.REGIONS.
TIP
The PUBLIC role is treated differently from any other role. It does not,
for example, appear in the view DBA_ROLES. This is because the source code
for DBA_ROLES, which can be seen in the cdsec.sql script called by the
catalog.sql script, specifically excludes it.
Включение ролей
По умолчанию если пользователю была назначена роль, то эта роль будет доступна (enabled). Это значит что когда сессия создаётся (подключается аккаунт) все права (и другие роли) назначенные роли будут доступны. Такое поведение можно изменить установив роль в значение «не по-умолчанию». Согласно правам с прошлых примеров
JON назначена роль HR_JUNIOR. У него нет прав на назначение этой роли другим пользователям, но это его роль по умолчанию – ему будет назначена эта роль при любом подключении. Такой вариант событий может быть не совсем вам нужным. Напирмер JON должен иметь доступ к данным в таблицах HR, но это не значит что вы хотите чтобы он мог смотреть данные к примеру из дома, в полночь. Вы хотите ограничить доступ таким образом, чтобы он мог иметь доступ к данным только из офиса, запуская специальную программу в рабочее время.
Чтобы изменить назначение ролей по умолчанию выполните команду
alter user jon default role none;
Теперь когда JON попробует подключиться к БД у него не будет никаких ролей по умолчанию. Но это значит что он даже не сможет подключиться – только роль HR_JUNIOR давала JON права на подключение к БД. Легко исправимо
Теперь когда JON подключится к БД у него будет подключен с ролью CONNECT – и текщая версия роли CONNECT даёт только доступ к созданию сессии. Команда для смены роли для сессии
SET ROLE rolename;
и может быть вызвана пользователем в любое время. Т.е. всё ещё не безопасно, но если роль была создана с помощью команды
CREATE ROLE rolename IDENTIFIED USING procedure_name ;
то эта роль может быть активирована только выполнение процедуры PL/SQL указанной в procedure_name. Эта процедура может делать какие –угодно проверки: проверка макси сети, имени процесса, времени и т.п. Встраивание вызовов процедур для проверки ролей в приложении может включать роли и отключать их по необходимости, оставляя их выключенными при работе в SQL *PLUS или других приложениях.
TIP
It can be very difficult to work out why you can see certain data. You may
have been granted the SELECT privilege on specific objects; you may have
been granted the ALL privilege; you may have SELECT ANY; SELECT may have
been granted to PUBLIC; or you may have a role to which SELECT has been
granted. You may have all of these, in which case they would all have to be
По умолчанию аккаунт не имеет никаких прав в БД Oracle. Невозможно даже создать подключения без назначенных прав. И даже после получения прав на подключения, аккаунт не может сделать ничего полезного (или опасного) без получения соответсвующих прав. Права назначаются с помощью команды GRANT и убираются с помощью команды REVOKE. Дополнительные директивы команды используются для разрешения аккаунта делится правами которые у него есть с другими пользователями. По умолчанию только аккаунта администратора (SYS и SYSTEM) владеют правами назначения прав. Пользователь который назначает права другому пользователю называется grantor когда получатель прав – grantee. Права разбиты на две группы: системные права, которые грубо говоря позволяют пользователю совершать действия влияющие на словарь данных, и права над объектами, которые позволяют пользователю совершать действия влияющие на данные.
Системные права
Всего доступно около двух сотен системных прав. Большинство из них влияет на действия затрагивающие словать данных (такие как создание таблиц или пользователей). Остальные влияют на экземпляр или БД (создание табличны пространств, изменение параметров БД и создание сессий). Наиболее часто используемые права это
CREATESESSION – права на подключения. Без этих прав вы даже не сможете подключиться к БД
RESTRICTEDSESSION – Если БД запущена с директивой STARTUPRESTRICT или применялась команда ALTERSYSTEMENABLERESTRICTEDSESSION, то только пользователи с этими правами смогут подключаться к БД
ALTERDATABASE – разрешает выполнять команды влияющие на физические структуры
ALTERSYSTEM – разрешает изменять параметры экземпляра и структуры памяти
CREATETABLESPACE – вместе с ALTERTABLESPACE и DROPTABLESPACE позволяют пользователю управлять табличными пространтсвами
CREATETABLE – позволяет gratee создавать таблицы в своей схеме; включает возможность создавать, изменять и удалять таблицы, выполнять команды DML и select и управлять индексами
GRANTANYOBJECTPRIVILEGE – позволяет grantee управлять правами объектов которые ему не принаджлежат, но не даёт прав ему самому
CREATEANYTABLE – grantee может создавать таблицы которые принадлежат другим аккаунтам
DROPANYTABLE – grantee позволяется удалять таблицы которые принадлежат другим аккаунтам
INSERTANYTABLE, UPDATEANYTABLE, DELETEANYTABLE – даёт grantee право выполнять DML команды над объектами которые ему не принадлежат
SELECTANYTABLE – Даёт право grantee выполнять SELECT к любмы таблицам.
Синтаксис для назначения прав
GRANT privilege [,privilege…] TO username;
После создания аккаунта, обычно назначаются права часто используемые пользователями кто вовлечён в разработку приложения
Эти права позволяют подключаться и настраивать сессию, создавать объекты и хранить PL/SQL объекты. Объекты могут быть созданы только в схеме аккаунта; нет прав к схемам других аккаунтов. Также создание объектов ограничивается лмимитами табличных пространств.
Другим вариантом назначения прав будет назначение grantee доступа для переназначения прав другим аккаунтам. Например
connect system/oracle;
grant create table to scott with admin option;
connect scott/tiger;
grant create table to jon;
Выполнение этих команд позволит SCOTT создавать таблицы в совей схеме, и выполнять команду GRANT. SCOTT даёт права пользователю JON создавать таблицы – но JON сможет создавать таблицы только в схеме JON. На рисунке 6-5 показаны права пользователя в Database Control; ту же информацию можно получить выполнив запрос к представлению DBA_SYS_PRIVS.
Если системные разрешения были отозваны, все действия которые вы выполнили пока у вас были права остаются в силе. Если у вас были права с ADMIN OPTION то у всех пользователей которым вы назначили права – права остаются, несмотря на то что у вас права отозвали. Не остаётся записей кто именно назначил системные привилегии, таким образом невозможно забрать права CASCADE как показано на рисунке 6-6
EXAM TIP
Revocation of a system privilege will not cascade (unlike
revocation of an object privilege).
Права ANY дают доступ ко всем объектам в БД. Таким образом
grant select any table to scott
позволить аккаунту SCOTT выполнять запрос SELECT ко всем таблицам во всех схемах БД. Такое назначение прав считается дурным тоном и ANY права назначаются только DBA.
TIP
In fact, ANY is not as dangerous now as with earlier releases. It no longer
includes tables in the SYS schema, so the data dictionary is still protected. But
ANY should still be used with extreme caution, as it removes all protection
from user tables.
Объектные права
Объектные права дают доступ к выполнению команд DML и SELECT к соответствующим объектам и выполнению PL/SQL объектов. Эти права не существуют для объектов в схеме аккаунта; если у пользователя есть системные права CREATE TABLE – это значит что он может выполнять SELECT и DML запросы к таблицам которые он создал без дополнительных прав.
EXAM TIP
The ANY privileges, that grant permissions against objects in
every user account in the database, are not object privileges—they are
system privileges.
Объектные права применяются к разным группам объектов
Синтаксис команды
GRANT privilege ON [schema.]object TO username [WITH GRANT OPTION];
Например
grant select on store.customers to scott;
Можно использовать ALL чтобы применить права для всех операций, или использовать конкретное указание столбца таблицы или представления.
grant select on store.orders to scott;
grant update (order_status) on store.orders to scott;
grant all on store.regions to scott;
Эти команды позволят аккаунту SCOTT выполнять запрос SELECT ко всем столбцам таблицы ORDERS в схеме STORE но обновлять данные только в одном столбце. Также у аккаунта SCOTT есть доступ ко всем операциям к таблице REGIONS. На рисунке 6-7 отображается результат назначения прав при просмотре в Database Control
TIP
Granting privileges at the column level is often said to be bad practice
because of the massive workload involved. If it is necessary to restrict peoples’
access to certain columns, creating a view that shows only those columns will
often be a better alternative.
Использование директивы WITH GRANT OPTION позволит пользователю передавать свои права другим аккаунта. Оракл хранит информацию о том кто и кому дал доступ на объектном уровне; это позволяет отзывать права учитывая эту информацию. Рассмотрим пример
connect store/admin123;
grant select on customers to sales with grant option;
connect sales/sales;
grant select on store.customers to webapp with grant option;
conn webapp/oracle;
grant select on store.customers to scott;
connect store/admin123;
revoke select on customers from sales;
После выполнения этих команд, ни у пользователя SALES ни у пользователя WEBAPP ни у пользователя SCOTT нет прав на выполнение команд SELECT к таблице STORE.CUSTOMERS.
EXAM TIP
Revocation of an object privilege will cascade (unlike revocation of
Когда пользователь подключается к БД, он подключается используя пользовательский аккаунт (user account) указывая имя аккаунта и метод аутентификации. Пользовательский аккаунт определяет первоначальные права доступа и атрибуты сессии. С пользовательским аккаунтам свзязывается схема (schema). Термины пользователь, пользовательский аккаунт и схема часто используется вместо друг друга в окружении Oracle, но это не одно и тоже. Пользователь – это человек который подключается к пользовательскому аккаунту устанавливая сессию к экземпляру БД и авторизуется используя имя аккаунта. Схема – это набор объектов принадлежащих пользовательскому аккаунту и мы рассмотрим детальнее в следующей главе. В зависимости от того как создался аккаунт будут установлены определнные аттрибуты для сесиий, некоторые из которых могут быть изменены позднее, во время существования сессии. Некоторые аккаунты создаются во время создания БД и DBA затем создаёт остальные аккаунты.
В некоторых приложениях, каждый пользователь использует свой аккаунт. Т.е. БД знает кто именно владелец каждой сессии. Такая модель хорошо работает для небольших систем но практически невозможна для среды в которой с БД работают сотник и тысячи пользователей. В больших системах пользователи подключаются к БД используя один аккаунт, и это добавляет сложностей для обеспечения безопаности сессии и аудита БД. Мы будем рассматривать модель где каждый пользователь имеет свой аккаунт.
Аттрибуты пользовательского аккаунта
У аккаунта сущуествует набор аттрибутов которые задаются при создании. Эти значения используются для сессии, и некоторые могут быть изменены либо самой сессией, либо DBA изменит значение во время существования сессии. Этими атрибутами являются
Имя
Метод аутентификации
Табличное пространство по умолчанию
Лимит табличного пространтсва
Временное табличное пространство
Статус
Все эти аттрибуты должны указываться в момент создания аккаунта, несмотря на то что только имя и метод аутентификации являются обязательными а для остальных существуют значения по умолчанию.
Имя аккаунта
Имя аккаунта должно быть уникальным для всей БД и соблюдать определенные правила. Имя аккаунта должно начинаться с буквы, длина не более 30 символов и может состоять только из букв, цифр, знака $ и символа подчёркивания. Также именем аккаунта не может быть зарезервированное слово. Символы чувствительны к регистру но будут автоматически преобразованы к верхнему регистру. Все эти правила (за исключением длинны) можно обойти если использовать имя внутри двойных кавычек, как показано на рисунке 6-1.
В первом примере создается аккаунт JOHN. Имя было введено строчными буквами но было преобразовано в прописные как видно в результате выполнения запроса. Второй аккаунт был создан с использованием того же имени и двойных кавычек. Третий и четвертый пример показывают что можно обойти правила неиспользуемых символов и зарезервированных слов используя кавычки.
Имя не может быть изменено после создания. Если необходимо изменить его, то можно удалить старый аккаунт и создать новый. Это критическое действие так как все объекты в схеме аккаунта будут удалены.
Табличные пространтсва по умолчанию и лимиты
У каждого аккаунта есть табличное пространство по умолчанию. Это табличное пространство где создаются объекты схемы (такие как таблицы, индексы) создаваемые этим аккаунтом. Аккаунт может создать объекты (быть владельцем) во всех табличных пространствах к которым у него есть лимит (квота), но если явно не указывать табличное пространтсво при создании объекта – будет использователья табличное пространство аккаунта по умолчанию.
Существует значение по умолчанию для БД которое будет использоваться для всех пользователей созданных без указания табличное пространства. Это значение можно установить во время создания БД или изменить выполнив команду
ALTER DATABASE DEFAULT TABLESPACE tablespace_name ;
Если у БД нет табличного пространства по умолчанию – используется SYSTEM.
Лимит (quota) — это размер пространства которое объекты схемы аккаунта могут использовать. Вы можете создавать объекты и выделять экстенты пока не достигните лимита. Если у вас нет квоты для табличного пространтсва – вы не можете создавать объекты. Квоты можно изменять в любое время если у вас есть права для этого. Если квота пользователя была изменена в меньшую сторону, а объекты уже занимают больше места – то существующие объекты можно будет использовать,но нельзя добавить элементы или создать новые объекты.
На рисунке 6-2 отображено как проверять и устанавливать лимиты
Первая команда проверяет представление DBA_USERS и определяет табличные пространства пользователя JOHN. DBA_USERS хранит по одной строке для каждого пользователя БД. Пользователь JOHN получил значения временного и табличного пространства из значения по умолчанию БД (которые видны в результате выполнения запроса к database_properties).
Две команды ALTER USER позволяют аккаунту JOHN использовать 10 МБ пространтсва в табличном пространстве USERS и неограниченный доступ к пространтсву EXAMPLE. Запрос к DBA_TS_QUOTAS отображает затем эту информацию. -1 обозначает неограниченный лимит. Во время выполнения запроса у аккаунта JOHN нет созданных объектов, и поэтому BYTES=0, что значит пространство ещё не используется.
EXAM TIP
Before you can create a table, you must have both permission to
execute CREATE TABLE and quota on a tablespace in which to create it.
TIP
Most users will not need any quotas, because they will never create
objects. They will only have permissions against objects owned by other
schemas. The few object-owning schemas will probably have QUOTA
UNLIMITED on the tablespaces where their objects reside.
Временное табличное пространтсво
Постоянные объекты (такие как таблицы) хранятся в постоянных табличных пространствах; временные объекты хранятся во временном табличном пространстве. Сессии нужно место во временном табличном пространстве если будет использоваться места больше чем доступно в PGA сессии. Операции которым нужно временное место (в памяти если хватает PGA или во временном таблично пространтсве) включают в себя: сортировку строк, объекдинение таблиц, построение индексов и использование временных таблиц. Каждому аккаунту выделяется временное табличное пространство и все пользовательские сессии подключенные к аккаунту будут использовать одно и тоже временное табличное пространство.
Запрос к представлению DBA_USERS на рисунке 6-2 показывает временное пространство пользователя JOHN, которое также является временным табличным простратсвном по умолчанию для БД.
Управление пространством во временных табличных пространствах полностью автоматическое. Объекты создаются и удаляются при необходимости самой БД. Пользователю не нужен лимит на временное таблично пространство, так как все объекты создаются (и он же является владельцем) аккаунтом SYS, у которого неограниченные лимиты для всех табличных пространств.
EXAM TIP
Users do not need a quota on their temporary tablespace.
Для изменения временного пространства польователя (что затронет все сессии которые подключается в будущем используя этот аккаунт) используйте команду ALTER USER
ALTER USER username TEMPORARY TABLESPACE tablespace_name;
TIP
If many users are logging on to the same user account, they will share the
use of one temporary tablespace. This can be a performance bottleneck, which
may be avoided by using temporary tablespace groups.
Профили
Пользовательские профили управляют настройками паролей и позволяют контролировать использование ресурсов. Более детально профили рассмотрим чуть ниже.
Профили полезны для управления паролями и ресурсами но могут использоваться только в среде где у каждого пользователя свой аккаунт. Если много пользователей подключаются к БД под одним аккаунтом, вы не захотите чтобы аккаунт блокировался если ввёл пароль несколько раз один пользователь, потому что этим вы заблокируете доступ всем остальным пользователям. Так же и использование ресурсов часто лучше управлять на уровне сессии а не на уровне аккаунта в целом.
Статус аккаунта
Каждый аккаунт имеет определённый статус, и значение можно увидеть в столбце ACCOUNT_STATUS представления DBA_USERS. Всего существует 9 статусов
OPEN – аккаунт готов к использованию
LOCKED – DBA заблокировал аккаунт, пользовтель не можед подключиться используя заблокированный аккаунт
EXPIRED – Пароль может иметь ограниченное время действия. В данном статусе время действия пароля истекло. Пользователь не может подключиться к аккаунта пока пароль не будет восстановлен
EXPIRED & LOCKED – Аккаунт заблокирован и время действия пароля истекло
EXPIRED (GRACE) – Пароль можно настроить таким образом чтобы он не становился EXPIRED сразу, а ещё был так называемый grace период, во время которого можно подключиться и изменить пароль
LOCKED (TIMED) – это обозначает что аккаунт заблокирвоан в связи с неудачными попытками подключения. Аккаунт можно настроить на автоматическую блокировку на какое-то время после определённого количества неудачных попыток подключения
EXPIRED & LOCKED (TIMED)
EXPIRED (GRACE) & LOCKED
EXPIRED (GRACE) & LOCKED (TIMED)
Для блокировки или разблокирования аккаунта используются команды
ALTER USER username ACCOUNT LOCK;
ALTER USER username ACCOUNT UNLOCK;
Для запроса изменения пароля пользователем при подключении можно выполнить команду
ALTER USER username PASSWORD EXPIRE;
Эта команда автоматически установит грейс пероид, принуждая пользователя изменить пароль при следующей попытке подключения. Нет команды UNEXPIRE. Единственный способ восстановить аккаунт – это изменить пароль.
Методы аутентификации
Аккаунт должен иметь определённый метод аутентификации: что-то что позволяет определить БД есть ли у пользователя пытающегося создать сессию доступ к аккаунту. Самый простой метод это использование пароля который совпадает с паролем хранящемся в БД, но есть и альтернативы. Возможнные варианты это
Аутентификация ОС
Аутентификация с помощью файла паролей
Аутентификация паролем
Внешняя аутентификация
Глобальная аутентификация
Первые два метода используются только администраторами, последняя требует установленного LDAP сервера.
Аутентификация ОС и файлом паролей
Для разрешения аккаунту использования этих методов аутентификации (эти два типа используется вместе) необходимо назначить аккаунта расширенные права SYSDBA или SYSOPER
GRANT [sysdba|sysoprt] TO username;
Назначение этих прав скопирует пароль аккаунта из словаря данных во внешний файл паролей, откуда он может быть считан экземпляром даже если БД ещё не открыта. Это также позволит экземпляру аутентифицировать пользователей путём проверки принадлежит ли пользователь группе-владельцу программ Oracle. После установки БД единственный аккаунт с этими правами – это SYS.
Для использования файла паролей можно использоуть следующий синтаксис
CONNECT username/password[@db_alias] AS [SYSOPER|SYSDBA];
Аутентификация с помощью файла паролей можно использовать для подключения к удалённой БД используя Oracle Net
Чтобы использовать авторизацию ОС пользователсь должен быть авторизован ОС с доступом к исполняемым файлам Oracle и затем можно выполнить команду
CONNECT / AS [SYSOPER|SYSDBA]
Пароли ОС не хранятся Oracle и поэтому не может быть проблем со сменой пароля.
Эквивалентом этой команды может быть подключения через Database Control при выбранном значении SYSDBA в списке Connect As. Для определения у кого есть пава SYSDBA и SYSOPER можно выполнить запрос к представлению V$PWFILE_USERS. Подключение с использованием аутентифкации файлом паролей или ОС всегда доступно вне зависимости от состояния экземпляра и БД и такой вид подключения необходим для выполнения команд STARTUP и SHUTDOWN.
Третий вид привилегий SYSASM но это выходит за рамки этого курса.
Аутентификация паролем
Синтаксис для подключения используя аутентификацию паролем используя SQL *Plus
CONNECT username/password[@db_alias];
Или в Database Control выбрать NORMAL в списке Connect As. Когда подключение происходит используя аутентифкацию паролем, экземпляр проверит пароль в строке подключения с паролем который хранится для этого аккаунта в словаре данных. Для того чтобы был доступен такой метод аутентификации БД должна быть открыта; и используя этот метод невозможно выполнять команды STARTUP и SHUTDOWN.Пользователь SYS не имеет прав подключения используя аутентификацию паролем – только через файл паролей, аутентификацию ОС или LDAP.
Начиная с версии 11g пароли чувствительны к регистру. Пароль хранится именно так как был введён без всяких преобразований регистра.
Когда подключение происходит по сети, 11g всегда использует шифрование перед передачей данных. Для шифрованя данных между пользовательским процессом и серверным процессом необходимо Advanced Security Option, но шифрование пароля включено по умолчанию.
Любой пользователь может изменить пароль аккаунта в любое время, а аккаунт с расширенными правами может изменить пароль любого пользователя. Синтаксис команды
ALTER USER username IDENTIFIED BY password;
Внешняя аутентификация
Если аккаунт был создан с директивой внешней аутентификации, Oracle делегирует аутентифкацию внешнему сервису; т.е. не будет запрошен пароль. Если куплена Advanced Security Option, то внешним сервисом может быть сервер Kerberos, сервер RADIUS или сервис аутентификации Windows. Когда пользователь пытается подключиться к аккаунту, вместо аутентификации пользователя, БД будет разрешать (или не разрешать) подключение в зависимости от того авторизован или пользователь во внешнем сервисе. Например если используется Kerberos – БД проверит существует ли у пользователя валидный Kerberos токен. Без Advanced Security Option – единственно доступной формой внешней аутентификации будет аутентификация ОС. Это требует прав SYSDBA или SYSOPER (как описано выше) но может быть использовано и для обычных аккаунтов. Необходимо создать пользователя Oracle с таким же именем как и аккаунт ОС с префиксом указанном в параметре OS_AUTHENT_PREFIX. По умолчанию значение OPS$. Для проверки значения можно использовать запрос
select value from v$parameter where name=’os_authent_prefix’
В Linux/Unix внешняя аутентификация ОС работает очень просто. Предполагая что значение OS_AUTHENT_PREFIX осталось по умолчанию и есть пользователь ОС с именем jwatson, можно создать пользователя Oracle и дать права подключения следующим образом
create user ops$jwatson identified externally;
grant create session to ops$jwatson;
Пользователь подключенный к ОС как jwatson сможет подключиться к БД выполнив команду
sqlplus /
из командной строки ОС и будет подключен к БД как пользователь ops$jwatson.
В Windows обычно используется домен и тогда команда создания пользователя будет вида
create user «OPS$JWACER\JOHN WATSON» identified externally;
TIP
Using external authentication can be very useful, but only if the users
actually log on to the machine hosting the database. Users will rarely do this,
so the technique is more likely to be of value for accounts used for running
maintenance or batch jobs.
Глобальная аутентификация
Стандартом для управления идентификацией признано использование LDAP серверов. Под глобальным пользователем (global user) подразумевается пользователь определённый в LDAP директории, и глобальная аутентификация (global authentification) значит делегирование аутентификации пользователя серверам LDAP.
Существует два метода для глобальной аутентификации
Пользователи определены в директории LDAP и в БД. Пользователь будет подключаться к БД используя пользовательский аккаунт с таким же именем как и имя пользователя в LDAP
Пользователи создаются только в LDAP директории. Все подключения к БД будут созданы используя один аккаунт БД.
Если всё настроено как надо подключение будет создано без запроса пароля.
Создание аккаунтов
У команды CREATE USER всего два обязательных параметра: имя и метод аутентификации. Дополнительно, можно указать табличное пространство по умолчанию и временное табличное пространство, лимиты, профили и команды блокировки аккаута и управления паролем. Пример команды (номера строк добавлены для удобства)
Только первая строка обязательна – существуют значения по умолчанию для всего остального. Рассмотрим пример построчно
Имя и пароль для аутентификации паролем
Табличное пространство по умолчанию и временное табличное пространство
Лимиты
Профиль для управления паролем и ресурсами
Принудительное изменение пароля при первом подключении
Аккаунт готов к использованию (команда по умолчанию)
Каждый параметр может быть изменён командой ALTER USER кроме имени. Для смены пароля выполните команду
alter user scott identified by lion;
Смена табличных пространств
alter user scott default tablespace store_data temporary tablespace temp;
Смена лимитов
alter user scott quota unlimited on store_data, quota 0 on users;
Смена профиля
alter user scott profile prod_profile;
Бывает необходимо удалить аккаунт, используется команда
drop user scott;
Эта команда будет выполнена успешно только если у аккаунта нет объектов: схема пуста. Если вы не хотите вначале удалять все объекты пользователя, можно использовать директиву CASCADE
drop user scott cascade;
Для управления пользователя в Database Control из домашней страницы перейдите на вкладку Server и перейдите по ссылке Users в секции Security. В новом окне отобразятся все пользователи остортированные по дате создания. Для сортировки по какому либо столбцу нажмите на заголовок столбца. На рисунке 6-3 отображается окно Database Control
рисунок 6-3 Окно управления пользователя в Database Control
Первый аккаунт на рисунке – PUBLIC. Это формальный пользователь которому необходимо назначить права для применения прав ко всем пользователям. Кнопки CREATE и DELETE позволяют создавать и удалять пользователей.
Для изменения аттрибутов аккаунта можно выделить пользователя и нажать EDIT. Октроется окно Edit User, показанное на рисунке 6-4. Это окно можно использовать для изменения аттрибутов кроме лимитов табличных пространств. Для этого есть отдельное окно. Также здесь можно назначать и удалять права и роли.
Одно табличное пространтсво физически может быть разделено между многими файлами данных
Одно табличное пространство может содержать много сегментоа
Один сегмент состоит из одного или более экстентов
Один экстент состоит из группы блоков начиная с определённого номера последовательно в одном файле данных
Размер блока Oracle должен быть равен или больше размера блока ОС
Блок Oracle это минимальная едицина ввода вывода Oracle
Создание и управление табличными пространствами
SMALLFILE табличное пространтсво может состоять из нескольких файлов, BIFGILE состоит из одного файла данных
Табличные пространства по умолчанию имеют local extent management и automatic segment space management, но не uniform siz
OMF файлы данных используют сгенерированные имена, начальный размер 100 МБ и автоувеличение без лимитов
Табличное пространтсво в котором созданы сегменты нельзя удалить – только есть указать директиву INCLUDING CONTENTS
Табличное пространство может быть включено, выключено и находиться в режиме только-чтения
Табличные пространства могут хранить три типа объектов: постоянные объекты, временные объекты и сегменты отмены изменений
Управление «местом» в табличных пространствах
Метод управления экстентами local использует битовые маски для управления экстентами в каждом файле данных
Директива UNIFORM SIZE использованная при создании табличного пространтсва гарантирует что все экстенты будут одинакового размера
Директива AUTOALLOCATE позволяет Oracle определять размер следующего экстента на основании количества и размера уже выделенных экстентов для этого пространства
Автоматическое управление пространством сегментов использует битовые маски для определения доступного места в каждом блоке
Возможно конвертировать табличное пространство из управляемого при помощи словаря к управляемому локально, но нельзя изменить метод управления свободным пространтсвом блоков сегмента
Управление пространством (доступным «местом») осуществляется на нескольких уровнях. Вначале место выделяется для табличного пространства (путём изменения размеров файлов данных). Затем пространство внутри табличного пространства выделяется для сегментов (путём выделения экстентов). И наконец пространство внутри сегментов выделяется для строк. Это происходит путём управления битовыми масками (bitmaps) которые отслеживают сколько свободного места в каждом блоке.
Управление экстентами
Метод управления экстентами устанавливается для табличного пространства и применяется для вссех сегментов этого табличного пространства. Существует два метода управления: управление с помощью словаря (dictionary management) или локальное управление (local management). Разница предельно проста: всегда надо использовать local management; dictionary management никогда не надо использовать. Dictionary management пока ещё поддерживается, и только. Это ограничение для поддержки предыдущих версий Oracle.
Dictionary management использует две таблицы в словаре данных. SYS.UET$ содержит строки описывающие использованные экстенты и SYS.FET$ хранит информацию о свободных экстентах. Каждый раз когда БД необходимо добавить экстент к таблице, необходимо прочитать FET$ таблицу чтобы найти свободный экстент и затем выполнить DML команды к таблицам FET$ и UET$ так как экстент становится не свободным. Этот механизм существенно снижает производительность, так как все операции по управлению пространством в БД (они могут инициироваться параллельно) должны выполняться согласно механизму управления транзакциями.
Локальный механизм был введён начиная с версии 8i и стал значением по умолчанию начиная с версии 9i. Он использует битовую маску которая хранится в каждом файле данных. Каждый бит управляет определённым набором блоков и когда место выделяется, значение соответсвующего бита устанавливается в единицу. Такой механизм гораздо более эффективен чем dictionary management. Время на выделение экстентов распределено между битовыми масками каждого файла, и битовые маски разных файлов могут обновляться параллельно, в отличие от использования двух общих таблиц. Битовая маска хранится в шапке файла данных (размер header по умолчанию = 64 Кб до 11g и 1 Мб после 11g. Надо добавлять размер шапки когда вы считаете размер файла).
Когда вы создаёте табличное пространство с механизмом локального управленяи, важным параметром является uniform size (равномерный размер). Если указывается эта опция, каждый экстент выделяемый в этом табличном пространтсве будет фиксированного размера.Это позволяет управлять пространством ещё более эффективно, так как количество блоков управляемых каждым битом в маске будет больше: один бит для экстента. Рассмотрим пример
Каждый экстент выделяемый в этом табличном пространстве будет размером 160 МБ, т.е. во всего будет около 64 экстентов. Битовой маске нужно всего 64 бита и 160 МБ можно выделить обновив всего один бит. Это может быть очень эффективно – если сегменты в этом табличном пространстве будут большими. Если будет создан сегмент которому надо место всего для нескольких строк – все равно будет выделен экстент в 160 МБ. Маленьким объектам лучше создавать отдельно таблично пространство
Когда сегмент будет создаваться в этом табличном пространстве, Oracle выделит экстент размером в 64Кб. Когда сегмент будет расти и требовать больше места, Oracle будет выделять экстенты по 64Кб до тех пор, пока их число не станет 16, а затем размер выделяемых экстентов будет постепенно увеличиваться.
Если база данных была обновлена, возможно что будут табличные пространства с dictionary-management управлением. Вы можете проверить это выполнив запрос
select tablespace_name, extent_management from dba_tablespaces
Любые dictionary-management табличные пространства могут быть сконвертированы в локально управляемые с помощью PL/SQL программы, которую можно вызвать
Метод управления пространством для сегмента устанавливается для табличного пространства и применяется ко всем сегментам в таблично пространстве. Существует два метода: manual и automatic. Автоматическое управление надо всегда использовать, а ручное – всего лишь ограничение для поддержки старых версий.
Автоматический метод был введён в версии 9i и стал значением по умолчанию начиная с версии 11g. Каждый сегмент создаваемый в автоматически управляемом табличном пространстве имеет набор битовых масок описывающих насколько заполнены блоки в нём. Всего хранится 5 битовых масок для каждого сегмента, и каждый блок существует только в одной битовой маске. В битмапах хранится информация о использованном пространстве по группам: битмап для полностью заполненных блоков, блоков где заполнено от 75% до 100%, от 50 до 75%, от 25 до 50 и от 0 до 25%. Когда нужен блок для записи сроки, серверный процесс сессии смотрит на размер строки, чтобы определить в какой битовой маске искать блок. Например если размер блока 4КБ и строка для вставки 1500 байт, то соответствующий блок необходимо искать в группе блоков где заполнено от 25 до 50%. Каждый блок в этой группе гарантированно имеет 2КБ свободного места. Когда строки доабвляются, удаляются или изменяются – битовые маски тоже обновляются.
Старый ручной способ управления использовал обычный список, известный как free list, в котором хранился список блоков доступных для записи, но без какой-либо информации о том сколько места свободно. Такой метод не оптимален так как необходимо проверять каждый блок хватает ли места и место распределяется непропорционально (может появиться много неиспользованного места). Для проверки метода управления можно выполнить запрос
select tablespace_name,segment_space_management from dba_tablespaces;
Невозможно изменить метод для управления пространством сегментов, но можно создать новое таблично пространство с автоматическим методом, перенсти туда все сегменты и удалить старое табличное пространство.
Табличные пространства это хранилище для данных схемы, включая словарь данных (который находится в схеме SYS). У всех баз данных обязаны быть табличные пространства SYSTEM и SYSAUX и (для работы с БД) временное табличное пространство и пространство undo. Обычно эти четыре табличных пространства создаются на этапе создания БД. В дальнейшем DBA может создавать много других табличных пространств для пользовательских данных, и возможно дополнительные пространства для undo и временных данных.
Создание табличного пространства
Для создания табличного пространства с помощью Enterpise Manager Database Control с домашней страницы базы данных перейдите на вкладку Server и нажмите на ссылку Tablespaces в разделе Storage. На рисунке 5-3 отображается результат для БД по умолчанию.
Рисунок 5-3 – Табличные пространства в БД ocp11g
Для каждого табличного пространства отображаются:
Allocatedsize –размер файла/ов данных табличного пространства. Это текущее значение, а не максимальное до которого может быть расширено
Spaceused – это пространство использованное сегментами
Allocatedspaceused (%) – графическое представление предыдущих значений
Allocatedfreespace – пространство доступное на данный момент в табличном пространстве
Status – зелёная галочка отображает что табличное пространтсво в рабочем состоянии и объекты этого пространства доступны для использования. Выключенное табличное пространство (offline) будут отображаться как красный крестик
Datafiles – колчиество файлов данных (или временных файлов для временного табличного пространства) которые входят в табличное пространство
Type – типы объектов, которые могут храниться в этом табличном пространстве. Постоянные пространства (permanent) могут хранить обычные объекты схемы, такие как таблицы и индексы. Временные табличные пространства могут хранить управляемые системой временные а сегменты, а пространства undo только системно управляемые сегменты undo
Extentmanagement – метод выделения экстентов для сегмента. LOCAL значение по умолчанию и всегда должно использоваться
Segmentmanagement – метод выделения блоков доступных для вставки данных. AUTO значение по умолчанию и рекомендуется для всех табличных пространств содержащих пользовательские данные.
Эту же информацию можно получить написав запрос к предсатвлениям словаря данных DBA_TABLESPACES, DBA_DATA_FILES, DBA_SEGMENTS и DB_FREE_SPACE. К примеру результатом выполнения запроса
(select sum(bytes) allocated, count(file_id) cnt from dba_data_files
where tablespace_name=’EXAMPLE’) d,
(select sum(bytes) free from dba_free_space
where tablespace_name=’EXAMPLE’) f,
(select sum(bytes) used from dba_segments
where tablespace_name=’EXAMPLE’) u
where t.tablespace_name=’EXAMPLE’;
будет
На этой же странице нажмите кнопку CREATE для создания нового табличного пространства. Новое окно создания запросит название нового табличного пространства, значения для Extent Management, Type и Status. В большинстве случаев значения по умолчанию валидны: Local, Permanent и Read Write. Затем кнопка ADD позволяет указать один или более файлов данных для нового табличного пространства. Для каждого файла необходимо указать имя файла и размер, также опционально можно включить autoextend до максимального допустимого размера файла. Возможность autoxtend позволяет Oracle серверу самому увеличиваться размер файлов данных при необходимости, что позволит избежать ошибок из-за нехватки места. На рисунках 5-4 и 5-5 отображены окна Database Control для создания табличного пространства NEWTS с одним файлом данных.
Рисунок 5-4 Окно создания табличного пространстваРисунок 5-5 Окно добавления файла данных
Нажав кнопку CONTINUE вы вернётесь к окну создания табличного пространства. Нажатие кнопки SHOW SQL отобразит сгенерированный запрос
Рассмотрим эту команду построчно
1 CREATE SMALLFILE TABLESPACE «NEWTS» – табличное пространство будет пространством типа SMALLFILE. Это значит что оно может состоять из множества файла данных. Альтернативой является BIGFILE, в этом случае невозможно добавить новый файл данных (но всё так же можно изменить размер). Флаг Use Bigfile Tablespace на рисунке 5-4 определяет это значение
2 DATAFILE – ‘/u02/oradata/ocp11g/newts01.dbf’ Имя и расположение файла данных
3 SIZE 100M AUTOEXTEND ON NEXT 100K MAXSIZE 200M – Файл данных будет создан размеров 100 Мб, при заполнении будет автоматически выделяться 100Кб до максимально допустимого значения в 200 Мб. По умолчанию автоматическое выделения места не включено.
4 LOGGING – Все операции над сегментами в табличном пространстве будут генерировать данные для повтора изменений (redo): это значение по умолчанию. Возможно отключить генерацию redo только для нескольких операция (таких как создание индекса)
5 EXTENT MANAGEMENT LOCAL – табличное пространство будет использовать битовые карты для выделения экстентов; значение по умолчанию
6 SEGMENT SPACE MANAGEMENT AUTO – Сегменты в табличном пространстве будут использовать битовые карты для отслеживания использования блоков; значение по умолчанию
Если выбрать вкладку Storage в окне создания табличного пространства то можно управлять параметрами управления экстентами и сжатия – Рисунок 5-6.
Рисунок 5-6 Дополнительные параметры создания табличного пространства
Когда используется локальное управление экстентами, возможно включить функционал согласно которому все экстенты в табличном пространстве будут одного размера. Также доступны опции сжатия, логирования.
Пример команды создания табличного пространства выполненной в SQL* Plus показан на рисунке 5-7.
Табличное пространство STORETABS состоит из двух файлов данных, оба без автоинкремента. Единственное различие от команды по умолчанию это указание размера extent-а в 5 МБ. Первый запрос на рисунке показывает что файлы не большие иначе нельзя было бы создать два файла данных. Второй запрос на рисунке отображает информацию о табличном пространстве TEMP, используемом для хранения временных объектов. Важно понимать что временное табличное пространство использует временные файлы, а не файлы данных. Временные файлы перечислены в пресдатвлении V$TEMPFILE и DBA_TEMP_FILES, когда файлы данных перечислены в V$DATAFILE и DBA_DATA_FILES. Также важно отметить что V$ и DBA показывают разную информацию. В V$TABLESPACE находится информация является ли табличное пространтсво «большим» и в V$TEMPFILE (или V$DATAFILE) размер файлов. Этой информации нет в представлениях DBA. Но представления DBA содержат детальную информацию о экстентах и сегментах. Разная информация доступна либо там либо там, так как некоторая информация хранится в файле контроле (и доступна только в V$ представлениях), а другая хранится в словаре данных (и видима в DBA представлениях). Остальная информация дублируется.
Изменение табличных пространств
Изменения происходящие над табличным пространством после создания обычно
Переименование
Включение выключение (online/offline)
Переключение в режим только-чтение и обратно
Изменение размера
Изменение уровня препупреждений
Переименование табличного пространтсва и его файлов
Синтаксис команды
ALTER TABLESPACE tablespaceoldname RENAME TO tablespacenewname;
Синтаксис очень прост но выполнение команды может доставить проблемы в будущем. Множество установок полагаются на название файлов чтобы соотносить файлы данных с табличными пространствами. На наших примерах видно что просто доавляется имя табличного пространства в имя файла и доабвляется номер. Oracle всё равно: взаимосвязь определяется нормерами табличных пространств и файлов. Эти номера доступны в столбцах TS# представления V$TABLESPACE и FILE# представления V$DATAFILE. Если вы зависите от названий, тогда вам нужно так переименовать файлы. Табличное пространство может быть переименовано в любое время, в том время как файлы можно переименовать только когда они не используются (offline). Это необходимо так как файлы переименовываются и на уровне операционной системы и все дескрипторы станут невалидными. Рисунок 5-8 показывает пример такого процесса над табличным пространством созданным на рисунке 5-7.
Первая команда изменяет имя табличного пространства. Это самая легкая часть. Затем табличное пространство выключается, и выполняются команды операционной среды переименовать файлы. Затем две команды ALTER DATABASE изменяют имена файлов в файле контроля, и Oracle сможет их найти. И наконец табличное пространство включается.
Включение и выключение табличного пространтсва (Online/Offline)
Включенным табличным пространством является пространство готовое к использованию; выключенное табличное пространство определено в словаре данны и файле контроля, но его нельзя использовать. Табличное пространтсво может быть включенным, но один или несколько файлов данных внутри него могут быть выключены. Такая ситуация может привести к неожиданным результатам и следует избегать её возникновения.
Синтаксис для выключения табличного пространства
ALTER TABLESPACE tablespacename OFFLINE [NORMAL|IMMEDIATE|TEMPORARY]
Обычное выключение (NORMAL – значение по умолчанию) запустит создание контрольной точки для всех файлов данных этого пространства. Все грязные буфферы в кэше которые содержат блоки из табличного пространтсва будут записаны в файлы данных и табличное пространство и файлы данных будут выключены.
Режим IMMEDIATE выключает табличное пространтсво и файлы данных сразу, без очищения буфера. Это значит что файлы данных станут повреждёнными (не содержат подтверждённые изменения) и необходимо будет восстанавливать их состояние (путём чтения и применения лога изменений) перед тем как можно будет их включить. Этот режим стоит использовать только если файлы были повреждены и контрольная точка не может быть создана.
Режим TEMPORARY создаст контрольную точку для всех файлов для которых она может быть создана и затем по порядку выключит файлы и табличное пространство. Любые повреждённые файлы будут выключены сразу. Если только один некоторые файлы были повреждёны, этот режим поможет ограничить количество файлов которые надо восстанавливать.
Режим только-чтения (Read only)
Чтобы понять эффект режима только чтения изучите рисунок 5-9. Синтаксис команды говорит сам за себя
ALTER TABLESPACE tablespacename [READONLY|READ WRITE];
После перевода в режим только-чтения, объекты не могут быть созданы используя DML команды. Но они могут быть удалены. Выглядит нелогично но давайте подумаем. Удаление таблицы на самом деле не выполняет каких-либо действий над таблицей. Это транзакция над словарём данных, которая удаляет строки описывающие таблицу и её столбцы; словарь данных находится в табличном пространстве SYSTEM и оно не только для чтения. Создание таблицы в пространстве находящемся в режиме только для чтения также будет неуспешно, так как кроме DDL запроса должно выделиться физическое место для первого экстента таблицы (если не включен deferred segment creation. Если включен то место не будет выделяться и запрос выполниться успешно, однако при попытке добавить строки в созданную таблицу будет ошибка).
Изменение размера табличного пространста
Размер табличного пространства может быть изменён как добавлением файлов данных в него так и изменением размера существующих файлов. Файлы данных могут быть увеличены автоматически при необходимости если была указана опция AUTOEXTEND при создании. Иначе вам придётся делать это вручную используя команду ALTER DATABASE
ALTER DATABASE DATAFILE filename RESIZE n [M|G|T]
M G и T это мегабайт, гигабайт и терабайт соответсвенно.
Рассмотрим пример
alter dtabase datafile ‘/oradata/users_02.dbf’resize 10m;
Из команды вы не знаете станет ли файл больше или меньше. Размер может быть увеличен только если в файловой системе достаточно свободного места. Уменьшение размера возможно только если внутри файла сущесвует достаточно места не выделенного под сегменты.
Для того чтобы добавить новый файл в табличному пространству выполняется команда
ALTER TABLESPACE tablespacename ADD DATAFILE ‘filename’ SIZE 50m;
Параметр AUTOEXTEND можно указать при создании или включить позже выполнив команду
alter database datafile ‘filename’ autoextend on next 50m maxsize 2g;
Результатом выполнения команды будет автоматическое увеличение файла на 50 МБ до достижения максимального размера в 2 ГБ.
Изменение уровня предупреждений
Процесс MMON экземпляра практически в режиме реального времени наблюдает за свободным местом в табличных пространствах. Если табличное пространтсво заполняется до определённого уровня MMON создаёт предупреждение. Уровень по умолчанию для создания предупреждения – 85%, для создания критического предупреждения – 97%. Увидить эти предупреждения можно по разному, самый лёгкий способ — посмотреть на домашнуюю страницу Database Control.
Чтобы посмотреть или изменить эти значения в Database Control можно выбрать Tablespace на вкладкe Server и нажать EDIT. Затем в окне управления пространством перейти на вкладку Thresholds. На рисунке 5-10 показан пример для пространства EXAMPLE.
Рисунок 5-10 Окно управления предупреждениями
На этом рисунке “Available Space” указано как 32Гб. Что полностью неверно, так как выделенное место как видно на рисунке 5-3 всего 100МБ. Это происходит так как включен AUTOEXTENSION. Если AUTOEXTEND указан для файла и не установленм MAXSIZE, тогда файл может увеличиваться до платформо-зависимого ограничения, в нашем случае 32 ГБ. Конечно это не значит что у системы есть место для таких файлов. Система предупреждения рассчитыает лимиты и использует максимально допустимый размер файла как основу для вычисления, и это абсолютно быссмесленно если у вас включен AUTOEXTEND и не указан MAXSIZE.
Становится понятно что при использовании автоматического управления размером желательно указывать максимальное значение. Это можно сделать и Database Control или командой ALTER DATABASE.
Удаление табличных пространств
Для удаления табличного пространтсва используется команда
DROP TABLESPACE tablespacename [INCLUDING CONTENTS [AND DATAFILES]];
Если не указано INCLUDING CONTENS то удаление не выполнится если существуют объекты в табличном пространстве. Используя этот параметр вы указываете Oracle вначале удалить все объекты, а затем удалить табличное пространство. И даже эта команда может быть выполнена неуспешно если например в табличном пространстве создана таблица родитель для внешнего ключа таблицы созданной в другом табличном пространстве.
Если не указано AND DATAFILES тогда табличное пространство и его содержимое будет удалено однако файлы данных не будут удалены с диска. Oracle не будет знать ничего об этих файлах после удаления табличного пространства и файлы можно будет удалить только командами операционной системы.
Oracle Managed Files (OMF)
Использование OMF должно избавить DBA от необходимости знать что-либо о файловой системе. Создание файлов БД может быть полностью автоматическим. Для включения OMF необходимо установить параметры экземпляра
DB_CREATE_FILE_DEST
DB_CREATE_ONLINE_LOG_DEST_1
DB_CREATE_ONLINE_LOG_DEST_2
DB_CREATE_ONLINE_LOG_DEST_3
DB_CREATE_ONLINE_LOG_DEST_4
DB_CREATE_ONLINE_LOG_DEST_5
DB_RECOVERY_FILE_DEST
Параметр DB_CREATE_FILE_DEST определяет путь по умолчанию дял файлов данных. Параметры DB_CREATE_ONLINE_LOG_DEST_n указывают путь файла текщих логов. Параметр DB_RECOVERY_FILE_DEST определяет путь к файлам архивных логовов и резервных копий. OMF будет использовать эти пути и создавать файлы со сгенерированными именами и (по умолчанию) устанавливать размер файлов. При включенном OMF всё равно можно указать имя вручную при создании табличного пространства.
Мы рассмотрели процесс взаимодействия экземпляра и сессий: процессы и структуры памяти. В этой главе мы будем рассмотривать саму БД. Все процессы обработки информации происходят в памяти экземпляра БД, но хранение данных происходит в файлах базы данных на диске. База данных состоит из трех типов файлов: файл контроля, файлы логов и файлов даных. Данные хранятся в файлах данных.
Пользователи никогда не видят физический файл данных. Они видят логические сегменты. Системные администраторы ничего не знают о логических сегментах – они видят файлы. В базе данных 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.