30 ноября 2012 г.

oracle: JDBC Thin Client in v$session

Заметки о том как отображаются сессии от JDBC Thin Client в v$session

Если попытаться посмотреть информацию о JDBC Thin Client в v$session, то всегда v$session.process = 1234

SELECT s.program,s.process, s.sid, s.seq#, s.event
  FROM v$session s


JDBC Thin Client1234489429653db file sequential read


Почему так происходит, почему PID клиентского процесса в OS всегда 1234 в случае с JDBC Thin Client ?

Ответ:


How to Set V$SESSION Properties Using the JDBC Thin Driver [ID 147413.1]

Note: The JDBC driver cannot correctly retrieve the values of some V$SESSION
properties on its own. Specifically, the driver exhibits the following behavior:

 - When querying the TERMINAL field of the V$SESSION table using the JDBC
Thin driver, the value returned is "unknown".

- When querying the PROCESS field of the V$SESSION table using the JDBC
Thin driver, the value returned is "1234".

- The driver returns the process ID as "1234" by default, since obtaining
a process ID is not possible using the JDBC Thin driver.




Java developer can provide value in code (if code change is an option) using Java Properties when creating JDBC connection:
         prop.put("v$session.process", clientProcess);
         prop.put("v$session.program", programName);

9 октября 2012 г.

oracle 11g: ADRCI утилита для анализа диагностики

В Oracle 11 произошли некоторые изменения в alert.log, теперь он представляет собой xml файл, но можно и найти его в текстовом виде ( искать в папке ../traces).

Появилась текстовая утилита ADRCI, которая позволяет работать с диагностическими данными, сообщениями и ошибками в alert.log.
Почитать об ADRCI можно тут и тут (или погуглить).

Для примера пару комманд:
$ adrci

adrci> SHOW INCIDENT -last 10

ADR Home = /oradump/diag/rdbms/cust1/cust1:
*************************************************************************
INCIDENT_ID          PROBLEM_KEY                                                 CREATE_TIME
-------------------- ----------------------------------------------------------- ----------------------------------------
383543               ORA 600 [25027]                                             2012-09-18 01:02:56.410000 +03:00
383542               ORA 600 [kghstack_underflow_internal_1]                     2012-09-18 01:02:44.434000 +03:00



adrci> SHOW INCIDENT -MODE DETAIL -P "INCIDENT_ID=383543"

Утилита имеет справку:
$ adrci

adrci> HELP


5 августа 2012 г.

20 июня 2012 г.

windows: uptime

Как узнать uptime в windows

Start -> Run -> cmd
И в консоли набрать:
net statistics server
или немного сокращённо:
net stats srv

Uptime идёт после слов "Статистика после..." (Statistics since...)

14 июня 2012 г.

unix: lsof

Использование утилиты lsof в unix:


1. Просмотр всех соединений IPv4
$ lsof -i 4 -a

2. Просмотр всех соединений IPv4, открытых процессом с PID = 1234
$ lsof -i 4 -a -p 1234

3 .Список открытых файлов на устройстве /dev/sda1
$ lsof /dev/sda1

4. Кто не отдаёт cdrom
$ lsof /dev/cdrom

5. Список всех файлов открытых юзером
$ lsof -u guppi

6. Какой процесс использует данный файл?
$ lsof /etc/passwd

7. Какие ресурсы использует процесс?
$ lsof -c mc
или
$lsof -p pid




12 июня 2012 г.

aix: настройка iSCSI инициатора в AIX 5.3

Wiki: http://en.wikipedia.org/wiki/ISCSI

В 2-х словах:
- позволяет подключать диски к серверу по Ethernet,
- target - сервер, который предоставляет дисковое пространство,
- initiator - клиент, который использует дисковое пространство.

1. Настройка инициатора
Настроить можно с помощью smit

1) Выберите Devices.
2)  Выберите  iSCSI.
3)  Выберите  iSCSI Protocol Device.
4)  Выберите  Change / Show Characteristics of an iSCSI Protocol Device.
Выберите устройство, которое ассоциировано с iSCSI инициатором, например, iscsi0.
Задайте Initiator Name (IQN), это имя  задается по определённому формату (см. Wiki).
Придумаем следующее имя: iqn.2012-06.com.test
Это имя используется при подсоединению к  iSCSI target.

Сохраняем настройки.

Сообщаем администратору target сервера наш iqn (iqn.2012-06.com.test).

