Friday, April 24, 2009

ШПАРГАЛКА ПО SED

HANDY ONE-LINERS FOR SED (Unix stream editor) 23 марта, 2001
ШПАРГАЛКА ПО SED
собранные Эриком Пементом (Eric Pement) версия 5.1
Последняя версия доступна на:
www.student.northpark.edu/pemente/sed/sed1line.txt

РАЗРЫВЫ ФЙЛА:

# заменяем ПРОБЕЛ на двойной пробел
sed G

# ставим двойной пробел с уже имеющимися в файле пустыми строками. Выходной файл
# должен содержать не более одной пустой строки между строками текста
sed '/^$/d;G'

# Тройной пробел в файле
sed 'G;G'

# отменить двойные пробелы (предполагается, что пронумерованные строки всегда пустые)
sed 'n;d'

ЧИСЛА:

# ставим номер каждой строки файла (левое выравнивание). Использование табуляции (смотри
# особенности применения 't' в конце этого файла) в отличие от пробела сохранит отступ(ы).
sed = filename | sed 'N;s/n/t/'

# ставим номер каждой строки файла (число слева, выравненное по правому краю)
sed = filename | sed 'N; s/^/ /; s/ *(.{6,})n/1 /'

# ставим номер каждой строки файла,но только если строка не пустая
sed '/./=' filename | sed '/./N; s/n/ /'

# считаем количество строк (аналог "wc -l")
sed -n '$='

ПРЕОБРАЗОВАНИЯ И ЗАМЕНА ТЕКСТА:

# В СРЕДЕ UNIX: переводит DOS стандарт перевода строки (CR/LF) в формат Unix
sed 's/.$//' # полагем , что все строки оканчиваются CR/LF
sed 's/^M$//' # в bash/tcsh, нажимем Ctrl-V затем Ctrl-M
sed 's/x0D$//' # для gsed 3.02.80, но выше попроще

# В СРЕДЕ UNIX: преобразовываем символы новой строки Unix (LF) в DOS формат
sed "s/$/`echo -e \r`/" # командная строка в ksh
sed 's/$'"/`echo \r`/" # командная строка в bash
sed "s/$/`echo \r`/" # командная строка в zsh
sed 's/$/r/' # для gsed 3.02.80

# В СРЕДЕ ДОС: преобразуем символы перевода строк Unix (LF) в DOS формат
sed "s/$//" # способ 1
sed -n p # способ 2

# В СРЕДЕ ДОС: преобразуем символы перевода строки ДОС (CR/LF) формат Unix
# этого нельзя сделать DOS версией sed. Используем "tr"
tr -d r outfile # GNU tr версии 1.22 или выше

# удаляем отступы (пробелы,табуляции) с начала каждой строки
# выравниваем текст полностью по левому краю
sed 's/^[ t]*//' # смотри проблемы с 't' в конце файла

# удалить замыкающие пробелы, табуляции с конца каждой строки
sed 's/[ t]*$//' # смотри проблемы с 't' в конце файла

# удаляем отступы, пробелы, табуляции и с конца , и с начала строки
sed 's/^[ t]*//;s/[ t]*$//'

# вставляем 5 пробелов в начале каждой строки (отступ для строки)
sed 's/^/ /'

# выравниваем весь текст справа по ширине колонки 79 символов
sed -e :a -e 's/^.{1,78}$/ &/;ta' # 78 плюс 1 пробел

# центрируем весь текст посредине при ширине колонки 79 символов.В первом способе
# пробелы в начале строки нужны, а пробелы в конце строки дополняются до конца строки.
# Второй способ, пробелы в начале строки отбрасываются в центр строки, и нет
# завершающих пробелов до конца строки.
sed -e :a -e 's/^.{1,77}$/ & /;ta' # Способ 1
sed -e :a -e 's/^.{1,77}$/ &/;ta' -e 's/( *)1/1/' # Способ 2

# подстановка (найти и заменить) "foo" на "bar" в каждой строке
sed 's/foo/bar/' # заменяет только первое вхождение в строке
sed 's/foo/bar/4' # заменяет только 4 вхождение в строке
sed 's/foo/bar/g' # заменяет ВСЕ вхождения в строке
sed 's/(.*)foo(.*foo)/1bar2/' # заменяет друг за другом
sed 's/(.*)foo/1bar/' # заменяет только завершающее слово

# ЗАМЕНЯЕТ "foo" на "bar" ТОЛЬКО для строк ,содержащих "baz"
sed '/baz/s/foo/bar/g'

# подставляет "foo" на "bar" КРОМЕ строк, содержащих "baz"
sed '/baz/!s/foo/bar/g'

# меняет "scarlet" или "ruby" или "puce" на "red"
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # большинство sedов
gsed 's/scarlet|ruby|puce/red/g' # только GNU sed

# обратный порядок строк (эмулирует "tac")
# баг/фича в HHsed v1.5 - пустые строки удаляются
sed '1!G;h;$!d' # способ 1
sed -n '1!G;h;$p' # способ 2

# обратный порядок символов в строке (походит на "rev")
sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//'

# соединяет строки друг с дружкой (как "paste")
sed '$!N;s/n/ /'

# если строка оканчивается обратным слэшем, добавляем последующую строку к ней
sed -e :a -e '/\$/N; s/\n//; ta'

# если строка начинается с знака равно , добавляем ее к предыдущей строке
# и заменяем "=" на один пробел
sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D'

# добавляем запятые к числовым строкам, меняя "1234567" на "1,234,567"
gsed ':a;s/B[0-9]{3}>/,&/;ta' # GNU sed
sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta' # остальные sed

# добавляем запятые к числам с десятичной точкой и знаком минуса (GNU sed)
gsed ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/12,3/g;ta'

# добавляем пустую строку каждые пять 5 строк (после строк 5, 10, 15, 20, итд.)
gsed '0~5G' # только GNU sed
sed 'n;n;n;n;G;' # другие sedы

ВЫБОРОЧНАЯ ПЕЧАТЬ ОПРЕДЕЛЕННЫХ СТРОК:

# печать первых 10 строк файла ( поведение "head")
sed 10q

# печать первой строки файла (поведение "head -1")
sed q

# печать последних 10 строк файла ( "tail")
sed -e :a -e '$q;N;11,$D;ba'

# печать последних 2 строк файла ( "tail -2")
sed '$!N;$!D'

# печать последней строки файла ( "tail -1")
sed '$!d' # способ 1
sed -n '$p' # способ 2

# печать только строк ,которые совпадают с regexp ( "grep")
sed -n '/regexp/p' # способ 1
sed '/regexp/!d' # способ 2

# печать только строк , НЕ совпадающих с regexp (как "grep -v")
sed -n '/regexp/!p' # способ 1, соответствует вышеприведенному
sed '/regexp/d' # спопоб 2, простейший синтаксис

# печать строки непосредственно перед regexp, но не строки
# содержащей regexp
sed -n '/regexp/{g;1!p;};h'

# печать строки непосредственно после regexp, но не строки
# содержащей regexp
sed -n '/regexp/{n;p;}'

# печать 1 строки контекста перед и после regexp,с номером строки,
# показывающей , сколько regexp встретилось (как в "grep -A1 -B1")
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

# grep для AAA и BBB и CCC (в любом порядке)
sed '/AAA/!d; /BBB/!d; /CCC/!d'

# grep для AAA и BBB и CCC (в таком же порядке)
sed '/AAA.*BBB.*CCC/!d'

# grep для AAA или BBB или CCC (как в "egrep")
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # большинство sedов
gsed '/AAA|BBB|CCC/!d' # только для GNU sed

# печать параграфа если тот содержит AAA (пустые строки,разделенные параграфами)
# HHsed v1.5 должен содержать 'G;' после 'x;' в следующих 3 скриптах
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

# печать параграфа если тот содержит AAA и BBB и CCC (в любом порядке)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

# печать параграфа если тот содержит AAA или BBB или CCC
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA|BBB|CCC/b;d' # только для GNU sed

# печать строк длинее 65 символов
sed -n '/^.{65}/p'

# печать строк короче 65 символов
sed -n '/^.{65}/!p' # способ 1, соответствует вышеприведенному
sed '/^.{65}/d' # способ 2, простой синтаксис

# печать секции файла от регулярного выражения до конца файла
sed -n '/regexp/,$p'

# печать секции файла , основанная на номерах строк (включающей строки 8-12 )
sed -n '8,12p' # способ 1
sed '8,12!d' # способ 2

# печать строки 52
sed -n '52p' # способ 1
sed '52!d' # способ 2
sed '52q;d' # способ 3, эффективно для больших файлов

# начиная со строки 3, печать каждой 7-ой строки
gsed -n '3~7p' # для GNU sed
sed -n '3,${p;n;n;n;n;n;n;}' # для других

# печать части файла между двумя регулярными выражениями
sed -n '/Iowa/,/Montana/p' # чувствительно к регистру

ИЗБРАННОЕ УДАЛЕНИЕ ОПРЕДЕЛЕННЫХ СТРОК:

# печать всего файла , КРОМЕ части между двумя регулярными выражениями
sed '/Iowa/,/Montana/d'

# удаление двойных,последовательных строк файла (типа "uniq").
# первая строка из дубирующихся строк сохраняется, остальные убираются
sed '$!N; /^(.*)n1$/!P; D'

# удалить дублирующиеся непоследовательные строки файла. Острожнее с
# переполнением размера буфера, занятой памяти, лучше используйте GNU sed!
sed -n 'G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P'

# удаление первых 10 строк файла
sed '1,10d'

# удалить последнюю строку файла
sed '$d'

# удалить последние 2 строки файла
sed 'N;$!P;$!D;$d'

# удалить последние 10 строк файла
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # способ 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # способ 2

# удалить каждую 8 строку
gsed '0~8d' # только GNU sed
sed 'n;n;n;n;n;n;n;d;' # другие sedы

# удалить все пустые строки файла (также как и "grep '.' ")
sed '/^$/d' # способ 1
sed '/./!d' # способ 2

# удалить все ПОСЛЕДОВАТЕЛЬНЫЕ строки файла , кроме первых; также
# удаляет все пустые строки с начала и до конца файла (походит на "cat -s")
sed '/./,/^$/!d' # способ 1, разрешает 0 пустых в начале, 1 от EOF
sed '/^$/N;/n$/D' # способ 2, разрешает 1 пустых в начале, 0 от EOF

# удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:
sed '/^$/N;/n$/N;//D'

# удалить все пустые строки с начала файла:
sed '/./,$!d'

# удалить все завершающие файл пустые строки
sed -e :a -e '/^n*$/{$d;N;ba' -e '}' # рaботает на всех sed
sed -e :a -e '/^n*$/N;/n$/ba' # также, кроме gsed 3.02*

# удалить последнюю строку каждого параграфа
sed -n '/^$/{p;h;};/./{x;/./p;}'

СПЕЦИАЛЬНЫЕ ПРИМЕНЕНИЯ:

# удалим спецсимволы (overstrikes) (символ, бэкспейс) из man pages. Команда 'echo'
# может понадобится для ключа -e если у вас ось Unix System V или bash shell.
sed "s/.`echo \b`//g" # двойные кавычки для среды Unix
sed 's/.^H//g' # в bash/tcsh, жмите Ctrl-V затем Ctrl-H
sed 's/.x08//g' # hex (16-ричное) выражение для sed v1.5

# получаем заголовок сообщения формата Usenet/e-mail
sed '/^$/q' # удаляем все после первой пустой строки

# получить тело сообщения формата Usenet/e-mail
sed '1,/^$/d' # удаляем все до первой пустой строки

# получить заголовок темы письма , но без слова "Subject: "
sed '/^Subject: */!d; s///;q'

# получить начальный заголовок письма отправителя
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

# разобрать свойства адреса, выкинуть нафиг e-mail адрес
# с 1-строчного адресного заголовка (смотрите выше)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

# добавить начальный уголок и пробел в каждую строку (квотинг сообщения)
sed 's/^/> /'

