# Администрирование Oracle

Инструкция описывает установку Oracle Database, создание базы данных для Global, экспорт схемы в дамп с помощью `expdp` и загрузку дампа с помощью `impdp`.

## Установка Oracle Database в Windows

Перед созданием базы установите серверную часть Oracle Database.

1. Запустите установщик Oracle Database.
2. На шаге **Configure Security Updates** укажите параметры получения уведомлений Oracle. Если уведомления не используются, оставьте адрес электронной почты пустым и подтвердите продолжение установки.

   ![Настройка уведомлений Oracle](img/image1.png)

3. На шаге **Select Installation Option** выберите **Install database software only**. База данных будет создана отдельно после установки серверного ПО.

   ![Выбор режима установки](img/image2.png)

4. На шаге **Select Database Installation Option** выберите **Single instance database installation**.

   ![Выбор типа установки](img/image3.png)

5. На шаге **Select Database Edition** выберите редакцию Oracle Database, используемую в контуре. В приведенном примере используется **Enterprise Edition**.

   ![Выбор редакции Oracle Database](img/image4.png)

6. На шаге **Specify Oracle Home User** укажите учетную запись, от имени которой будут работать службы Oracle. В приведенном примере используется **Windows Built-in Account**.

   ![Выбор учетной записи Oracle](img/image5.png)

7. На шаге **Specify Installation Location** укажите:

   - **Oracle base** — корневой каталог Oracle;
   - **Software location** — каталог установки Oracle Database.

   Пример:

   <!-- Начало кода -->
   ```text
   Oracle base: E:\oracle
   Software location: E:\oracle\product\12.2.0\dbhome_1
   ```
   <!-- Конец кода -->

   ![Каталоги установки Oracle](img/image6.png)

8. Дождитесь завершения проверки предварительных требований.
9. На странице **Summary** проверьте выбранные параметры и нажмите **Install**.

   ![Проверка параметров установки](img/image7.png)

После завершения установки настройте listener.

## Установка Oracle Database в Linux

В Linux серверное ПО устанавливается из дистрибутива Oracle Database от имени пользователя Oracle.

1. Подготовьте каталоги `ORACLE_BASE` и `ORACLE_HOME` и предоставьте пользователю Oracle права на них.
2. Распакуйте дистрибутив Oracle Database.
3. Запустите установщик из каталога дистрибутива:

   <!-- Начало кода -->
   ```bash
   ./runInstaller
   ```
   <!-- Конец кода -->

4. В мастере установки выберите установку только серверного ПО и создание одиночного экземпляра базы данных.
5. Укажите `ORACLE_BASE` и `ORACLE_HOME`.
6. После проверки предварительных требований запустите установку.
7. Выполните системные скрипты, которые установщик предложит запустить от имени `root`.
8. После установки задайте окружение пользователя Oracle:

   <!-- Начало кода -->
   ```bash
   export ORACLE_BASE=<путь_к_oracle_base>
   export ORACLE_HOME=<путь_к_oracle_home>
   export PATH=$ORACLE_HOME/bin:$PATH
   ```
   <!-- Конец кода -->

После установки настройте listener и создайте базу данных.

## Настройка listener

Listener принимает сетевые подключения к Oracle Database. Для настройки используется Oracle Net Configuration Assistant.

В Windows Oracle Net Configuration Assistant можно запустить из меню Oracle или командой `netca`. В Linux запустите:

<!-- Начало кода -->
```bash
$ORACLE_HOME/bin/netca
```
<!-- Конец кода -->

1. Выберите **Listener configuration**.

   ![Выбор настройки listener](img/image8.png)

2. Выберите **Add** для создания listener.

   ![Создание listener](img/image9.png)

3. Укажите имя listener. По умолчанию используется:

   <!-- Начало кода -->
   ```text
   LISTENER
   ```
   <!-- Конец кода -->

   ![Имя listener](img/image10.png)

4. Выберите протокол **TCP**.

   ![Выбор протокола listener](img/image11.png)

5. Укажите порт listener. Стандартный порт Oracle:

   <!-- Начало кода -->
   ```text
   1521
   ```
   <!-- Конец кода -->

   ![Настройка порта listener](img/image12.png)

6. Завершите настройку Oracle Net Configuration Assistant.

Проверьте состояние listener:

<!-- Начало кода -->
```text
lsnrctl status
```
<!-- Конец кода -->

При необходимости запустите его:

<!-- Начало кода -->
```text
lsnrctl start
```
<!-- Конец кода -->

## Создание базы данных