В ответ он должен, сконфигурировать CHAP авторизацию для нашего инициатора, и прислать ip- адрес, iqn - имя таргета и пароль для CHAP авторизации.
Например:
ip - 192.168.0.1,
iqn - iqn.2000-01.com.hp:storage.p1000g4.5001caf1eb
password - iscsi_password

После этого редактируем на инициаторе файл /etc/iscsi/targets, а именно добавляем наш таргет для CHAP авторизации, примеры есть в самом файле /etc/iscsi/targets:
192.168.0.1    3260   iqn.2000-01.com.hp:storage.p1000g4.5001caf1eb    "iscsi_password"


Сохраняем файл и переходим к п.2

2. Подключение диска

Если мы всё сделали правильно в п.1 и настроена маршрутизация между клиентом и сервером, то:
1) Вводим команду:
$ cfgmgr -v -l iscsi0

При вводе этой команды драйвер попытается соединиться с целевыми устройствами, перечисленными в файле /etc/iscsi/targets, и определить новый жесткий диск (hdisk) для всех LUN на найденных целевых устройствах.

2) Проверяем, что новый жесткий диск определился:
$ lsdev -Ccdisk |grep iSCSI
hdisk6      Available              Other iSCSI Disk Drive

$ lspv hdisk6

$ lsattr -El hdisk6

3) Cделаем volume group, где iscsivg - имя группы, которое придумываем сами:
$ mkvg -y iscsivg hdisk6

4) Информация о группе, смотрим на Total PPs, чтобы знать какого размера делать логический volume(-мы):
$ lsvg iscsivg

Посмотреть какие логические volume(-мы) уже есть
$ lsvg -l iscsivg

5) Создаем logical volume, где
iscsi_vol01 - имя нового logical volume,
jfs2 - тип файловой системы,
3715 - размер  logical volume  (Total PPs из предыдущей команды п.4) 

$ mklv -t jfs2 -y iscsi_vol01 iscsivg 3715

6)  Включаем Auto Varyon = No, делаем это потому что функция varyonvg после рестарта выполняется раньше, чем инициализируется tcp/ip ( сам не проверял порядок )

$ chvg -a n iscsivg

7) Создаем файловую систему на volume, где
-d iscsi_vol01 - на какой волуме,
-m /mnt/iscsifs - точка монтирования
-A no - не монтировать файловую систему после рестарта,
-a logname=INLINE  - jfs2 лог на том же волуме что и сама файловая jfs2:

$ crfs -v jfs2 -d iscsi_vol01 -m /mnt/iscsifs -A no -u iscsi -a logname=INLINE

8) Монтируем


$ mount /mnt/iscsifs


3. Монтирование после рестарта


1) Проверяем
$ lspv

2) Включаем группу
$ varyonvg iscsivg

3) Монтируем
$ mount /mnt/iscsifs


1 июня 2012 г.

oracle: show list of dbms packages

Посмотреть список dbms пакетов:
SELECT DISTINCT name,TYPE
FROM dba_source
WHERE name LIKE 'DBMS_%'
ORDER BY name;

bash tips&tricks

1. Повторить команду, выполненную ранее (!!).

$ date
Fri Jun  1 09:33:49 EEST 2012
$ !!
date
Fri Jun  1 09:33:51 EEST 2012


13 апреля 2012 г.

aix: команда errpt, отчёт об ошибках


Команда errpt ( см. man errpt)

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

# посмотреть детальные ошибки за указанный период времени( формат даты mmddhhmmyy)
# -s start_date, -e end_date
$ errpt -a  -s 0604090601  -e 0605090901 | more  
$ errpt -aD -s 0412010012 -e 0412023012 > /tmp/error.log

# посмотреть все ошибки определённого Resource Name, например SYSPROC или SYSVMM
$ errpt -a  -N SYSPROC |more
$ errpt -a  -N SYSVMM  > /tmp/err.log

# посмотреть ошибку по её идентификатору
$ errpt -j 5DFED6F1

# посмотреть менее детальный (чем errpt -a) список ошибок. AIX5 ONLY !!!!
$ errpt -A

# исключить дублирующиеся ошибки. AIX5 ONLY !!!!
$ errpt -D | more
$ errpt -aD | more  

aix: кто логинился в систему? команда last, файл wtmp


1. last - утилита, показывает, кто логинился к системе (см. man last)

В AIX эти данные хранятся в бинарном файле /var/adm/wtmp

2. Очистка содержимого /var/adm/wtmp

Иногда /var/adm/wtmp надо чистить:
$ /usr/sbin/acct/nulladm /var/adm/wtmp