# удалить начальный уголок и пробел из каждой строки (антиквотинг сообщения)
sed 's/^> //'

# удалить теги HTML (включая многострочные теги)
sed -e :a -e 's/<[^>]*>//g;/
# распаковать многотомные заююкоженые бинарники,удалить дополнительный заголовок
# и инфу, которые остаются от ююкоженой части. Файлы переданные в
# sed долны идти в правильном порядке. Версия 1 может вводиться в командной строке
# ; версия 2 может запихиваются в запускаемые скрипты Unix shell
# (Изменение от скрипта Рауля Деси (Rahul Dhesi)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # Версия 1
sed '/^end/,/^begin/d' "$@" | uudecode # Версия 2

# заZIPовать каждый .TXT файл отдельно,удаляя исходный и
# называя каждый .ZIP файл именем запакованного .TXT файла
# (под DOS: команда "dir /b" возвращает чисто имена файлов списком).
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^(.*).TXT/pkzip -mo 1 1.TXT/" >>zipup.bat

ТИПОВОЕ ПОЛЬЗОВАНИЕ: Sed получает одну или больше команд по порядку

и применяет их при каждой операции ввода. После этого все команды применяются
к первой строке ввода,затем первая строка выводится и вторая строка ожидает
ввода для обработки , а затем цикл повторяется. Предыдущие примеры предполагают
что ввод производится со стандартного ,например с консоли
обычно это будет ввод трубы, вернее, канала (или контейнера) ;) (piped input). Один из
больших имен файлов добавляется в командную строку если нет ввода со
стандартного устройства ввода , посылаемого на устройство вывода (Экран).
Вот примерчики:

cat filename | sed '10q' # Используются каналы-контейнера
sed '10q' filename # такой же эффект но без кота ;) ("cat")
sed '10q' filename > newfile # перенаправим вывод на диск

Для дополнительных примеров , включая применение команд для ввода
команд с файла на диске , а не только в командной строке, прочитайте "sed &
awk, 2я редакция," от Даля Дугерти( Dale Dougherty) и Арнольда Руббенса
( Arnold Robbins) (O'Reilly,1997; www.ora.com), "Обработка текста в UNIX ,"
Даля Дугерти( Dale Dougherty) и Тима Орэйли (Tim O'Reilly) (Hayden Books, 1987)
или учебники от Майка Арста (Mike Arst) в файле U-SEDIT2.ZIP (нуно поискать).
Чтоб впитать силу sed, нужно понять что такое "Регулярные выражения." Для этого,
прочитайте "Регулярные выражения" от Джефри Фриддла (Jeffrey Friedl)
(O'Reilly, 1997).Читайте ("man") маны , может помочь в Unix ("man
sed", "man regexp", или подсекцию , посвященную регулярным выражениям в "man
ed"), но маны достаточно сложны. Они написаны не для обучения
sed или использованию regexp для чайников, но как как справочник
для использующих программы на практике.

ИСПОЛЬЗОВАНЕ КАВЫЧЕК: Представленные примеры используют одинарные кавычки ('...')
в отличие от двойных ("...") для ограничения редактируемых команд еще
во времена использования ed на Unix. Одинарные кавычки предохраняют
оболочку Unix от интерпретации знака бакса ($) и обратнокавычек
(`...`),которые использует шелл , если они окружены двойными кавычками.
Пользователям "csh" и аналогам также нужно экранировать
знак восклицания (!) бэкслэшем (например, !) для правильной работы
вышепредставленных примеров,даже внутри одинарных кавычек.
Версии sed для DOS всегда требуют двойные кавычки ("...") а не одинарные
для ограничения редактируемых комманд.

ИСПОЛЬЗОВАНИЕ 't' В СКРИПТАХ SED: Для чистоты документации мы использовали
выражение 't' для вывода символа табуляции (0x09) в скриптах.
Однако, меногие версии sed не распознают 't' , и для этого,когда вы пишете
эти скрипты в командной строке ,жмите вместо этого кнопочку
TAB. 't' поддеривается регулярными выражениями в awk, perl, и HHsed, sedmod,
и GNU sed v3.02.80.

ВЕРСИИ SED: Версии sed различны, поэтому возможны некотрые различия синтаксиса.
В особых случаях, может не быть поддержки меток (:name) или ветвящихся конструкций
(b,t) в пределах редактируемых команд, кроме окончания этих команд.
Мы использовали синтаксис который будет использоваться для большинства
версий sed , тогда как популярные версии сед под лицензией
GNU разрешают более последовательный синтаксис. Когда читатель видит
длиннющую команду как эта:

sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

то хорошо бы знать, что версии GNU sed позволяют переписать это:

sed '/AAA/b;/BBB/b;/CCC/b;d' # или иначе
sed '/AAA|BBB|CCC/b;d'

В дополнение, запомните что многие версии sed понимают команды
как "/one/ s/RE1/RE2/", и НЕ разрешают "/one/! s/RE1/RE2/", в которых
содержится пробел перед 's'. Остерегайтесь пробелов при вводе команд.

ОПТИМИЗАЦИЯ СКОРОСТИ: Если скорость выполнения хочется увеличить (для
больших входных файлов или слабоватого "железа", замена будет
работатать быстрее с выражением поиска находящимся перед
инструкцией вида "s/.../.../" Например:

sed 's/foo/bar/g' filename # стандартная команда замены
sed '/foo/ s/foo/bar/g' filename # это работает быстрее
sed '/foo/ s//bar/g' filename # укороченый синтаксис sed

В строке выборки или удаления, которая используется вами для вывода строк
выбранной части файла, команда выхода (q) в скрипте намного уменьшает время
обработки для больших файлов. Вот пример:

sed -n '45,50p' filename # печать строки 45-50 позиции файла
sed -n '51q;45,50p' filename # по-другому, но работает шустрее

Если у вас есть еще скрипты для распространения или если вы нашли ошибки
в этой листовке, плиз пошлите мыло автору листовки. Напишите какую версию
sed вы юзаете, ось, под которою скомпилен тот самый сед, и описание
проблемы. Данные скрипты в этом файле были написаны и распространяются
господами:

Al Aab # модератор "sedеров"
Edgar Allen # разное
Yiorgos Adamopoulos
Dale Dougherty # автор "sed & awk"
Carlos Duarte # автор "do it with sed"
Eric Pement # автор этого перевода
Ken Pizzini # автор GNU sed v3.02
S.G. Ravenhall # скрипт для de-html
Greg Ubben # приложения и помощь
-------------------------------------------
Korepanov Roman # перевод на русский язык

DLINK drivers for WinXP SP3

http://support.dlink.ca/faq/view.asp?prod_id=3002

Wednesday, April 22, 2009

regexp протестить

man 7 glob

man bash – раздел qwoting

bash by example

grep ^# /etc/y*conf – найти все, что с решетки

grep ^#.*\.$ /etc/y*conf – найти все, что начинается с решетки, содержит .* - все что угодно ( . – любой символ, звездочка – сколько угодно раз от нуля и больше), заканчивается точкой (\. – заквотированная бэкслэшем точка, $ - символ конца строки)

Не срабатывает конец строки – надо разобраться

Thursday, April 16, 2009

[mntent]: warning: no final newline at the end of /etc/fstab

Dont' forget to put empty line at the end of etc/fstab. Just put it at the end of /etc/fstab.

Wednesday, March 25, 2009

Очистить схему

Если нет пароля system, а только на схему, то чтобы обновить схему, ее сложно пересоздать. В этом случае можно попробовать удалить все объекты схемы при помощи скриптика.

set head off
set pages 0
set long 9999999
spool drop_glueadm_obj.sql
select 'drop '||object_type||' '||object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS;',';') from user_objects;
/

Sunday, March 22, 2009

Friday, March 20, 2009

RDP Client tips

How to connect to Terminal Windows if limit of simultaneuos connections is reached?
mstsc.exe -console

Mount your bootable ISO to an image drive

For this example I will use drive D: as the image drive, and drive E: as the flash drive.
Then
xcopy D:\*.* E: /s/e/f

Wednesday, January 14, 2009

2 change sgid on directory and access level

1) To setup sgid on directories within current directory
find . -type d -exec chmod 4660 "{}" ";"
2) To give write permissions for oner and group on files within current directory
find . -type f -exec chmod 660 "{}" ";"

Thursday, September 18, 2008

Warning!!! BIG SIZE of file!!!

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
CDIR=/path1/path2/
OUTF=warning.out
CRIT=400
RCPT=my@email.com
rm -rf ${CDIR}${OUTF}
for files in `ls -l ${CDIR} | awk '{print $9}'`
do
size=`ls -l ${files} | awk '{print $5}'`
tfile=`ls -l ${files} | awk '{print $9}'`
if [ ${size} -ge ${CRIT} ];
then cat >> ${CDIR}${OUTF} << ECHO
Warning! Size of ${CDIR}${tfile} is ${size}
ECHO
fi
done
cat ${CDIR}${OUTF} | mail -s 'Warning!!! BIG SIZE of file!!!' ${RCPT}

Tuesday, August 12, 2008

Script to identify long ago accessed files

He asked me how can he identify long ago accessed files. I've written the following script.

bash-2.05b$ more laaf.sh
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
FNAME=$1
DAYS=$2
if test $# -lt 2
then
echo 'Usage: laaf.sh <+|-N>, where N - number of days'; exit
fi
find $FNAME -type f -atime $DAYS -exec ls -lt --full-time '{}' \; | awk '{print $6,$5,$9;}'
==
Usage: ./laaf.sh <+|-N> [> file.out]
where - is the path to the target directory
<+|-N> - accessed before|after N days

In the output of this script will be modified date, size and file name with full path by row

Monday, August 11, 2008

script for sorting files by modification date

If you want to see files sorted by modification date in the subdirectories, you can paste below into the file for example mytest.sh, do it executable and run it with desireable directory as the argument
For example,
bash-2.05b$ ./mytest.sh /usr/local/etc
---
# cat > mytest.sh << EOF
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
FNAME=$1
find $FNAME -type f -exec ls -lt --full-time '{}' \; | awk '{print $6,$5,$9;}'
EOF
--
As a result you'll recieve date, size and pathname of all files from directory

Friday, June 13, 2008

Re: OCP Credential Validation

После того как 28-го мая я сдал 1z0-043 я написал свой Prometric Testing ID на ocpexam_ww@oracle.com с темой "OCP Credential Validation", затем подтверждал свои курсы на oracle.prometric.com и выслал копию письма о заполнении этой самой "Hands-On Course Requirement Form" на ocpreq_ww@oracle.com
И вот только сегодня 13 июня пришло письмо, что вроде как мой статус OCP подвержден от results@prometric.com.

Your OCP Hands-On Course Requirement has been verified. If you have met
all your exam requirements, you can expect to receive your OCP Success Kit
within 30 days from this message.

и от ocpreq_ww@oracle.com
==============
От кого: Oracle Certification Program
Кому: Мне
Дата: 13 Июн 2008 10:34:55
Тема: Re: OCP Credential Validation

Hi МоеИмя,

Thanks for the course confirmation. Your Hands-on form was verified and if you have completed all the required exams then you should wait for 6-8 weeks from your date of verification of your Hands-On Course Requirement Form to receive your Oracle 10g DBA OCP success kit.
..................
правда как-то странно звучит "if you have completed all the required exams then you should wait" они сразу-то не смогли определить все ли требуемые экзамены сданы :)

Monday, June 09, 2008

По установке Oracle 9i на Linux (Centos 4.6)

Решил протестить и задокументить на случай необходимости быстрой установки Oracle 9i на Linux.
Тест провел с установкой Oracle 9i на Centos 4.6.
В соотв-ии с Note:303859.1 (Requirements for Installing Oracle 9iR2 on RHEL 4)
ставим дополнительно те, которых не хватает в системе из списка:
Minimum Software Requirement:
=============================
* Required OS Components
- compat-db-4.1.25-9
- compat-gcc-32-3.2.3-47.3
- compat-gcc-32-c++-3.2.3-47.3
- compat-oracle-rhel4-1.0-3
- compat-libcwait-2.0-1
- compat-libgcc-296-2.96-132.7.2
- compat-libstdc++-296-2.96-132.7.2
- compat-libstdc++-33-3.2.3-47.3
- gnome-libs-1.4.1.2.90-44
- gnome-libs-devel-1.4.1.2.90-44
- libaio-devel-0.3.102-1
- libaio-0.3.102-1
- make-3.80-5
- openmotif21-2.1.30-11
- xorg-x11-deprecated-libs-devel-6.8.1-23.EL
- xorg-x11-deprecated-libs-6.8.1-23.EL
Учитывая зависимости, которые потребовались для этих пакетов, у меня получился след. полный список для доп.установки диска. Можно то, что ниже просто вставить в простой sh-скриптик и запустить.
---
cd /media/cdrom/CentOS/RPMS
rpm -Uvh compat-db-4.1.25-9.i386.rpm \
compat-libgcc-296-2.96-132.7.2.i386.rpm \
compat-libstdc++-296-2.96-132.7.2.i386.rpm \
compat-libstdc++-33-3.2.3-47.3.i386.rpm \
compat-gcc-32-3.2.3-47.3.i386.rpm \
compat-gcc-32-c++-3.2.3-47.3.i386.rpm \
gnome-libs-1.4.1.2.90-44.1.i386.rpm \
glib-devel-1.2.10-15.i386.rpm \
ORBit-devel-0.5.17-14.i386.rpm \
alsa-lib-devel-1.0.6-5.RHEL4.i386.rpm \
audiofile-devel-0.2.6-1.el4.1.i386.rpm \
esound-devel-0.2.35-2.i386.rpm \
freetype-devel-2.1.9-6.el4.i386.rpm \
fontconfig-devel-2.2.3-13.el4.i386.rpm \
xorg-x11-devel-6.8.2-1.EL.33.i386.rpm \
gtk+-devel-1.2.10-36.i386.rpm \
libjpeg-devel-6b-33.i386.rpm \
libtiff-devel-3.6.1-12.i386.rpm \
libungif-devel-4.1.3-1.el4.2.i386.rpm \
imlib-devel-1.9.13-23.i386.rpm \
gnome-libs-devel-1.4.1.2.90-44.1.i386.rpm \
libaio-0.3.105-2.i386.rpm \
libaio-devel-0.3.105-2.i386.rpm \
make-3.80-6.EL4.i386.rpm \
openmotif21-2.1.30-11.RHEL4.6.i386.rpm \
xorg-x11-deprecated-libs-6.8.2-1.EL.33.i386.rpm \
xorg-x11-deprecated-libs-devel-6.8.2-1.EL.33.i386.rpm
---

Конфигурирование Linux для установки Oracle (делаю как при установке Oracle 10)

1) Заведение групп oinstall, dba и пользователя oracle (copy-paste)
# /usr/sbin/groupadd -g 502 oinstall
# /usr/sbin/groupadd -g 503 dba
# /usr/sbin/useradd -m -u 501 -g dba -G oinstall oracle