База данных создается с помощью Oracle Database Configuration Assistant (`DBCA`).

В Windows запустите:

<!-- Начало кода -->
```text
dbca
```
<!-- Конец кода -->

В Linux запустите:

<!-- Начало кода -->
```bash
$ORACLE_HOME/bin/dbca
```
<!-- Конец кода -->

### Основные параметры базы

1. В DBCA выберите **Create a database**.

   ![Создание базы данных](img/image13.png)

2. Выберите **Advanced configuration**. Расширенный режим позволяет вручную настроить память, кодировку, количество процессов и расположение файлов базы.

   ![Выбор режима создания базы](img/image14.png)

3. На шаге **Select Database Deployment Type** выберите:

   - **Oracle Single Instance database**;
   - шаблон **General Purpose or Transaction Processing**.

   ![Выбор типа базы](img/image15.png)

4. На шаге **Specify Database Identification Details** укажите:

   - **Global database name** — имя базы;
   - **SID** — идентификатор экземпляра.

   Для используемой конфигурации Oracle 12c флаг **Create as Container database** не устанавливается.

   ![Идентификация базы](img/image16.png)

5. На шаге **Select Database Storage Option** укажите расположение файлов базы. При использовании файловой системы можно оставить **Use template file for database storage attributes** и проверить расположение файлов перед непосредственным созданием базы.

   ![Настройка хранения файлов базы](img/image17.png)

6. Настройте параметры восстановления и архивирования в соответствии с требованиями контура. В приведенном примере **Fast Recovery Area** и архивирование не используются.

   ![Настройка восстановления и архивирования](img/image18.png)

7. На шаге настройки сети выберите ранее созданный `LISTENER` и проверьте используемый порт.

   ![Выбор listener для базы](img/image20.png)

8. **Oracle Database Vault** и **Oracle Label Security** включаются только при необходимости. В приведенной конфигурации они не используются.

   ![Дополнительные механизмы безопасности](img/image19.png)

### Настройка памяти

На странице **Configuration Options** откройте закладку **Memory** и используйте **Automatic Shared Memory Management**.

Оставляйте не менее 40% общей ОЗУ сервера для операционной системы и дискового кеша. Для Oracle используйте не более 60% ОЗУ.

Для тестовой базы с небольшим количеством пользователей и без ресурсоемких операций используйте начальную конфигурацию:

- SGA — `3 GB`;
- PGA — `1 GB`.

Для продуктивной базы значения выбираются с учетом объема данных, количества пользователей и характера нагрузки.

![Настройка памяти базы](img/image21.png)

### Настройка кодировки

На закладке **Character sets** выберите **Use OS character set (CL8MSWIN1251)**.

Для национального набора символов используется `AL16UTF16`.

Также укажите:

- **Default language** — `Русский`;
- **Default territory** — `Россия`.

![Настройка кодировки](img/image22.png)

### Настройка количества процессов

На закладке **Sizing** задайте значение **Processes**.

Для тестовой базы используйте значение в диапазоне от `320` до `1200`. Конкретное значение выбирается с учетом количества одновременных подключений и выполняемых процессов.

![Настройка количества процессов](img/image23.png)

### Настройка средств управления

На шаге **Management Options** настройте средства управления базой. В приведенном примере используется **Enterprise Manager Database Express** с портом `5500`.

![Настройка Enterprise Manager](img/image24.png)

### Настройка административных пользователей

На шаге **User Credentials** задайте пароли административных пользователей Oracle.

![Настройка административных пользователей](img/image25.png)

### Завершение создания базы

На шаге **Creation Options** установите **Create database**.

Перед созданием базы откройте **Customize Storage Locations** и проверьте состав и расположение файлов базы.

![Параметры создания базы](img/image26.png)

После проверки настроек запустите создание базы и дождитесь завершения DBCA.

Проверьте состояние экземпляра:

<!-- Начало кода -->
```sql
SELECT instance_name, status
FROM v$instance;
```
<!-- Конец кода -->

Проверьте состояние базы:

<!-- Начало кода -->
```sql
SELECT name, open_mode
FROM v$database;
```
<!-- Конец кода -->

## Экспорт схемы с помощью expdp

Для создания дампа используется Oracle Data Pump Export (`expdp`).

### Определение размера исходных данных

Перед экспортом определите объем исходных табличных пространств:

<!-- Начало кода -->
```sql
SELECT tablespace_name,
       ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS size_gb
FROM dba_data_files
GROUP BY tablespace_name
ORDER BY tablespace_name;
```
<!-- Конец кода -->