aix: sar


Команда sar собирает статистическую информацию о работе системы.

Для того чтобы запустить команду, которая собирает статистическую информацию о работе системы и сразу же выводит ее на экран, введите:

$ sar -u 2 5

17:58:15    %usr    %sys    %wio   %idle
17:58:17      43       9       1      46
17:58:19      35      17       3      45
17:58:21      36      22      20      23
17:58:23      21      17       0      63
17:58:25      85      12       3       0

Average       44      15       5      35

где 2 - интервал опроса в секундах, 5 - кол-во опросов

В папке /var/adm/sa/ хранятся логи в бинарном виде за 31 день.
Чтобы посмотреть за 22-е число месяца лог нужно:

$ sar -f /var/adm/sa/sa22 -s 14:20 -e 15:00
, где -f указывает путь к логу (подробнее см. man sar)

6 апреля 2012 г.

oracle: лицензирование


Источник: http://dba.ucoz.ru/index/0-53

Распространение программных продуктов Oracle (далее "Программы") осуществляется путем предоставления лицензий на их использование.
Продажа лицензий в России и странах СНГ производится только уполномоченными партнерами компании Oracle.

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

Стоимость лицензий и технической поддержки рассчитывается на основании всемирного Прейскуранта Oracle ( Oracle Global Price List). Лицензируемые Программы предоставляются по каналам электронной связи или на носителях CD-ROM. Лицензирование Программ означает приобретение прав на их использование, а не покупку самих программных продуктов.

Основные варианты лицензирования: 
  1. Named User Plus ("Именованный пользователь"). "Named User Plus" - лицо, уполномоченное использовать программы, установленные на одном или нескольких серверах, не зависимо от того, использует ли оно программу в данный момент времени или нет. Автоматическое устройство (не требующее участия человека) при возможности доступа к программам считается как Named User Plus в дополнение ко всем лицам, уполномоченным использовать программы. При использовании мультиплексирующих аппаратных или программных средств (например, монитора транзакций или веб-сервера) это число должно быть определено на входе мультиплексора. Число Named User Plus для ряда программ должно быть не менее установленного правилами лицензирования (см. раздел "Минимальное число пользователей").

5 апреля 2012 г.

oracle: импорт с помощью imp

Импорт в другое табличное пространство
Необходимо импортировать таблицу в другую базу данных в другую схему в другое табличное пространство. Так же можно разнести таблицу и индексы по разным табличным пространствам.

-- экспорт таблицы
exp user@sid FILE=exp_table.dmp TABLES=\(SCHEMA.TABLE_NAME\) STATISTICS=NONE

-- по желанию можно добавить ещё каких нибудь параметров экспорта, например:
exp user@sid FILE=exp_table.dmp TABLES=\(SCHEMA1.TABLE_NAME\) STATISTICS=NONE GRANTS=N INDEXES=N

Переливаем файл exp_table.dmp в то место, откуда будем экспортировать(на другой сервер, например).

Импорт в другую базу в другую схему в другое табличное пространство.
Общий алгоритм такой:
1. Создаем таблицу в нужной нам схеме, с нужным параметром TABLESPACE

Если есть возможность посмотреть sql-код создания исходной таблицы CREATE TABLE, то можно скопировать этот код в редактор или в какой нить Oracle Developer, отредактировать как нам надо с учётом новой схемы и табличного пространства и затем создать таблицу в нужном нам месте с нужными параметрами.

Можно сгенерировать sql-код  CREATE TABLE из файла экспорта exp_table.dmp .
Для этого используем утилиту импорта imp и опцию INDEXFILE.
imp user@sid2 file=exp_table.dmp TABLES=\(TABLE_NAME\) fromuser=SCHEMA1 touser=SCHEMA2 indexfile=create_table_name.sql

В итоге получим файл create_table_name.sql, имя которого задали в параметре INDEXFILE, при этом никакие данные не импортируются.
Редактируем файл как нам надо, и создаём таблицу.

2. Импортируем в созданную таблицу данные из файла exp_table.dmp .
imp user@sid2 file=exp_table.dmp TABLES=\(TABLE_NAME\) fromuser=SCHEMA1 touser=SCHEMA2 FEEDBACK=10000 IGNORE=Y

Не забываем при этом использовать параметр IGNORE=Y, он позволяет продолжить импорт в таблицу, которая уже существует, без него импорт выругается, что таблица уже существует.


29 марта 2012 г.

oracle: кто использует TEMPORARY Tablespaces

