среда, 20 ноября 2013 г.

Изучаю Oracle: Начало

Oracle предоставляет бесплатную (express) версию своей СУБД, которую можно скачать на официальном сайте (потребуется зарегистрироваться).

Если ваш компьютер/сервер находится в домене, то чтобы корректно установить oracle потребуется зайти под локальной учетной записью с правами администратора. СУБД установится и под доменной учетной записью, но при этом сам экземпляр БД (instance) будет создана некорректно и его придется пересоздавать и перенастраивать. Как это сделать будет написано дальше.

Что такое "экземпляр БД"? Это отдельная БД со своим именем, пользователями, таблицами, настройками, правами. В Oracle могут быть созданы и работать несколько экземпляров БД. Экземпляр можно остановить, создать, удалить и это никак не будет влиять на другие экземпляры. По умолчанию создается только один экземпляр.

1. Проверка работы БД


Для управления БД в комплекте идет консольное приложение SQL*Plus, с помощью которой можно как настраивать БД, так и получать доступ к данных хранящимся в ней. Запустив её вы увидите:
SQL*Plus: Release 11.2.0.2.0 Production on ******************
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
SQL>
На данный момент вы просто запустили её. Но к БД доступа, на данный момент, вы не имеете. Чтобы получить доступ к БД нужно к ней подключиться. Для этого существует команда CONNECT. Чтобы с помощью неё подключиться к БД с правами администратора без логина и пароля, необходимо чтобы учетная запись пользователя под которой запущен SQL*Plus была в группах Администраторы и ORA_DBA. В этом случае команда для подключения выгладит так:
CONNECT / AS SYSDBA
Теперь проверим запущен ли экземпляр БД командой:
STARTUP
Эта команда запускает экземпляр БД. Если экземпляр уже запущен, то вы увидите:
ORA-01081: cannot start already-running ORACLE - shut it down first
Если не был запущен, но успешно запустился:
ORACLE instance started.
Total System Global Area  ********* bytes
Fixed Size                  ******* bytes
Variable Size             ********* bytes
Database Buffers          ********* bytes
Redo Buffers                ******* bytes
Database mounted.
Database opened.
Если же не был запущен и при попытке запустить возникла ошибка, вы увидите сообщение об ошибке:
ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file 'C:\oraclexe\app\oracle\product\11.2.0\serv
er\dbs\spfileXE.ora'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) ?? ??????? ????? ????????? ????.
Если у вас на данном этапе не возникло проблем, то теперь вы можете делать с БД все что захотите: останавливать, запускать, создавать таблицы, добавлять данные и пункт 2 вы можете пока не читать.

2. Что делать если вы устанавливали СУБД Oracle из под доменной учетной записи и теперь не можете запустить БД


* Ниже будет использоваться абсолютный путь расположения директории Oracle, у меня это C:\ORACLEXE. Название экземпляра БД - XE.

Начнем с того, что восстановил главный настоечный файл БД - spfile. Он должен располагаться здесь - C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\ и иметь имя - spfile<имя_экземпляра_БД>.ora, в нашем случае spfileXE.ora. Но его там нет. Но зато есть файл init.ora. С помощью него мы получим spfile.
Откроем init.ora:
# Change '<ORACLE_BASE>' to point to the oracle base (the one you specify at
# install time)
db_name='ORCL'
memory_target=1G
processes = 150
audit_file_dest='<ORACLE_BASE>/admin/orcl/adump'
audit_trail ='db'
db_block_size=8192
db_domain=''
db_recovery_file_dest='<ORACLE_BASE>/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='<ORACLE_BASE>'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300 
remote_login_passwordfile='EXCLUSIVE'
#undo_tablespace='UNDOTBS1'
# You may want to ensure that control files are created on separate physical
# devices
control_files = (ora_control1, ora_control2)
compatible ='11.2.0'

