К основному контенту

Сообщения

Сообщения за сентябрь, 2015

Решение ошибки ORA-31634 при работе с датапампом.

При частом использовании датапампа возможно возникновение ошибок следующего вида: ORA-31634: job already exists ORA-31664: unable to construct unique job name when defaulted Причина в следующем: Системные таблицы относящиеся к старым заданиям датапампа не были удалены. "This error normally occurs when you do not specify a unique JOB_NAME for the DataPump job  and for some reason that JOB_NAME already exists in the database, or else if you are running many jobs at the same time (more than 99 jobs) and DataPump cannot create a new job." (MOS) Для решения проблемы: 1. Найти неработающие задания ДП. SELECT owner_name, job_name, operation, job_mode,     state, attached_sessions     FROM dba_datapump_jobs     where owner_name='SCHEMA' and state='NOT RUNNING' ORDER BY 1,2;  2. Найти соответствующие этим заданиям системные таблицы. SELECT o.status, o.object_id, o.object_type,            o.owner||'.'||object_name &quo

Использование Oracle Total Recall

1. Создание табличного пространства под архив:   CREATE TABLESPACE FLASH_ARCH_TS datafile         SIZE 10M AUTOEXTEND ON NEXT 100M; 2. Создание архива с периодом хранения год: CREATE FLASHBACK ARCHIVE FLASH_ARCH TABLESPACE FLASH_ARCH_TS RETENTION 1 YEAR; 3. Выдача прав для использования архива:    GRANT FLASHBACK ARCHIVE ON FLASH_ARCH TO DBAX;    ALTER FLASHBACK ARCHIVE FLASH_ARCH SET DEFAULT; 4. Включение архива для новой таблицы: CREATE TABLE  FB_TEST  (   id          NUMBER,   text  VARCHAR2(50)    ) FLASHBACK ARCHIVE [FLASH ARCH];   или    ALTER TABLE FB_TEST FLASHBACK ARCHIVE [ FLASH_ARCH] ;  для уже существующей таблицы. 5. Тест. Пробуем вставить данные в таблицу, затем убеждается, что 5 секунда назад их не было. insert into  FB_TEST    values(1,'test'); commit; select * from  FB_TEST   AS OF  TIMESTAMP(SYSTIMESTAMP - INTERVAL '5' second); no rows selected 6. Изменение структуры alter table  FB_TEST    add (text2 varchar2(20))

Импорт схемы БД с удаленного сервера.

Задача: Провести реимпорт данных с удаленного сервера. Задача осложняется слабым каналом, а также версией Oracle - Standart Edition One, которая не поддерживает datapump опции compression = all. Имя схемы передается в качестве параметра (%1) для пакетного файла. rem Считаем, что имя хоста совпадает с именем базы в TNS set rem_hst=REMOTE rem rem_dir - это data_pump_dir на удаленной машине. set rem_dir=oracle\ora11\RDBMS\log rem Login и пароль для net use'a set rem_usr=localhost\dbax set rem_psw=p@S$w0Rd rem Экспорт дампа и архивирование его через wmic. expdp  dbax/ p@S$w0Rd @%rem_hst% dumpfile=%1.dmp schemas=%1 logfile=%1.log reuse_dumpfiles=yes wmic /node:"%rem_hst%" /user:%rem_usr% /password:"%rem_psw%" process call create "zip E:\%rem_dir%\%1.zip E:\%rem_dir%\%1.dmp" rem Копирование с возобновлением в случае падения сети. net use \\%rem_hst%\e$ /user:%rem_usr% %rem_psw% :copy copy \\%rem_hst%\e$\%rem_dir%\%1.zip c:\app\oracle\da

Настройка DataGuard с помощью dgmgrl

Делал все по  этой   статье, с небольшими своими исправлениями. Ниже могут быть ошибки, неплохо бы перепроверить еще раз. Еще хорошая статья . Не проверял, но у него всегда все по делу. 1. Настройка Listner на обоих серверах. Нужна статическая регистрация. listener.ora LISTENER =   (DESCRIPTION_LIST =     (DESCRIPTION =       (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))     )   ) SID_LIST_LISTENER =   (SID_LIST =     (SID_DESC =       (GLOBAL_DBNAME = prd_DGMGRL) -- в 12c я обошелся без " _DGMGRL"       (ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)       (SID_NAME = prd)     )   ) tnsnames.ora prd=   (DESCRIPTION =     (ADDRESS_LIST =       (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))     )     (CONNECT_DATA =       (SID = prd)     )   ) std=   (DESCRIPTION =     (ADDRESS_LIST =       (ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521))     )     (CONNECT_DATA =

Перемещение данных в другое табличное пространство.

1. Перемещение таблиц. SELECT      'ALTER TABLE '          || owner          || '.'          || segment_name          || ' MOVE TABLESPACE USERS;'   FROM   dba_segments  WHERE   tablespace_name = 'USERS2' AND segment_type = 'TABLE' 2. Перемещение LOB. SELECT      'ALTER TABLE '          || A.owner          || '.'          || TABLE_NAME          || ' MOVE LOB('          || COLUMN_NAME          || ') STORE AS (TABLESPACE USERS);'   FROM   dba_segments A, DBA_LOBS B  WHERE       a.tablespace_name = 'USERS2'          AND segment_type = 'LOBSEGMENT'          AND A.SEGMENT_NAME = B.SEGMENT_NAME 3. Перемещение индексов. SELECT      'ALTER INDEX '          || owner          || '.'          || segment_name          || ' REBUILD TABLESPACE USERS;'   FROM   dba_segments  WHERE   tablespace_name = 'USERS2' AND segment_type = 'INDEX' 4. Индек

Автозапуск Oracle в Linux

1. После создания экземпляра правим /etc/oratab, а именно устанавливаем флажок рестарта в 'Y'. vim /etc/oratab AXDB:/app/oracle/product/12.1.0/dbhome_1:Y 2. Теперь из под root'a создаем файл  /etc/init.d/dbora вот с таким содержимым. #!/bin/sh # chkconfig: 345 99 10 # description: Oracle auto start-stop script. # # Set ORA_HOME to be equivalent to the $ORACLE_HOME # from which you wish to execute dbstart and dbshut; # # Set ORA_OWNER to the user id of the owner of the # Oracle database in ORA_HOME. ORA_HOME= /app/oracle/product/12.1.0/dbhome_1 ORA_OWNER=oracle if [ ! -f $ORA_HOME/bin/dbstart ] then     echo "Oracle startup: cannot start"     exit fi case "$1" in     'start')         # Start the Oracle databases:         # The following command assumes that the oracle login         # will not prompt the user for any values         # Remove "&" if you don't want startup as a background process.

Администратор всея CDB

Раньше для создания административного пользователя достаточно было выдать любому права dba. Но в 12c, с оздав пользователя: grant dba to c##dbax container=all; Подключившись с cdb$root и запросив gv$session получим отображение только сессий работающих в root'овом контейнере. Пользователь может видеть сессии работающие в других контейнерах только перейдя в соответствующий контейнер. alter session set container=axpdb1; В то же время, при подключении "sys as sysdba" запрос к gv$session возвращает сессии по всей базе. Хочется администрировать всю инфраструктуру, но не подключаться без нужды под sys'ом. Решение следующее . connect system@root  -- под sys ’ом не получилось. ALTER USER c##dbax SET CONTAINER_DATA = (CDB$ROOT,AXPDB1) FOR GV$SESSION CONTAINER=CURRENT; Тут мы разрешаем пользователю c##dbax во время нахождения в контейнере root просматривать информацию из gv$session касающуюся контейнеров CDB$ROOT и AXPDB1.