Нужно узнать какие сессии используют временное табличное пространство в данный момент:
SELECT DISTINCT s.username, s.sid, s.serial#, s.osuser, u.TABLESPACE, u.contents, u.segtype, u.extents, u.blocks
FROM v$session s, v$sort_usage u
WHERE s.saddr=u.session_addr
ORDER BY s.username, s.osuser;


21 марта 2012 г.

online source code formatter

Онлайн форматирование исходного кода для вставки в html http://quickhighlighter.com

oracle: какому объекту принадлежит блок


Есть file# (номер файла) и block# (номер блока).
Нужно узнать к какому объекту принадлежит этот блок.

SELECT owner,
       segment_name,
       segment_type
FROM   dba_extents
WHERE  file_id = FILE#
       AND block# BETWEEN block_id AND block_id + blocks - 1
       AND ROWNUM = 1;  

Искать может долго, несколько минут, поэтому добавляем условие "rownum=1",
чтобы если нашло строку не искало дальше, так будет быстрее.


15 марта 2012 г.

oracle: манипуляции с PERFSTAT

oracle: statspack

Перенести схему PERFSTAT в другое табличное пространство. 
Освободить место в существующем  табличном пространстве.
Експорт/импорт схемы PERFSTAT.

-- создать tablespace куда хотим перенести
CREATE TABLESPACE perfstat_tbs datafile '/u01/ORADATA/PERFSTAT/perfstat_01.dbf'
SIZE 5000m autoextend ON;


-- останавливаем job сбора статистики (выполняется от владельца джоба)
-- обязательно нужен commit
SELECT *
FROM   user_jobs;

EXEC dbms_job.broken(jobno, TRUE);
COMMIT;


-- Сохраним на всякий случай сам джоб из какого нить девелопера
DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => X
   ,what      => 'statspack.snap;'
   ,next_date => TO_DATE('01.01.4000 00:00:00','dd/mm/yyyy hh24:mi:ss')
   ,INTERVAL  => 'trunc(SYSDATE+1/24,'HH')'
   ,no_parse  => FALSE
   ,instance  => 1
  );
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || TO_CHAR(x));
COMMIT;
END;
/


-- экспорт схемы
cd /backup_vol/oracle_backup
export NLS_LANG=AMERICAN_AMERICA.CL8ISO8859P5
exp perfstat@orcl FILE=perfstat_15_03_2012.dmp LOG=perfstat_15_03_2012.LOG owner=PERFSTAT

-- импорт схемы
Сохраняем скрипт создания юзера PERFSTAT со всеми грантами и прочим из какого нить девелопера в файл скажем perfstata_schema.sql

Будет что вроде приведённого ниже куска, если переносим в другой tablespace, то при импорте меняем DEFAULT TABLESPACE PERFSTAT_TBS в оператре CREATE USER PERFSTAT на тот tablespace, в который хотим его перенести, ну и не забыть создать сам tablespace.

CREATE USER PERFSTAT
  IDENTIFIED BY VALUES 'xxxxxxxxxxxxxx'
  DEFAULT TABLESPACE PERFSTAT_TBS
  TEMPORARY TABLESPACE TEMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;
....

-- удаляем полностью PERFSTAT, чтобы удалить все данные в схеме
DROP USER PERFSTAT CASCADE;

-- создаём схему PERFSTAT, которую предварительно сохранили в perfstata_schema.sql

-- импорт
export NLS_LANG=AMERICAN_AMERICA.CL8ISO8859P5
imp perfstat@orcl file=perfstat_12_05_2011.dmp log=imp_perfstat_12_05_2011.log fromuser=PERFSTAT touser=PERFSTAT

-- проверяем индексы
SELECT index_name,status FROM dba_indexes WHERE owner='PERFSTAT';

-- проверяем джоб
SELECT * FROM user_jobs;

24 февраля 2012 г.

windows: отключить ядро cpu

Бывает нужно по каким либо причинам отключить одно или несколько ядер в многоядерном CPU.

В Windows XP это делается так(подходит и для Windows Vista, 7):

На вкладке BOOT.INI жмём "Дополнительно..."

Ставим галочку напротив /NUMPROC и устанавливаем то количество ядер, которое хотим: 

И "откинувшись на спинку кресла" перезагружаемся...


unix: посмотреть зависимости библиотеки (ldd)


Команда ldd