В нем везде заменим (перед этим можно сделать резервную копию) <ORACLE_BASE> на c:\oraclexe\app\oracle и сохраняем.
Далее в SQL*Plus вызываем команду:
CREATE SPFILE='C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\spfileXE.ora' FROM PFILE='C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\init.ora'
Теперь мы имеем рабочий spfile и можем повторить попытку запустить экземпляр БД командой STARTUP в SQL*Plus. Теперь она должна пройти но при этом выдать ошибку:
ORACLE instance started.
Total System Global Area  644468736 bytes
Fixed Size                  1385488 bytes
Variable Size             192941040 bytes
Database Buffers          444596224 bytes
Redo Buffers                5545984 bytes
ORA-00205: error in identifying control file, check alert log for more info
Связано это с тем, что на самом деле запуск экземпляра состоит из нескольких этапов:
1) Запуск экземпляра.
2) Монтирование (mount).
3) Открытие доступа (open).
Мы смогли запустить экземпляр, но смонтировать данные не смогли. Это потому, что нам нечего монтировать - файлов содержащих данные нету. Если вы загляните в директорию C:\oraclexe\app\oracle\oradata\XE, то увидите что она пуста. Так быть не должно. Чтобы это исправить нужно вызвать команду CREATE DATABASE <имя_экземпляра_БД>, которая создаст необходимые для работы БД файлы. Синтаксис вызова такой:
CREATE DATABASE xe
   USER SYS IDENTIFIED BY 123456
   USER SYSTEM IDENTIFIED BY 123456
   LOGFILE GROUP 1 ('c:\oraclexe\app\oracle\oradata\xe\redo01.log') SIZE 100M,
           GROUP 2 ('c:\oraclexe\app\oracle\oradata\xe\redo02.log') SIZE 100M,
           GROUP 3 ('c:\oraclexe\app\oracle\oradata\xe\redo03.log') SIZE 100M
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   MAXINSTANCES 1
   CHARACTER SET US7ASCII
   NATIONAL CHARACTER SET AL16UTF16
   DATAFILE 'c:\oraclexe\app\oracle\oradata\xe\system01.dbf' SIZE 325M REUSE
   EXTENT MANAGEMENT LOCAL
   SYSAUX DATAFILE 'c:\oraclexe\app\oracle\oradata\xe\sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TEMPORARY TABLESPACE tempts1
      TEMPFILE 'c:\oraclexe\app\oracle\oradata\xe\temp01.dbf' 
      SIZE 20M REUSE
   UNDO TABLESPACE UNDOTBS1
      DATAFILE 'c:\oraclexe\app\oracle\oradata\xe\undotbs01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
В конце выполнения команда должна выдать "Database created."
Если теперь вы заглянете в папку C:\oraclexe\app\oracle\oradata\XE, то должны увидеть следующие файлы:
REDO01.LOG
REDO02.LOG
REDO03.LOG
SYSAUX01.DBF
SYSTEM01.DBF
TEMP01.DBF
UNDOTBS01.DBF

Все. Теперь вы можете попробовать создать таблицу:
CREATE TABLE tbl_test1(id int, col1 int);
Вставить в нее данные:
INSERT INTO tbl_test1 VALUES(1, 1);
INSERT INTO tbl_test1 VALUES(2, 2);
INSERT INTO tbl_test1 VALUES(3, 3);
и считать их:
SELECT * FROM tbl_test1;

