5 октября 2013 г.

Oracle Net

Недавно узнал что Oracle листенер на одиночном сервере базы данных (не RAC) по умолчанию слушает все сетевые интерфейсы. Для этого достаточно в конфигурационном файле listener.ora указать имя сервера, например

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = setebos)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

Имя хоста:

oracle> hostname
setebos

oracle> cat /etc/hosts
10.127.120.129  setebos.dit.ru setebos

Проверяем:
oracle> ifconfig
bond0.1742          inet addr:10.127.120.129
bond0.2630          inet addr:172.16.8.1  Bcast:172.16.8.63  Mask:255.255.255.192
usb0               inet addr:169.254.95.120  Bcast:169.254.95.255  Mask:255.255.255.0

В файле /etc/hosts указан адрес 10.127.120.129, но слушаются все IP адреса:

setebos:/oracle> nmap 10.127.120.129
1521/tcp open  oracle

setebos:/oracle> nmap 172.16.8.1
1521/tcp open  oracle

setebos:/oracle> nmap 169.254.95.120
1521/tcp open  oracle

На сервере RAC слушается только указанный сетевой интерфейс.

12 сентября 2013 г.

Oracle Golden Gate на Oracle Rac

При настройке настройке процесса Extract на кластерной базе столкнулся с ошибками:

1)
The number of Oracle redo threads (4) is not the same as the number of
checkpoint threads (1). EXTRACT groups on RAC systems should be created
with the THREADS parameter

Нужно добавить опцию threads
- Delete the extract
delete extract testext

- Recreate the extract
add extract testext, tranlog, threads 2, begin now
add <exttrail/rmttrail> <path>, extract testext

- Start the extract
start extract testext

2) На сервере с 2-мя узлами при старте выдается ошибка:
WARNING OGG-01423  No valid default archive log destination directory found for thread 4.
WARNING OGG-01423  No valid default archive log destination directory found for thread 3.

Нужно удалить лишние потоки в active redo log

alter database disable thread 3;
alter database disable thread 4;

ALTER DATABASE DROP LOGFILE GROUP 7;
ALTER DATABASE DROP LOGFILE GROUP 8;
ALTER DATABASE DROP LOGFILE GROUP 5;
ALTER DATABASE DROP LOGFILE GROUP 6;

3) Создание пользователя в ASM инстансе:
CREATE USER asm_user IDENTIFIED by XXX;
GRANT SYSASM TO asm_user;  
GRANT sysdba TO asm_user;

Проверка:
sqlplus asm_user@ORCL_ASM as sysasm

Добавляем в файл параметров
TranLogOptions ASMUser asm_user@ORCL_ASM, asmpassword XXX

13 августа 2013 г.

Переподключение дисков в ASM через multipath

Проблема: диски в ASM примонтированы напрямую, не используя multipath.

Нужно отмонтировать диски а ASM с одного пути, например /dev/sdc, и примонтировать к другому, например к /dev/dm-1

Для примера:

1)
ls -al /dev/oracleasm/disks/

brw-rw---- 1 oracle oinstall 8, 16 Jul  2 15:12 DISK1
brw-rw---- 1 oracle oinstall 8, 32 Jul  2 15:12 DISK2

Видно что диски примонтированы напрямую, не через  multipath (цифра 8)

2)
Должно быть:
ls -al /dev/oracleasm/disks/

brw-rw---- 1 oracle oinstall 253, 8 May 20 14:40 DISK1
brw-rw---- 1 oracle oinstall 253, 9 May 20 14:40 DISK2

Вместо 8 стоит 253, значит  диски примонтированы правильно (через multipath )

3)
Для определения, к какому multipath относится DISK1:
multipath -ll | less

далее в этом списке ищем устройство с этими major minor номерами.
То есть 8:16. Для поиска можно просто в строке приглашения less набрать /8:16
Имеем например: 0:0:0:5  sdb  8:16   [active][ready], а принадлежит он mpath1.
Путь к нему будет: /dev/mapper/mpath1

4)
Определяем пути, к которым подключены диски:
/etc/init.d/oracleasm listdisks
DISK1
DISK2
DISK3
DISK4

ls -al /dev/oracleasm/disks/
total 0
drwxr-xr-x 1 root   root         0 Jun 25 18:47 .
drwxr-xr-x 4 root   root         0 Jun 25 18:47 ..
brw-rw---- 1 oracle oinstall 8, 48 Jul  3 16:58 DISK1
brw-rw---- 1 oracle oinstall 8, 64 Jul  3 16:58 DISK2
brw-rw---- 1 oracle oinstall 8, 80 Jul  3 16:58 DISK3
brw-rw---- 1 oracle oinstall 8, 96 Jul  3 16:58 DISK4