Проверка id и gid
# id oracle uid=501(oracle) gid=502(oinstall) groups=502(oinstall),503(dba)

Установка пароля passwd oracle через:
# passwd oracle

2) Создание директорий по OFA (copy-paste)
# mkdir /oracle
# chown -R oracle:oinstall /oracle
# chmod -R 775 /oracle

3) Конфигурирование параметров ядра (через copy-paste) и shell-лимиты
(делаю как при установке Oracle 10)
Создать и запустить скриптик с таким содержимым
#/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin
cp /etc/sysctl.conf /etc/sysctl.conf.ori
cat >> /etc/sysctl.conf << MYEOF
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=262144
net.core.wmem_max=262144
MYEOF
/sbin/sysctl -p
cp /etc/security/limits.conf /etc/security/limits.conf.ori
cat >> /etc/security/limits.conf <oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
MYEOF
cp /etc/pam.d/login /etc/pam.d/login.ori
cat >> /etc/pam.d/login <session required /lib/security/pam_limits.so
MYEOF
cp /etc/profile /etc/profile.ori
cat >> /etc/profile <if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
MYEOF
cp /etc/csh.login /etc/csh.login.ori
cat >> /etc/csh.login << MYEOF
if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
MYEOF
cp /etc/profile /etc/profile.ori
cat >> /etc/profile << MYEOF
if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
MYEOF

cp /etc/csh.login /etc/csh.login.ori
cat >> /etc/csh.login << MYEOF
if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
MYEOF
---
В .bash_profile юзера oracle я добавил

export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_SID=test9i
export LD_ASSUME_KERNEL=2.4.19
export ORACLE_TERM=xterm
export PATH=$PATH:$ORACLE_HOME/bin

По окончании установки при помощи runInstall в граф.окне получил
Ошибки
/oracle/jre/1.1.8/bin/../lib/i686/native_threads/libzip.so: symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference (libzip.so)
Unable to initialize threads: cannot find class java/lang/Thread
Could not create Java VM

Решение проблем (как и вообще установка с необходимыми патчами) хорошо описано в пошаговой инструкции от Terek’а
http://conrad2001.narod.ru/terek/oracle9204linux.htm
После накатки патчей и перелинковки пробелмы исчезают.

Также могут быть полезными ссылки
http://www.puschitz.com/InstallingOracle9i.shtml
http://download-east.oracle.com/docs/html/B13670_06/toc.htm
http://blogs.ittoolbox.com/database/david/archives/installing-oracle-9-on-rhel4-19572

Saturday, June 07, 2008

Бэкапирование баз MS SQL

Вчера закончил документировать реестр всех баз MS SQL, в котором для каждого сервера указал все БД и время выполнения заданий по их бэкапированию и месторасположением бэкап-файлов на локальном диске. Прежний админ MS SQL уволился, а нового админа еще не приняли на работу и я по мере своих сил и навыков смотрю за сиквел-базами.
После того как закончил данный реестр и более менее воткнулся в систему, решил задокументировать для себя существующий механизм бэкапирования базы MS SQL на локальный диск.

Итак, раз в неделю в вскр-е или в субботу производится полный бэкап баз и ежедневно дифференциальные. Перед тем как сделать полный бэкап базы, файл предыдущего бэкапа архивируется Rar-ом. Для чего необходимо разрешить MS SQL выполнять команды ОС, см.комменты.

Step-by-Step в SQL Server Management Studio на примере базы My_DB

1) Создание нового задания.
Сервер-> SQL Server Agent -> Jobs - New Job
Заполняем Name, Description, обращаем внимание на галочку в Enable (пока отключим ее, сняв галку, позже после создания задания и расписания включим)
Продолжение см. в комментах.

Сборщик конфигурации Unix/Linux в HTML

Сегодня "вендоры" попросили выслать конфигурацию боевого сервера Linux, который необходимо "пролечить" и "прикрутить" к HP SW XP1024, выслав ссылку на утилитку cfg2html. Скачал ее, установил, собрал инфу просто запуском /usr/bin/cfg2html-linux из директории, в которую будут сложены html-файл и др.
Несомненно, удобная утиля, ее урл - http://come.to/cfg2html

Friday, May 23, 2008

По переносу базы MS SQL 2005 на другой диск

Обратились ароматизаторы с проблемкой, в рамках которой нужно было перенести одну из баз MS SQL Server 2005 на другой диск. Нашел ссылку http://technet.microsoft.com/ru-ru/library/ms187858.aspx , но открыв MS SQL Management Studio и прикинув как это сделать через GUI, попробовал и .... прикольно, не думал, что так просто переместить базу в сиквеле :)

Wednesday, May 21, 2008

Дефрагментация таблиц, индексов (with LOB and partitions) с перемещением в другой TS

Столкнулся с проблемой, когда после удаления данных таблицы сильно дефрагментировались. Короче база на базе одной ASM diskgroup, в которой одна дисковая группа на базе 2 Lun's. Один размером 512Gb, другой - 72Gb. Запрос "select sum(bytes) from dba_segments" возвращает не более 100Gb, т.е. у меня более 400Gb свободно, но .... запрос "select total_mb,free_mb from v$asm_diskgroup" из более чем 500Гб возвращает свободных только 60Гб. А мне нужно вывести из этой дисковой группы Lun размером 72Гб. Но для того, чтобы вывести диск из группы необходимо достаточное свободного места для ребалансинга.
После команд
alter diskgroup dg1 drop disk dg_0001;
alter diskgroup dg1 rebalance power 6;
и после очистки содержимого v$asm_operation, говорящего нам о завершении ребалансинга
запрос "select name,path,state from v$asm_disk" возвращает состояние диска Hung. Согласно Reference "HUNG - Disk drop operation cannot continue because there is insufficient space to relocate the data from the disk being dropped". Вот так вот.
Сделать shrink невозможно, т.к. segment space management для табличных пространств в manual.
Спросил совета - Г. посоветовал сделать единственно верное в данном случае. Переместить все данные из одного из таблспэйса в другой вновь созданный соответствующего размера (select sum(bytes) from dba_segments where tablespace_name='MYDB_2006') и затем удалить исходный таблспэйс.
И вот решил "записать" скриптики, которые я использовал.
==========
-- Moving LOB PACKAGE_IN_DB to tablespace MYDB_TEST
set head off
set heading off
set pagesize 1000
set linesize 1000
set long 999999999
spool move_table_lob.sql
select 'ALTER TABLE '||TABLE_OWNER||'.'||TABLE_NAME|| ' move partition '||PARTITION_NAME|| ' LOB(PACKAGE_IN_DB)
STORE AS (TABLESPACE MYDB_2006);' from dba_tab_partitions where table_name='PACKAGES'
and tablespace_name='MYDB_TEST';
spool off;
@move_table_lob.sql
exit;
/
-- Moving partitions to tablespace MYDB_TEST
set head off
set heading off
set pagesize 1000
set linesize 1000
set long 999999999
spool move_table_part.sql
select 'ALTER TABLE '||TABLE_OWNER||'.'||TABLE_NAME|| ' move partition '
||PARTITION_NAME|| ' tablespace MYDB_2006;' from dba_tab_partitions where
table_name='PACKAGES' and tablespace_name='MYDB_TEST';
spool off;
@move_table_part.sql
exit;
/
--Moving subpartitions to MYDB_TEST
set head off
set heading off
set pagesize 1000
set linesize 1000
set long 999999999
spool move_table_subpart.sql
select 'ALTER TABLE '||TABLE_OWNER||'.'||TABLE_NAME|| ' move subpartition '
||SUBPARTITION_NAME|| ' tablespace MYDB_TEST;' from dba_tab_subpartitions
where table_name='MV_VOLUMES' and tablespace_name='MYDB_2006';
spool off;
@move_table_subpart.sql
exit;
/
--Moving Indexes to MYDB_TEST
set head off
set heading off
set pagesize 1000
set linesize 1000
set long 999999999
spool move_ind_part.sql
select 'ALTER INDEX '||INDEX_OWNER||'.'||INDEX_NAME|| ' rebuild partition '||PARTITION_NAME ||' TABLESPACE MYDB_TEST;'
from dba_ind_partitions where tablespace_name='MYDB_2006';
spool off;
@move_ind_part.sql
exit;
/
-- Moving LOB-partitions (LOBINDEXES,LOBSEGMENTS) to tablespace MYDB_2006
set head off
set heading off
set pagesize 1000
set linesize 1000
set long 999999999
spool move_table_lob.sql
select 'ALTER TABLE '||TABLE_OWNER||'.'||TABLE_NAME|| ' move partition '||PARTITION_NAME|| ' LOB(' ||COLUMN_NAME||')
STORE AS (TABLESPACE MYDB_2006);' from dba_lob_partitions where tablespace_name='MYDB_TEST';
spool off;
@move_table_lob.sql
exit;
/

Monday, May 19, 2008

Тест с добавлением/мультпасингом LUN-ов из HP XP 1024