Есть какая то shared library (например libCSGcsvPP.so), нужно посмотреть её зависимости:
$ ldd libCSGcsvPP.so
libCSGcsvPP.so needs:
         /dm/appl/BDDM/lib/libMECS.so
         /usr/lib/libthread.a(shr.o)
         /usr/lib/libC.a(shr.o)
         /usr/lib/libC.a(ansi_32.o)
         /usr/lib/libc.a(shr.o)
         /usr/lib/lib++.so
         /u01/app/oracle/product/9.2.0.5.0/lib/libclntsh.a(shr.o)
         /usr/lib/libpthreads.a(shr_xpg5.o)
         /usr/lib/librtl.a(shr.o)
         /usr/lib/libc_r.a(shr.o)
         /usr/lib/libC.a(ansicore_32.o)
         /usr/lib/libC.a(shrcore.o)
         /usr/lib/libC.a(shr2.o)
         /usr/lib/libC.a(shr3.o)
         /unix
         /usr/lib/libcrypt.a(shr.o)
         /usr/lib/libdl.a(shr.o)
         /usr/lib/libodm.a(shr.o)
         /usr/lib/libc.a(aio.o)
         /usr/lib/libpthreads.a(shr_comm.o)

16 января 2012 г.

oracle: мониторинг объектов схемы

1. Посмотреть кто к каким объектам схемы обращается.


-- кто к каким объектам схемы обращается
SELECT a.object,
       a.type,
       a.sid,
       b.username,
       b.osuser,
       b.program
FROM   v$access a,
       v$session b
WHERE  a.sid   = b.sid
AND    a.owner = UPPER('arbor')
ORDER BY a.object;


Используем представление V$ACCESS.
V$ACCESS содержит информацию о блокировках, которые в данный момент наложены на объекты library cache. Это делается для того чтобы они не ушли из library cache пока они требуются для выполнения sql запроса.

2. Есть программа, нужно узнать к каким объектам она обращается.

-- основываясь на п.1, можно посмотреть информацию о том: какая конкретная программа
-- какие объекты использует
SELECT a.object,
       a.TYPE,
       a.sid,
       b.username,
       b.osuser,
       b.program
  FROM v$access a, v$session b
 WHERE     a.sid = b.sid
       AND a.owner = UPPER ('arbor')
       AND b.program LIKE 'ck_KenanPaymentCreate%'
ORDER BY a.object;

oracle: мониторинг блокировок

oracle: блокировки (locks), защёлки (latches), enqueues
Мониторинг блокировок (http://my-oracle.it-blogs.com.ua/)

Запросы для мониторинга блокировок в базе.

-- смотрим блокировки, установленные текущими транзакциями в базе,
-- которые блокируют запросы на блокировку от других сессий (where block=1)
SELECT l.SID,s.username,s.program,l.TYPE,l.LMODE,ROUND(CTIME/60) "Time(Min)",
(SELECT object_name FROM dba_objects WHERE object_id=lo.object_id) obj,
DECODE(lo.locked_mode,
   0, 'None',           /* Mon Lock equivalent */
   1, 'Null',           /* N */
   2, 'Row-S (SS)',     /* L */
   3, 'Row-X (SX)',     /* R */
   4, 'Share',          /* S */
   5, 'S/Row-X (SSX)',  /* C */
   6, 'Exclusive',      /* X */
   TO_CHAR(lo.locked_mode)) mode_held
FROM V$LOCK l, v$locked_object lo, v$session s
WHERE block=1
AND l.sid=lo.session_id AND l.sid=s.sid;

-- смотрим активные сессии, которые чего то ждут, и чего они собственно ждут
SELECT s.program,s.username,s.osuser,s.machine,sw.* FROM v$session_wait sw,v$session s
WHERE sw.sid=s.sid
AND sw.event<>'rdbms ipc message' AND sw.event NOT LIKE 'SQL*Net%'
ORDER BY sw.event ASC;

-- смотрим блокировки, установленные текущими транзакциями в базе,
-- кто и на что и какой тип блокировки установил
SELECT  oracle_username, session_id,s.program,object_name,DECODE(a.locked_mode,
   0, 'None',           /* Mon Lock equivalent */
   1, 'Null',           /* N */
   2, 'Row-S (SS)',     /* L */
   3, 'Row-X (SX)',     /* R */
   4, 'Share',          /* S */
   5, 'S/Row-X (SSX)',  /* C */
   6, 'Exclusive',      /* X */
   TO_CHAR(a.locked_mode)) mode_held
FROM V$LOCKED_OBJECT a,DBA_OBJECTS b,v$session s WHERE a.object_id = b.object_id
AND a.session_id=s.sid;



11 января 2012 г.