/etc/init.d/oracleasm querydisk -v -d DISK1
Disk "DISK1" is a valid ASM disk on device /dev/sdd[8,48]

Так смотрим по всем дискам, в итоге составляем таблицу соответствий:
------------------------------------------------------------------
| DISK1    sdd  mpath6        dm-8
| DISK2    sde  mpath3        dm-3
| DISK3    sdf   mpath4        dm-4  
| DISK4    sdg  mpath5        dm-5
------------------------------------------------------------------

5) В ASM
SQL>  select g.name "Group", d.name "Disk", d.mode_status "Status" from v$asm_disk d, v$asm_diskgroup g where d.group_number = g.group_number;

Group                          Disk                           Status
------------------------------ ------------------------------ -------
DATA                           DATA_0002                      ONLINE
FLASH                          FLASH_0000                     ONLINE
DATA                           DATA_0001                      ONLINE
DATA                           DATA_0000                      ONLINE


SQL> show parameter asm_diskstring

asm_diskstring                       string      /dev/oracleasm/disks

SQL> select GROUP_NUMBER, DISK_NUMBER, MODE_STATUS, STATE, NAME, PATH from v$asm_disk;
           1           2 ONLINE  NORMAL   DATA_0002  /dev/oracleasm/disks/DISK4

           2           0 ONLINE  NORMAL   FLASH_0000 /dev/oracleasm/disks/DISK3

           1           1 ONLINE  NORMAL   DATA_0001   /dev/oracleasm/disks/DISK2

           1           0 ONLINE  NORMAL   DATA_0000  /dev/oracleasm/disks/DISK1


6)  Удаление:

ALTER DISKGROUP FLASH DROP DISK FLASH_0000;

7) Отмонтируем:
ASMCMD> umount FLASH

DROP DISKGROUP FLASH INCLUDING CONTENTS;

8) Удаляем:
/etc/init.d/oracleasm deletedisk DISK3
Deleting Oracle ASM disk "VOL1" [ OK ]

9) Если не удаляется, то чистим заголовок диска:
-- Сохраняем заголовок диска в файл
dd if=/dev/sdf of=file_sdf bs=1024 count=100
dd if=/dev/sdf of=file_sdf3 bs=1024 count=100

-- Обнуление диска для возможности его удалить
dd if=/dev/zero of=/dev/sdf bs=1024 count=100

-- Удаляем с /etc/init.d/oracleasm deletedisk, если и сейчас не получится, то перезагружаем хост
-- Восстанавливаем заголовок диска:
dd if=file_sdf of=/dev/sdf  bs=1024 count=100

10) Создаем
/etc/init.d/oracleasm createdisk DISK3 /dev/dm-4

11) Добавляем параметр EXCLUDE в /etc/sysconfig/oracleasm
ORACLEASM_SCANEXCLUDE="sd"

12)
/etc/init.d/oracleasm scandisks


23 апреля 2013 г.

Oracle Web Services Manager Gateway Is Slow


На московском узле портала gosuslugi.ru стал зависать сервер с Oracle Web Services Manager

Нашел подходящую статью с описанием:
Oracle Web Services Manager Gateway Is Slow And Causes Locks [ID 967020.1]


Для исправления нужно создать 2 индекса и очистить пул:

CREATE INDEX orawsm.IDX_MPSTORE_TEST_1 ON orawsm.MEASUREMENT_PERSISTED_STORE (STORETIME) LOGGING TABLESPACE USERS NOPARALLEL;
       
CREATE INDEX orawsm.IDX_pipeline_TEST_1 ON orawsm.PIPELINES (policy_id, pipeline_status,pipeline_major_ver, pipeline_minor_ver ) LOGGING TABLESPACE USERS NOPARALLEL;

alter system flush shared_pool;

5 февраля 2013 г.

Ошибка TNS-12555: TNS:permission denied



При старте листенера на одном из серверов получил ошибку:

Starting /opt/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /opt/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/asur-nsi-db-02/listener/alert/log.xml
Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
TNS-12555: TNS:permission denied
 TNS-12560: TNS:protocol adapter error
  TNS-00525: Insufficient privilege for operation
   Linux Error: 1: Operation not permitted

Listener failed to start. See the error message(s) above...

В интернете нашел, что  причина в каталоге /var/tmp/.oracle

Для проверки:

ls -la /var/tmp/.oracle
total 44
drwxrwxrwt 2 root   oracle 4096 Feb  5 15:44 .
drwxrwxrwt 3 root   root   4096 Mar 22  2012 ..
srwxrwxrwx 1 oracle oracle    0 Mar 22  2012 s#12914.1
srwxrwxrwx 1 oracle oracle    0 Mar 22  2012 s#12914.2
srwxrwxrwx 1 oracle oracle    0 Mar 22  2012 s#13198.1
srwxrwxrwx 1 daemon root      0 May 14  2012 s#16174.1
srwxrwxrwx 1 daemon root      0 May 14  2012 s#16174.2
srwxrwxrwx 1 daemon root      0 Apr  2  2012 s#18732.1
srwxrwxrwx 1 daemon root      0 Apr  2  2012 s#18732.2
srwxrwxrwx 1 daemon root      0 Mar 22  2012 s#4741.1
srwxrwxrwx 1 daemon root      0 Apr 11  2012 s#7507.2
srwxrwxrwx 1 daemon root      0 Oct  6 12:45 sEXTPROC1
srwxrwxrwx 1 oracle oracle    0 Mar 22  2012 sEXTPROC1521

Как видно, несколько файлов имеют владельцем другую группу.
Для исправления:
chown -R oracle:oracle /var/tmp/.oracle


1 февраля 2013 г.

Opening of wallet based credential store failed. Reason java.io.IOException

Скопировал сервер с Oracle Aplication Server 10 на другой хост. 

1) При старте получил ошибку: 
Opening of wallet based credential store failed. Reason java.io.IOException

Для исправления нужно сделать:
chmod -R 777 /tmp

2) Нужно исправить файл hosts


29 января 2013 г.

Удаление архивных логов


Настроил несколько standby серверов, после этого появилась проблема с удалением архивных логов Oracle.

По официальной документации делаем так:
- настроить архивирование логов с помощью rman
- настроить  RETENTION POLICY
- включить mandatory для передачи архивных логов
- затем удалять логи с помощью
backup archivelog all delete input;
- на standby сервере можно использовать что-то вроде
delete archivelog all completed before 'sysdate';
или
delete archivelog until time ‘SYSDATE-10';

Этот вариант мне не подошел, пришлось удалять все логи вручную с помощью скриптов:

#!/bin/bash

echo "start ..."

. /home/oracle/scripts/oraenv.sh

export NLS_DATE_FORMAT="DD-MON-RRRR HH24:MI:SS"
export TODAY=`date '+%Y%m%d'`
export TIME=`date '+%H%M%S'`

echo "step 2 ..."


cd /home/oracle/scripts

rm /home/oracle/scripts/1.tmp

sqlplus -s / as sysdba << EOF
set heading off
set pages 0 echo off feedback off
spool /home/oracle/scripts/1.tmp
select max(sequence#)-10 from v\$archived_log where dest_id=5 and thread#=1 and standby_dest='YES' and applied ='YES';
spool off;
exit;
EOF

echo "step 3 ..."

seq1=`cat /home/oracle/scripts/1.tmp | awk 'NR==1{print $1}'`

echo "step 4 ..."
echo "seq1 = $seq1"


echo $seq1
echo "delete noprompt archivelog until sequence $seq1 thread 1;"

rman msglog /home/oracle/scripts/PRIMARY_ARC_DEL.${TODAY}_${TIME}.log << EOF
connect target /
run{
delete noprompt archivelog until sequence $seq1 thread 1;
}
EOF

echo "done ..."


exit


22 января 2013 г.

Краткая инструкция по установке Standby сервера


ON PRIMARY

1) Прописать на каждом из 3-х узлов в /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora

DOCSTB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xxxxxxxxxx)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = docstb)
    )
  )

DOC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xxxxxxxxxxxxx)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = doc)
    )
  )

ON STANDBY

2) Прописать тоже самое, что и в пункте

3) Прописать статический листенер в /u01/app/oracle/product/11.2.0/grid/network/admin/listener.ora  , чтобы мы могли удаленно подсоединиться к базе в состоянии nomount

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME=docstb)
      (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = docstb)
    )
  )


ON PRIMARY

4) Скопировать файл паролей с одного из узлов на стендбай и переименовать его в orapwdocstb


ON STANDBY

5) Создаём audit trail директорию в $ORACLE_BASE/admin

cd /u01/app/oracle/admin
mkdir docstb
cd docstb
mkdir adump

6) Создаём файл параметров initdocstb.ora в директории /u01/app/oracle/product/11.2.0/dbhome_1/dbs/

db_name=docstb

7) Устанавливаем ORACLE_SID=docstb и запускаем базу в режиме nomount

startup nomount

ON PRIMARY

8) Выполняем команды

alter system set log_archive_config='DG_CONFIG=(doc,docstby,docstb)';
alter system set log_archive_dest_3='SERVICE=DOCSTB VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=docstb';
alter system set log_archive_dest_state_3=enable;