Исходные данные: сервер HP Proliant DL360 на Linux Centos 4.6 с базой Oracle 10.2.0.3 с ASM, который создан на основе LUN'а из массива HP EVA5000.
Задача: необходимо перевести базу на LUN'ы массива HP XP1024.
Итак, необходимо "увидеть" презентованные из XP1024 луны, настроить для них multipathing при помощи device-mapper'а. Затем данные луны добавить в существующую дисковую группу и в случае успешных тестов вывести старый диск EVA5000 из существующей дисковой группы.
В случае успеха провести данную операцию на боевом сервере.
От 23 мая - к сожалению тест пока завершился неуспешно. Презентованные LUNы видны, но каждый получаемый путь в /dev/mpath содержит отдельный путь к презентованному LUNу. Позже нашел в документе с www.hp.com "Installation and Reference Guide Device Mapper Multipath Enablement Kit for HP StorageWorks Disk Arrays", где для XP1024 было примечание -
*If you useXP128/1024,the system modes 140 and 293 must be switched on,otherwise
the XP does not respond to a SCSI inquiry to code page 0x83 with a unique serial number (scsi_id tool). This prevents the HPDM Multipath from detecting the redundant paths.
Таких режимов 140 и 293 в прошивке нашего XP1024 не оказалось.
Ссылка на документы
Т.о. продолжение тестов отложено до начала июня, когда Д. вернется из штатов с форума HP-шников.
p.s. Спустя 7 часов ближе к концу раб. дня Д. позвонил в Москву в HP и спросил об этих режимах. Там сообщили, что есть такие режимы и что перезвонят через "10 минут".

Sunday, May 18, 2008

Сдал на OCA - Oracle 10g Administration I

Вчера, 17 мая 2008, (спустя почти 2 года как решился перевестись на должность DBA с переездом со своей семьей во Владик) сдал свой первый экзамен по Oracle - 1z0-042 - OCA Oracle 10g Administration I. Получил OCA (Oracle Certified Associate), если сдать еще один тест - 1z0-043, то получу OCP (Oracle Certified Professional) ..... Так-то какая-никакая черта под идею стать DBA-йщиком подведена и я немного рад. Хотя понимаю, что это на самом деле мало что значит, это лишь "бумажка" да и у нас в отделе это не определяет истинную квалификацию и далеко не всегда OCP-шники воспринимаются всерьез :) Согласен с ними - тем более, что они сильные и нах им эти экзамены не сдались :) А я решил иметь бумажки на случай смены работы :) Смены работы не только в ближайшее время, а вообще на будущее - в подтверждение опыта работы с Oracle на основе времени с момента получения статусов OCA, OCP.
Так что хорошо бы в ближайшее время поднапрячься и сдать 1z0-043 и получив OCP cразу написать письмо Марие о получении статуса OCP, чтобы обновили CV. Думаю, они могут это учесть как положительный фактор и им было бы полегче придумывать должность и круг обязанностей :) Видно будет...

Saturday, May 17, 2008

По переводу ASM с EVA5000 на XP1024

Сегодня, в субботу, в 10.40 час. позвонил Д.(человек круглосуточно болеет за дело и обдумывает его), спросил как вчера прошли работы (я вчера вечером просто срестартил одну базу по ченджу) и попросил пока не ставить restore базы ITC в тестовую, т.к. там какие-то проблемы еще с DataProtector. Я сказал, что Restore запустил вчера вечером и еще не прилетало сообщения ни об ошибке ни об успехе. Д. предположил, что ресторинг заклинило на mount request (позже в понедельник М.С. сказал, что так и было - были mount request'ы, которые ему приходилось проталкивать вручную все выходные).
Затем Д. озвучил в своем стиле то ради чего и звонил - просьбу-задачку провести тесты с настройкой Multipathing'а для дисков массива XP1024 на тестовой машине, на которой я месяцев сколько-то назад настроил его для дисков EVA5000 по подобию боевого сервера.
Т.е. нужно сделать Multipathing на оба массива как на EVA так и на XP, протестировать failover, "выдернув шнурочек" и на основе тестов разработать план перевода ASM боевого ITC c EVA5000 на XP1024.
Утилиту xpinfo, которая отображает всю информацию по презентованным хосту дискам, Д. положил в хоум рута.
Думаю, очень интересная задачка, и с понедельника начнем.

Tuesday, April 15, 2008

the X11 forwarding request was rejected!

При попытке запустить XManager'ом Х-ы на Линухе
ошибка "the X11 forwarding request was rejected!..."
Добавить в /etc/ssh/sshd_config
X11Forwarding yes
и рестартовать процесс sshd

Monday, April 14, 2008

check RMAN-processes

Сегодня с утра одна из баз (10.2.0.3, HP-UX 11.11) оказалась остановленной. При попытке стартовать базу вылетели ошибки о нехватке места. df -k показал, что место в разделе /oracle, где лежит ORACLE_HOME было забито. Очень странно, при размере разделе в 10Гб и размере ORACLE_HOME до 4Гб. Я начал судорожно искать куда делось место через "du -k" по поддиректориям. Не найдя никаких новых файлов, заметил вчерашние нулевые логи бакапов архивлогов и один лог на текущее время. Просмотрел его через tail -f - лог постоянно пополнялся ошибками.
Посмотрел процессы rman - висело 2 процесса rman со вчерашнего вечера.
Убил их ... и место освободилось, почти 4Гб.
Т.е. какой-то процесс rman занимал все доступное место в разделе - очень странно.
Но надо иметь ввиду - либо отстреливать зависшие RMAN-процессы, либо надо переписать скрипты так чтобы логи падали в другой раздел. Возможно это поможет в таких случаях.

Thursday, March 13, 2008

В alert.log сыпятся SUCCESS: diskgroup DGROUP1 was dismounted ...

См. Note:361173.1 Asm Diskgroup success Mount And Umount messages in alert.log during Rman Backup
--------
Alert.log shows the following messages during a rman backup:
SUCCESS: diskgroup LOG was mounted
SUCCESS: diskgroup LOG was dismounted
SUCCESS: diskgroup LOG was mounted
SUCCESS: diskgroup LOG was dismounted

Solution
Intended behavior. No solution required.

Wednesday, March 12, 2008

Archival Error и ORA-07445: exception encountered: core dump ....

Сегодня позвонили и пожаловались, что в одной из баз время от времени выполнение процедур заканчивается ошибкой Archival Error....
Посмотрел alert.log - ошибка Archival Error и в последних двух логах бэкапа ошибка
ORA-09817: Write to audit file failed.
SVR4 Error: 28: No space left on device
Дабы быстрее разрешить проблему я освободил место в разделе удалением устаревших архивов, освободив 1 Гб.
К этому моменту пришел Г. , задал вопрос "кто сожрал 34 гига?" и взялся за проблему. Сначала обнаружил, что освобожденное мною место в 1Гб было уже сожрано и что в cdump куча корок, которые практически и забили все дисковое пространство. Нужно смотреть alert.log.
В нем было обнаружено куча "ORA-07445: exception encountered: core dump" со ссылкой на трейсы. Г. изучил и заключил, что проблема в мат.представлениях, структура которых неправильна, о чем известил программеров.
Я сравнил время появления алертов в алерт.логе со временем вчерашнего апгрейда одной из баз, с которой взаимодействует проблемная база. Время примерно совпало.
Опыт: после всяческих апгрейдов следи за alert.log и cdump

Friday, March 07, 2008

установка Cerberus Helpdesk 4.0

Установку делал в соответствии с http://wiki.cerberusdemo.com/index.php/Installing_4.0
Скачал cerb4-servercheck.php.txt, переименовал и расположил его на сайте.
Обратился к файлу через веб и получил сообщение об отсутствии модуля MailParse и нехватку в php.ini опции upload_tmp_dir. Прописал в своем /usr/local/etc/php.ini и указал на директории upload внутри директории, заготовленной для будущего веб-сайта cerberus.
Установил MailParse по ссылке http://www.cerb4.com/forums/showthread.php?t=40 и получил
"Cerberus Helpdesk 4.0 - Server Environment Checker
Your server is Cerberus Helpdesk 4.0 compatible!"
По MailParse также есть http://wiki.cerberusdemo.com/index.php/Installing_PHP_Mailparse

Thursday, February 14, 2008

SNMP - закрытие доступа к public на Solaris 10

В отчете XSpider'а своего сервера под Solaris 10 имеется "некритичная уязвимость" c рекомендацией "Закрыть доступ к учетной записи public в snmp."

Сегодня все же решил заняться ею. Делаем проверку при помощи snmpget:
- Получить описание системы c localhost
# snmpget -v 2c -c public localhost system.sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: SunOS my_server_name 5.10 Generic_118822-25 sun4u
- Узнать когда SNMP-агент был инициирован последний раз
# snmpget -v 2c -c public localhost system.sysUpTime.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (146645223) 16 days, 23:20:52.23

Установил коммент в /etc/snmp/conf/snmpd.conf у строчки #system-group-read-community public
и рестартовал сервис snmp
# /etc/rc3.d/S76snmpdx stop
# /etc/rc3.d/S76snmpdx start

И повторяем проверку - ответы такие же .... хм....
Ну да , все правильно, ведь проверку делаю с localhost, а нужно со стороны ... Поэтому устанавливаю net-snmp на другой хост с Linux.

[root@centest RPMS]# rpm -Uvh lm_sensors-2.8.7-2.40.5.i386.rpm
warning: lm_sensors-2.8.7-2.40.5.i386.rpm: V3 DSA signature: NOKEY, key ID 443e1821
Preparing... ########################################### [100%]
1:lm_sensors ########################################### [100%]
[root@centest RPMS]# rpm -Uvh lm_sensors-devel-2.8.7-2.40.5.i386.rpm
warning: lm_sensors-devel-2.8.7-2.40.5.i386.rpm: V3 DSA signature: NOKEY, key ID 443e1821
Preparing... ########################################### [100%]
1:lm_sensors-devel ########################################### [100%]
[root@centest RPMS]# rpm -Uvh net-snmp-5.1.2-11.EL4.11.i386.rpm
warning: net-snmp-5.1.2-11.EL4.11.i386.rpm: V3 DSA signature: NOKEY, key ID 443e1821
Preparing... ########################################### [100%]
1:net-snmp ########################################### [100%]
[root@centest RPMS]# rpm -Uvh net-snmp-utils-5.1.2-11.EL4.11.i386.rpm
warning: net-snmp-utils-5.1.2-11.EL4.11.i386.rpm: V3 DSA signature: NOKEY, key ID 443e1821
Preparing... ########################################### [100%]
1:net-snmp-utils ########################################### [100%]

Стартовал демон snmp

[root@centest init.d]# /etc/init.d/snmpd start
Starting snmpd: [ OK ]

Проверил доступ к проблемному серверу - он есть
[root@centest init.d]# snmpget -v 2c -c public my_server_name system.sysUpTime.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (3715) 0:00:37.15

Итак, public все еще открыт .... из man snmpd.conf узнаю о файлике /etc/sma/snmp/snmpd.conf, в котором в строке rocommunity public добавляю 127.0.0.1 так, что стало
rocommunity public 127.0.0.1
Т.е. определил доступ к public только лишь с localhost
Рестартовал сервисы и проверил.

с localhost:
# snmpget -v 2c -c public localhost system.sysUpTime.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (53857) 0:08:58.57

с Linux-хоста
[root@centest init.d]# snmpget -v 2c -c public my_server_name system.sysUpTime.0
Timeout: No Response from my_server_name.

Т.о., в Solaris 'read only'-доступ к community public устанавливается в файлике /etc/sma/snmp/snmpd.conf

Теперь, думаю, XSpider успокоится.

Ссылки по теме:
http://www.net-snmp.org/wiki/index.php/Tutorials










Friday, February 08, 2008

IPMI Service Processor

Сегодня впервые столкнулся с IPMI Service Processor. После отправки сервера SUN ... под Linux Centos 4.1 64bit в ребут не дождался его старта. Нужно было лезть на него консольно.
Погуглив, помогла страничка http://docs.sun.com/source/817-5249-17/appendixF.html#pgfId-1002294
После входа в консоль сначала пришлось выключить сервак по питанию, а затем включить след.образом:

login as: admin
admin@10.27.45.13's password:

Sun Microsystems
IPMI v2.0 Service Processor

Version: V2.2.0.20
localhost $ platform set power state -W -f off
Scheduled platform off

localhost $ platform set os state boot -W -f

localhost $ platform get os state
BIOS booting

localhost $ platform get os state
OS booting

localhost $ platform get os state
OS booting

--
Через некоторое время появился ping до сервака и я облегченно вздохнул .... сервак-то в другом городе и время уже 22 часа.
IPMI - такого зверя я и не знал...

Wednesday, January 30, 2008

Примеры чекеров, скриптов sh

# Чекает не висит ли процесс rman-а больше суток
#!/bin/sh
PATH=/bin
LD=`(date --date='2 days ago' '+%b%d')`
RCPNTP=me@email
HOST=`uname -n`
if
ps -ef|grep -i $LD |grep rman
#if [ $? != 0 ];
then
echo "rman 2 days ago down on "$HOST|mailx -s "rman 2 days ago down on "$HOST ${RCPNTP} < /dev/null fi

##################
Чекает доступность по пингу хоста $HOST
#!/bin/sh
HOST=имя_сервера_который_чекаем
RCPNT=me@email ping -c 2 10.25.40.5 >/dev/null 2>&1
if [ $? -ne 0 ]; then
mail -s 'Alarm!!! Server is down. Check '$HOST $RCPNT < /dev/null
fi
#################
# Бэкапит файлы *jak* из директории /usr/local/BackUp по дням недели, удаляя устаревшие бэкапы
#!/bin/sh
PATH=/bin:/usr/bin:/usr/local/bin
BKPDIR=/usr/local/BackUp
TODAY=`date +'%a'`
TOMCAT=/usr/local/jakarta-tomcat-4.1.18
cd $TOMCAT
BKPFILES=`ls`
tar zcf $BKPDIR/$TODAY-jak.tar.gz $BKPFILES
find $BKPDIR/ -type f -name '*jak*' -mtime +2 -exec rm "{}" ";"

Wednesday, January 23, 2008

Physical Memory in HP-UX

Как определить размер физической памяти в HP-UX

1) Способ, не везде срабатывающий
# dmesg |grep Physical