Полученные значения используйте при выборе размера датафайлов целевой базы.

### Подготовка каталога Data Pump

Параметр `DIRECTORY` содержит имя объекта Oracle `DIRECTORY`, связанного с каталогом файловой системы на сервере Oracle.

Проверьте стандартный каталог `DATA_PUMP_DIR`:

<!-- Начало кода -->
```sql
SELECT directory_name, directory_path
FROM dba_directories
WHERE directory_name = 'DATA_PUMP_DIR';
```
<!-- Конец кода -->

Если используется отдельный каталог, создайте его на сервере Oracle и зарегистрируйте в базе:

<!-- Начало кода -->
```sql
CREATE OR REPLACE DIRECTORY GLOBAL_DP AS '<путь_к_каталогу>';
```
<!-- Конец кода -->

Предоставьте пользователю экспорта права на каталог:

<!-- Начало кода -->
```sql
GRANT READ, WRITE ON DIRECTORY GLOBAL_DP TO <user>;
```
<!-- Конец кода -->

### Создание дампа

Выполните экспорт схемы:

<!-- Начало кода -->
```text
expdp <user>@<service> DIRECTORY=DATA_PUMP_DIR DUMPFILE=<dump_file>.dmp LOGFILE=<export_log>.log SCHEMAS=<schema>
```
<!-- Конец кода -->

Например, для схемы `BTK`:

<!-- Начало кода -->
```text
expdp <user>@<service> DIRECTORY=DATA_PUMP_DIR DUMPFILE=btk.dmp LOGFILE=btk_export.log SCHEMAS=BTK
```
<!-- Конец кода -->

После завершения экспорта проверьте:

- итоговое сообщение Data Pump;
- журнал экспорта;
- наличие файла `.dmp` в каталоге `DATA_PUMP_DIR`.

## Импорт схемы с помощью impdp

Для загрузки дампа используется Oracle Data Pump Import (`impdp`).

Импорт схемы Global выполняется вместе со служебными SQL-скриптами, которые создают и подготавливают окружение базы.

### Файлы импорта

Для импорта используются:

- [Import.bat](/attach/Import.bat) — пример командного файла для последовательного запуска импорта в Windows;
- [drop.sql](/attach/drop.sql) — подготовка схемы `BTK` к повторной загрузке;
- [pre_script.sql](/attach/pre_script.sql) — создание схемы `BTK`, назначение табличных пространств, квот и необходимых прав;
- [pre_post_script.sql](/attach/pre_post_script.sql) — подготовка объектов схемы после загрузки дампа;
- [pre_post_script2.sql](/attach/pre_post_script2.sql) — дополнительная подготовка объектов после импорта;
- [post_script.sql](/attach/post_script.sql) — завершающая компиляция и подготовка окружения Global;
- [dropAQ.sql](/attach/dropAQ.sql) — вспомогательный скрипт удаления очередей Oracle AQ. В стандартной последовательности `Import.bat` автоматически не запускается.

### Подготовка к импорту

Перед импортом убедитесь, что база данных создана и доступна.

#### Табличные пространства и датафайлы

У новой базы по умолчанию создается один основной датафайл для пользовательских данных. Перед импортом подготовьте табличные пространства и необходимое количество датафайлов.

Скрипт `pre_script.sql` назначает схеме `BTK` квоты на табличные пространства:

- `USERSNEW`;
- `INDX`;
- `ACTNEW`.

Эти табличные пространства должны существовать до запуска импорта.

##### Датафайлы исходной базы

На исходной базе, из которой формируется дамп, получите список датафайлов:

<!-- Начало кода -->
```sql
SELECT tablespace_name, file_name, status, bytes
FROM dba_data_files;
```
<!-- Конец кода -->

По результату определите состав датафайлов исходной базы: табличные пространства, количество файлов, их расположение и размер.

##### Датафайлы целевой базы

На целевой базе, в которую будет загружен дамп, получите текущий список датафайлов:

<!-- Начало кода -->
```sql
SELECT tablespace_name, file_name, status, bytes
FROM dba_data_files;
```
<!-- Конец кода -->

Сопоставьте список с исходной базой и добавьте недостающие датафайлы в соответствующие табличные пространства.

Для добавления датафайла используйте `ALTER TABLESPACE`. Например:

<!-- Начало кода -->
```sql
ALTER TABLESPACE USERS
ADD DATAFILE 'D:\oradata\test\USERS02.DBF'
SIZE 100M
REUSE
AUTOEXTEND ON
NEXT 100M
MAXSIZE UNLIMITED;
```
<!-- Конец кода -->