3 комментария:

  1. Спасибо большое за пост - сильно помог!

    ОтветитьУдалить
  2. Большое спасибо. Очень помогло
    Но теперь при подключении через клиент ввожу логин SYS и пароль (который указывал при установке). Клиент возвращает ошибку "Некорректный логин или пароль"

    ОтветитьУдалить
  3. После 2х дней шаманства, удалось поднять сервер
    Инструкцию описываю ниже (спасибо автору статьи):
    В sqlplus вводим Conn SYS as sysdba
    Пароль указываем который был при установке
    Startup
    Если ошибка ORA-01078: failure in processing system parameters, то ищем файлик C:\oraclexe\app\oracle\product\11.2.0\server\dbs\init.ora
    Редактируем его
    db_name='ORCL'
    memory_target=1G
    processes = 150
    audit_file_dest='C:\oraclexe\app\oracle\admin\ORCL\adump'
    audit_trail ='db'
    db_block_size=8192
    db_domain=''
    db_recovery_file_dest='C:\oraclexe\app\oracle\fast_recovery_area'
    db_recovery_file_dest_size=2G
    diagnostic_dest='C:\oraclexe\app\oracle\product\11.2.0'
    dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
    open_cursors=300
    remote_login_passwordfile='EXCLUSIVE'
    undo_tablespace='UNDOTBS1'
    # You may want to ensure that control files are created on separate physical
    # devices
    control_files = (ora_control1, ora_control2)
    compatible ='11.2.0'


    Создаем недостающие директории


    В файле C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\sqlnet.ora
    Меняем значение на SQLNET.AUTHENTICATION_SERVICES = (NONE)

    Создаем SPFILEORCL.ora
    В sqlplus вводим CREATE SPFILE='C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\spfileORCL.ora' FROM PFILE='C:\ORACLEXE\APP\ORACLE\product\11.2.0\server\dbs\init.ora'

    Если все гуд, то увидим надпись File created

    Далее создаем БД
    Создаем директорию C:\oraclexe\app\oracle\oradata\ORCL
    В SQLPLUS вводим команду:
    CREATE DATABASE ORCL
    USER SYS IDENTIFIED BY 123456
    USER SYSTEM IDENTIFIED BY 123456
    LOGFILE GROUP 1 ('C:\oraclexe\app\oracle\oradata\ORCL\redo01.log') SIZE 100M,
    GROUP 2 ('C:\oraclexe\app\oracle\oradata\ORCL\redo02.log') SIZE 100M,
    GROUP 3 ('C:\oraclexe\app\oracle\oradata\ORCL\redo03.log') SIZE 100M
    MAXLOGFILES 5
    MAXLOGMEMBERS 5
    MAXLOGHISTORY 1
    MAXDATAFILES 100
    MAXINSTANCES 1
    CHARACTER SET US7ASCII
    NATIONAL CHARACTER SET AL16UTF16
    DATAFILE 'C:\oraclexe\app\oracle\oradata\ORCL\system01.dbf' SIZE 325M REUSE
    EXTENT MANAGEMENT LOCAL
    SYSAUX DATAFILE 'C:\oraclexe\app\oracle\oradata\ORCL\sysaux01.dbf' SIZE 325M REUSE
    DEFAULT TEMPORARY TABLESPACE tempts1
    TEMPFILE 'C:\oraclexe\app\oracle\oradata\ORCL\temp01.dbf'
    SIZE 20M REUSE
    UNDO TABLESPACE UNDOTBS1
    DATAFILE 'C:\oraclexe\app\oracle\oradata\ORCL\undotbs01.dbf'
    SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
    Если все гуд, увидим Database created

    Создаем тестовую таблицу и наполняем ее данными:
    СREATE TABLE test1(id int, col1 int);
    INSERT INTO test1 VALUES(1, 1);
    INSERT INTO test1 VALUES(2, 2);
    INSERT INTO test1 VALUES(3, 3);
    SELECT * FROM test1;


    Заводим юзера для БД
    CREATE USER USER1 IDENTIFIED BY 123123;
    Где USER1 – логин, 123123 – пароль

    Добавляем права юзеру:
    Делаем админом - GRANT dba TO USER1 WITH ADMIN OPTION;
    Права на создание таблиц - GRANT create session, create table TO USER1;
    Выделяем ресурсы для юзера - ALTER USER USER1 QUOTA 50m ON system;

    На стороне клиента указываем TNS:
    ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) ) )
    Где - адрес сервера

    Set ORACLE_HOME=C:\oraclexe\app\oracle\product\11.2.0\server
    Set SYSTEM_PASS=123123


    Запустить catalog.sql, catproc.sql
    Пример:
    conn SYS as SYSDBA
    123123
    @C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\cataproc.sql


    Подключиться через клиент и радоваться жизни

    ОтветитьУдалить