2) Сработал на разных платформах
# /opt/ignite/bin/print_manifest |grep -i memory



Monday, January 21, 2008

Bonding и отключение поддержки IPv6 (sit0) в Centos 4.6

Только что на тестовом серваке Proliant DL360 G4 c двумя оптическими карточками QLA2340 (которые предварительно перепрошил до firmware ver.1.54, скачанным с здесь) с Centos 4.6 на базе двух карточек Broadcom Corporation NetXtreme BCM5704 Gigabit Ehernet (Tigon3 chip) поднял bonding как описано в How can I bond multiple network interfaces (bonding) together into a single channel in Red Hat Enterprise Linux 4?

И тупо проверил выдергиванием кабелей по очереди - все работает.
Сообщил сетевикам, они настроили team на коммутаторах, но пожаловались на то, что с их стороны виден лишний MAC-адрес.
Действительно, в выводе # ifconfig -a маячит интерфейс "sit0 Link encap:IPv6-in-IPv4", который они и попросили убрать.
Очевидно поддержка IPv6 включена по дефолту в ядро 2.6.xxx
Для отключения IPv6 добавил в /etc/modprobe.conf
alias net-pf-10 off
alias ipv6 off
и перегрузился, после чего sit0 исчез из системы.

p.s. прикол в том, что на других боевых системах с Centos sit0 также присутствует :)

Thursday, January 17, 2008

Копирование пользователей с их правами

Здесь и здесь решение задачки переноса юзеров с их грантами из боевой в тестовую БД

set head off
set pages 0
set long 9999999
spool user_script.sql
SELECT DBMS_METADATA.GET_DDL('USER', USERNAME) || '/' DDL
FROM DBA_USERS
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT', USERNAME) || '/' DDL
FROM DBA_USERS
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT', USERNAME) || '/' DDL
FROM DBA_USERS
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', USERNAME) || '/' DDL
FROM DBA_USERS;
spool off;

Wednesday, January 16, 2008

dbid в шаблоне %F

При восстановлении базы RMAN-ом необходимо установить DBID командой set dbid .
Дабы не искать его в логах лучше пользоваться шаблоном %F - при создании backup_set это первая последовательность цифр в имени файла при использовании шаблона %F - например,

configure controlfile autobackup format for device type disk to '/orabackup/rman2disk/back1_ctl_%F';

Friday, December 21, 2007

Грабелька с OVO-мониторингом баз Oracle (на Linux-ах)

Суть проблемы изложена в вопросе в форуме hp itrc.
Hi
We have the following situation. After a colleque of us restored partially a backup ( core dump happended) ORACLE is behaving somehow strange :
Logon to ORACLE using sqlplus works fine
Using the application that is normally used with the db alos works fine.
If the application tries to logon to ORACLE using programmatic access does not work at all .We always get the ORA-12546 error
We cannot fin whats wrong.
Has anyone a idea where we should search
Ответ оказался:
Make sure the permission on the oracle execuatble is correct. The oracle executable permission should be:
52224 -rwsr-sr-x 1 oracle dba 53431665 Aug 10 11:07 oracle
Explanation:
The error, ora-12546, occurs due to an incorrect setting on the oracle executable.

По AWR

-- Просмотреть все снимки, хранящиеся в репозитарии
select * from sys.wrm$_snapshot;

-- Просмотреть текущие настройки AWR

select * from dba_hist_wr_control;

-- Задать новые настройки AWR
begin
dbms_workload_repository.modify_snapshot_settings(
interval=>15,
retention=>10080);
end;

--Просмотреть представления с данными AWR

SELECT table_name, comments FROM dict WHERE table_name
LIKE 'DBA_HIST%'
order by 1;

-- Удалить AWR снапшоты (на примере ниже размер БД уменьшается с 10 до 3Гб)

SQL> select sum(bytes)/1024/1024/1024 from dba_segments;

SUM(BYTES)/1024/1024/1024
-------------------------
               10.2251587

SQL> select dbid, retention from dba_hist_wr_control;

      DBID RETENTION
---------- ---------------------------------------------------------------------------
2822602820 +00008 00:00:00.0

SQL> select min(snap_id), max(snap_id) from dba_hist_snapshot;

MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
       21234        21405

SQL>  exec dbms_workload_repository.drop_snapshot_range(21234,21405);

PL/SQL procedure successfully completed.

SQL> select sum(bytes)/1024/1024/1024 from dba_segments;

SUM(BYTES)/1024/1024/1024
-------------------------

               3.08276367