В примере `D:\oradata\test\USERS02.DBF` — путь к создаваемому датафайлу. Для целевой базы укажите фактический каталог данных и нужное табличное пространство.

Если требуемого табличного пространства еще нет, создайте его до добавления дополнительных датафайлов.

Создайте табличное пространство `USERSNEW`:

<!-- Начало кода -->
```sql
CREATE TABLESPACE USERSNEW
DATAFILE '<путь_к_файлу>/usersnew01.dbf'
SIZE <начальный_размер>
AUTOEXTEND ON
NEXT <шаг_расширения>
MAXSIZE <максимальный_размер>;
```
<!-- Конец кода -->

Создайте табличное пространство `INDX`:

<!-- Начало кода -->
```sql
CREATE TABLESPACE INDX
DATAFILE '<путь_к_файлу>/indx01.dbf'
SIZE <начальный_размер>
AUTOEXTEND ON
NEXT <шаг_расширения>
MAXSIZE <максимальный_размер>;
```
<!-- Конец кода -->

Создайте табличное пространство `ACTNEW`:

<!-- Начало кода -->
```sql
CREATE TABLESPACE ACTNEW
DATAFILE '<путь_к_файлу>/actnew01.dbf'
SIZE <начальный_размер>
AUTOEXTEND ON
NEXT <шаг_расширения>
MAXSIZE <максимальный_размер>;
```
<!-- Конец кода -->

В Windows в `<путь_к_файлу>` укажите каталог данных Oracle. В Linux укажите каталог данных, используемый в установленном контуре.

#### Файлы и подключение

Перед запуском импорта:

1. Проверьте свободное место на дисках.
2. Скопируйте дамп `btk.dmp` в физический каталог, соответствующий `DATA_PUMP_DIR`.
3. Скопируйте SQL-скрипты и `Import.bat` в рабочий каталог.
4. Проверьте доступность сервиса Oracle:

   <!-- Начало кода -->
   ```text
   sqlplus <user>@<service>
   ```
   <!-- Конец кода -->

5. В `Import.bat` замените значения примера на параметры целевой базы:

   - путь к `ORACLE_HOME`;
   - имя сервиса;
   - административные учетные данные;
   - имя дампа.

```{warning}
`drop.sql` выполняет `DROP USER BTK CASCADE` и полностью удаляет существующую схему `BTK` вместе с принадлежащими ей объектами.

Запускайте импорт с удалением схемы только для базы, которую требуется полностью перезалить из дампа.
```

### Порядок импорта

`Import.bat` выполняет операции в следующем порядке.

1. Запускает `drop.sql` под `SYSDBA`.
2. Запускает `pre_script.sql` под `SYSDBA`.

   Скрипт создает владельца схемы `BTK`, назначает табличные пространства и квоты, предоставляет необходимые права и создает вспомогательное окружение.

3. Запускает `impdp` и загружает дамп:

   <!-- Начало кода -->
   ```text
   impdp "<sys_user>/<password>@<service> as sysdba" directory=DATA_PUMP_DIR dumpfile=btk.dmp logfile=btk.log
   ```
   <!-- Конец кода -->

4. Запускает `pre_post_script.sql` от имени схемы `BTK`.
5. Запускает `pre_post_script2.sql` под `SYSDBA`.
6. Запускает `post_script.sql` под `SYSDBA`.

`post_script.sql` перекомпилирует объекты, перестраивает необходимые индексы, создает и подготавливает окружение `GLOBAL_SYSTEM`, синхронизирует административные роли и собирает статистику схемы `BTK`.

Для Linux используется та же последовательность запуска `sqlplus` и `impdp`, но команды выполняются из `$ORACLE_HOME/bin` или из окружения пользователя Oracle. Вместо `Import.bat` можно использовать shell-скрипт с теми же шагами.

## Проверка результата

После импорта проверьте журналы:

- `drop.log`;
- `pre.log`;
- `btk.log`;
- `pre_post.log`;
- `pre_post2.log`;
- `post.log`.

Проверьте наличие невалидных объектов:

<!-- Начало кода -->
```sql
SELECT owner,
       object_type,
       object_name
FROM dba_objects
WHERE status = 'INVALID'
  AND owner IN ('BTK', 'GLOBAL_SYSTEM')
ORDER BY owner, object_type, object_name;
```
<!-- Конец кода -->

Проверьте, что необходимые табличные пространства доступны, а датафайлы созданы и доступны Oracle.

После успешного импорта проверьте подключение Global к базе данных и выполнение основных операций системы.
