Введение в 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