smon times out every 5 minutes, pmon every three seconds.
2011-04-05
2011-03-28
_small_table_threshold
Давно хотел посмотреть сам на этот механизм, но Льюис уже выложил тесты.
Определение
По результатам тестов Льюиса для Oracle 10.2, проверяется содержимое буферного кеша (x$bh), количество touch и количество блоков для таблиц разных размеров:
Определение
- Table < (2%*buffer_cache) = _small_table_threshold is located into the middle point of LRU list when loaded into the buffer cache.
- Table > (2%*buffer_cache) = _small_table_threshold is located into the cold end of the LRU list when loaded into the buffer cache.
По результатам тестов Льюиса для Oracle 10.2, проверяется содержимое буферного кеша (x$bh), количество touch и количество блоков для таблиц разных размеров:
- Для больших таблиц (свыше 10% кеша) touch не увеличивается, используется table scans (long)
- Для таблиц больше 25% буферного кеша при сканировании буферы переиспользуются
- Для таблиц меньше 10% буферного кеша touch увеличивается, причем первое сканирование таблицы не увеличивает touch (получается table scans (long)), последующие увеличивают (table scans (short))
- Для таблиц менее 2% touch count увеличивается каждый раз, используются table scans (short)
- Для 9-й и менее версий оракла поведение соответствует определению.
2011-03-16
Немного о лицензировании
Первая вьюха:
Информация по использованию опций:
Вьюха основана на таблицах wri$:
Пополняются они один раз в неделю (колонка sample_interval = 604800). Значение интервала берется из таблицы WRI$_DBU_USAGE_SAMPLE, API для изменения этого значения (кроме прямого UPDATE) найти не удалось.
Единственный пакет, который ссылается на эту таблицу: dbms_feature_usage_internal, который содержит 2 интересные процедуры:
EXEC dbms_feature_usage_internal.exec_db_usage_sampling(curr_date => SYSDATE) Заработало только после переподключения сессии, почему-то не обновляет в wri$_dbu_usage_sample колонку last_sample_date, но обновление количества использований после переподключения сессии происходит (до переподключения в трейсе вообще не было UPDATEов)
EXEC dbms_feature_usage_internal.sample_one_feature(feat_name => 'Automatic Workload Repository') - приводит к обновлению dba_feature_usage_statistics, причем дата последнего обновления проставляется в last_sample_date для всех опций (т.к. она одна и берется из таблицы wri$_dbu_usage_sample).
Что делают эти процедуры можно посмотреть, сняв трейс 10046.
select * from v$license;
SESSIONS_MAX 0
SESSIONS_WARNING 0
SESSIONS_CURRENT 2
SESSIONS_HIGHWATER 7
USERS_MAX 0
CPU_COUNT_CURRENT 1
CPU_CORE_COUNT_CURRENT
CPU_SOCKET_COUNT_CURRENT
CPU_COUNT_HIGHWATER 1
CPU_CORE_COUNT_HIGHWATER
CPU_SOCKET_COUNT_HIGHWATER Информация по использованию опций:
SELECT * FROM dba_feature_usage_statisticsВьюха основана на таблицах wri$:
create or replace view dba_feature_usage_statistics as
select samp.dbid, fu.name, samp.version, detected_usages, total_samples,
decode(to_char(last_usage_date, 'MM/DD/YYYY, HH:MI:SS'),
NULL, 'FALSE',
to_char(last_sample_date, 'MM/DD/YYYY, HH:MI:SS'), 'TRUE',
'FALSE')
currently_used, first_usage_date, last_usage_date, aux_count,
feature_info, last_sample_date, last_sample_period,
sample_interval, mt.description
from wri$_dbu_usage_sample samp, wri$_dbu_feature_usage fu,
wri$_dbu_feature_metadata mt
where
samp.dbid = fu.dbid and
samp.version = fu.version and
fu.name = mt.name and
fu.name not like '_DBFUS_TEST%' and /* filter out test features */
bitand(mt.usg_det_method, 4) != 4 /* filter out disabled features */;Пополняются они один раз в неделю (колонка sample_interval = 604800). Значение интервала берется из таблицы WRI$_DBU_USAGE_SAMPLE, API для изменения этого значения (кроме прямого UPDATE) найти не удалось.
Единственный пакет, который ссылается на эту таблицу: dbms_feature_usage_internal, который содержит 2 интересные процедуры:
EXEC dbms_feature_usage_internal.exec_db_usage_sampling(curr_date => SYSDATE) Заработало только после переподключения сессии, почему-то не обновляет в wri$_dbu_usage_sample колонку last_sample_date, но обновление количества использований после переподключения сессии происходит (до переподключения в трейсе вообще не было UPDATEов)
EXEC dbms_feature_usage_internal.sample_one_feature(feat_name => 'Automatic Workload Repository') - приводит к обновлению dba_feature_usage_statistics, причем дата последнего обновления проставляется в last_sample_date для всех опций (т.к. она одна и берется из таблицы wri$_dbu_usage_sample).
Что делают эти процедуры можно посмотреть, сняв трейс 10046.
2011-02-01
Как заставить работать lateral в oracle
ANSI SQL оператор lateral аналогичнен конструкции TABLE в Oracle.
Но просто так он не работает:
Внимание на условие d2.dummy = d1.dummy внутри lateral.
Но
Но просто так он не работает:
sps@v-pc-dev-3>SELECT *
2 FROM dual d1,
3 lateral (
4 SELECT * FROM dual d2 WHERE d2.dummy = d1.dummy
5 )
6 WHERE d1.dummy = 'X';
lateral (
*
ошибка в строке 3:
ORA-00933: SQL command not properly endedВнимание на условие d2.dummy = d1.dummy внутри lateral.
Но
sps@v-pc-dev-3>alter session set events '22829 trace name context forever';
Сеанс изменен.
sps@v-pc-dev-3>SELECT *
2 FROM dual d1,
3 lateral (
4 SELECT * FROM dual d2 WHERE d2.dummy = d1.dummy
5 )
6 WHERE d1.dummy = 'X';
D D
- -
X X
1 строка выбрана.
2010-06-03
Скрипт для проверки привелегий
При изменении инсталляции и инсталляции из дампа привелегии можно проверить скриптом:
SELECT grantee "Кому", granted_role "Что", NULL "На что"
FROM Dba_Role_Privs
WHERE grantee LIKE 'SP%' OR grantee LIKE 'PN%'
OR granted_role LIKE 'SP%' OR granted_role LIKE 'PN%'
UNION ALL
SELECT grantee, PRIVILEGE, table_name
FROM Dba_Tab_Privs
WHERE grantee LIKE 'SP%' OR grantee LIKE 'PN%'
UNION ALL
SELECT grantee, PRIVILEGE, NULL
FROM dba_sys_Privs
WHERE grantee LIKE 'SP%' OR grantee LIKE 'PN%'
ORDER BY 1,2,32010-05-28
Список ролей, которые необходимо создать перед импортом
Импорт ругается на ошибки при разворачивании дампа? Пропускаем лог через скрипт:
и получаем список ролей, которые необходимо создать.
$ grep " TO \"" specpr.log | sed s/'^.* TO "\(.*\)".*"$'/'CREATE ROLE \1;'/g | sort | uniq и получаем список ролей, которые необходимо создать.
2010-04-30
Тайм менеджмент. Вольный пересказ книги Глеба Архангельского
Причины творческой лени
- усталость и переутомнение
- несоответсвие нашего "должен" нашему "хочу"
- ощущение ненужности выполняемой в данный момент задачи
Как себя мотивировать на выполнение "нудных", больших задач?
Резать слонов на биштексы. Не стоит бояться и глобализировать большие задачи. Надо разделить их на мелкие и решать их постепенно, резать слона на бифштексы. Бифштексы должны быть измеримыми (мы можем управлять только тем, что можно измерить). Решать их можно в произвольном порядке (метод швейцарарского сыра, выгрызая дырки из большой задачи каждый день). Планировать и незамедлительно решать некоторое количество неприятных задач (съедать каждое утро по лягушке). Поощрять себя (хотя достижение результата это и так неплохая мотивация) за каждую небольшую победу. Маленькие победы можно фиксировать, например на графике, что дает дополнительную мотивацию.Использовать "якорь" для быстрого включения в работу. Одним из самых простейших якорей является музыка. Нам песня работать и жить помогает.
Некоторым помогает работа в режиме дедлайна, который можно создавать искусственно.
Таблицы дел
Завести и повесить таблицу ежедневных дел. Выпонил дело -- ставишь галочку, не выполнил дело -- ставишь прочерк. За каждые пятнадцать галочек поощрение. По количеству прочерков видно, какие дела надо подтягивать.Реактивный и проактивный подходы к жизни
Автор великолепно разжевывает идею Стивена Кови о реактивном и проактивном подходе к жизни.Он постоянно плыл по течению, спотыкаясь о самого себя, постоянно придумывая оправдания своим неудачам, отказываясь принять на себя ответсвенность.Эта мысль приведена автором из Чака Норриса. Кто хочет ищет способы, кто не хочет - оправдания. Ох, как же часто (кажется), что на нас давят непреодолимые внешние обстоятельства: нет времени, нет денег, устал... А на самом деле это обычный реактивный подход к жизни -- плыть себе и плыть как гамно по течению. Тут уж надо действительно разобраться: нужно тебе это или не нужно. Цель это или мечта (а помечтать, как заметил автор, русский народ любит).
Люди ведут себя подобно ему, словно они сего лишь проходят мимо жизни, перебираясь из одного дня в другой. Не то, что бы у них не было желаний и мечтаний, как они добиваются успеха, но эти мечты сопровождаются многими оправданиями своего ничего неделания, основанных на убедительных доводах и они мгновенно преграждают им путь, как только такие люди начинают думать, что, возможно, - лишь возможно! - наступит день, когда они начнут исполнять эти желания.
Но им всегда что-нибудь мешает - неудачное время года, срочный ремонт автомобиля или то, что они слишком устали вчера вечером. Так они говорят, но истина заключается в том, что единственным препятствием, стоящим на их пути, являются они сами…
Родные и навязанные цели
Родными целями можно назвать всесторонне обдуманную, проанализированную, "выстраданную" цель. Например как открыть в городе первый медицинский центр. Или освоить новый язык программирования. В противоположность им есть цели навязанные: рекламой, родственниками, стереотипами, окружающей средой, моралью и этикой развращенного общества: я получаю лимон, у меня есть Ламборджини, 3 любовницы и квартира в центре Москвы. Задача человека: отсеять эту шелуху, найти свои истинны ценности.Мемуарник. Призвание -> Миссия -> Цель
Продолжая тему о постановке глобальных целей жизни, поднятую Кови, Глеб предагает определить свои базовые ценности, на основе которых будут строится долгосрочные цели-маяки. Для этого каждый день записываем в мемуарник Главное Событие Дня, каждую недулю - Главное Событие Недели. Для каждого из этих событий определяем категорию, к которой оно относится, например: поговорил с другом (Друзья), навестил брата (Семья), погулял по историческим местам Москвы (путешествия, новизна ощущений, развитие). У каждого человека свой набор ценностей, важно определить "свои родные", ключевые ценности.Приводится интересное определение: цель -- то что мы берем от жизни, завоевываем, миссия -- то что отдаем, приносим в этот мир. Для формирования своей миссии автор предлагает составить на себя эпитафию, что скажут потомки, после того, как Вы умрете. Миссию компании можно проверить аналогично.
От миссии переходим к призванию. Если миссию человек может поменять по своему усмотрению в течении своей жизни, то призвание уже на всю жизнь. Любой человек стремится к свободе, а призвание, как то от чего нельзя отказаться, нельзя бросить -- высшая степень несвободы. Но именно оно дает высшую степень осмысленности жизни, счастье.
Ключевые области жизни
Если собрать все задачи и попробовать повесить на них таги, то у занятых людей можно выделить по 5-10 основных тагов (ключевых областей жизни). В каждой из этих областей жизни необходимо иметь четкие цели, сами области долны быть приоритезированы между собой для соблюдения баланса времени между задачами из разных областей.При достижении долгосрочных целей важно расставить приоритеты. Добиться успеха на работе, в спорте и стать отцом 3 детей вряд ли получится. Необходимо расставить приоритеты и выделить первоочередные цели. Сделать это можно например при помощи мемуарника (= набору ключевых ценностей). Сразу вспоминается Кови с главой про лидерство: Прежде чем взбираться по лестнице убедитесь, что она приставлена к правильной стене.
Карта ценностей
Конечной целью составления целей, ключевых ценностей, миссии, ключевых областей -- карта ценностей. По горизонтальной оси годы, повертикальной области жизни. Составляем примерный план что-где-когда мы хотим достичь. Пусть план будет неточный, но зато он будет.SMART-цели
Цели должны быть SMART - от слов specific, measurable, achievable, realistic, time-bound - конкретные, измеримые, достижимые, реалистичные, привязанные к времени, например: в этом году получить сертификат OCP.Планирование дня
Планы нужны для ситуаций, когда все меняется. Вы ведь не планируете чистку зубов, т.к. этот процесс понятен и предсказуем.Задачи делятся на:
- жесткие - привязанные ко времени (совещание в 12-00)
- гибкие - можно делат ьв любое удобное время (слепить патч)
- бюджетируемые - крупные задачи без конкретного времени исполнения (подготовить лекцию)
Планирование по принципу День-Неделя-Год
Совсем положе на Планарий, с задачами на день, неделю и хаос. Ежедневно просматриваем задачи и переносим их из Года в Неделю и из Недели в месяц.Экономия времени
Учитесь говорить НЕТУчитесь расчищать вашу жизнь от навязанных дел -- умейте говорить нет делам, которые не соответствуют вашим принципам и целям, делам которые вам не нравятся.
Стратегии отказа:
- Военная хитрость -- попросту солгать. Может открыться и отношения будут испорчены.
- Логическая аргументация -- не подходит для эмоциональных людей
- Отложить/замотать -- к сожалению многие путают надежду и обещание.
- Сделать желаемое непривлекательным
- Третий путь -- предложить альтернативу
Метод здорового пофигизма
Подумай: а нужно ли это выполнять вообще? Может все рассосется и надобность отпадет. Помни принцип ПВО: Не спеши выполнять -- отменят.
Покупка своего времени
Делегируйте свои задачи, задачи которые вам не нравятся, задачи которые отнимают слишком много времени и сил. Передать кому-то, равно как и купить услугу на стороне может выйти дешевле, чем делать все самому. Помни: трать невосполнимое время на Главное.
Принятие решений
Принимай решения используя как можно большее количество критериев (матрицу критериев). Наппример, пишем программу и есть 2 разных варианта ее написать. Критерии для выбора того или иного варианта:- Скорость работы
- Просто кода
- Скорость реализации
- Простота тестирования
Круг влияния и кргу беспокойства
У Кови введено понятие "круг влияния" и "круг беспокойства". Обычно круг беспокойства гораздо шире круга влияния. Но зачем беспокоится и вообще знать о том, что не влияет на вашу жизнь и на что не можете повлиять вы сами. Фильтруйте новости и информацию, которую получаете. Количество информации в мире растет по экспоненте и за всем не угонишься. Какая нам разница до наводнения в Папуа и теракта в Сомали.Творческая карточека
- Материализация мыслей. Мысль не записанная мысль потерянная.
- Записывать не только свои мысли, но и чужие. Пусть мысли сталкиваются из этого может родится что-то новое. Мысли по теме можно помечать тегами, соответствующим ключевым областям жизни.
- Регулярно просматривать эту картотеку
Организация работы на основании структурирования внимания
Сознание человека может работать только с одним объектом, предсознание с 5-9 объектами одновременно. Подсознание работает с бесконечным числом объектов. Рабочее пространство должно соотвествовать этой структуре: в центре один объект с которым работаем, в близи 5-9 близконеобходимых объекта, все остальное на перифирии. Если что-то помещается в область предсознания (становится близконеобходимым объектом) необходимо что-то удалить из этой области, что бы объект не потерял значимость.Поглотители времени
Интереснейшая мысль, как бюрократия разбазаривает наше личное время. Мы проводим часы земли, что бы сэкономить сто ватт электроэнергии, почему не провести час без бюрократии, что бы сэкономить годы человеческого времени. Вот и сейчас, что бы поменять свои права я вынужден тратить целый рабочий день на этихОсновным методом борьбы с поглотителями времени является измерение -- ежедневный хронометрах на что уходит сколько времени (интересно, туалет учитывать:)). Подсчитываем, сколько времени тратится на поглотители и строим график. Самое интересное, что как только мы начинаем учитывать и отображать показатель будет сам стремится в лучшую сторону.
Что делать в транспорте
Помимо очевидных читайте, слушайте аудиокигу, отдыхайте, учитесь очень понравился кусок про думайте:
– Обдумывайте конкретный список вопросов. Участники тренингов часто говорят: «В транспорте я думаю». Не тешьте себя иллюзией. Если у вас нет списка конкретных вопросов к размышлению (или ваше думание не есть сознательная обработка только что пришедшей в голову идеи), то скорее всего, абстрактное думание - просто пережевывание одного и того же на холостых оборотах мозга, без смысла и пользы. Гораздо лучше иметь конкретный список вопросов к размышлению в транспорте, и еще - в ходе размышлений обязательно нужно делать пометки в блокноте, чтобы не потерять ценные идеи.
Проведение совещаний
- Определитесь с форматом совещания: мозговой штурм/планерка/стратегическое свещание
- Определить круг участников. Слишком много лишнего народу будет уметь и мешаться. Или тихо спать в углу мирно тратя свое рабочее время.
- Определить круг рассматриваемых вопросов
- Определить длительность совещания и следящего за временем.
- Организуйте обстановку и разошлите материалы в сжатой форме. Для того, что бы определить, что люди с материалами ознакомились, попросите прислать несколько решений по вопросам. Не приславших решение не приглашайте. Без дополнительных стимулов читать материалы вряд ли кто станет.
- Зафиксиуйте и разошлите результаты. Незафиксировнные результаты = отсутствию совещания.
Научите других экономить свое и наше время
Пока в нашем обществе, к сожалению, культура управления временем практически отсутствует. Если у вас украли тысячу рублей, все понимают, что это нехорошо. Если у вас украли час времени, который, в отличие от тысячи рублей, невосстановим и невосполним, - никто не считает это предосудительным.Посчитайте цену своего времени, времени своего подразделения в деньгах. Боритесь за время не менее жестко, чем за деньги. Время гораздо дороже денег -- оно не возобновляется и его гораздо меньше.
Тайм-менеджмент в семейной жизни
- "Мы вместе" не значит, что "мы делаем одно и то же"
- У каждого должно быть время для себя (особенно у интравертов)
- Принципы взаимоотношений должны проговариваться в явном виде. А еще лучше прописываться.
Тайм-менеджмент и дети
- Самомотивация. Не допускать промедление и откладывание задач.
- Таблица ежедневных дел
- Планирование хороших оценок. Уделение внимания отстающему предмету.
Факты о времени
- Жизнь дается человеку один раз
- Время это материал из которого соткана жизнь
- Время и поступки человека в нем необратимы
Философия ТМ
Организация времени расположением дел и поступков в нем подобно организации пространства перемещением и расположением вещей. Существует 3 уровня организации времени:- Как идти - эффективность - технологический
- Куда идти - стратегия - стратегичский
- Зачем идти - философия - мировозренческий
Взаимозависимость уровней
Начиная заниматься тайм-менеджментом, задумываясь, как использовать время более эффективно, приходишь к вопросу о целях. Из множества целей выбираются наиглавнейшие, становится вопрос приоритетов, который перерастает в вопрос ценностей. Таким образом человек поднимается вверх по лестнице тайм-менеджмента.Освоившись, установив свои ценности, расставив свои приоритеты начинаешь ставить долгосрочные (годовые) и более краткосрочные (недельные) цели. На ненужные, не соответствующие ценностям задачи не тратим время -- делегируем, покупаем или откладываем их в долгий ящик (метод трех гвоздей).
ТМ-идеалогия одной фразой
«Вдумчиво и осмысленно использовать невосполнимое время жизни в соответствии с осознанными личными ценностями и приоритетами».
Аксиомы ТМ
1. Человек свободен. Поступки могут зависить от начальных условий: ресурсы, наследственность. Однако ничто не определяет нашу жизнь на 100 процентов. Решающее значение имеет наш собственный выбор и наше желание что-то поменять. Не надо ныть и винить во всем окружение, государство, правительство (как это по-русски). Человек свободен изначально и во всем виноват только он сам. Если человек понял, что он свободен, а это чувство начинается внутри, то он может отсеять навязанную ему шелуху, штампы, как он должен жить и что он должен делать.2. Ответственность. Человек отвечает за тот как он строит свою жизнь и тратит свое время. Цитата про проактивность:
«Амебой», а не «Человеком», я назову человека, неосмысленно и безответственно плывущего по течению, реагирующего на внешние воздействия, но не применяющего свою свободу к построению своей жизни и не берущего на себя ответственность за то, что с его жизнью и его временем происходит.3. Развитие. Время жизни - время развития, время совершенствования.
К сожалению, именно на постсоветском пространстве эта болезнь особенно сильна. Сколько наш человек может придумать причин, почему он не несет ответственности за то, что с ним происходит. Виноваты всегда правительство, президент, жидомасоны, олигархи, демократы, коммунисты, ЖЭК, работодатель и т.д. Знакомо?
Тайм менеджент не только защита своего времени (время=деньги, позволять воровать свое время и чем не лучше, чем позволить украсть у тебя из кошелька, даже хуже, т.к. время не восполнимо), но и бережное отношение к времени других.
Не быть амебой поможет поставновка целей и определение ценностей.
Цели - самое простое для нас, мы творческая нация, мы умеем мечтать. Но дальше начинается этап тяжелого труда. Большинство жизнеописаний великих людей довольно-таки скучно читать. «Мы решили копать там, где никто еще не копал. Мы копали долго, все вокруг над нами смеялись. Потом сломалась лопата. Ее было сложно починить, но мы ее починили. Потом мы поняли, что копали не в ту сторону, а еще мы натерли мозоли до крови, а денег на пластырь не было, но мы все равно копали». Да, именно так - никаких чудес, никакой золотой рыбки, никакого «щучьего веления». Удача чаще приходит к тому, кто вкалывает, чем к тому, кто лежит на печи и ждет, когда же его жизнь изменится к лучшему.
Помни. Время невосполнимо.
PS: анекдот понравился: «Товарищи, товарищи, я без очереди!» - «Очередь для тех, кто без очереди, - в соседнее окошко!»2010-04-29
Порядок функциональных предикатов в запросе
Как показано в этой замечательной статье, если у оптимизатора нет информации о функции (статистике), то порядок предикатов в WHERE условии соответствует написанному в запросе.
Наличие статистики можно определить по трейсу 10053, в котором содержаться такие строки
Связать статистику с функцией можно при помощи селективности по-умолчанию:
Данная команда не очищает закешированные планы. Это можно сделать по хитрому, поменяв комментарий в используемой запросом таблице :)
Кроме селективности для функций можно задавать стоимость (CPU Cost, IO Cost, Net Cost)
Так же в статье описан Extensible Optimiser, представляющий собой объектный тип, возвращающий статистику по функции во время выполнения запроса.
Наличие статистики можно определить по трейсу 10053, в котором содержаться такие строки
No default cost defined for function SOME_FUNCTION
No default selectivity defined for function SOME_FUNCTIONСвязать статистику с функцией можно при помощи селективности по-умолчанию:
ASSOCIATE STATISTICS WITH FUNCTIONS quick_function DEFAULT SELECTIVITY 0.1;Данная команда не очищает закешированные планы. Это можно сделать по хитрому, поменяв комментарий в используемой запросом таблице :)
Кроме селективности для функций можно задавать стоимость (CPU Cost, IO Cost, Net Cost)
ASSOCIATE STATISTICS WITH FUNCTIONS high_cpu_io DEFAULT COST (6747773, 210, 0);Так же в статье описан Extensible Optimiser, представляющий собой объектный тип, возвращающий статистику по функции во время выполнения запроса.
2010-04-02
Порядок загрузки linux
После загрузки ядра читается файл /etc/inittab. В нем указывается уровень загрузки по умолчанию (уровень загрузки для большинства операционных систем свой).
TO KNOW: командой init 6 можно перезагрузить сервер
В /etc/inittab указываются скрипты или папки, которые запускаются при загрузке соответствующего уровня:
Для того, что бы добавить что-то в автозагрузку необходимо:
1. Написать скрипт и поместить его в /etc/init.d, дать ему необходимые привелегии
2. Поместить его через symlink в /etc/rc.d на необходимый уровень и на необходимое действие.
Если в заголовке скрипта прописано
то можно воспользоваться командой /sbin/chkconfig --add ИМЯ_СКРИПТА, которая добавит сервис автоматически.
В результате, для файла dbora, получим сформированные симлинки:
Также можно поместить вызов скрипта в /etc/rc.d/rc.local (или /etc/rc.local, что одно и то же). Скрипт выполняется один раз, до логина. Скрипт выполняется после всех инициализационных скриптов, но до окна логина.
Некоторые дистрибутивы линукса могут не запускать этот файл.
id:3:initdefault:TO KNOW: командой init 6 можно перезагрузить сервер
В /etc/inittab указываются скрипты или папки, которые запускаются при загрузке соответствующего уровня:
l3:3:wait:/etc/rc.d/rc 3Для того, что бы добавить что-то в автозагрузку необходимо:
1. Написать скрипт и поместить его в /etc/init.d, дать ему необходимые привелегии
2. Поместить его через symlink в /etc/rc.d на необходимый уровень и на необходимое действие.
Если в заголовке скрипта прописано
# chkconfig: 35 99 10
# description: Description hereто можно воспользоваться командой /sbin/chkconfig --add ИМЯ_СКРИПТА, которая добавит сервис автоматически.
- 35 -- на уровнях 3 и 5 сервис будет запускаться, на остальных останавливаться.
- 99 -- сервис будет запукаться где-то в конце
- 10 -- сервис будет останавливаться одним из первых.
В результате, для файла dbora, получим сформированные симлинки:
/etc/rc.d/rc0.d/K10dbora
/etc/rc.d/rc1.d/K10dbora
/etc/rc.d/rc2.d/K10dbora
/etc/rc.d/rc3.d/S99dbora
/etc/rc.d/rc4.d/K10dbora
/etc/rc.d/rc5.d/S99dbora
/etc/rc.d/rc6.d/K10dbora
К -- запуск для останова сервиса, dbora stop, S -- запуск сервиса dbora start. Скрипты выполняются по порядку нумерации, если хотим, что бы скрипт выполнился в начале, присваем ему номер поменьше.Также можно поместить вызов скрипта в /etc/rc.d/rc.local (или /etc/rc.local, что одно и то же). Скрипт выполняется один раз, до логина. Скрипт выполняется после всех инициализационных скриптов, но до окна логина.
Некоторые дистрибутивы линукса могут не запускать этот файл.
2010-04-01
Файлы инициализации в Linux
Типы запуска командной оболочки
Interctive login shell запускается, когда пользователь входит в систему посредством ввода логина и пароля (выполняется скрипт /bin/login и введенный пароль проверяется посредством /etc/passwd).
Interactive non login shell запускается, когда пользователь запускает оболочку без ввода пароля:
* [prompt]/bin/bash --
* su username (без минуса копирует родительское окружение, с минусом не копирует)
* xterm, console из графического интерфейса
Файлы, выполняющиеся при запуске командной оболочки
- /etc/profile -- запускается при любом входе в любую оболочку
- ~/.bashrc -- вход без логина (например, родительская оболочка установлена в ksh, в ней мы вызываем bash командой. Если мы хотим инициализировать переменные, то делаем это в этом файле).
- ~/.bash_profile -- вход с логином
- /etc/bashrc -- обычно существует и вызывается из ~/.bashrc (вызов пишется ручками, см. ниже)
- /etc/profile.d/*.sh -- вызывается из /etc/profile (вызов пишется ручками, см. ниже)
Взаимосвязи между файлами
На примере типичной конфигурации
1. ~/.bashrc вызывается из ~/.bash_profile. Если создавался пользователем самостоятельно, то этого важного вызова может и не быть
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi2. /etc/bashrc из ~/.bashrc
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi3. /etc/profile.d/*.sh из /etc/profile
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. $i
else
. $i >/dev/null 2>&1
fi
fi
done4. /etc/profile.d/*.sh из /etc/bashrc
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. $i
else
. $i >/dev/null 2>&1
fi
fi
doneТестирование запуска оболочек
Добавим в указанные выше файлы /etc/profile, ~/.bash_profile, ~/.bashrc, /etc/bashrc, /etc/profile.d/testbash.sh строчку с заполнением название скрипта в лог. Строка добавлена в конец файла, так что при вызове другого файла сначала появляется запись о другом файле, потом о текущем
При обычном входе с логином паролем
script name: /etc/profile.d/testbash.sh
script name: /etc/profile
script name: /etc/bashrc
script name: roots .bashrc
script name: roots .bash_profilesu - Запуск без сохранения окружения
script name: /etc/profile.d/testbash.sh
script name: /etc/profile
script name: /etc/bashrc
script name: roots .bashrc
script name: roots .bash_profilesu Запуск с сохранением окружения
script name: /etc/profile.d/testbash.sh
script name: /etc/bashrc
script name: roots .bashrcЗапуск скрипта
#!/bin/bash
echo HelloПУСТОЗапуск другой оболочки /bin/ksh
ПУСТОЗапуск /bin/bash
script name: /etc/profile.d/testbash.sh
script name: /etc/bashrc
script name: oracles .bashrcВыводы
Лучше всего окружение настраивать в .bashrc, убедившись, что в .bash_profile есть ссылка на .bashrc
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fiЗа более подробной информацией: info bash
По материалам статьи http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html
2010-03-17
sql loader загрузка master-detail
Задался интересным вопросом, вставки через loader таблиц master-detail.
Взял примерчик с forum.oracle.com, немного его попилил и наткнулся на проблему, что генерируемый в master table ключ получить из записи detail совсем не просто.
Итак задача: есть текстовый файл, содержащий данные из родительской и дочерней таблицы в перемешку. Нет доступа к серверу :) (что бы не было желания делать внешние таблицы) и неохота делать пост-процедуры обработки (как советует делать дядюшка Кайт). Но есть желание поизголяться с sql loader.
Пример входных данных:
Решение 1 (используя sequence)
Без OPTIONS (ROWS = 1) ничего работать не будет -- все дочерние записи привяжутся к последней записи
Решение 2 (натолкнувшее на написание этой задачи)
Допустим у нас есть какой-то признак, по которому мы можем найти родительскую запись (в примере добавил в конце строки еще поле). Будем получать по этому признаку идентификатор родителькой записи:
Но вынесем запрос для получения для идентификатора в функцию:
Такое ощущение, что тут что-то аналогичное bind array в dbms_sql -- запросы выполняются 1 раз для первой переменной массива.
Трейс, полученный в результате эксперимента (для немного измененной таблицы) для INSERT:
Взял примерчик с forum.oracle.com, немного его попилил и наткнулся на проблему, что генерируемый в master table ключ получить из записи detail совсем не просто.
Итак задача: есть текстовый файл, содержащий данные из родительской и дочерней таблицы в перемешку. Нет доступа к серверу :) (что бы не было желания делать внешние таблицы) и неохота делать пост-процедуры обработки (как советует делать дядюшка Кайт). Но есть желание поизголяться с sql loader.
Пример входных данных:
M,master1
D,master1-detail1
D,master1-detail2
D,master1-detail3
M,master2
D,master2-detail1
M,master3
D,master3-detail1Скрипт для создания объектов:CREATE TABLE master_table(ID NUMBER,code VARCHAR2(50),creation DATE);
CREATE TABLE detail_table(pid NUMBER, NAME VARCHAR2(100));
CREATE SEQUENCE testseq INCREMENT BY 1;Решение 1 (используя sequence)
OPTIONS (ROWS = 1)
LOAD DATA
INFILE *
TRUNCATE
INTO TABLE master_table
WHEN (1) ='M'
FIELDS TERMINATED BY ',' optionally enclosed by '"' TRAILING NULLCOLS
(id expression "testseq.nextval",
mcol1 filler,
code,
creation "sysdate"
)
INTO TABLE detail_table
WHEN (1) ='D'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(col1 filler position(1:2),
pid expression "testseq.currval" ,
name "UPPER(:name)")
BEGINDATA
M,master1
D,master1-detail1
D,master1-detail2
D,master1-detail3
M,master2
D,master2-detail1
M,master3
D,master3-detail1Без OPTIONS (ROWS = 1) ничего работать не будет -- все дочерние записи привяжутся к последней записи
Решение 2 (натолкнувшее на написание этой задачи)
Допустим у нас есть какой-то признак, по которому мы можем найти родительскую запись (в примере добавил в конце строки еще поле). Будем получать по этому признаку идентификатор родителькой записи:
OPTIONS (ROWS = 1)
LOAD DATA
INFILE *
TRUNCATE
INTO TABLE master_table
WHEN (1) ='M'
FIELDS TERMINATED BY ',' optionally enclosed by '"' TRAILING NULLCOLS
(mcol1 filler,
code,
id,
creation "sysdate"
)
INTO TABLE detail_table
WHEN (1) ='D'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(col1 filler position(1:2),
Name "UPPER(:name)",
pid "(select id from master_table WHERE id = :pid)")
BEGINDATA
M,master1,1
D,master1-detail1,1
D,master1-detail2,1
D,master1-detail3,1
M,master2,2
D,master2-detail1,2
M,master3,3
D,master3-detail1,3Пример так же работает только с OPTIONS (ROWS = 1). Без этого запрос к получению родительского идентификатора выполняется столько раз, сколько COMMIT было сделано и строки привязываются в хаотичном порядке.Но вынесем запрос для получения для идентификатора в функцию:
CREATE OR REPLACE FUNCTION f(aID VARCHAR2) RETURN NUMBER IS
BEGIN
FOR rec IN (select id from master_table WHERE id = aID) LOOP
RETURN rec.id;
END LOOP;
RETURN NULL;
END;и будем ее вызывать:Load DATA
INFILE *
TRUNCATE
INTO TABLE master_table
WHEN (1) ='M'
FIELDS TERMINATED BY ',' optionally enclosed by '"' TRAILING NULLCOLS
(mcol1 filler,
code,
id,
creation "sysdate"
)
INTO TABLE detail_table
WHEN (1) ='D'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(col1 filler position(1:2),
Name "UPPER(:name)",
pid "f(:pid)")
BEGINDATA
M,master1,1
D,master1-detail1,1
D,master1-detail2,1
D,master1-detail3,1
M,master2,2
D,master2-detail1,2
M,master3,3
D,master3-detail1,3Все работает нормально и без OPTIONS (ROWS = 1).Такое ощущение, что тут что-то аналогичное bind array в dbms_sql -- запросы выполняются 1 раз для первой переменной массива.
Трейс, полученный в результате эксперимента (для немного измененной таблицы) для INSERT:
INSERT INTO BDETAILS (ID,NAME,AMT,FLAG)
VALUES
(f(:"NAME"),(SELECT id FROM master_table WHERE chc = :"NAME") || ' ' ||
UPPER(:"NAME"),:AMT,:FLAG)
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 3 0.01 0.00 3 26 26 5
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.00 3 26 26 55 строк вставляются за 3 execute.2010-02-27
SQLNET.VALID_NODE_CHECKING
Фича, которая позволяет запрещать подключение клиентов через LISTENER.
Изначально имеем пустой файл sqlnet.ora на сервере:
С клиента у нас есть возможность подключиться к базе
Добавим в файл sqlnet.ora строки
и перезагружаем листенер командой
Таким образом мы запретили подключаться к серверу с машины sphaera144. С остальных машин подключение разрешено.
ПРИМЕЧАНИЕ: если на сервере файла sqlnet.ora вообще не было и мы его создаем заново, то lsnrctl reload не хватает. Необходимо использовать lsnrctl stop/start.
Изменим строку в файле sqlnet.ora на сервере с tcp.excluded_nodes=(sphaera144) на tcp.invited_nodes=(sphaera144).
и перезапустим листенер lsnrctl reload.
Пробуем подключится с машины sphaera144
Подключение разрешено только с SPHAERA144. Со всех остальных машин подключение запрещено.
Теперь добавим обе строки:
После подключения:
INVITED_NODES имеем преимущество перед EXCLUDED_NODES
выводы
1. Если нет файла sqlnet.ora на сервере, то listener необходимо перезагружать полностью. В остальных случаях хватает lsnrctl reload
2. При добавлении адреса в invited_nodes все остальные адреса запрещены.
3. invited_nodes имеет преимущество перед excluded_nodes -- подключиться можно только с тех адресов, которые разрешены.
Изначально имеем пустой файл sqlnet.ora на сервере:
> cat sqlnet.ora
>С клиента у нас есть возможность подключиться к базе
C:>sqlplus sps/sps@v-pc-dev-3
SQL*Plus: Release 10.2.0.3.0 - Production on Sat Feb 27 20:36:28 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - Production
SQL>Добавим в файл sqlnet.ora строки
tcp.validnode_checking=yes
tcp.excluded_nodes=(sphaera144)и перезагружаем листенер командой
lsnrctl reloadПосле перезагрузки при подключении с клиента имеем:C:\>sqlplus sps/sps@v-pc-dev-3
SQL*Plus: Release 10.2.0.3.0 - Production on Sat Feb 27 20:40:29 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-12547: TNS:lost contactТаким образом мы запретили подключаться к серверу с машины sphaera144. С остальных машин подключение разрешено.
ПРИМЕЧАНИЕ: если на сервере файла sqlnet.ora вообще не было и мы его создаем заново, то lsnrctl reload не хватает. Необходимо использовать lsnrctl stop/start.
Изменим строку в файле sqlnet.ora на сервере с tcp.excluded_nodes=(sphaera144) на tcp.invited_nodes=(sphaera144).
и перезапустим листенер lsnrctl reload.
Пробуем подключится с машины sphaera144
C:\>sqlplus sps/sps@v-pc-dev-3
SQL*Plus: Release 10.2.0.3.0 - Production on Sat Feb 27 20:45:43 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - ProductionС другой машины имеемC:\>sqlplus sps/sps@v-pc-dev-3
SQL*Plus: Release 10.2.0.3.0 - Production on Sat Feb 27 20:40:29 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-12547: TNS:lost contactПодключение разрешено только с SPHAERA144. Со всех остальных машин подключение запрещено.
Теперь добавим обе строки:
tcp.invited_nodes=(sphaera144)
tcp.excluded_nodes=(sphaera144)После подключения:
C:\>sqlplus sps/sps@v-pc-dev-3
SQL*Plus: Release 10.2.0.3.0 - Production on Sat Feb 27 20:45:43 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - ProductionINVITED_NODES имеем преимущество перед EXCLUDED_NODES
выводы
1. Если нет файла sqlnet.ora на сервере, то listener необходимо перезагружать полностью. В остальных случаях хватает lsnrctl reload
2. При добавлении адреса в invited_nodes все остальные адреса запрещены.
3. invited_nodes имеет преимущество перед excluded_nodes -- подключиться можно только с тех адресов, которые разрешены.
2010-02-07
Параметр OS_AUTHENT_PREFIX и подключение
Если приводить выдержку из документации:
OS_AUTHENT_PREFIX specifies a prefix that Oracle uses to authenticate users attempting to connect to the server. Oracle concatenates the value of this parameter to the beginning of the user's operating system account name and password. When a connection request is attempted, Oracle compares the prefixed username with Oracle usernames in the database.
Итак попробуем:
Теперь попробуем поменять значение префикса (для этого придется перезапускать экземпляр)
Попробуем создать пользователя не с паролем, а внешнего:
Выводы
1. При локальном подключении, если OS_AUTHENT_PREFIX отличен от OPS$, то пользователь в Oracle должен быть заведен identified externally
2. Если OS_AUTHENT_PREFIX=OPS$, то пользователь может быть заведен как внешний, так и с паролем.
Подключение по сети
А теперь попробуме подключится к серверу из вне без ввода пароля. Для этого (хоть Oracle этого так и не рекомендует, установим параметр REMOTE_OS_AUTHENT=TRUE.
Теперь попробуем варианты:
1. OS_AUTHENT_PREFIX <> OPS$, identified externally
2. OS_AUTHENT_PREFIX <> OPS$, identified by password
3. OS_AUTHENT_PREFIX = OPS$, identified by password
Таким образом для внешнего подключения при REMOTE_OS_AUTHENT=TRUE поведение такое же, как и для внутреннего.
OS_AUTHENT_PREFIX specifies a prefix that Oracle uses to authenticate users attempting to connect to the server. Oracle concatenates the value of this parameter to the beginning of the user's operating system account name and password. When a connection request is attempted, Oracle compares the prefixed username with Oracle usernames in the database.
Итак попробуем:
oracle@v-pc-dev-3:~> sqlplus /
ERROR:
ORA-01017: invalid username/password; logon denied
oracle@v-pc-dev-3:~> sqlplus / as sysdba
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - Production
SQL> show parameter os_authent_prefix
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix string ops$
SQL> grant create session to ops$oracle identified by pass;
Grant succeeded.
SQL> exit
Disconnected from Oracle Database 10g Release 10.2.0.1.0 - Production
oracle@v-pc-dev-3:~> sqlplus /
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - Production
SQL>Таким образом, создав пользователя OPS$ORACLE нам удалось подключится к локальному экземпляру без пароля.Теперь попробуем поменять значение префикса (для этого придется перезапускать экземпляр)
SQL> show parameter OS_AUTHENT_PREFIX
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix string XYZ$
SQL> grant create session to XYZ$ORACLE identified by pass; Мы создали пользователя Oracle, соответствующего данному префиксу. Теперь подключаемся:
oracle@v-pc-dev-3:~> sqlplus /
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Feb 7 15:05:04 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Упс. Не получилось.Попробуем создать пользователя не с паролем, а внешнего:
SQL> create user XYZ$ORACLE identified externally;
User created.
SQL> grant create session to XYZ$ORACLE;
Grant succeeded. и подключаемся снова
oracle@v-pc-dev-3:~> sqlplus /
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - ProductionВыводы
1. При локальном подключении, если OS_AUTHENT_PREFIX отличен от OPS$, то пользователь в Oracle должен быть заведен identified externally
2. Если OS_AUTHENT_PREFIX=OPS$, то пользователь может быть заведен как внешний, так и с паролем.
Подключение по сети
А теперь попробуме подключится к серверу из вне без ввода пароля. Для этого (хоть Oracle этого так и не рекомендует, установим параметр REMOTE_OS_AUTHENT=TRUE.
Теперь попробуем варианты:
1. OS_AUTHENT_PREFIX <> OPS$, identified externally
SQL> create user "XYZ$ANDREY.ZAYTSEV" identified externally;
SQL> grant connect to "XYZ$ANDREY.ZAYTSEV";
Grant succeeded.
/>sqlplus /@v-pc-dev-3
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - Production ПОЛУЧИЛОСЬ2. OS_AUTHENT_PREFIX <> OPS$, identified by password
SQL> create user "XYZ$ANDREY.ZAYTSEV" identified by pass;
User created.
SQL> grant connect to "XYZ$ANDREY.ZAYTSEV";
Grant succeeded.
/>sqlplus /@v-pc-dev-3
ERROR:
ORA-01017: invalid username/password; logon denied
НЕ ПОЛУЧИЛОСЬ 3. OS_AUTHENT_PREFIX = OPS$, identified by password
SQL> create user "OPS$ANDREY.ZAYTSEV" identified by pass;
User created.
SQL> grant connect to "OPS$ANDREY.ZAYTSEV";
Grant succeeded.
C:\Documents and Settings\andrey.zaytsev>sqlplus /@v-pc-dev-3
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - Production
ПОЛУЧИЛОСЬТаким образом для внешнего подключения при REMOTE_OS_AUTHENT=TRUE поведение такое же, как и для внутреннего.
Построчный вывод в SQL*Plus
Для построчного вывода в SQL*Plus:
SQL> set pause "Hit Enter"
SQL> set pagesize 1
SQL> set pause on
SQL> select rownum from all_objects where rownum <=5;
Hit Enter
1
Hit Enter
2
Hit Enter
3
Hit Enter
4
Hit Enter
5
Кроме того может пригодится ограничить количество выбираемых за раз строк:SQL> SET ARRAYSIZE 1Данная возможность может быть полезна для проверки поведения в конкурирующих сессиях.
2010-02-06
EVENTS in oracle
EVENTS в основном применяются для снятия трейсов, дампов, включения/выключения различных фич, патчей и т.д.
Задаются при помощи параметра инициализации EVENT - например для трассировки служебных процессов при старте экземпляра, утилиты ORADEBUG или с помощью команды
alter session/system SET EVENTS 'event_number trace name context forever, level event_level'
forever означает, что событие будет действовать пока мы его не отключим. Если forever нет, то событие повторяется ровно 1 раз. Так
Перечень событий можно посмотреть:
1. В интернете, например тут
2. В файле $ORACLE_HOME/rdbms/mesg/oraus.msg или используя oerr (для linuxов)
Интересные события
ALTER SYSTEM SET EVENTS '10231 trace name context forever, level 10';
пропуск бед-блоков при скинировании таблицы. Может помочь, если база вдруг нагнулась.
Снятие дампов
EVENTS можно использовать для снятия различных дампов, в случае возникновения ошибки:
Список доступных дампов посмотреть oradebug dumplist
Дамп "просто так":
P.S. Примеры взяты из книжки Norbert Debes "Secrets of the Oracle Database". Книга очень достойная

Задаются при помощи параметра инициализации EVENT - например для трассировки служебных процессов при старте экземпляра, утилиты ORADEBUG или с помощью команды
alter session/system SET EVENTS 'event_number trace name context forever, level event_level'
forever означает, что событие будет действовать пока мы его не отключим. Если forever нет, то событие повторяется ровно 1 раз. Так
ALTER SESSION SET EVENTS '10046 trace name context level 1'запишет в трейс ровно 1 команду ALTER и отключится.Перечень событий можно посмотреть:
1. В интернете, например тут
2. В файле $ORACLE_HOME/rdbms/mesg/oraus.msg или используя oerr (для linuxов)
>;oerr ora 10046
10046, 00000, "enable SQL statement timing"
// *Cause:
// *Action:Номера большинства event от 10000 до 10999.Интересные события
ALTER SYSTEM SET EVENTS '10231 trace name context forever, level 10';
пропуск бед-блоков при скинировании таблицы. Может помочь, если база вдруг нагнулась.
Снятие дампов
EVENTS можно использовать для снятия различных дампов, в случае возникновения ошибки:
ALTER {SESSION|SYSTEM} SET EVENTS 'error_code TRACE NAME dump_name LEVEL lvl'Список доступных дампов посмотреть oradebug dumplist
Дамп "просто так":
ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME dump_name LEVEL lvl'напримерALTER SESSION SET EVENTS 'immediate trace name systemstate level 10';P.S. Примеры взяты из книжки Norbert Debes "Secrets of the Oracle Database". Книга очень достойная
2010-01-29
Создание v$ представлений
То немногое полезное, что удалось подчерпнуть из книги Richard Niemiec Oracle database 10G Performance tuning tips and techniques.
fixed_tables, v$, gv$
При старте экземпляра исполняемый файл создает в SGA x$ таблицы. Некоторые из них доступны в NOMOUNT
На основе x$ таблиц строятся sys.gv$ представления. Их доступность в nomount/mount зависит от того, на основе чего построен запрос представления. Запросы к этим представлениям может делать только пользователь sys.
Посмотреть список sys.gv$ и sys.v$ представлений можно при помощи запроса
Для того, что бы дать возможность остальным пользователям посмотреть на данный из x$ таблиц делается следующее:
1. Создаются вьюхи с подчеркиванием sys.gv_$ и sys.v_$.
2. На вьюхи sys.gv_$ и sys.v_$ создаются публичные синонимы gv$ и v$.
Посмотреть это можно в catalog.sql (и 2 штуки в catldr.sql)
Запрашивая v$ мы делаем запрос к публичному синониму!!!
Доступность V$ в режиме mount и nomount
Доступность представлений зависит от таблиц, на которых они построены (КО). Так, в режиме nomount для вышеприведнной таблицы x$ksutm, которая доступна мы получим:
Используя приложение С из вышеописанной книги, найдем представление, которое зависит от словаря V$SEGMENT_STATISTICS (зависит от obj$, user$, x$ksolsfts, ts$, ind$) и выполним к нему запрос в режиме MOUNT:
fixed_tables, v$, gv$
При старте экземпляра исполняемый файл создает в SGA x$ таблицы. Некоторые из них доступны в NOMOUNT
SQL> select * from x$ksutm;
ADDR INDX INST_ID KSUTMTIM
-------- ---------- ---------- ----------
00000000 0 1 1733938708
некоторые в MOUNTselect * from x$kccfe;
select * from x$kccfe
*
ERROR at line 1:
ORA-01507: database not mountedнекоторые в open. Структура таблиц зашита в исполняемом файле(?). Перечень таблиц можно получить выполнив запросSELECT * FROM v$fixed_table WHERE TYPE ='TABLE'На основе x$ таблиц строятся sys.gv$ представления. Их доступность в nomount/mount зависит от того, на основе чего построен запрос представления. Запросы к этим представлениям может делать только пользователь sys.
create or replace view gv$fixed_table as
select inst_id,kqftanam, kqftaobj, 'TABLE', indx
from X$kqfta
union all
select inst_id,kqfvinam, kqfviobj, 'VIEW', 65537
from X$kqfvi
union all
select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537
from X$kqfdt;На основе sys.gv$ представлений строятся sys.v$ представления. Выглядит это так:select latch#,name, hash from gv$latchname where inst_id = userenv('Instance')т.е. из sys.gv$ не выбирается колонка inst_id и добавляется условие фильтрации inst_id = userenv('Instance')Посмотреть список sys.gv$ и sys.v$ представлений можно при помощи запроса
SELECT * FROM v$fixed_table WHERE TYPE ='VIEW'Какие запросы скрыты за представлениями можно при помощи запроса к вьюхе v$fixed_view_definition.Для того, что бы дать возможность остальным пользователям посмотреть на данный из x$ таблиц делается следующее:
1. Создаются вьюхи с подчеркиванием sys.gv_$ и sys.v_$.
2. На вьюхи sys.gv_$ и sys.v_$ создаются публичные синонимы gv$ и v$.
Посмотреть это можно в catalog.sql (и 2 штуки в catldr.sql)
create or replace view v_$gcshvmaster_info as select * from v$gcshvmaster_info;
create or replace public synonym v$gcshvmaster_info for v_$gcshvmaster_info;
grant select on v_$gcshvmaster_info to select_catalog_role;
create or replace view v_$gcspfmaster_info as select * from v$gcspfmaster_info;
create or replace public synonym v$gcspfmaster_info for v_$gcspfmaster_info;
grant select on v_$gcspfmaster_info to select_catalog_role;Для того, что бы дать конечному пользователю посмотреть v$, ему необходимо грантовать sys.v_$ представление.Запрашивая v$ мы делаем запрос к публичному синониму!!!
Доступность V$ в режиме mount и nomount
Доступность представлений зависит от таблиц, на которых они построены (КО). Так, в режиме nomount для вышеприведнной таблицы x$ksutm, которая доступна мы получим:
SQL> select * from v$timer;
HSECS
----------
1733979624А для недоступной таблицы x$kccfe:SQL> select * from v$filestat;
select * from v$filestat
*
ERROR at line 1:
ORA-01507: database not mountedУ меня есть предположение, что в mount не доступны те таблицы, которые зависят от ораклового словаря. Попробуем в этом убедится.Используя приложение С из вышеописанной книги, найдем представление, которое зависит от словаря V$SEGMENT_STATISTICS (зависит от obj$, user$, x$ksolsfts, ts$, ind$) и выполним к нему запрос в режиме MOUNT:
SQL> SELECT object_name FROM V$SEGMENT_STATISTICS WHERE ROWNUM <= 1;
SELECT object_name FROM V$SEGMENT_STATISTICS WHERE ROWNUM <= 1
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 2
ORA-01219: database not open: queries allowed on fixed tables/views onlyПри этом любое другое представление, не зависящее от словаря Oracle успешно работает:SQL> SELECT NAME FROM V$DATABASE;
NAME
---------
DB1
SQL> SELECT instance_name FROM V$INSTANCE;
INSTANCE_NAME
----------------
db1
2009-08-28
Стив Джобс
(с) Стив Джобс и три его истории

Ваша работа заполнит большую часть жизни и единственный способ быть полностью довольным – делать то, что по-вашему является великим делом. И единственный способ делать великие дела – любить то, что вы делаете.
2009-04-09
Команда для поиска самых больших файлов
В Linux для поиска самых больших файлов в каталоге и его подкаталогах использовать команду:

find . -type f -print | xargs du -m | sort -rn | less2009-03-03
Как читать CONNECT BY в плане
Нарыл очень полезную статью:
Striving for Optimal Performance » Operation CONNECT BY WITH FILTERING
В общем и целом смысл в чтении плана CONNECT BY WITH FILTERING:
Имеются 3 дочерние операции:
1. Получение первой строки START WITH (2)
2. Работа по извлечению строк следующего уровня, на основании текущего (3)
3. Строка, работающая, если все не помещается в памяти (8). На этот случай заведен баг, т.к. работать будет все очень долго.
PS: надо поискать книгу этого автора.

Striving for Optimal Performance » Operation CONNECT BY WITH FILTERING
В общем и целом смысл в чтении плана CONNECT BY WITH FILTERING:
---------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows |
---------------------------------------------------------------------
|* 1 | CONNECT BY WITH FILTERING | | 1 | 14 |
|* 2 | TABLE ACCESS FULL | EMP | 1 | 1 |
| 3 | NESTED LOOPS | | 4 | 13 |
| 4 | BUFFER SORT | | 4 | 14 |
| 5 | CONNECT BY PUMP | | 4 | 14 |
| 6 | TABLE ACCESS BY INDEX ROWID| EMP | 14 | 13 |
|* 7 | INDEX RANGE SCAN | EMP_MGR_I | 14 | 13 |
| 8 | TABLE ACCESS FULL | EMP | 0 | 0 |
---------------------------------------------------------------------
Имеются 3 дочерние операции:
1. Получение первой строки START WITH (2)
2. Работа по извлечению строк следующего уровня, на основании текущего (3)
3. Строка, работающая, если все не помещается в памяти (8). На этот случай заведен баг, т.к. работать будет все очень долго.
PS: надо поискать книгу этого автора.
2009-02-12
Полезные штуки для работы с ролями
Список привелегий можно получить из таблиц:
System_Privilege_Map - системные привелегии
Table_Privilege_Map - объектные привелегии
Список ролей в системе можно получить 2 способами: dba_roles, sys.user$
Список привелегий в сыром виде
sysauth$ - системные привелегии, роли
objauth$ - объектные привелегии
Список привелегий в обработанном виде
В обработанном виде, что бы посмотреть что чему грановано можно воспользоваться вьюхами: dba_tab_privs (All grants on objects in the database), dba_sys_privs (System privileges granted to users and roles), dba_role_privs (Roles granted to users and roles), dba_col_privs (All grants on columns in the database). Они представляют собой простую надстройку над сырыми таблицами, например:
Как видно, в dba_tab_privs не попадают некоторые привелегии (col# IS NULL). В моей базе это привелегии
Кроме того, для того, что бы сравнить все привелегии, доступные пользователю, придется строить древовидные структуры из роле (привелегия дана одной роли, роль - другой роли и т.д)
Вьюха dba_role_privs построена на табличке sysauth$:
Мои привелегии
Сужением указанных выше вьюх являются вьюхи:
Можно получить из вьюх:
Где посмотреть привелегии для текущей сессии:
За исключением dba_roles, dba_role_privs, user_role_privs, session_roles, описанных выше, можно отметить следующие вьюхи:
System_Privilege_Map - системные привелегии
Table_Privilege_Map - объектные привелегии
Список ролей в системе можно получить 2 способами: dba_roles, sys.user$
Список привелегий в сыром виде
sysauth$ - системные привелегии, роли
objauth$ - объектные привелегии
Список привелегий в обработанном виде
В обработанном виде, что бы посмотреть что чему грановано можно воспользоваться вьюхами: dba_tab_privs (All grants on objects in the database), dba_sys_privs (System privileges granted to users and roles), dba_role_privs (Roles granted to users and roles), dba_col_privs (All grants on columns in the database). Они представляют собой простую надстройку над сырыми таблицами, например:
create or replace view dba_tab_privs
(grantee, owner, table_name, grantor, privilege, grantable, hierarchy)
as
select ue.name, u.name, o.name, ur.name, tpm.name,
decode(mod(oa.option$,2), 1, 'YES', 'NO'),
decode(bitand(oa.option$,2), 2, 'YES', 'NO')
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.col# is null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#;Как видно, в dba_tab_privs не попадают некоторые привелегии (col# IS NULL). В моей базе это привелегии
GRANT UPDATE(some_column) ON tableКроме того, для того, что бы сравнить все привелегии, доступные пользователю, придется строить древовидные структуры из роле (привелегия дана одной роли, роль - другой роли и т.д)
Вьюха dba_role_privs построена на табличке sysauth$:
select /*+ ordered */ decode(sa.grantee#, 1, 'PUBLIC', u1.name), u2.name,
decode(min(option$), 1, 'YES', 'NO'),
decode(min(u1.defrole), 0, 'NO', 1, 'YES',
2, decode(min(ud.role#),null,'NO','YES'),
3, decode(min(ud.role#),null,'YES','NO'), 'NO')
from sysauth$ sa, user$ u1, user$ u2, defrole$ ud
where sa.grantee#=ud.user#(+)
and sa.privilege#=ud.role#(+) and u1.user#=sa.grantee#
and u2.user#=sa.privilege#
group by decode(sa.grantee#,1,'PUBLIC',u1.name),u2.name;
Мои привелегии
Сужением указанных выше вьюх являются вьюхи:
- all_tab_privs - Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
- all_col_privs - Grants on columns for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
- user_tab_privs - Grants on objects for which the user is the owner, grantor or grantee. Как видно, от all_tab_privs отличается отсутствием PUBLIC
- user_col_privs - Grants on columns for which the user is the owner, grantor or grantee
- user_sys_privs - System privileges granted to current user
- user_role_privs - Roles granted to current user
Можно получить из вьюх:
- all_col_privs_made - Grants on columns for which the user is owner or grantor
- all_col_privs_recd - Grants on columns for which the user, PUBLIC or enabled role is the grantee
- all_tab_privs_made - User's grants and grants on user's objects
- all_tab_privs_recd - Grants on objects for which the user, PUBLIC or enabled role is the grantee
- user_col_privs_made - All grants on columns of objects owned by the user
- user_col_privs_recd - Grants on columns for which the user is the grantee
- user_tab_privs_made - All grants on objects owned by the user
- user_tab_privs_recd - Grants on objects for which the user is the grantee
SELECT grantee, grantor, table_name FROM user_tab_privs
MINUS
SELECT grantee, grantor, table_name FROM user_tab_privs_made
MINUS
SELECT USER grantee, grantor, table_name FROM user_tab_privs_recdГде посмотреть привелегии для текущей сессии:
- table_privileges - Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee. От all_tab_privs отличается только большим набором колонок.
- session_privs - Privileges which the user currently has set. Во вьюхе содержаться системные привелегии. Сделана на основе sys.v$enabledprivs
- session_roles - Roles which the user currently has enabled. Отличается от user_role_privs тем, что роли могут быть задизейблены или отключены, например:
SQL> SELECT COUNT(*) FROM User_Role_Privs;
COUNT(*)
----------
28
SQL> SELECT COUNT(*) FROM session_roles;
COUNT(*)
----------
28
SQL> CREATE OR REPLACE PROCEDURE p IS
2 n NUMBER;
3 BEGIN
4 SELECT COUNT(*) INTO n FROM User_Role_Privs;
5 dbms_output.put_line('User_Role_Privs Count = ' || n);
6
7 SELECT COUNT(*) INTO n FROM session_roles;
8 dbms_output.put_line('session_roles Count = ' || n);
9 END;
10 /
Procedure created
SQL> EXEC p
User_Role_Privs Count = 28
session_roles Count = 0
PL/SQL procedure successfully completed
- column_privileges - Grants on columns for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee. От all_col_privs отличается только большим набором колонок.
За исключением dba_roles, dba_role_privs, user_role_privs, session_roles, описанных выше, можно отметить следующие вьюхи:
- role_role_privs - Roles which are granted to roles
- role_sys_privs - System privileges granted to roles
- role_tab_privs - Table privileges granted to roles
Подписаться на:
Сообщения (Atom)