9) Создаем скрипт standby.sql

run {
     allocate channel doc type disk;
     allocate auxiliary channel docstb type disk;
     duplicate target database for standby
     from active database
spfile
     set cluster_database='FALSE'
     set user_dump_dest='/u01/app/oracle/diag/rdbms/docstb/trace'
     set core_dump_dest='/u01/app/oracle/diag/rdbms/docstb/cdump'
     set background_dump_dest='/u01/app/oracle/diag/rdbms/docstb/trace'
     set audit_file_dest='/u01/app/oracle/admin/docstb/adump'
     set db_create_file_dest='+STBY'
     set db_recovery_file_dest='+STBY'
     set db_recovery_file_dest_size='300G'
     set local_listener=''
     set remote_listener=''
     set service_names='docstb'
     set db_unique_name='docstb'
     set db_file_name_convert='+DATA','+STBY'
     set log_file_name_convert='+DATA','+STBY'
     set control_files='+STBY/docstb/controlfile/docstb.ctl'
     set log_archive_max_processes='5'
     set fal_client='docstb'
     set fal_server='doc'
     set standby_file_management='AUTO'
     set log_archive_config='DG_CONFIG=(doc,docstb)'
     set log_archive_dest_2='SERVICE=DOC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=doc';
     }

10) Запускаем скрипт на одном из узлов

rman target sys/xxxxxxx
connect auxiliary sys/xxxxxxxxxxx@docstb
@/u01/app/oracle/product/11.2.0/dbhome_1/dbs/standby.sql

ON STANDBY

11)
alter database recover managed standby database using current logfile disconnect from session;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
alter database open read only;
alter database recover managed standby database using current logfile disconnect from session;

alter system set dg_broker_start=TRUE;


ON PRIMARY

12)

dgmgrl> connect sys/******
dgmgrl> add database docstb as  connect identifier is docstb;
 dgmgrl> enable configuration;

15 января 2013 г.

Установка Crypto Pro JSP


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


C:\jcp\lib>install "D:\oracle\soasuite\asgw2\jdk\jre" СЕРИЙНЫЙ_НОМЕР "НАЗВАНИЕ_ОРГАНИЗАЦИИ"

14 января 2013 г.

Небольшая инструкция использования ASM без asmlib


В версии red hat 6.3 не поддерживается asmlib. 
Инструкция сделана на основе документа во вложении Configure RAW on ASM.docx

On first node

1) # fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or
OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected
by w(rite)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-522, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-522, default 522):
Using default value 522

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


2) # cat /proc/partitions  -- проверяем создание партиции
major minor  #blocks  name

   8        0  104857600 sda
   8        1     512000 sda1
   8        2   74984448 sda2
   8       16  524288000 sdb
   8       17  524281243 sdb1
253        0   35745792 dm-0
253        1   16777216 dm-1
253        2   22458368 dm-2

3) Open /etc/udev/rules.d/60-raw.rules and put these lines there for all disks

ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"


ACTION=="add", KERNEL=="raw*", OWNER=="oracle", GROUP=="oinstall",  MODE=="0660"


3) Run following commands to bound raw disks:
# /bin/raw /dev/raw/raw1 /dev/sdb1

4) Starting udev
# start_udev


ON second node

1) # /sbin/partprobe  --обновляет /proc/partitions

2) Run following commands to bound raw disks:
# /bin/raw /dev/raw/raw1 /dev/sdb1

3) Starting udev
# start_udev

Недостатки:
К сожалению, при такой конфигурации не работает часть функционала ASM, например ACFS:

ASMCMD> volcreate -G data -s 1G  volume_test
ORA-15032: not all alterations performed
ORA-15490: not all instances could add/drop the volume (DBD ERROR: OCIStmtExecute)


4 января 2013 г.

файлы конфигураций dgmgrl


В среде Oracle RAC по документации Oracle файлы конфигураций dgmgrl нужно создавать на shared диске. Но по умолчанию эти файлы лежат на локальных дисках.

У меня это влияет на то, что после перезагрузки одного узла RAC иногда он перестает отправлять данные на standby сервер, иногда теряет конфигурацию.

Лечится это так:
Asmcmd:
cp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/dr1dst.dat +DATA/dr1dst.dat
cp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/dr2dst.dat +DATA/dr2dst.dat

sqlplus:
ALTER SYSTEM SET DG_BROKER_START=FALSE;
ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='+DATA/ dr1dst.dat' SCOPE=BOTH sid='*';
ALTER SYSTEM SET DG_BROKER_CONFIG_FILE2='+DATA/ dr2dst.dat' SCOPE=BOTH sid='*';
ALTER SYSTEM SET DG_BROKER_START=TRUE;