Введение в Oracle 10g. Часть 2
Работа с базой данных: первые шаги
Введение
предыдущей части мы рассмотрели установку Oracle 10g XE, а теперь речь пойдет о резервном копировании и восстановлении, основных учетных записях и ролях базы.
Резервное копирование и восстановление
Операции резервного копирования и восстановления в Oracle можно разделить на три вида:
- логическое резервное копирование — производится при помощи входящей в состав Oracle утилиты exp, которая позволяет экспортировать всю базу, заданные схемы или таблицы. В случае экспорта всей базы выполняется так называемый полный экспорт (при этом экспортируются все таблицы базы данных) или инкрементный (выгружаются таблицы, изменившиеся с момента последнего экспорта). Для Oracle 10g XE, в котором объем базы не превышает 4 Гбайт, можно пользоваться полным экспортом;
- физическое резервное копирование — выполняется после остановки базы и предполагает копирование файлов данных, управляющих файлов, оперативных журналов повтора и файла init.ora с настройками базы;
- оперативное резервное копирование — осуществляется в базе, функционирующей в режиме ARCHIVELOG. В этом режиме производится архивация оперативных журналов повтора и ведется журнал всех транзакций.
Для небольших учебных баз данных наиболее простым и надежным является полное логическое резервное копирование и физическое резервное копирование. Логическое резервное копирование выполняется при помощи утилиты exp.exe, размещенной в папке oraclexe\app\oracle\product\10.2.0\server\BIN\. Утилита является консольным приложением, получающим параметры через командную строку. Поскольку параметров обычно бывает много (5-10 штук), удобно создать профиль с параметрами и затем передать его утилите экспорта при помощи параметра parfile.
Рассмотрим пример типовых профилей. Для начала решим наиболее распространенную задачу — создание резервной копии одной или нескольких схем. В качестве примера рассмотрим копирование схемы SCOTT с учебным примером. Для этого создадим текстовый файл exp_scott.prm, содержащий следующие строки:
USERID = имя/пароль
LOG = ora10scott.log
FILE = ora10scott.dmp
OWNER= SCOTT
Затем произведем экспорт, выполнив команду exp parfile=exp_scatt.prm, в результате чего будет создан файл ora10scott.dmp, содержащий резервную копию схемы SCOTT. Этот файл имеет бинарный формат и очень хорошо сжимается любым архиватором, поэтому для автоматизации процедуры резервного копирования удобно создать BAT-файл, содержащий команду экспорта и вызов архиватора для сжатия полученного дампа.
В нашем случае параметр USERID содержит имя и пароль для доступа к базе данных, параметр LOG задает имя файла, в который записывается протокол работы, параметр FILE задает имя файла резервной копии, OWNER — одна или несколько экспортируемых схем (если указывается несколько схем, то они перечисляются через запятую).
Для выполнения полного экспорта профиль немного изменится:
USERID = имя/пароль
LOG = ora10full.log
FILE = ora10 full.dmp
FULL = Y
Важным моментом является то, что экспорт конкретной схемы можно выполнять от имени ее владельца, но для полного экспорта необходимо обладать ролью DBA, в противном случае попытка полного экспорта завершится ошибкой EXP-00023 с сообщением «Must be a DBA to do Full Database or Tablespace export». Размер дампа в случае полного экспорта пустой базы Oracle 10g XE составляет 43 Мбайт (9 Мбайт после сжатия WinRar). Настоятельно рекомендуется выполнять периодическое резервное копирование даже на учебной базе — известны десятки и сотни случаев, когда в ходе изучения Oracle происходит повреждение базы, удаление пользователя или иная операция, приводящая к потере созданных объектов. Проще всего создавать резервную копию после каждого сеанса работы. Для упрощения этой операции можно применить BAT-файл следующего вида:
del ora10scott.dmp
del ora10scott.log
exp parfile=exp_scott_d.prm
"C:\Program Files\WinRAR\WinRAR.exe" a -agDDMMYYYY -m5 ora10g- ora10scott.dmp ora10scott.log
del ora10scott.dmp
del ora10scott.log
В данном случае параметры экспорта содержатся в файле exp_scott_d.prm. После выполнения резервного копирования производится архивация дампа и протокола экспорта, причем в имени архива содержится дата его создания. Размер архива определяется количеством объектов и объемом данных в таблицах; для учебной схемы SCOTT-архив с резервной копией имеет размер 2 Кбайт.
Логический импорт является зеркальной операцией по отношению к экспорту и выполняется при помощи утилиты IMP. В ходе импорта необязательно импортировать всю имеющуюся в дампе информацию — можно произвести импорт заданных схем или таблиц. Параметры утилиты IMP удобно размещать в профилях, например для импорта схемы SCOTT можно применить профиль следующего вида:
USERID = scott/tiger
LOG = ora10scottimp.log
FILE = ora10scott.dmp
ROWS = Y
GRANTS = Y
INDEXES = Y
FROMUSER= SCOTT
TOUSER= SCOTT
Параметр FROMUSER указывает, из каких учетных записей в дампе берется информация, а TOUSER — в какие учетные записи она импортируется. Это очень удобная возможность утилиты импорта, так как она позволяет импортировать данные одной схемы в другую.
Параметры ROWS (строки таблиц), GRANTS (полномочия на объекты), INDEXES (индексы) указывают, какие типы объектов импортируются.
Рассмотрим несколько типичных ситуаций, встречающихся на практике:
- необходимо импортировать таблицы, но не требуется загружать в них данные — в этом случае следует задать параметр ROWS=N;
- необходимо импортировать объекты учетной записи SCOTT в учетную запись SCOTT1. В этом случае следует задать параметры FROMUSER=SCOTT и TOUSER= SCOTT1;
Перед импортом необходимо удалить все объекты из схемы, иначе в процессе импорта будут выдаваться ошибки IMP-00015 для каждой импортируемой таблицы (импорт данных в этом случае не производится). Если по каким-либо причинам необходимо загрузить данные в существующую таблицу, то можно применить параметр IGNORE=Y, что приведет к игнорированию ошибок при создании объектов и к продолжению импорта данных. Однако в случае применения параметра IGNORE=Y необходимо учитывать, что в таблицах без первичного ключа может возникнуть удвоение записей (так как каждая операция импорта загружает новые данные, а старые при этом не уничтожаются).
У IMP есть одна интересная функция — вместо выполнения команд в базе данных эта утилита выводит их в протокол, генерируя тем самым скрипты, содержащие DML-операторы. Для включения этой функции необходимо указать параметр SHOW=Y.
![]() |
![]() |
Учетные записи SYS и SYSTEM
аждая база Oracle с момента своего создания содержит две схемы (следует отметить, что термины «учетная запись», «схема» и «пользователь» обозначают в Oracle одно и то же) — SYS и SYSTEM. Схема SYS содержит все системные объекты — внутренние таблицы базы данных, пакеты, процедуры. Кроме того, пользователь SYS является владельцем словаря данных. Словарь данных Oracle — это совокупность таблиц и представлений, позволяющих получить любую информацию о структуре базы данных, о ее настройках и состоянии при помощи стандартных SQL-запросов. Учетная запись SYS является также учетной записью администратора базы данных с неограниченными полномочиями. Учетная запись SYSTEM предоставляет доступ ко всем объектам базы и наделена ролью DBA. При работе с учетными записями SYS и SYSTEM необходимо соблюдать ряд правил:
- разработка в базе данных не должна вестись от имени пользователей SYS и SYSTEM;
- нельзя удалять или изменять системные объекты, размещенные в этих схемах, — подобные действия могут привести к непредсказуемым последствиям;
- у учетных записей SYS и SYSTEM должны быть заданы сложны устойчивые к подбору пароли длиной не менее 6-8 символов. В случае необходимости можно вообще запретить регистрацию пользователей под учетными записями SYS и SYSTEM.
Стандартные роли
Роли в Oracle — это именованные группы привилегий. После создания базы данных в ней создается несколько стандартных ролей:
- роль CONNECT — содержит только одну привилегию CREATE SESSION, позволяющую создавать соединение с базой;
- роль DBA — полный набор привилегий, необходимых администратору базы;
- роль RESOURCE — базовый набор привилегий, необходимых разработчику;
- роль DELETE_CATALOG_ROLE — привилегии для удаления информации из таблицы аудита;
- роль SELECT_CATALOG_ROLE — привилегии для чтения информации из таблиц аудита;
- роль EXP_FULL_DATABASE — необходима пользователю, из-под учетной записи которого будет производиться полный экспорт базы;
- роль IMP_FULL_DATABASE — необходима пользователю, из-под учетной записи которого будет производиться полный импорт базы.
![]() |
![]() |
Работа с базой данных: первые шаги
так, мы рассмотрели основные вопросы, связанные с резервным копированием и восстановлением. Теперь перейдем непосредственно к изучению возможностей Oracle. Начнем с языка запросов Oracle SQL. Язык запросов содержит операторы двух типов:
- DML — язык манипулирования данными (команды SELECT, INSERT, UPDATE и DELETE);
- DDL — язык определения данных. Позволяет создавать, изменять и удалять объекты, изменять настройки базы данных.
В некоторых классификациях операторов SQL выделяют также подмножество операторов DCL — это категория SQL-операторов, управляющих доступом к данным и базе данных. В частности, к этой категории относятся операторы GRANT (выдача привилегий на некоторый объект) и REVOKE (аннулирование ранее выданных привилегий).
Начнем рассмотрение Oracle SQL с оператора SELECT, предназначенного для извлечения данных из базы. Базовый синтаксис оператора SELECT имеет вид:
SELECT список столбцов через запятую
FROM список таблиц через запятую
[WHERE условия]
[HAVING условия]
[GROUP BY группировка]
[ORDER BY сортировка]
Вместо списка столбцов допускается использование символа «*», который рассматривается как «все столбцы всех перечисленных в FROM таблиц».
Рассмотрим простейший запрос
SELECT *
FROM SCOTT.EMP
Данный запрос извлекает всю информацию из таблицы EMP. При использовании «*» следует учитывать ряд факторов:
- порядок следования столбцов при применении «*» не гарантируется. Следовательно, если использование конкретного списка столбцов по какой-либо причине недопустимо, то необходимо обращаться к возвращаемым столбцам по именам, а не по индексу. Это распространенная ошибка, поскольку, как правило, столбцы возвращаются в порядке их следования в таблице и любая реорганизация таблицы может привести к возникновению трудно диагностируемых ошибок;
- во многих случаях клиентское приложение применяет только часть имеющихся в таблице столбцов. Если вместо перечисления необходимых столбцов указать «*», то на клиентскую сторону будут передаваться неиспользуемые данные, что приведет к избыточной нагрузке на сеть и, как следствие, к снижению производительности;
- в случае извлечения информации из двух и более таблиц может оказаться, что в таблицах существуют столбцы с одинаковыми именами. В этом случае возникнет ошибка «ORA-00918 column ambiguously defined» и запрос не выполнится. Это один из подводных камней, с которыми сталкиваются начинающие разработчики, — запрос может работать во время отладки, а затем через некоторое время производится модификация базы, что приводит к появлению в применяемых запросом таблицах столбцов с одинаковыми именами, в результате чего запрос перестает работать.
В некоторых случаях может потребоваться вернуть при помощи запроса результат работы некоторой хранимой функции или результат вычисления. В этом случае можно использовать специальную системную таблицу DUAL, доступную всем пользователям и всегда содержащую единственный столбец с именем DUMMY и типом VARCHAR2(1) и единственную строку. Пример запроса, производящего вычисления и применяющего таблицу DUAL:
SELECT 4 + 5*20
FROM DUAL
В качестве другого примера с использованием таблицы DUAL можно рассмотреть вызов функции SYSDATE, возвращающей текущую дату:
SELECT SYSDATE
FROM DUAL