define(`SMART_HOST',`smtp.provider.com')

After installing new Linux-server with Oracle etc. for successful mailing don't remember about adding feature "define(`SMART_HOST',`smtp.provider.com')" into your sendmail.mc
And after do
# cd /etc/mail
# make
# killall -1 sendmail
# echo test|mail me@mydomain.com

Thursday, December 20, 2007

top 2 file

top -d 1 -n 1000 -f /home/oracle/slava3.txt

Убить неубиваемую сессию (ORA-00031: session marked for kill)

Сегодня при попытке убить сессию нарвался на ошибку ORA-00031: session marked for kill
В таком случае сессию можно убить из Unix через убийство процесса
# kill pid, где pid - это spid из представления v$process, который можно узнать по ADDR. ADDR узнается по PADDR из v$session. Напр-р,
select spid from v$process where addr in
(select paddr from v$session where osuser='ADUser');

Если есть под рукой Toad , то в Session Browser
spid для проблемной сессии можно посмотреть перейдя в закладку Process

Tuesday, December 18, 2007

FEATURE(`delay_checks')

FEATURE(`delay_checks') - интересная фича в конфиге sendmail при проблеме когда сервер долго не выдает invitation из-за чего коннекты могут отваливаться по таймауту

http://dz.dn.ua/spam/antispam.html

Wednesday, December 12, 2007

Грабли с WMware

Получил сегодня ошибку "511 vmware-serverd service is not running" в своей VMware Server 1.0.2 после рестарта XP. По совету в одном из форумов, вылечил путем перезапуска службы VMware Registration Service при закрытой консоли. Но при попытке запустить виртуальную машину получил следующую ошибку "Virtual machine config file is invalid.." Вычитал про файлы .vmem and .vmem.lck в директории данной машины здесь и просто попытался их удалить, что оказалось безуспешно. Пришлось сребутить опять свою XP, после чего данные файлы исчезли и VMWare-машина нормально стартовала.

Tuesday, December 11, 2007

Грабли при Upgrade до 10.2.0.3

Сегодня при попытке проапгредить тестовую БД после накатки Patch Set 2 (релиз 10.2.0.3) нарвался на неожиданные грабли:
1) Ошибки как при запуске @?/rdbms/admin/catupgrd.sql, так и при запуске dbua (Ошибка звучала примерно так
DBUA thinks this is a Rerun operation and is trying to connect to the database with oracle home /oracle/product/10g. If you believe this is not a Rerun operation, remove the below file and invoke DBUA again.
/oracle/product/10g/cfgtoollogs/dbua/logs/Welcome_LIVE.txt ).
Оказалось, что были потеряны онлайн-логи БД - сообщение об этом я получал при
SQL> startup upgrade , но игнорировал ....
После того как проделал
SQL> recover database until cancel;
SQL> alter database open resetlogs;
(конечно на боевой базе после этого обязательно сделать полный бэкап базы) проблема ушла и после SQL> startup upgrade скрипт @?/rdbms/admin/catupgrd.sql начал свое исполнение.

Вывод 1: не игнорь недоступность онлайн-логов при "startup upgrade" .
---
2) Делал upgrade по Readme.html из архива патча. Потратив время, оказалось, что не стоит игнорить написанное черным по белому там - проверьте нет ли обновленного readme на металинке. В файле на металинке перед обновлением необходимо пропатчиться....

Вывод 2: прежде чем делать любые обновления, проверяй металинк, не обновился ли документ, описывающий данное обновление.

3) Нарвался на "тупейшую" засаду - скрипт catupgrd.sql завис бес каких либо сообщений, не сразу заглянув в алерт.лог я выяснил, что место в дисковой группе АСМ закончилось :( вот, засада.

Вывод 3: проверь достаточно ли свободного места в SYSTEM, SYSAUX, да и просто в дисковой группе.

Friday, December 07, 2007

Для установки запуска агента OVO

Для установки OVO-агента
[root@mysrv OpC]# /usr/src/OVO/RPC_BBC/opc_inst -s <имя_сервера>

Для запуска и проверки статуса OVO-агента
[root@mysrv OpC]# /opt/OV/bin/OpC/opcagt -start
[root@mysrv OpC]# /opt/OV/bin/OpC/opcagt -status
VPO Managed Node status :
-------------------------
Control Agent /opt/OV/bin/OpC/opcctla (13529) is running
Message Agent /opt/OV/bin/OpC/opcmsga (13532) is running
BBC Local Location Broker /opt/OV/bin/llbserver (13533) is running
Subagent 1:
Action Agent /opt/OV/bin/OpC/opcacta (13534) is running
Logfile Encapsulator /opt/OV/bin/OpC/opcle (13535) is running
Monitor Agent /opt/OV/bin/OpC/opcmona (13536) is running
Message Interceptor /opt/OV/bin/OpC/opcmsgi (13537) is running
Subagent 12:
Performance Agent /opt/OV/bin/coda -redirect (13538) is running
Subagent 13:
Service Discovery Agent /opt/OV/bin/OvSvcDiscAgt /f -start (13539) is running

Wednesday, December 05, 2007

iptables - первый опыт :)

Раннее всегда работал с ipfw, но сегодня пришлось активировать и "подкрутить" iptables в linux (CentOS). Нужно было оставить открытым порт только для одного ip-адреса. Почитав в Инете и поманив сделал так.
Активировал через Х-ы через Security.
Правила описываются в /etc/sysconfig/iptables
После добавления (изменения) правила в этот файлик
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5555 -s 10.27.115.223 -j ACCEPT
которое идентично стандартным за исключением того, что я добавил ip-адрес источника через ключ -s ('-s 10.27.115.223')
срестартил iptables
# /etc/init.d/iptables restart
Для проверки правил полезная командочка
# iptables-save > /root/firewall.rules2

Wednesday, November 07, 2007

Включить XDMCP в Linux

в /etc/X11/gdm/gdm.conf
[xdmcp]
Enable=true
#init 5
Ели не проканало, то посмотри Red Hat ноуледжбэйз

Принципалы (principals), защищаемые (securables), разрешения (permissions) в SQL Server 2005

Принципалы (principals) — это те объекты, которым в SQL Server 2005 можно предоставлять разрешения. Они могут быть как индивидуальными (например, учетная запись), так и групповыми (например, роль).

Securables (дословно "защищаемые") — еще одна важнейшая концепция системы безопасности SQL Server 2005. Это все, на что в SQL Server 2005 можно назначить разрешения.

Терминология системы безопасности SQL Server 2005, принципалы (principals), защищаемые (securables), разрешения (permissions)

Tuesday, October 23, 2007

первый бэкап и ресторе в MS SQL 2005 :)

Недавно меня неофициально отправили на MS-курс "Внедрение MS SQL 2005" (на работе читали курсы для разработчиков двумя этажами выше). И похоже, что мои впечатления от "первого" знакомства MS SQL 2005 выше ожидаемых. Хотя конечно, чтобы серьезно заниматься им, надо потратить немало времени и усилий. Но мне нужно знать и представлять "куда кликнуть" когда наш DBA от MS SQL будет в отпуске или отъезде.
Мне понравились доступность и понятность материалов из текнет и онлайн-букса.
Пример скрипта, который я нашел и который возможно нужен будет частенько для создания копии БД для разработчиков.

-- Скрипт создает копию БД (formonitor) из ее бэкапа под новым именем (DB_test) и новым расположением md- и ld-файлов БД.

USE master

GO
-- DROP DATABASE DB_test
RESTORE DATABASE DB_test
FROM disk='D:\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\formonitor.bak'
WITH RECOVERY ,
MOVE 'Formonitor' TO 'D:\Test_DB\DB_test.mdf',
MOVE 'Formonitor_log' TO 'D:\Test_DB\DB_test.ldf'
--
/*
Чтобы узнать логические имена файлов 'Formonitor' и 'Formonitor_log' из файла бэкапа formonitor.bak нужно сказать:
RESTORE FILELISTONLY
FROM disk='D:\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\formonitor.bak'
*/

Wednesday, October 10, 2007

первый снег ... собеседование у Оюны

АВФ:
>> не действительно красиво листва ещё не опала леса зелёно красно жёлтые и Байкал синий солнце и снег

Monday, August 20, 2007

Скрипты для перекомпиляции INVALID-объектов

После некоторых действий в базе (импорта, обновления, установки CPU и др.) часто обнаруживаются INVALID-объекты, которые рекомендуется лечить запуском скрипта $ORACLE_HOME\rdbms\admin\utlrp.sql.
Сейчас для компиляции инвалидных функций и процедур я пользуюсь sqlplus-скриптом с сайта Don'а Burleson'а invalid_func_proc.sql.
А для компиляции инвалидных пакетов и тел пакетов скриптом с Oracle-Base invalid_pkg.sql.

--invalid_func_proc.sql
set heading off;
set feedback off;
set echo off;
set lines 999;
set page 500;
spool run_invalid.sql
select
'ALTER ' || OBJECT_TYPE || ' ' ||
OWNER || '.' || OBJECT_NAME || ' COMPILE;'
from dba_objects
where status = 'INVALID'
and object_type in ('FUNCTION','PROCEDURE');
spool off;
set heading on;
set feedback on;
set echo on;
--@run_invalid.sql
--===========================
--invalid_pkg.sql.
SET SERVEROUTPUT ON SIZE 1000000
BEGIN
FOR cur_rec IN (SELECT owner,
object_name,
object_type,
DECODE(object_type, 'PACKAGE', 1,
'PACKAGE BODY', 2, 2) AS recompile_order
FROM dba_objects
WHERE object_type IN ('PACKAGE', 'PACKAGE BODY')
AND status != 'VALID'
ORDER BY 4)
LOOP
BEGIN
IF cur_rec.object_type = 'PACKAGE' THEN
EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type ||
' "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE';
ElSE
EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.owner ||
'"."' || cur_rec.object_name || '" COMPILE BODY';
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.owner ||
' : ' || cur_rec.object_name);
END;
END LOOP;
END;
/

Sunday, August 19, 2007

Протестить mount over ssh?

Нашел про монтирование удаленной фс через ssh - надо протестить ...
http://www.cyberciti.biz/tips/rhel-centos-mounting-remote-filesystem-using-sshfs.html
да и вообще похоже много чего полезного здесь

Friday, August 17, 2007

su - oracle - Your default context is user_u:system_r:unconfined_t.

После перезагрузки сервака после вчерашнего обновления openssh (еще не определил как это связано с сабжем), не сработал dbora - "пошел" разбираться. При попытке изменить контекст юзера получил
[root@mysrv]# su - oracle
Your default context is user_u:system_r:unconfined_t.

Do you want to choose a different one? [n]
[oracle@mysrv ~]$
Теперь ясно почему не сработал dbora.

Гугл посоветовал закомментарить в /etc/pam.d/su строку с pam_selinux.so open multiple

#session required /lib/security/$ISA/pam_selinux.so open multiple
session required /lib/security/$ISA/pam_selinux.so open

и это помогло.

Thursday, August 16, 2007

How to enable telnet in CentOS

На время обновления openssh на всякий случай приподнял telnet по howto с centos.org

1. Login to your server through SSH and su to root.
2. Type pico /etc/xinetd.d/telnet
3. Look for the line: disable = no and replace with disable = yes
4. Now restart the inetd service: /etc/rc.d/init.d/xinetd restart
5. Turn off it through chkconfig as well because it can still start through that.
/sbin/chkconfig telnet off

SQL> drop database;

Минут 10 убил чтобы перевести базу в нужное состояние перед drop'ом :)
SQL> startup mount EXCLUSIVE restrict force;
ORACLE instance started.

Total System Global Area 536870912 bytes
Fixed Size 1261860 bytes
Variable Size 167775964 bytes
Database Buffers 364904448 bytes
Redo Buffers 2928640 bytes
Database mounted.
SQL> drop database;

Обновление пакетов Linux на примере обновления open-ssh до 4.6p1 на CentOS 4.4

1) Обновление из RPM-исходника (пример с zlib)
# wget ftp://chuck.ucs.indiana.edu/pub/array2/linux/fedora/linux/core/5/source/SRPMS/zlib-1.2.3-1.2.1.src.rpm
# rpmbuild --rebuild zlib-1.2.3-1.2.1.src.rpm
# rpm -Uhv /usr/src/redhat/RPMS/i386/zlib-*1.2.3-1.2.1.i386.rpm

2) Обновление из тарбола (на примере openssh)
# cd /usr/src/redhat/SOURCES
# wget ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-4.6p1.tar.gz
# tar zxvf openssh-4.6p1.tar.gz
Ищем файлик типа spec
# find . -type f -name *.spec
# cd openssh-4.6p1/contrib/redhat/
# vi openssh.spec
%define no_x11_askpass 1
%define no_gnome_askpass 1
# rpmbuild -bb --clean --target i586 openssh.spec
# cd /usr/src/redhat/RPMS/i586
# rpm -Uvh openssh-*4.6p1-1.i586.rpm
Во время установки ругнулось на зависимости старых пакетов
error: Failed dependencies:
openssh = 3.9p1-8.RHEL4.9 is needed by (installed) openssh-askpass-3.9p1-8.RHEL4.9.i386
openssh = 3.9p1-8.RHEL4.9 is needed by (installed) openssh-askpass-gnome-3.9p1-8.RHEL4.9.i386
- удалил их через
# rpm -e <пакеты, на которые ругалось>

После удаления повторил установку и перегрузил процесс sshd через
kill -1

3) Установка или обновление при помощи yum
#yum install XFree86-devel
#yum install gtk2-devel
#yum update openssl

mount NFS from HP-UX onto Oracle on Linux

Для того, чтобы сделать импорт дампа базы из hp-ux на linux проделал следующее
1) на hp-ux под root'ом
- в /etc/rc.config.d/nfsconf значения параметров NFS_SERVER и START_MOUNTD заменил на 1.
- запустил /sbin/init.d/nfs.server start
- дамп файл лежит в /dmp, поэтому в /etc/exports добавил строчку
/dmp -anon=65534,async
- перечитал изменения /usr/sbin/exportfs -a
- проверил /usr/sbin/exportfs
2) на Linux под root'ом
также решил смонтировать и дал команду
$ mount name_of_server:/dmp /dmp -o rw,bg,hard,nointr,tcp,vers=3,timeo=300,rsize=32768,wsize=32768
Когда я ее дал в начале без опций $ mount name_of_server:/dmp /dmp, то при попытке сделать импорт из этой директории вывалилась ошибка:
ORA-27054: NFS file system where the file is created or resides is not mounted with correct options

Wednesday, August 15, 2007

RMAN-03002: failure of Duplicate Db command at

Технари бросили задачку сделать им копию продакшн-базы для тестирования новой версии их софта. Датафайлы базы в объеме чуть более 160 Гб. Первая мысль, которая пришла - поднять вторую базу на этом же сервере через RMAN duplicate. Но .... sga рабочей базы забила всю доступную оперативную память сервера, а там ее всего 2Gb и есна уменьшать ее нельзя :(
Тогда как сделать копию базы, если нет железа, где ее развернуть? Спросить у офисников VMWare-машинку. Удалось найти у них VMWare-машинку на 2Gb RAM, но дискового пространства всего лишь 170 Гб :( - больше нету. Ок, пока я поднял на ней Centos 4.4 и Oracle 10gR2.
Итак остаются две проблемы - для дамп-файла нет места на сервере. Также его нет на VMWare-сервере, который выделен под копию базы. Cетевой экспорт посредством network_link не подходит, т.к. в базе огромная куча таблиц с полями типа LONG (Интересно убрано ли это ограничение в недавно выложенной 11g?).
Доовольный и потирая руки, т.к. никогда не делал его, я ответил себе - нужно попробовать RMAN duplicate!!! Проведя тесты у себя на тестовой базе, подготовил duplicate.rcv c содержимым:
run {
allocate auxiliary channel 'aux_sbt' type 'sbt_tape';
duplicate target database to 'SID новой базы'
skip tablespace 'ненужный TS';
}
exit;
Запустил команду
$ rman target / auxiliary sys/passwd@ @duplicate.rcv
и .... получил ошибки, основной смысл которых RMAN-03002: failure of Duplicate Db command at .... Погуглив и пошаривши по металинку осеняет!!! кого я гоню-то - и грустно и смешно :( ОСи то разные :( Тесты я провел на Linux-ах и с той и с этой стороны, а под продакшн базой у меня сервачок HP rp5470 с HP-UX 11.11, когда как для тестовой копии я поднял Linux - другого варианта не было. Известно, что при RMAN restore (который является частью duplicate) возможны только одинаковые ОСи. Вот он пример того, как что-то зная в теории, выпускаешь из виду на практике, пока не "наступишь"... Эээхх....

А с копией базы на самом деле оказалось не все потеряно. Эту боевую базу поднимал я и располагал данные на MSA1000. Тоже неплохой опыт был. Т.к. вот к моему серваку был подключен еще один такой же массив. Соответственно с него мне и выделили раздельчик на 300Гб - благо еще была возможность. Для того, чтобы подмаунтить его коллега использовал ioscan, insf , funC -disk и sam. Саначала создал volume group vg01, а в ней и раздел lvol9 с монтированием его в /dmp. Дальше дело техники - expdp и ipmdp по сети.
Кстати, impdp по сети с дамп-файлом еще делать не приходилось и надеюсь все сработает - щас пока молотит expdp. Через некоторое время добавлю продолжение.

Saturday, August 11, 2007

Перенос базы в новую ASM_DISKGROUP

После того, как был добавлен новый LUN, был настроен автостарт базы осталось решить последнюю проблему - необходимо перенести базу из текущих asm_diskgroups, поднятых на RAID0 в новую asm_diskgroup, созданную на базе нового добавленного LUN'а RAID1.
При подготовке к данному переносу почитал доку, ноты металинка и провел ряд тестов на своей тестовой базе в VMVare-машине. В результате составил след.инструкцию, которую и использовал при работе с продакшн базой.
====
Задача: Перенести базу в новую asm_diskgroup
Данные: Имя новой asm_diskgroup - EVA01R1


1) Сделать бэкап control- файла

SQL> select name from v$controlfile;
SQL> alter database backup controlfile to '+EVA01R1';

2) Задать новое месторасположение control-файла в spfile

SQL> alter system set control_files='+EVA01R1\ITC\CONTROLFILE\CONTROL01.CTL' SCOPE=SPFILE;

Прим. если spfile не используется экземпляром, то прописать в его init.ora

3) Восстановить новый из старого control-файла


$ rman target /
RMAN > shutdown immediate;
RMAN > startup nomount;
RMAN> restore controlfile from '+EVA02/itc/controlfile/current.266.610247845';

4) Запустить копирование базы

RMAN> alter database mount;
RMAN> backup as copy database format ' +EVA01R1 ';

5) Переключить базу на копию

RMAN> switch database to copy;
RMAN> RUN
{
SWITCH TEMPFILE 1 TO '+EVA01R1';
}


6) Добавить в init.ora
параметр Db_create_file_dest=+eva01r1

7) Открыть базу
RMAN> alter database open;

8) Добавить в новую asm_diskgroup зеркальные копии онлайн-логов во всего журнальные группы экземпляра

alter database add logfile member ' +EVA01R1 ' to group 1 ;
alter database add logfile member ' +EVA01R1 ' to group 2;
alter database add logfile member ' +EVA01R1 ' to group 3 ;
alter database add logfile member ' +EVA01R1 ' to group 4 ;
alter database add logfile member ' +EVA01R1 ' to group 5 ;

9) Переключить журнал
alter system archive log current

10) Удалить старые копии журналов из старой asm_diskgroup

Можно использовать скрипт (здесь старая группа +EVA02)

declare
strSQL varchar2( 200 );
begin
for pList in (select member from v$logfile where member like '+EVA02/%' ) loop
strSQL:= 'alter database drop logfile member "' || pList.member || '"' ;
begin
EXECUTE IMMEDIATE strSQL;
end;
end loop;
end;

или вручную через

alter database drop logfile member '+EVA02/itc/onlinelog/group_1.256.609887989’
(имя файла изменять на свое)

Проверить остались ли старые файлы
select member from v$logfile where member like '+EVA02/%'

11) Переместить файл block_change_tracking

SQL> select status,filename
from v$block_change_tracking;

SQL> alter database disable block change tracking

SQL> alter database enable block change tracking
using file '+EVA01R1' reuse;


12) Проверить месторасположение всех фалов

select name from v$controlfile
union
select name from v$datafile
union
select name from v$tempfile
union
select member from v$logfile
union
select filename from v$block_change_tracking


13) Удалить все старые дисковые группы как ненужные

SQL> drop diskgroup eva01 including contents;
SQL> drop diskgroup eva02 including contents;

Friday, August 10, 2007

Добавление восьмого LUN'а с EVA5000 в Centos (ПРОДОЛЖЕНИЕ)

Вчера делал перенос базы в новую ASM дисковую группу как раз на этом сервере с его перезагрузкой. Тогда остались вопросы по поведению после ребута:
1) Похватится ли 8-й LUN системой?
2) Создастся ли /dev/mpath/3600508b4001039d90000600000d20000p1 , на базе которого должен создастся /dev/raw/raw17 ?
Ответы на все отрицательные :( Хотя после установки max-scsi-luns=255 ответы должны были быть положительными.
Пришлось пока просто прописать автостартап-скрипты для добавления 8-го LUNа и для монтирования с него raw-девайса для новой дисковой группы ASM Oracle. Как раз на нее и переливал впоследствии базу RMAN-ом.

[root@vld-olap-1 init.d]# cat /etc/init.d/addscsilun
#!/bin/sh
#
# chkconfig: 2345 1 99
# description: Adds new scsi LUN
#

/bin/echo "scsi add-single-device 0 0 0 8" > /proc/scsi/scsi
/bin/echo "scsi add-single-device 0 0 1 8" > /proc/scsi/scsi
/bin/echo "scsi add-single-device 1 0 0 8" > /proc/scsi/scsi
/bin/echo "scsi add-single-device 1 0 1 8" > /proc/scsi/scsi

#chkconfig --add addscsilun
проапдейтил скрипт маунта нового раздела в raw17 и все конечно заработало и проблема закрыта, но ... вопрос почему же 8-й LUN не подхватился системой после ребута остался нерешенным.

Thursday, August 09, 2007

Смена пароля SYS экземпляра ASM

[oracle@mysrv dbs]$ orapwd file=$ORACLE_HOME/dbs/orapw+ASM password=sys force=y

Wednesday, August 08, 2007

Добавление восьмого LUN'а с EVA5000 в Centos

После включения поддержки ядром max_scsi_luns для автоматического подключения scsi-разделов презентовали дополнительный LUN на основе, которого нужно было сделать asm_diskgroup. Как я это сделал.
1) Вручную добавил данный LUN через
echo "scsi add-single-device 0 0 0 8" > /proc/scsi/scsi
echo "scsi add-single-device 0 0 1 8" > /proc/scsi/scsi
echo "scsi add-single-device 1 0 0 8" > /proc/scsi/scsi
echo "scsi add-single-device 1 0 1 8" > /proc/scsi/scsi

после чего появился файл /dev/dm-14
2) Вручную добавил вь-14
# multipathd -k
multipathd> add map dm-14
ok
после чего в /dev/mpath/ появилась ссылка на /dev/dm-14

3) Создал партицию из появившейся ссылки, т.е. в моем случае
# fdisk /dev/mpath/3600508b4001039d90000600000d20000
выдели все доступное пространство от первого до последнего цилиндра
Дал команду #partprobe

После чего я ожидал увидеть /dev/mpath/3600508b4001039d90000600000d20000p1, но этого не произошло.
Поэтому очень важно увидеть создание данного файла после ребута, т.к. именно после его создания startup-скриптами будет создан raw-девайс, на базе которого создается asm_diskgroup.

А пока я создал вручную raw через
# raw /dev/raw/raw17 /dev/mpath/3600508b4001039d90000600000d20000

А далее под oracle и ORACLE_SID=+asm создал группу
SQL> create diskgroup eva01r1 external redundancy disk /dev/raw/raw17;

Теперь нужно проверить во время ночных работ с перезагрузкой сервера и переливкой RMAN-ом базы в данную asm_diskgroup следующее:
1) Похватится ли 8-й LUN системой?
2) Создастся ли /dev/mpath/3600508b4001039d90000600000d20000p1 , на базе которого должен создастся /dev/raw/raw17 ?

Скрипт создания raw

cnt=10
for md in `ls /dev/mpath/*p1`
do
raw /dev/raw/raw$cnt $md
cnt=`expr $cnt + 1`
done;

Продолжение следует ...

Tuesday, August 07, 2007

per_free in tablespace/autoextent on

Запустив запрос на проверку свободной пространства в ТС
SELECT F.TABLESPACE_NAME,TO_CHAR ((T.TOTAL_SPACE - F.FREE_SPACE),'999,999') "USED (MB)",
TO_CHAR (F.FREE_SPACE, '999,999') "FREE (MB)",
TO_CHAR (T.TOTAL_SPACE, '999,999') "TOTAL (MB)",
TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)),'999')||' %' PER_FREE
FROM (SELECT TABLESPACE_NAME, ROUND (SUM (BLOCKS*(SELECT VALUE/1024
FROM V$PARAMETER WHERE NAME = 'db_block_size')/1024) ) FREE_SPACE
FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F,
(SELECT TABLESPACE_NAME,ROUND (SUM (BYTES/1048576)) TOTAL_SPACE
FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME ) T
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME
обнаружил пару ТС с 0% в значении PER_FREE
Вопрос: как проверить выставлен ли autoextent в файлах данного ТС?
Ответ: select * from dba_data_files

Friday, August 03, 2007

umask и Vintela VAS

При установке VAS у пользователей AD их id в Unix-системах начинаются с 1001.
Согласно Red Hat Knowledgebase Если id пользователя более, чем 99, то umask по-умолчанию должен быть 002, иначе 022 (см./etc/bashrc), но umask у пользователей VAS на CentOS упорно 022.

Вследствие чего возникает проблема, когда пользователь группы VAS не может изменить (удалить) файлы, созданные другим пользователем этой же группы VAS.
Т.е. пользователь VAS должен либо давать команду umask 002 (666-002=664), чтобы его коллеги по VAS-группе могли менять созданные им файлы либо подправить свой /home/user/.bashrc путем добавления в конце строки umask 002.
Но юзеры никак не хотят это принять и упорно ругают VAS :) Можно их понять ....

Надо подправить настройки для вновь создаваемых пользователей для Linux в
/etc/skel/.bashrc, откуда берет настройки /etc/default/useradd, просто добавив в конце строку umask 002.
А для тех пользователей, которые уже зарегились подправить их /home/AD-user/.bashrc

Thursday, August 02, 2007

Куда сыпятся логи стартап-скриптов в HP-UX?

При тестировании скрипта автостарта ASM-экземпляра Oracle (да и наверняка других самописных) полезно знать, что HP-UX логгирует записи о стартовых скриптах в /etc/rc.log. Кто встречал ошибку SQL> ORA-29701: unable to connect to Cluster Manager, тот поймет в чем польза этого файлика :)

Wednesday, August 01, 2007

Ссылки на БобрДобр

Удобный сервис - БобрДобр. Во всяком случае так позиционируется и на первый взгяд так и есть. Во всяком случае есть возможность "уволить" тэг "Links" :)

Ссылки BASH Shell Script Directory

http://bash.cyberciti.biz/

Monday, July 30, 2007

Поддержка ядром Linux определенного кол-ва scsi luns

Cсылки, которые пригодились для решения этой задачи
1) How do I setup multiple LUNs on Red Hat Enterprise Linux 4?

How do I rebuild the initial ramdisk image?

2) Administer Linux on the fly с переводом на опеннете.

Ccылки к тому, что сегодня получил задание выяснить как увеличить кол-во поддерживаемых LUNs ядром Linux (Centos 4.4). Было высказано предположение, что у ядра есть параметр, подобный max scsi luns, дефолтовое значение которого 7, которое нужно увеличить. Про дефолтовое значение max_scsi_luns я не нашел ничего, но как оказалось на данном сервере после загрузки ОС вручную запускался скрипт rescan-scsi-bus.sh , использующий добавление дисков на лету echo "scsi add-single-device H C I L" > /proc/scsi/scsi и и который не без ограничений.
Вечером следующего дня я сделал установку Multiple LUNs с перестройкой образа RAM-диска по указанным ссылкам и это избавило от ручного запуска данного скрипта.
Также был автоматизирован запуск asm-экземпляра и базы Oracle и apache после загрузки ОС.

Thursday, June 28, 2007

Быстрый Logminer

1) Создай пакет DBMS_LOGMNR
$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus system/password @dbms.sql

2) Определи файлы, которые будут анализироваться логмайнером (в примере далее это файлы ASM типа +DBGROUP1/ccdb/onlinelog/group_2.262.593698089), например, вытащи активные журналы через

SELECT distinct member LOGFILENAME FROM V$LOGFILE;

3) Добавь полученные файлы в поле видимости пакета DBMS_LOGMNR
BEGIN
sys.DBMS_LOGMNR.ADD_LOGFILE
('+DBGROUP1/ccdb/onlinelog/group_2.262.593698089'); --замени на свои имена файлов
sys.DBMS_LOGMNR.ADD_LOGFILE
('+DBGROUP1/ccdb/onlinelog/group_3.263.593698095');
sys.DBMS_LOGMNR.ADD_LOGFILE
('+DBGROUP1/ccdb/onlinelog/group_1.261.593698085');
END;

4) Запусти начало анализа журналов
BEGIN
sys.DBMS_LOGMNR.START_LOGMNR
(options =>
dbms_logmnr.dict_from_online_catalog);
END;

5) Найди проблемную операцию и вытащи UNDO-запрос через запрос к V$LOGMNR_CONTENTS
Например,
select username,to_char(timestamp,'mm/dd/yy hh24:mi:ss') timestamp,
seg_type_name, seg_name, table_space, sql_redo,sql_undo, session# SID, serial#
from V$LOGMNR_CONTENTS
where operation = 'DELETE' -- Если нужно поменяй отслеживаемую операцию!!!
and table_space like 'USERS' -- Если нужно поменяй или убери ТС!!!
and to_char(timestamp,'mm/dd/yy hh24:mi:ss')> '06/27/07 17:00:00' -- Здесь задай свою дату!!!
order by 2 desc;

6) Остановить Logmnr-процесс
BEGIN
sys.Dbms_Logmnr.end_logmnr;
END;

Быстро сфлэшбэчиться 2 (to before drop;)

В продолжение своей темки "Быстро сфлэшбэчиться" провел тестики с "корзиной" при удалении тестовой таблички adm_office на основе "Using Oracle's recycle bin, by Natalka" и "Ретроспективная (Flashback) таблица", где Arup неплохо вставил - "В некоторых случаях этим пользователем-неудачником можете оказаться и вы – АБД!". С чем я согласен :)

drop table adm_office; -- случайное удаление таблицы
select * from tab; -- видим строку с переименованной таблицей в системную
select * from recyclebin; --удостоверимся, что это наша удаленная таблица
--если в sqlplus, то можно SQL> show recyclebin
flashback table adm_office to before drop; -- сфлэшбэчим удаленную табличку

Итак я представил, что кто-то из юзеров удалил таблицу в своей схеме и позвонил мне. Я зашел под system'ом и не увидел удаленной таблицы в recyclebin. Тогда делаю запрос
select owner, object_name, original_name, type, droptime, can_undrop, can_purge from dba_recyclebin;
и вижу то, что нужно - схему, имя таблицы, время ее удаления и возможность восстановления!
Можно проверить эту табличку запросом к переименованной табличке, например:
select * from СХЕМА."BIN$kffqEdSnQd2u6rEnet3Pzg==$0"
Теперь осталось сфлэшбэчить данную табличку с указанием ее схемы-владельца
flashback table СХЕМА.adm_office to before drop;

Wednesday, June 27, 2007

Тесты c Logminer

Сегодня провел тесты с logminer на основе статьи Раскрываем секреты – глубинный анализ журналов пока на своей Винде в тестовой базе.
Сначала нужно инсталлировать пакет DBMS_LOGMNR (далее шаг 1)
Затем выдать привилегию юзеру, который будет анализировать журнал (шаг 2 - сразу родился вопрос - когда я попытался сделать анализ от юзера adm, которому дал роль по статье, получил ошибку "Привилегий недостаточно" - поэтому вопрос с привилегиями пока открыт).

Тест в винде - если что-то удалено недавно и изменения сохранились в оперативных журналах (имена журналов мы возьмем из SELECT distinct member LOGFILENAME FROM V$LOGFILE;)

1) C:\>sqlplus / as sysdba
2) SQL> c:\oracle\product\10.2.0\db_1\rdbms\admin\dbmslm.sql;
3) SQL> GRANT EXECUTE_CATALOG_ROLE TO adm;
4) SQL> CREATE PUBLIC SYNONYM DBMS_LOGMNR FOR SYS.DBMS_LOGMNR;
5) SQL> SELECT distinct member LOGFILENAME FROM V$LOGFILE;
6) BEGIN
DBMS_LOGMNR.ADD_LOGFILE
('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLWIN\REDO03.LOG');
DBMS_LOGMNR.ADD_LOGFILE
('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLWIN\REDO02.LOG');
DBMS_LOGMNR.ADD_LOGFILE
('C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLWIN\REDO01.LOG');
END;
8) BEGIN
DBMS_LOGMNR.START_LOGMNR
(options =>
dbms_logmnr.dict_from_online_catalog);
END;

здесь dbms_logmnr.dict_from_online_catalog - как я понял из доки использование логмайнером словаря БД для анализа не только онлайн-журналов (dbms_logmnr.DICT_FROM_REDO_LOGS), но и заархивированных.

9) select username,to_char(timestamp,'mm/dd/yy hh24:mi:ss') timestamp,
seg_type_name, seg_name, table_space, sql_redo,sql_undo, session# SID, serial#
from V$LOGMNR_CONTENTS
where operation = 'DELETE'
and table_space like 'USERS'
and to_char(timestamp,'mm/dd/yy hh24:mi:ss')> '06/27/07 17:00:00'
order by 2 desc;

10) Нахожу нужную строку и из SQL_UNDO выбираю и выполняю соответствующий запрос, чтобы вернуть как было.
Прим. Cтолбец SQL_REDO – показывает оператор, который может быть выполнен, чтобы вызвать то же самое изменение, сделанное пользователем, и столбец SQL_UNDO – оператор, который может быть выполнен для отмены изменения.


Но что делать если произошло пакетное удаление или изменение? Думаю, pl/sql с курсорами, хотя не уверен. Надо будет протестить.

Tuesday, June 19, 2007

Не используйте нулевой сектор raw-девайса для Oracle ASM в Solaris 10

Вчера коллега натолкнулся на проблему, что сырой девайс не определялся ASM-инстансом Oracle в числе CANDIDATE-дисков. Сегодня утром он нашел проблему и поделился опытом. Он сделал дамп этого раздела dd-ой и увидел, что Solaris 10 R2 записал свою служебную инфу в нулевой сектор этого девайса. Очевидно, что для ASM-инстанса это и послужило проблемой. Тогда он пересоздал сырой раздел не с нулевого, а с первого сектора и ASM увидел CANDIDATE-диск.
Вывод: выделяя девайс под раздел для Oracle ASM в Solaris 10 начните его не с нулевого, а с первого сектора. На других ОС-ях пока не было возможности проверить это. Ссылка на man dd

Thursday, June 14, 2007

CPU Apr 2007 на Solaris 10 (Sparc 64-bit)

Сегодня ночью установил CPU Apr 2007 на Oracle 10gR2 на базе Solaris 10 (Sparc 64-bit). Данный апрельский Critical Patch Update ставился впервые и проделав загодя тесты с его установкой на Linux x86 (Centos 4.4) на выполнение работ по План-графику выделил 1 час с 9.00 до 10.00 утра. Т.к. на Линухе на установку данного CPU я затратил примерно полчаса. Но этой ночью ввиду бессоницы (укладывал себя спать с пол 12-го ночи раза три) и возможно неуверенности, что одного часа утром может и не хватить (а надо уложиться именно за это время), решил начать установку из дома и не пожалел об этом.... Т.к. на все работы по установке этого CPU на Solaris 64-bit ушло 2 часа 15 мин. - с 3.45 час. до 6.00 час. Причем свежий opatch 10.2.0.2.2, который требовался для установки этого CPU, был уже установлен и резервные копии базы и бинарников Oracle сделаны из cron.
В конце установки CPU пришлось поволноваться, когда получил это:
Inventory check OK: Patch ID 5901881 is registered in Oracle Home inventory with proper meta-data.
Verification of 'ar' actions failed. This is a known issue for this platform. Pl ease check the note 353150.1 on Metalink for the process to manually verify the files.
Files check OK: Files from Patch ID 5901881 are present in Oracle Home

Но следование упомянутой ноте 353150.1 показало, что "... all Source files are 4 bytes smaller than their respective Destination files AND the patch has successfully applied". Тесты с базой прошли успешно и она уже чуть более часа как в "плавании".

Tuesday, June 12, 2007

В dbca не вижу базы, созданной вручную

Провел тест с созданием базы вручную на основе модифицированного скрипта, сгенерированного раннее при помощи dbca. База успешно поднялась. Но когда я решил взглянуть на нее через dbca, с удивлением обнаружил, что ее нет среди инстансов ... Хотя база поднята и работает.
Хм... пока тема остается открытой.

Saturday, June 09, 2007

Error 45 initializing SQL*Plus

Сегодня утром на свежеустановленном тестовом сервере Centos 4.4 + Oracle 10gR1 получил ошибку Error 45 initializing SQL*Plus

[oracle@centest ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.2.0 - Production on Sat Jun 9 10:19:14 2007
Copyright (c) 1982, 2005, Oracle. All Rights Reserved.
Error 45 initializing SQL*Plus
Internal error

Судя по металинку эта бага обнаруживается на разных платформах и версиях Oracle, нашел упоминание о Bug 3039738 (Oracle Cluster File System (OCFS) ) и в форуме данная проблема присутствует. Заглянул в первое попавшееся и когда вычитал реплику автора о подобной проблеме "Even I faced the same problem. But when I set the oracle_home,nls_lang and path environment variables it worked fine" сразу проверил свои переменные окружения и обалдел, когда увидел, что HOSTNAME=my_server_name.other_domain.ru :)
Заглянул в /etc/hosts, /etc/resolv.conf, /etc/sysconfig/network - так и есть, там прописан не мой, а "левый" домен.
Исправил, ребутнулся - ошибка осталась :(
Проблема остается открытой ...

Thursday, June 07, 2007

grant select on все таблицы одной схемы другой схеме?

К моему удивлению, не нашел как это сделать в SQL Reference и сделал через запуск скрипта, полученного из
SET ECHO OFF
SET NEWPAGE 0
SET SPACE 0
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL ON
spool grants2user2.sql
select 'grant select on '''||owner||'.'||table_name||''' to user2;' from dba_tables where owner='USER1';
spool off;
exit;

Wednesday, June 06, 2007

Вывод списка ролей (пример использования %ROWTYPE)

declare
cursor get_roles is -- Объявляем курсор
select * from dba_roles;
v_roles get_roles%ROWTYPE; --Объявляем переменную, работающую с курсором
begin
open get_roles;
loop
exit when get_roles%NOTFOUND; --Оператор цикла для просмотра всех записей таблицы
dbms_output.enable;
fetch get_roles into v_roles; --Фетчим курсор в переменную
dbms_output.put_line(TO_CHAR(v_roles.role));
end loop;
close get_roles;
end;
/

Tuesday, June 05, 2007

Создание скрипта сохранения и изменения паролей

set pause off;
set pages 0;
set linesize 140;
set feedback off;
set termout off;
column cmd_line format a80
column tick format a3
column sum_bytes format 999,999,999,999
spool return_pass.spool.sql;
select 'alter user "'||username||'" identified by values '''||password||''';' from dba_users;
spool off;
spool change_pass.spool.sql;
select 'alter user "'||username||'" identified by qqq;' from dba_users;
spool off;
exit;

Open Relay Checker etc.

Онлайн-чекеры Интернет-серверов
http://tests.nettools.ru/
http://www.mxtoolbox.com/blacklists.aspx

IP-калькуляторы
http://ipcalc.dewil.ru
http://www.cotse.com/networkcalculator.html

Monday, June 04, 2007

create_roles.sql

set feedback off
set heading off
set termout off
set linesize 1000
set trimspool on
set verify off
spool roles.sql
select 'create role ' || r.role || ';'
from dba_roles r;
spool off;
exit;