<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>С Oracle по работе</title>
	<atom:link href="http://www.oraclist.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.oraclist.ru</link>
	<description>Описание вашего блога</description>
	<pubDate>Tue, 21 Feb 2012 04:44:13 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Самописная статистика по росту объектов базе данных ORACLE</title>
		<link>http://www.oraclist.ru/2012/02/samopisnaya-statistika-po-rostu-obektov-baze-dannyx-oracle/</link>
		<comments>http://www.oraclist.ru/2012/02/samopisnaya-statistika-po-rostu-obektov-baze-dannyx-oracle/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 04:44:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=74</guid>
		<description><![CDATA[Здравствуйте.
По работе мне понадобилось проследить рост объектов в базе данных (таблицы, индексы, лоб-объекты). Это нужно было для того, чтобы увидеть какие объекты и как быстро растут. Для этих целей я написал маленький “модулек”.
Будем делать этот модулек в схеме ser_mon.
1. Дадим права данной схеме на выборку из системного представления.
grant select on dba_segments to ser_mon;
2. Создадим таблицу [...]]]></description>
			<content:encoded><![CDATA[<p>Здравствуйте.</p>
<p>По работе мне понадобилось проследить рост объектов в базе данных (таблицы, индексы, лоб-объекты). Это нужно было для того, чтобы увидеть какие объекты и как быстро растут. Для этих целей я написал маленький “модулек”.</p>
<p>Будем делать этот модулек в схеме ser_mon.</p>
<p>1. Дадим права данной схеме на выборку из системного представления.</p>
<p style="padding-left: 30px; "><em>grant select on dba_segments to ser_mon;</em></p>
<p>2. Создадим таблицу в которой будет хранится информация по размеру объектов:</p>
<div style="padding-left: 30px; "><em>Create table SER_MON.OBJECTS_SIZE_STAT</em></div>
<div style="padding-left: 30px; "><em>(</em></div>
<div style="padding-left: 30px; "><em>check_date  DATE,</em></div>
<div style="padding-left: 30px; "><em>object_name VARCHAR2(255),</em></div>
<div style="padding-left: 30px; "><em>object_size NUMBER</em></div>
<div style="padding-left: 30px; "><em>)</em></div>
<div style="padding-left: 30px; "><em>tablespace USERS</em></div>
<div style="padding-left: 30px; "><em>pctfree 10</em></div>
<div style="padding-left: 30px; "><em>initrans 1</em></div>
<div style="padding-left: 30px; "><em>maxtrans 255</em></div>
<div style="padding-left: 30px; "><em>storage</em></div>
<div style="padding-left: 30px; "><em>(</em></div>
<div style="padding-left: 30px; "><em>initial 64K</em></div>
<div style="padding-left: 30px; "><em>next 1M</em></div>
<div style="padding-left: 30px; "><em>minextents 1</em></div>
<div style="padding-left: 30px; "><em>maxextents unlimited</em></div>
<div style="padding-left: 30px; "><em>);</em></div>
<div><em><br />
</em></div>
<div>3. Создадим процедуру, которая будет писать текущее состояние по объектам в созданную нами таблицу.</div>
<div>
<div style="padding-left: 30px; "><em>create or replace procedure ser_mon.check_objects_size is</em></div>
<div style="padding-left: 30px; "><em>begin</em></div>
<div style="padding-left: 30px; "><em>insert into ser_mon.objects_size_stat o (check_date,object_name,object_size)</em></div>
<div style="padding-left: 30px; "><em>select sysdate,s.owner || ‘.’ || s.segment_name, sum(s.bytes) / 1024 / 1024</em></div>
<div style="padding-left: 30px; "><em>from dba_segments s</em></div>
<div style="padding-left: 30px; "><em>where s.bytes / 1024 / 1024 &gt;1</em></div>
<div style="padding-left: 30px; "><em>group by s.owner || ‘.’ || s.segment_name;</em></div>
<div style="padding-left: 30px; "><em>commit;</em></div>
<div style="padding-left: 30px; "><em>exception when others then</em></div>
<div style="padding-left: 30px; "><em>p_log.put_in_log(p_proc_name =&gt; ’ser_mon.check_objects_size’,p_message =&gt; sqlerrm(),p_is_error =&gt; 1);</em></div>
<div style="padding-left: 30px; "><em>end check_objects_size;</em></div>
<div><em><br />
</em></div>
<div>4. Создадим джоб, который будет запускать созданную нами процедуру раз в сутки.</div>
<div>
<div style="padding-left: 30px; "><em>variable job number;</em></div>
<div style="padding-left: 30px; "><em>begin</em></div>
<div style="padding-left: 30px; "><em>sys.dbms_job.submit(job =&gt; :job,</em></div>
<div style="padding-left: 30px; "><em>what =&gt; ’ser_mon.check_objects_size();’,</em></div>
<div style="padding-left: 30px; "><em>next_date =&gt; to_date(’02-02-2012 23:00:00′, ‘dd-mm-yyyy hh24:mi:ss’),</em></div>
<div style="padding-left: 30px; "><em>interval =&gt; ‘trunc(sysdate+1)+23/24′);</em></div>
<div style="padding-left: 30px; "><em>commit;</em></div>
<div style="padding-left: 30px; "><em>end;</em></div>
<div style="padding-left: 30px; "><em>/</em></div>
<div><em><br />
</em></div>
</div>
<div>Все, модулек готов. Чтобы посмотреть как выросли объекты в бд нужно запустить следующий запрос:</div>
<div>
<div style="padding-left: 30px; "><em>select s1.object_name,</em></div>
<div style="padding-left: 30px; "><em>(s2.object_size - s1.object_size) as diff,</em></div>
<div style="padding-left: 30px; "><em>s1.object_size,</em></div>
<div style="padding-left: 30px; "><em>s2.object_size</em></div>
<div style="padding-left: 30px; "><em>from SER_MON.OBJECTS_SIZE_STAT s1, SER_MON.OBJECTS_SIZE_STAT s2</em></div>
<div style="padding-left: 30px; "><em>where trunc(s1.check_date) + 30 = trunc(sysdate)</em></div>
<div style="padding-left: 30px; "><em>and trunc(sysdate - 1) = trunc(s2.check_date)</em></div>
<div style="padding-left: 30px; "><em>and s1.object_name = s2.object_name</em></div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2012/02/samopisnaya-statistika-po-rostu-obektov-baze-dannyx-oracle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Уничтожение сессий ORACLE</title>
		<link>http://www.oraclist.ru/2012/02/unichtozhenie-sessij-oracle/</link>
		<comments>http://www.oraclist.ru/2012/02/unichtozhenie-sessij-oracle/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 04:34:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Теория]]></category>

		<category><![CDATA[kill]]></category>

		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=71</guid>
		<description><![CDATA[Конечно, уничтожение сессий в нормально работающей системе это случай выходящий за рамки обычного, но иногда все же такая возможность нужна.
В документации по ссылке описаны команды уничтожения сессий ( выдержка процитирована внизу заметки) .
Я думаю что наилучшим вариантом будет: alter system disconnect session&#8217;#SID,#SERIAL&#8217; immediate;

Повторюсь что я только начинающий ораклист и могу быть неправ. Если хотите поправить - [...]]]></description>
			<content:encoded><![CDATA[<p>Конечно, уничтожение сессий в нормально работающей системе это случай выходящий за рамки обычного, но иногда все же такая возможность нужна.</p>
<p>В документации по <a href=" http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_2013.htm#BABEBJFA" target="_blank">ссылке</a> описаны команды уничтожения сессий ( выдержка процитирована внизу заметки) .</p>
<p>Я думаю что наилучшим вариантом будет: <span><strong><em>alter system disconnect session&#8217;#SID,#SERIAL&#8217; immediate;</em></strong></span></p>
<p><span id="more-71"></span></p>
<p>Повторюсь что я только начинающий ораклист и могу быть неправ. Если хотите поправить - пишите в комментариях.</p>
<p><span style="text-decoration: underline;">Выдержка из документации:</span></p>
<p class="subhead2">DISCONNECT SESSION Clause</p>
<p>Use the <code>DISCONNECT</code> <code>SESSION</code> clause to disconnect the current session by destroying the dedicated server process (or virtual circuit if the connection was made by way of a Shared Sever). To use this clause, your instance must have the database open. You must identify the session with both of the following values from the <code>V$SESSION</code> view:</p>
<ul>
<li>For <code><span class="codeinlineitalic">integer1</span></code>, specify the value of the <code>SID</code> column.</li>
<li>For <code><span class="codeinlineitalic">integer2</span></code>, specify the value of the <code>SERIAL#</code> column.</li>
</ul>
<p>If system parameters are appropriately configured, then application failover will take effect.</p>
<ul>
<li>The <code>POST_TRANSACTION</code> setting allows ongoing transactions to complete before the session is disconnected. If the session has no ongoing transactions, then this clause has the same effect described for as<code>KILL</code> <code>SESSION</code>.</li>
<li>The <code>IMMEDIATE</code> setting disconnects the session and recovers the entire session state immediately, without waiting for ongoing transactions to complete.
<ul>
<li>If you also specify <code>POST_TRANSACTION</code> and the session has ongoing transactions, then the <code>IMMEDIATE</code> keyword is ignored.</li>
<li>If you do not specify <code>POST_TRANSACTION</code>, or you specify <code>POST_TRANSACTION</code> but the session has no ongoing transactions, then this clause has the same effect as described for <code>KILL</code> <code>SESSION</code> <code>IMMEDIATE</code>.
<div class="infoboxnotealso">
<p class="notep1">See Also:</p>
<p><a href="http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_2013.htm#i2198603">&#8220;Disconnecting a Session: Example&#8221;</a></div>
</li>
</ul>
</li>
</ul>
<p class="subhead2">KILL SESSION Clause</p>
<p>The <code>KILL</code> <code>SESSION</code> clause lets you mark a session as terminated, roll back ongoing transactions, release all session locks, and partially recover session resources. To use this clause, your instance must have the database open, and your session and the session to be terminated must be on the same instance. You must identify the session with both of the following values from the <code>V$SESSION</code> view:</p>
<ul>
<li>For <code><span class="codeinlineitalic">integer1</span></code>, specify the value of the <code>SID</code> column.</li>
<li>For <code><span class="codeinlineitalic">integer2</span></code>, specify the value of the <code>SERIAL#</code> column.</li>
</ul>
<p>If the session is performing some activity that must be completed, such as waiting for a reply from a remote database or rolling back a transaction, then Oracle Database waits for this activity to complete, marks the session as terminated, and then returns control to you. If the waiting lasts a minute, then Oracle Database marks the session to be terminated and returns control to you with a message that the session is marked to be terminated. The <code>PMON</code> background process then marks the session as terminated when the activity is complete.</p>
<p>Whether or not the session has an ongoing transaction, Oracle Database does not recover the entire session state until the session user issues a request to the session and receives a message that the session has been terminated.</p>
<div class="infoboxnotealso">
<p class="notep1">See Also:</p>
<p><a href="http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_2013.htm#i2260288">&#8220;Terminating a Session: Example&#8221;</a></div>
<p><span class="subhead3">IMMEDIATE </span>Specify <code>IMMEDIATE</code> to instruct Oracle Database to roll back ongoing transactions, release all session locks, recover the entire session state, and return control to you immediately.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2012/02/unichtozhenie-sessij-oracle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Знакомство с Automatic Workload Repository</title>
		<link>http://www.oraclist.ru/2011/05/znakomstvo-s-automatic-workload-repository/</link>
		<comments>http://www.oraclist.ru/2011/05/znakomstvo-s-automatic-workload-repository/#comments</comments>
		<pubDate>Wed, 18 May 2011 06:39:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[администрирование]]></category>

		<category><![CDATA[AWR]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=66</guid>
		<description><![CDATA[ 
Oracle предоставляет множество инструментов для сборки информации о базе данных и предоставления отчетов на ее основании. Изначально были скрипты UTLBSTAT/UTLESTAT, которые использовались для мониторинга метрик производительности. В Oracle 8i был представлен STATPACK, его функциональность была расширена в Oracle 9i. В версии Oracle Database 10g statpack эволюционировал в Automatic Workload Repository (AWR). AWR лицензируется как [...]]]></description>
			<content:encoded><![CDATA[<h1><span style="font-weight: normal; "> </span></h1>
<p>Oracle предоставляет множество инструментов для сборки информации о базе данных и предоставления отчетов на ее основании. Изначально были скрипты UTLBSTAT/UTLESTAT, которые использовались для мониторинга метрик производительности. В Oracle 8i был представлен STATPACK, его функциональность была расширена в Oracle 9i. В версии Oracle Database 10g statpack эволюционировал в Automatic Workload Repository (AWR). AWR лицензируется как часть пакета диагностики. Прежде чем его использовать убедитесь, лицензирована ли у вас эта опция. Но, в версии 10G осталась возможность использовать statpack, его функционал так же был расширен.</p>
<table border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><strong>Рекомендовано для:</strong></p>
<ul>
<li>Oracle Database 10g R1</li>
<li>Oracle Database 10g R2</li>
<li>Oracle Database 11g R1</li>
<li>Oracle Database 11g R2</li>
</ul>
</td>
<td align="right"></td>
</tr>
<tr>
<td colspan="2">
<div>
<p><strong><a href="http://www.itshop.ru/Oracle/l2t1f2c0sc0" target="_blank">Oracle</a></strong> предоставляет множество инструментов для сборки информации о базе данных и предоставления отчетов на ее основании. Изначально были скрипты UTLBSTAT/UTLESTAT, которые использовались для мониторинга метрик производительности. В Oracle 8i был представлен STATPACK, его функциональность была расширена в Oracle 9i. В версии Oracle Database 10g statpack эволюционировал в Automatic Workload Repository (AWR). AWR лицензируется как часть пакета диагностики. Прежде чем его использовать убедитесь, лицензирована ли у вас эта опция. Но, в версии 10G осталась возможность использовать statpack, его функционал так же был расширен.</p>
<p>AWR (Автоматический репозиторий рабочей нагрузки) основывается на похожих принципах сбора статистической информации в копии, как statspack и estat/bstat. Разница заключается в приёмах и методологии сбора информации, а также в количестве дополнительной информации.</p>
<h5>Схема работы AWR</h5>
<p>Automatic Workload Repository представляет из себя набор внутренних таблиц словаря данных БД Oracle и специальный фоновый процесс MMON, который появился в Oracle10g.</p>
<p>Периодически AWR создает статистическую копию (снимок) и сохраняет информацию в таблицах расположенных в табличном пространстве SYSAUX. По умолчанию регулярный период сбора установлен на 60 минут. Это значение может быть уменьшено до 10 минут при желании. Механизм сбора статистической копии (awr snapshot) установлен в базе данных 10G по умолчанию и в отличии от пакета statspack установки на автоматический сбор информации не требуется.</p>
<p>Как говорилось выше, для исполнения сбора статистики был введён новый фоновый процесс (MMON). За сбор информации для статистической копии отвечает подчинённый процесс (slave process) M001. В виду того, что MMON является фоновым процессом, влияние на производительность системы во время сбора информации сведено к минимуму путём доступа к структурам памяти (SGA) на прямую, минуя уровень SQL запросов.</p>
<p>Ниже, на рисунке, схематично показана архитектура AWR и его взаимодействие с другими компонентами <strong><a href="http://www.itshop.ru/Oracle/l2t1f2c0sc0" target="_blank">Oracle</a></strong>:</p>
<p><img src="http://www.interface.ru/iarticle/img/22589_40838065.png" border="0" alt="" width="606" height="402" /></p>
<p>Как видно из схемы, фоновый процесс MMON периодически опрашивает динамические представления V$ и таблицы X$ и переносит статистическую информацию в свои внутренние таблицы словаря данных с префиксом WRH$. По умолчанию, сбор статистики процессом MMON выполняется каждый час. Процесс MMON также ответственен за удаление устаревшей информации из репозитария AWR. В отличие от утилиты STATSPACK, AWR может хранить статистические данные в виде &#8216;скользящего окна&#8217;. Например, AWR хранит по умолчанию статистику только за последние семь дней, хотя его можно настроить так, что статистика будет удаляться только вручную, как это предусмотрено в STATSPACK. MMON также собирает статистику ожиданий для новой компоненты Active Session History (ASH), которая позволяет просматривать историю работы каждого активного сеанса базы данных.</p>
<h5>Репозиторий AWR</h5>
<p>Репозиторий представляет набор таблиц и представлений словаря данных Oracle. Владельцем репозитория является пользователь SYS, объекты репозитория размещены в табличном пространстве SYSAUX. Все данные размещаются в наборе таблиц с префиксом WR.</p>
<p>Статистическая информация, которая хранится в хранилище данных AWR активно используется, как внутренними, так и внешними компонентами Oracle, в то время как в STATPACK информация не использовалась, и дожидалась действий DBA. К внутренним компонентам, использующим статистику AWR, можно отнести такие новые компоненты, как Automatic Database Diagnostic Monitor (ADDM), SQL Tuning Advisor, SQL Access Advisor, Automatic Segment Advisor, Undo Advisor, Segment Advisorи т.д. Все эти компоненты впервые представлены в Oracle10g и служат для автоматизации и выработки рекомендаций по настройке производительности различных подсистем базы данных Oracle. Например, компонента ADDM автоматически выполняет анализ текущих данных в AWR после каждого нового снимка и показывает возможные узкие места в базе данных, а также предлагает свои рекомендации по возможным путям их решения. Внешними компонентами, использующими статистику AWR, являются Oracle Enterprise Manager, Statspack Viewer и т.д.</p>
<p>Хранилище данных механизма AWR содержит таблицы следующих типов:</p>
<ul>
<li>
<div>Таблицы с префиксом WRM$ хранят метаданные AWR. Например, таблица WRM$_SNAPSHOT хранит информацию обо всех снимках, которые хранятся в репозитории</div>
</li>
<li>
<div>Таблицы с префиксом WRH$ хранят собственно статистическую историю. Напрмер, таблица WRH$_SYSSTAT содержит снимки динамического представления V$SYSSTAT</div>
</li>
<li>
<div>Таблицы с префиксом WRI$ содержат служебную информацию различных компонент Oracle типа SQL Tuning Advisor, которые используют информацию AWR. Например, таблица WRI$_ADV_TASKS содержит историю о всех запусках advisory компонент, использующих данные AWR</div>
</li>
</ul>
<p>Ниже представлен запрос для получения списка этих таблиц:</p>
<div>
<pre>SELECT TABLE_NAME
FROM DBA_TABLES
WHERE TABLESPACE_NAME = 'SYSAUX'
AND SUBSTR(TABLE_NAME, 1,2) = 'WR'
AND ROWNUM &lt;= 20
ORDER BY 1;</pre>
</div>
<p>Результаты запроса:</p>
<p>TABLE_NAME<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
WRH$_ACTIVE_SESSION_HISTORY_BL<br />
WRH$_BG_EVENT_SUMMARY<br />
WRH$_BUFFER_POOL_STATISTICS<br />
WRH$_CLASS_CACHE_TRANSFER_BL<br />
WRH$_CR_BLOCK_SERVER<br />
WRH$_CURRENT_BLOCK_SERVER<br />
WRH$_DATAFILE<br />
WRH$_DB_CACHE_ADVICE_BL<br />
WRH$_DLM_MISC_BL<br />
WRH$_ENQUEUE_STAT<br />
WRI$_OPTSTAT_HISTGRM_HISTORY<br />
WRI$_OPTSTAT_HISTHEAD_HISTORY<br />
WRI$_OPTSTAT_IND_HISTORY<br />
WRI$_OPTSTAT_OPR<br />
WRI$_OPTSTAT_TAB_HISTORY<br />
WRI$_SCH_CONTROL<br />
WRI$_SCH_VOTES<br />
WRI$_SQLSET_BINDS<br />
WRI$_SQLSET_DEFINITIONS<br />
WRM$_BASELINE</p>
<p>Как видно, по именам таблиц легко догадаться о данных, которые в них размещены.</p>
<h5>Возможности AWR</h5>
<p>Можно разделить статистические данные собираемые AWR на два больших класса:</p>
<ul>
<li>
<div>События ожидания (wait event) - ситуация при которой сеанс ожидает завершения определённого события, например завершения запроса к диску (I/O request)</div>
</li>
<li>
<div>Распределение рабочего времени (time model statistics ) - в то время, как статистки класса ожидания описывают, где происходили главные простои системы, статистки класса распределения рабочего времени описывают на что было потрачено время во время работы, например сколько времени ушло на синтаксический анализ</div>
</li>
</ul>
<p>Automatic Workload Repository (AWR) используется для сбора статистики производительности, включая:</p>
<ul>
<li>
<div>Время ожидания ресурсов базы данных (foreground и background wait events). Эту статистическую информацию можно использовать для первоначального определения &#8216;узких&#8217; мест в производительности базы данных</div>
</li>
<li>
<div>Метрики, характеризующие скорость доступа к различным ресурсам базы данных. Например, процессорное время на вызов пользователя (CPU Tome Per User Call) или число логических чтений в секунду (Consistent Read Gets Per Sec). Этот вид статистики появился в Oracle10g и представляет собой набор автоматически вычисляемых процессом MMON статистик, которые раньше надо было вычислять вручную</div>
</li>
<li>
<div>Временные статистики, описывающие распределение использования процессорного времени (Time model). Этот вид статистик также является новшеством 10 версии и характеризует использование процессорного времени для выполнения определенных задач. Например, метрика sql execute elapsed time характеризует фактическое время выполнения запросов SQL. Наибольший интерес представляет собой метрика DB time, которая описывает общее процессорное время, затраченное Oracle для обслуживания всех пользовательских операций. Эту метрику можно использовать для мониторинга общей загрузки БД</div>
</li>
<li>
<div>Системные статистики, описывающие производительность экземпляра Oracle и операции ввода/вывода в табличные пространства/файлы данных базы</div>
</li>
<li>
<div>Статистика работы операционной системы. В 10 версии появилась возможность отслеживать основные параметры производительности операционной системы</div>
</li>
<li>
<div>Статистическая информация по SQL-запросам. Данный вид статистики позволяет DBA отслеживать ресурсоемкие SQL-запросы, используя различные критерии. Например, выбирать SQL-запросы, сделавшие наибольшее число операций ввода/вывода в файлы данных</div>
</li>
<li>
<div>Статистика по истории доступа к сегментам данных. Данный вид статистики позволяет выявить &#8220;горячие&#8221; сегменты данных, используя различные критерии, например, число логических или физических чтений данных сегмента</div>
</li>
</ul>
<h5>Управление AWR</h5>
<p>Для управления настройками AWR можно использовать стандартный пакет PL/SQL DBMS_WORKLOAD_REPOSITORY и графический интерфейс Oracle Enterprise Manager. Пакет DBMS_WORKLOAD_REPOSITORY содержит следующие вызовы:</p>
<p><strong>MODIFY_SNAPSHOT_SETTINGS</strong> - процедура позволяет настраивать частоту, с которой процесс MMON будет сохранять в хранилище AWR новый снимок статистик, а также временной интервал хранения этого снимка в базе данных. Текущие значения этих настроек можно посмотреть, выполнив SQL-запрос:</p>
<div>
<pre>SELECT
 EXTRACT( DAY FROM SNAP_INTERVAL) * 24 * 60 +
 EXTRACT( HOUR FROM SNAP_INTERVAL) * 60 +
 EXTRACT( MINUTE FROM SNAP_INTERVAL ) "SNAPSHOT INTERVAL (MIN)",
 EXTRACT( DAY FROM RETENTION) * 24 * 60 +
 EXTRACT( HOUR FROM RETENTION) * 60 +
 EXTRACT( MINUTE FROM RETENTION ) "RETENTION INTERVAL (MIN)"
FROM DBA_HIST_WR_CONTROL;</pre>
</div>
<p><strong>CREATE_SNAPSHOT</strong> - процедура позволяет вручную сохранить в репозитории AWR новый статистический снимок. Единственный параметр этой процедуры задает детализацию статистической информации, сохраняемой в БД. Значение по умолчанию для этого параметра задается параметром инициализации экземпляра Oracle STATISTICS_LEVEL. Допустимые значения этого параметра - TYPICAL и ALL. Обычно рекомендуется использовать уровень статистики TYPICAL, который достаточен для мониторинга производительности базы данных.</p>
<p><strong>DROP_SNAPSHOT_RANGE</strong> - процедура позволяет вручную удалять статистические данные для заданного набора снимков.</p>
<p><strong> CREATE_BASELINE</strong> - процедура позволяет создавать именованные наборы снимков для последующего сравнения производительности базы данных для различных временных интервалов.</p>
<p><strong>AWR_REPORT_TEXT</strong> и <strong>AWR_REPORT_HTML</strong> - функции позволяют вручную строить отчеты для заданных временных интервалов.</p>
<p>Константы пакета DBMS_WORKLOAD_REPOSITORY MIN_INTEVAL и MAX_INTERVAL задают допустимые минимальные и максимальные значения для интервала сбора статистики в минутах соответственно, а MIN_RETENTION и MAX_RETENTION задают минимальное и максимальное время хранения статистики в базе данных соответственно.</p>
<h5>Моментальные снимки (Snapshots)</h5>
<p>По умолчанию, снимки делаются каждый час и хранятся в течении 7 дней. Для определения установленных значений выполняется запрос:</p>
<div>
<pre>SELECT SNAP_INTERVAL,
 RETENTION
FROM DBA_HIST_WR_CONTROL;</pre>
</div>
<p>SNAP_INTERVAL      RETENTION<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;  &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
+00000 01:00:00.0  +00007 00:00:00:0</p>
<p>Результаты запроса показывают, что интервал создания снимков равен 1 часу и хранятся снимки 7 дней, т.е. выставлены значения, используемые по умолчанию.</p>
<p>Автоматическая сборка статистики возможна при значении параметра STATISTICS_LEVEL равным ALL или TYPICAL. Если значение равно BASIC, выполняется ручное управление снимками. Узнать текущее значение параметра можно выполнив запрос:</p>
<div>
<pre>SELECT NAME,
 VALUE
FROM GV$PARAMETER
WHERE NAME LIKE 'stat%';</pre>
</div>
<p>statistics_level    TYPICAL</p>
<p>Изменить значение параметра STATISTICS_LEVEL  можно конструкцией  ALTER SYSTEM или ALTER SESSION.</p>
<h6>Создание моментальных снимков</h6>
<p>По умолчанию, снимки создаются автоматически, но бывают ситуации, когда требуется ручное создание снимка. Для этого выполняется команда:</p>
<div>
<pre>BEGIN
 DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
END;</pre>
</div>
<p>Как видно, функция CREATE_SNAPSHOT не имеет параметров. Все необходимые параметры берутся из системы.</p>
<h6>Изменение настроек моментальных снимков</h6>
<p>Значения, предлагаемые Oracle по умолчанию, могут быть изменены. Для этого выполняется такой запрос:</p>
<div>
<pre>BEGIN
 DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
 -- Продолжительность хранения. Значение в минутах (установлено 30 дней).
 retention =&gt; 43200,
 -- Как часто делать снимок. Значение в минутах.
 interval =&gt; 30):
END;
/</pre>
</div>
<ul>
<li>
<div>Значение параметра RETENTION устанавливается в минутах, и должно быть в интервале от 1 440 (один день) до 52 596 000 (100 лет)</div>
</li>
<li>
<div>Значение параметра INTERVAL устанавливается в минутах, и должно быть в интервале от 10 до 525 600 (один год)</div>
</li>
</ul>
<p>Внесенные изменения и настройки отражаются в представлении DBA_HIST_WR_CONTROL. При установке значения интервал (interval) равное 0, снимки не делаются. Делать это не рекомендуется.</p>
<h6>Удаление снимков</h6>
<p>Для удаления снимков из репозитория используется процедура DROP_SNAPSHOT_RANGE:</p>
<div>
<pre>BEGIN
 DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE (
 low_snap_id =&gt; 42,
 high_snap_id =&gt; 52);
END;
/</pre>
</div>
<p>Вся информация о сделанных снимках может быть запрошена из представления DBA_HIST_SNAPSHOT. Далее представлен запрос иллюстрирующий это:</p>
<div>
<pre>COL INSTART_FMT NOPRINT;
COL INST_NAME FORMAT A12 HEADING 'Instance';
COL DB_NAME FORMAT A12 HEADING 'DB Name';
COL SNAP_ID FORMAT 99999990 HEADING 'Snap Id';
COL SNAPDAT FORMAT A18 HEADING 'Snap Started' JUST C;
COL LVL FORMAT 99 HEADING 'Snap/Level';
SET HEADING ON;
BREAK ON INST_NAME ON DB_NAME ON HOST ON INSTART_FMT SKIP 1;
TTITLE OFF;
SELECT
 TO_CHAR(S.STARTUP_TIME,' DD MON "at" HH24:MI:SS') INSTART_FMT,
 DI.INSTANCE_NAME INST_NAME,
 DI.DB_NAME DB_NAME,
 S.SNAP_ID SNAP_ID,
 TO_CHAR(S.END_INTERVAL_TIME,'DD MON YYYY HH24:MI') SNAPDAT,
 S.SNAP_LEVEL LVL
FROM DBA_HIST_SNAPSHOT S,
 DBA_HIST_DATABASE_INSTANCE DI
WHERE DI.DBID = S.DBID
 AND DI.INSTANCE_NUMBER = S.INSTANCE_NUMBER
 AND DI.STARTUP_TIME = S.STARTUP_TIME
ORDER BY SNAP_ID;</pre>
</div>
<h5>Базовые линии</h5>
<p>Базовые линии (baselines) - это пара снимков, представляющая период использования. Однажды определенные базовые линии могут использоваться для сравнения производительности в различные моменты времени по сравнению с прошлыми показателями. Для создания базовой линии используется конструкция:</p>
<div>
<pre>BEGIN
 DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE (
 start_snap_id =&gt; 210,
 end_snap_id =&gt; 220,
 baseline_name =&gt; 'first_baseline');
END;
/</pre>
</div>
<p>Пара снимков, ассоциированные с базовой линией сохраняется до тех пор, пока базовая линия не будет явно удалена:</p>
<div>
<pre>BEGIN
 DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE (
 baseline_name =&gt; 'first_baseline',
 cascade =&gt; FALSE); --Если значениеTRUE, то удаляются связанные снимки.
END;
/</pre>
</div>
<p>Для параметра CASCADE значение по умолчанию берется равным FALSE.</p>
<p>Если вы создали базовые линии для периода времени, то можно обратиться к представлению DBA_HIST_SNAPSHOT для определения идентификаторов снимков - SNAP_ID, вошедших в этот период:</p>
<div>
<pre>SELECT SNAP_ID,
 BEGIN_INTERVAL_TIME,
 END_INTERVAL_TIME
FROM DBA_HIST_SNAPSHOT
ORDER BY 1;</pre>
</div>
<p>SNAP_ID BEGIN_INTERVAL_TIME       END_INTERVAL_TIME<br />
&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
380     14-OCT-09 11.00.37.796 AM 14-OCT-09 12.00.11.515 PM<br />
381     14-OCT-09 12.00.11.515 PM 14-OCT-09 01.00.54.109 PM<br />
382     14-OCT-09 01.00.54.109 PM 14-OCT-09 02.00.34.906 PM<br />
383     14-OCT-09 02.00.34.906 PM 14-OCT-09 03.01.07.062 PM<br />
384     14-OCT-09 03.01.07.062 PM 14-OCT-09 04.00.41.343 PM<br />
385     14-OCT-09 04.00.41.343 PM 14-OCT-09 05.00.19.546 PM<br />
386     14-OCT-09 05.00.19.546 PM 14-OCT-09 06.00.57.187 PM<br />
387     14-OCT-09 06.00.57.187 PM 14-OCT-09 07.00.35.734 PM<br />
388     14-OCT-09 07.00.35.734 PM 14-OCT-09 08.00.13.734 PM<br />
389     14-OCT-09 08.00.13.734 PM 14-OCT-09 09.00.51.812 PM<br />
390     14-OCT-09 09.00.51.812 PM 14-OCT-09 10.00.30.234 PM</p>
<h5>Запуск отчета AWR</h5>
<p>В отличие от механизма statspack при использовании AWR нет надобности настраивать автоматический механизм сбора копий (snapshots). Эта функция работает по умолчанию в любой базе 10-ой версии. Пользователю остается лишь получить отчёт, который основывается на выбранных копиях.</p>
<p>Для получения отчетов, Oracle предоставляет два скрипта awrrpt.sql и awrrpti.sql. Для генерации отчета выполните скрипты:</p>
<div>
<pre>@$ORACLE_HOME/rdbms/admin/awrrpt.sql
@$ORACLE_HOME/rdbms/admin/awrrpti.sql</pre>
</div>
<p>Запуск из SQLPlus осуществляется как показано ниже:</p>
<div>
<pre>SQL&gt; @?/rdbms/admin/awrrpt.sql
SQL&gt; @?/rdbms/admin/ awrrpti.sql</pre>
</div>
<p>После запуска на исполнение, будет предложено выбрать формат отчета -  текстовый вариант или HTML. Указать идентификаторы начального и конечного снимков и месторасположение отчета. После того, как отчет сформирован, его можно просмотреть в браузере или любом текстовом редакторе. Пример исполнения отчета:</p>
<p>SQL&gt; @$ORACLE_HOME/rdbms/admin/awrrpti.sql<br />
Specify the Report Type<br />
~~~~~~~~~~~~~~~~~~~~~~~<br />
Would you like an HTML report, or a plain text report?<br />
Enter &#8216;html&#8217; for an HTML report, or &#8216;text&#8217; for plain text<br />
Defaults to &#8216;html&#8217;</p>
<p>На этом шаге запрашивается формат отчета, для получения в HTML введите html, для получения текстового варианта укажите text. По умолчанию используется HTML, в приведенном примере указан HTML:</p>
<p>Enter value for report_type: html<br />
Type Specified: html<br />
Instances in this Workload Repository schema<br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</p>
<p>DB Id        Inst Num DB Name      Instance     Host<br />
&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8211;<br />
* 268115148         1 ALL_ORACLE   ALL_ORACLE   TEST</p>
<p>Enter value for dbid: 268115148<br />
Using 268115148 for database Id<br />
Enter value for inst_num: 1<br />
Using 1 for instance number<br />
Using the Automatic Workload Repository (AWR) 273<br />
Specify the number of days of snapshots to choose from<br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Entering the number of days (n) will result in the most recent (n) days of<br />
snapshots being listed. Pressing without specifying a number<br />
lists all completed snapshots.</p>
<p>Listing the last 3 days of Completed Snapshots<br />
Snap<br />
Instance     DB Name      Snap Id   Snap Started       Level<br />
&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;-<br />
lnx1         LNX1               290 20 Oct 2009 00:00     1<br />
291                                 20 Oct 2009 01:00     1<br />
292                                 20 Oct 2009 02:00     1<br />
293                                 20 Oct 2009 03:00     1<br />
294                                 20 Oct 2009 04:00     1<br />
295                                 20 Oct 2009 05:00     1</p>
<p>Specify the Begin and End Snapshot Ids<br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</p>
<p>На этом шаге будут запрошены идентификаторы начального и конечного снимков</p>
<p>Enter value for begin_snap: 290<br />
Begin Snapshot Id specified: 290<br />
Enter value for end_snap: 295<br />
End Snapshot Id specified: 295<br />
Specify the Report Name<br />
~~~~~~~~~~~~~~~~~~~~~~~<br />
The default report file name is awrrpt_1_290_345.html. To use this name,<br />
press to continue, otherwise enter an alternative.</p>
<p>И на последнем шаге будет предложено указать имя отчета или использовать предложенное системой:</p>
<p>Enter value for report_name: report.html<br />
Using the report_name report.html</p>
<p>Главное отличие от statspack заключается в том, что в простом отчёте AWR текст SQL команд представлен полностью, а не частично как это было раньше. Также можно использовать $ORACLE_HOME/rdbms/admin/awrsqrpt.sql для получения детального отчёта по определённому SQL.</p>
<h5>Примеры использования информации AWR</h5>
<p>Как было сказано выше, хранилище данных AWR служит источником данных о работе сервера баз данных для различных компонент сервера. Описание настройки других подсистем сервера, которые используют хранилище AWR для выработки своих рекомендаций, остается за рамками этой статьи. Ниже приведено несколько примеров того, как можно использовать информацию AWR для анализа тенденций в работе сервера Oracle. Анализ тенденций, или трендов, позволяет увидеть картину того, какие характеристики производительности имеет база данных по часам в течение дня или по дням недели. Обычно такая усредненная картина достаточно точно описывает поведение базы данных для конкретного набора приложений и конечных пользователей. Это позволяет более эффективно определять узкие места в работе и моменты времени, когда возможен спад производительности сервера.</p>
<p>Например, DBA хочет знать, какой в среднем объем физических чтений и в какие моменты времени в течение дня генерирует база данных. Приведенный ниже запрос к хранилищу AWR отвечает на этот вопрос:</p>
<div>
<pre>SET PAGES 999
SET PAGESIZE 1000
BREAK ON SNAP_TIME SKIP 2
COL SNAP_TIME FORMAT A19 HEADING 'Day Hour'
COL AVG_VALUE FORMAT 999,999,999 HEADING 'Avg Physical Reads'
SELECT TO_CHAR(BEGIN_INTERVAL_TIME,'hh24') SNAP_TIME,
 AVG(VALUE) AVG_VALUE
FROM DBA_HIST_SYSSTAT
NATURAL JOIN
 DBA_HIST_SNAPSHOT
WHERE STAT_NAME = 'physical reads'
GROUP BY TO_CHAR(BEGIN_INTERVAL_TIME,'hh24')
ORDER BY TO_CHAR(BEGIN_INTERVAL_TIME,'hh24');</pre>
</div>
<p>Пример результата работы этого скрипта может выглядеть следующим образом:</p>
<p>Hour         Avg Physical Reads<br />
&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
00                        76,120<br />
01                        90,200<br />
02                       150,395<br />
03                       170,028<br />
04                       176,677<br />
05                       175,874<br />
06                       172,680<br />
07                       177,164<br />
08                       278,073<br />
09                       281,816<br />
10                       482,518<br />
11                       781,793<br />
12                       986,012<br />
13                       863,357<br />
14                       471,752<br />
15                       367,471<br />
16                       274,219<br />
17                       273,576<br />
18                       269,362<br />
19                       174,765<br />
20                       174,083<br />
21                       169,860<br />
22                       75,2070<br />
23                       74,5340</p>
<p>Из приведенного выше отчета видно, что наибольший объем операций физического чтения приходится в среднем на период времени с 11 до 13 часов, что может вызвать нежелательные задержки в работе пользователей. Знание подобного рода информации позволяет <a href="http://www.all-oracle.ru/content/glossary/default.aspx?id=91" target="_blank">DBA</a> более точно локализовать причины подобного рода проблем. Если скопировать полученные данные в Excel и построив график, можно получить графическое представление ситуации, как показано на нижеприведенном рисунке:</p>
<p><img src="http://www.interface.ru/iarticle/img/22589_40838066.png" border="0" alt="" width="532" height="291" /></p>
<p>Тот же отчет, но по дням недели выглядит следующим образом:</p>
<div>
<pre>SET PAGES 999
SET PAGESIZE 1000
BREAK ON SNAP_TIME SKIP 2
COL SNAP_TIME FORMAT A19 HEADING 'Week Day'
COL AVG_VALUE FORMAT 999,999,999 HEADING 'Avg Physical Reads'
SELECT TO_CHAR(BEGIN_INTERVAL_TIME,'day') SNAP_TIME,
 AVG(VALUE) AVG_VALUE
FROM DBA_HIST_SYSSTAT
NATURAL JOIN
 DBA_HIST_SNAPSHOT
WHERE STAT_NAME = 'physical reads'
GROUP BY TO_CHAR(BEGIN_INTERVAL_TIME,'day')
ORDER BY 2 DESC;</pre>
</div>
<p>Week Day            Avg Physical Reads<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
wednesday                      569,687<br />
monday                         515,349<br />
tuesday                        493,313<br />
thursday                       305,815<br />
friday                         297,250<br />
sunday                         190,185<br />
saturday                       170,332</p>
<p>Еще один пример аналитического отчета, приведенный ниже, показывает усредненное время ожидания по часам суток, что позволяет определить, в какие моменты пользовательские сессии потенциально могут иметь задержку с ответом на свои запросы, вызванную ожиданием каких-либо ресурсов базы данных:</p>
<div>
<pre>SELECT TO_CHAR(H.SAMPLE_TIME,'HH24') "Hour",
 SUM(H.WAIT_TIME/100) "Total Wait Time (Sec)"
FROM V$ACTIVE_SESSION_HISTORY H,
 V$EVENT_NAME N
WHERE H.SESSION_STATE = 'ON CPU'
 AND H.SESSION_TYPE = 'FOREGROUND'
 AND H.EVENT_ID = N.EVENT_ID
 AND N.WAIT_CLASS &lt;&gt; 'Idle'
GROUP BY
 TO_CHAR(H.SAMPLE_TIME,'HH24');</pre>
</div>
<p>Hour Total Wait Time (Sec)<br />
&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
11                     219<br />
12                 302,998<br />
13                  60,982<br />
14                 169,716<br />
15                  39,593<br />
16                 299,953<br />
17                 122,933<br />
18                   5,147</p>
<p>Таким образом, механизм AWR наряду со стандартным набором отчетов предоставляет широкие возможности по более детальному анализу производительности в различных временных срезах. Использование AWR совместно с такими новыми технологиями Oracle, такими как Active Session History, улучшенный Wait Event Interface и набором встроенных утилит ADDM, SQL Tuning Advisor и других значительно облегчает задачи администрирования, мониторинга и поддержания производительности больших систем Oracle на необходимом уровне.</p>
<p>На этом позвольте завершить эту обзорную статью посвященную AWR. Удачи.</p></div>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2011/05/znakomstvo-s-automatic-workload-repository/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SGA, PGA и процессы.</title>
		<link>http://www.oraclist.ru/2011/05/sga-pga-i-processy/</link>
		<comments>http://www.oraclist.ru/2011/05/sga-pga-i-processy/#comments</comments>
		<pubDate>Thu, 12 May 2011 10:17:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Теория]]></category>

		<category><![CDATA[PGA]]></category>

		<category><![CDATA[SGA]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=63</guid>
		<description><![CDATA[ЭКЗЕМПЛЯР ORACLE
Экземпляр Oracle состоит из процессов и разделяемой  памяти, необходимой для доступа к информации в БД. Если копнуть чуть  глубже, то экземпляр составляют пользовательские процессы, фоновые  процессы Oracle и разделяемая область памяти, которую используют все эти  процессы.
Что же представляет собой разделяемая память  (shared memory)? Oracle использует разделяемую память в разных [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ЭКЗЕМПЛЯР ORACLE</strong></p>
<p align="justify">Экземпляр Oracle состоит из процессов и разделяемой  памяти, необходимой для доступа к информации в БД. Если копнуть чуть  глубже, то экземпляр составляют пользовательские процессы, фоновые  процессы Oracle и разделяемая область памяти, которую используют все эти  процессы.</p>
<p align="justify">Что же представляет собой разделяемая память  (shared memory)? Oracle использует разделяемую память в разных целях:  как кэширование данных и индексов, так и хранение программного кода.  Разделяемая память делится на несколько частей (или структур памяти).  Основными структурами памяти Oracle являются Системная Глобальная  Область (System Global Area или SGA) и Программная Глобальная Область  (Program Global Area или PGA). Рассмотрим SGA и PGA более подробно.  <span id="more-63"></span></p>
<p align="justify"><strong>Системная Глобальная Область (SGA) </strong></p>
<p align="justify">SGA - это область разделяемой памяти, которую  Oracle использует для хранения данных и управляющей информации одного  конкретного экземпляра Oracle. SGA размещается в памяти при запуске  экземпляра Oracle и освобождает память при останове. Каждый запущенный  экземпляр Oracle имеет свою собственную SGA. Информация в SGA состоит из  следующих компонентов (каждый из которых создается в памяти при запуске  экземпляра):</p>
<ul>
<li>
<div>кэш буферов БД - здесь хранятся последние открытые  блоки данных. Эти блоки могут содержать данные, которые изменились, но  еще не были записаны на диск (грязные блоки); данные, которые не  изменялись либо были записаны на диск после изменения (чистые блоки).  Так как кэш буферов БД хранит блоки данных на основе алгоритма последних  используемых блоков, то наиболее активно используемые блоки постоянно  остаются в памяти (тем самым, снижая дисковый ввод/вывод и увеличивая  производительность системы).</div>
</li>
<li>
<div>буфер журнала изменений - хранит данные об  изменениях БД. Буфер журнала изменений записывается в файл журнала  изменений настолько быстро и эффективно, насколько это возможно.  Помните, что журнал изменений используется для восстановления экземпляра  СУБД Oracle в случае сбоя системы.</div>
</li>
<li>
<div>разделяемый пул - Это область SGA, в которой  хранятся такие структуры разделяемой памяти, как разделяемые SQL-области  в библиотечном кэше и внутренняя информация словаря данных. Разделяемый  пул важен, потому что недостаточный объем памяти, выделенный для него,  может привести к деградации производительности всей системы. Разделяемый  пул состоит из библиотечного кэша и кэша словаря данных.</div>
</li>
</ul>
<p align="justify">Библиотечный кэш используется для хранения  разделяемых SQL. Здесь для каждого уникального SQL-выражения строиться  дерево разбора строк и план исполнения, которые кэшируются (т.е.  сохраняются в библиотечном кэше). Если несколько приложений отправляют  одинаковые SQL-выражения, то для ускорения работы используется  разделяемая SQL-область (так как используются уже разобранные строки и  готовый план исполнения, то происходит экономия времени).</p>
<p align="justify">Кэш словаря данных содержит набор таблиц и  представлений, используемых в качестве ссылок к БД Oracle. Здесь  храниться информация о логической и физической структуре БД. Словарь  данных содержит следующую информацию:</p>
<ul>
<li>
<div>пользовательская информация (например, пользовательские привилегии)</div>
</li>
<li>
<div>ограничения целостности, определенные для таблиц БД</div>
</li>
<li>
<div>имена и типы данных всех столбцов таблиц БД</div>
</li>
<li>
<div>информация об объеме памяти, определенном и используемом объектами схемы данных</div>
</li>
</ul>
<p align="justify">Oracle часто обращается к словарю данных при разборе  SQL-выражений. Эти обращения составляют сущность работы Oracle. Узкие  места в словаре данных влияют работу всех пользователей системы Oracle.  Поэтому Вы всегда должны быть уверены, что объем памяти, определенный  для словаря данных, достаточно велик для кэширования данных. Если кэш  словаря данных мал, то Вы заметите значительное снижение  производительности. Когда под кэш словаря данных Вы определите  достаточный объем памяти, существенных проблем с производительностью  быть не должно.</p>
<p align="justify"><strong>Программная Глобальная Область (PGA) </strong></p>
<p align="justify">Программная Глобальная Область - это такая  область памяти, в которой хранятся данные и управляющая информация о  серверных процессах Oracle. Размер и содержание PGA определяется  опциями, которые Вы указываете при инсталляции Oracle. Эта область  состоит из следующих компонентов:</p>
<ul>
<li>
<div>пространство стека - это память, хранящая переменные сеансов, массивы сеансов и т.д.</div>
</li>
<li>
<div>информация сеанса - если Oracle работает не в  мультинитевом режиме, то информация сеанса хранится в PGA. В противном  случае, информация сеанса хранится в SGA.</div>
</li>
<li>
<div>приватная SQL-область - это часть PGA, где хранятся связанные переменные и буферы реального времени.</div>
</li>
</ul>
<p><strong>ПРОЦЕССЫ</strong></p>
<p align="justify">Процесс (или нить) - это механизм выполнения  программного кода, который может выполняться незаметно для пользователя.  Кроме того, несколько процессов могут работать одновременно. В разных  операционных системах и на разных платформах они могут называться  по-разному (процессы, нити, демоны и т.д.), но, в сущности, одинаковы.  СУРБД Oracle работает с двумя видами процессов: пользовательские  процессы и процессы Oracle (также известные как фоновые или теневые). В  некоторых операционных системах (таких как Windows NT) процессы  действительно являются нитями, но, чтобы не путаться в понятиях, будем  называть их просто &#8220;процессами&#8221;.</p>
<p align="justify">Пользовательские процессы</p>
<p align="justify">Пользовательские (клиентские) процессы - это  пользовательские соединения с СУРБД. Пользовательский процесс управляет  вводом и взаимодействует с серверными процессами Oracle через  программный интерфейс Oracle. Пользовательский процесс используется  также для выдачи информации пользователю, и, при необходимости,  представляет ее в более удобной форме.</p>
<p align="justify">Процессы Oracle</p>
<p align="justify">Процессы Oracle выполняют функции для  пользовательских процессов. Могут быть разбиты на две группы: серверные  процессы (выполняющие функции для активных процессов) и фоновые процессы  (выполняют функции СУРБД в целом).</p>
<p align="justify">Серверные процессы (теневые) взаимодействуют  между процессами пользовательскими и Oracle, исполняя пользовательские  запросы. Например, если пользовательский процесс запрашивает часть  данных, которых еще нет в SGA, то теневой процесс несет ответственность  за чтение блоков данных из БД в SGA. Между пользовательским и теневым  процессом возникает связь один-к-одному (конфигурация выделенного  сервера), хотя один теневой процесс может одновременно взаимодействовать  с несколькими пользовательскими (конфигурация мультинитевого сервера),  экономя системные ресурсы.</p>
<p align="justify">Фоновые процессы используются для выполнения  разнообразных задач СУРБД Oracle. Эти задачи варьируются от  взаимодействия с экземпляром Oracle до записи грязных блоков на диск.  Далее представлены девять фоновых процессов Oracle:</p>
<ul>
<li>
<div>DBWR (DataBase Writer) - ответственен за запись  грязных блоков из блоковых буферов БД на диск. Когда транзакция изменяет  информацию в блоке данных, этот блок данных не обязан быть немедленно  записан на диск. Следовательно, DBWR может записывать данные на диск  способом более эффективным, чем запись всех изменений по отдельности.  DBWR обычно записывает данные тогда, когда они уже нужны для чтения.  Записываются также те данные, которые были недавно использованы. Для  систем с асинхронным вводом/выводом достаточно одного процесса DBWR. Для  остальных систем можно значительно увеличить производительность, создав  несколько процессов DBWR.</div>
</li>
<li>
<div>LGWR (LoG Writer) - записывает данные из журнального буфера в журнал изменений.</div>
</li>
<li>
<div>CKPT (ChecK PoinT) - дает сигнал процессам DBWR о  необходимости выполнения контрольной точки и обновления всех файлов  данных и управляющих файлов. Контрольная точка - это событие, когда все  измененные буферы БД записываются на диск. CKPT - это не обязательный  процесс. Если процесс CKPT не запущен, то его работу принимает на себя  LGWR.</div>
</li>
<li>
<div>PMON (Process MONitor) - используется для  поддержания остальных процессов и перезапуска преждевременно погибших <img src='http://www.oraclist.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Также PMON очищает неиспользуемые области буферов и освобождает те  ресурсы, которые могут быть еще заняты. Ответственен за перезапуск всех  зависших процессов и диспетчеров.</div>
</li>
<li>
<div>SMON (System MONitor) - выполняет восстановление  экземпляра при его запуске. Это включает очистку временных сегментов и  восстановление незаконченных транзакций. А также дефрагментирует БД.</div>
</li>
<li>
<div>RECO (RECOvery) - очищает незаконченные транзакции в распределенной БД. Выполняет фиксацию или откат спорных транзакций.</div>
</li>
<li>
<div>ARCH (ARCHiver) - копирует файлы журнала изменений  при их заполнении. ARCH активен только в том случае, если СУРБД работает  в режиме ARCHIVELOG. Если система не работает в этом режиме, то  возможны ситуации, в которых не удастся восстановить систему после сбоя.  В некоторых случаях все же можно работать и в режиме NOARCHIVELOG.</div>
</li>
<li>
<div>LCKn (Parallel Server LoCK) - до десяти процессов  (где n - от 0 до 9) могут использоваться при работе сервера в  параллельном режиме. Выполняют функции межэкземплярной блокировки.</div>
</li>
<li>
<div>Dnnn (Dispatcher) - при работе сервера в  мультинитевом режиме, то существует хотя бы один диспетчерский процесс,  ответственный за каждый протокол взаимосвязи. Диспетчерские процессы  организуют взаимодействие между пользовательскими и разделяемыми  серверными процессами.</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2011/05/sga-pga-i-processy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Просмотр самых встречающихся объектов в архивных и оперативных логах</title>
		<link>http://www.oraclist.ru/2011/03/prosmotr-samyx-vstrechayushhixsya-obektov-v-arxivnyx-i-operativnyx-logax/</link>
		<comments>http://www.oraclist.ru/2011/03/prosmotr-samyx-vstrechayushhixsya-obektov-v-arxivnyx-i-operativnyx-logax/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 04:25:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[администрирование]]></category>

		<category><![CDATA[archive log]]></category>

		<category><![CDATA[logminer]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=60</guid>
		<description><![CDATA[Иногда надо просматривать что же такого много нагенерированного в логах.. вот написал тестовый скрипт.
На входе дата начала просмотра и дата окончания - на выходе самые частовстречающиеся объекты по 5 штук для каждой инструкции INSERT,DELTE,UPDATE

&#8211; Created on 24.03.2011 by TIGRANAV
declare
&#8211; Local variables here
i           integer;
l_starttime varchar2(100) := &#8216;28.03.2011 8:00:00&#8242;;
l_endtime   varchar2(100) := [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда надо просматривать что же такого много нагенерированного в логах.. вот написал тестовый скрипт.</p>
<p>На входе дата начала просмотра и дата окончания - на выходе самые частовстречающиеся объекты по 5 штук для каждой инструкции INSERT,DELTE,UPDATE</p>
<p><span id="more-60"></span></p>
<p>&#8211; Created on 24.03.2011 by TIGRANAV</p>
<p>declare</p>
<p>&#8211; Local variables here</p>
<p>i           integer;</p>
<p>l_starttime varchar2(100) := &#8216;28.03.2011 8:00:00&#8242;;</p>
<p>l_endtime   varchar2(100) := &#8216;28.03.2011 8:15:00&#8242;;</p>
<p>m           integer;</p>
<p>begin</p>
<p>&#8211; Test statements here</p>
<p>for i in (select name, first_time, completion_time</p>
<p>from v$archived_log</p>
<p>where first_time &gt;</p>
<p>to_date(l_starttime, &#8216;DD.MM.YYYY HH24:MI:SS&#8217;)</p>
<p>and completion_time &lt;</p>
<p>to_date(l_endtime, &#8216;DD.MM.YYYY HH24:MI:SS&#8217;)) loop</p>
<p>htp.p(i.name || &#8216;&lt;br&gt;&#8217;);</p>
<p>DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME =&gt; i.name,</p>
<p>OPTIONS     =&gt; DBMS_LOGMNR.NEW);</p>
<p>DBMS_LOGMNR.START_LOGMNR(STARTTIME =&gt; i.first_time,</p>
<p>ENDTIME   =&gt; i.completion_time,</p>
<p>OPTIONS   =&gt; DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);</p>
<p>for j in (select operation, count(*) as cn</p>
<p>from V$LOGMNR_CONTENTS</p>
<p>where operation in (&#8217;INSERT&#8217;, &#8216;UPDATE&#8217;, &#8216;DELETE&#8217;)</p>
<p>group by operation</p>
<p>order by count(*) desc) loop</p>
<p>htp.p(j.operation || &#8216; - &#8216; || j.cn || &#8216;&lt;br&gt;&#8217;);</p>
<p>m := 0;</p>
<p>for k in (select SEG_OWNER || &#8216;.&#8217; || SEG_NAME as obj, count(*) as cn</p>
<p>from V$LOGMNR_CONTENTS</p>
<p>where operation = j.operation</p>
<p>group by SEG_OWNER || &#8216;.&#8217; || SEG_NAME</p>
<p>order by count(*) desc) loop</p>
<p>if (m &lt; 5) then</p>
<p>htp.p(&#8217;   &#8216; || k.obj || &#8216; -&gt; &#8216; || k.cn || &#8216;&lt;br&gt;&#8217;);</p>
<p>end if;</p>
<p>m := m + 1;</p>
<p>end loop;</p>
<p>end loop;</p>
<p>end loop;</p>
<p>end;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2011/03/prosmotr-samyx-vstrechayushhixsya-obektov-v-arxivnyx-i-operativnyx-logax/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ORA-01555 на Oracle 8</title>
		<link>http://www.oraclist.ru/2010/12/ora-01555-na-oracle-8/</link>
		<comments>http://www.oraclist.ru/2010/12/ora-01555-na-oracle-8/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 10:55:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[администрирование]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=50</guid>
		<description><![CDATA[На нашем форуме часто при бэкапировании возникает ошибка:
ORA-01555: snapshot too old: rollback segment number 17 with name &#8220;RBS16&#8243; too small
Причем, все время разные экстенты (что вообщем то не удивительно).
Сервер ORACLE версии 8.1.7.3
Посмотрим, какого размера наши эксенты:
select t.segment_name,t.initial_extent,t.next_extent,t.max_extents from dba_segments t where t.segment_type like &#8216;%ROLLBA%&#8217;
В поем случае все сегменты имеют initial_extent=next_extent=524288 и max_extents=4096, то есть максимальный [...]]]></description>
			<content:encoded><![CDATA[<p>На нашем форуме часто при бэкапировании возникает ошибка:</p>
<p style="color: #f70732;">ORA-01555: snapshot too old: rollback segment number 17 with name &#8220;RBS16&#8243; too small</p>
<p>Причем, все время разные экстенты (что вообщем то не удивительно).<br />
Сервер ORACLE версии 8.1.7.3<span id="more-50"></span></p>
<p>Посмотрим, какого размера наши эксенты:</p>
<p><em>select t.segment_name,t.initial_extent,t.next_extent,t.max_extents from dba_segments t where t.segment_type like &#8216;%ROLLBA%&#8217;</em></p>
<p>В поем случае все сегменты имеют initial_extent=next_extent=524288 и max_extents=4096, то есть максимальный размер сегмента может быть до 524288*4096=2147483648=2ГБ</p>
<p>Поскольку возникает подобная ошибка (ORA-01555), то нам нужно увеличить размер таблспейса RBS с 2ГБ до, например, 4ГБ и увеличить максимальный экстент, например в 1,5 раза, дабы оставить место и для других сегментов.<br />
для этого нужно выполнить команду:</p>
<p><em>ALTER ROLLBACK SEGMENT rbsX STORAGE (MAXEXTENTS 6144);</em></p>
<p>Для формирования группы команд чтобы сделать это для всех сегментов нужно выполнить запрос:</p>
<p><em>select &#8216;ALTER ROLLBACK SEGMENT &#8216;||t.segment_name||&#8217; STORAGE (MAXEXTENTS 6144);&#8217; from dba_segments t where t.segment_type like &#8216;%ROLLBA%&#8217;;</em></p>
<p>И потом выполнить его в командном окне под SYS (исключив разве что SYSTEM).</p>
<p>Мне помогло.</p>
<p>Полезная информация:<br />
http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a76956/rollbak.htm#828</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2010/12/ora-01555-na-oracle-8/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Удаление трассировочных файлов в Oracle</title>
		<link>http://www.oraclist.ru/2010/04/udalenie-trassirovochnyx-fajlov-v-oracle/</link>
		<comments>http://www.oraclist.ru/2010/04/udalenie-trassirovochnyx-fajlov-v-oracle/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 07:55:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[администрирование]]></category>

		<category><![CDATA[логи]]></category>

		<category><![CDATA[чистка]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=48</guid>
		<description><![CDATA[Поделюсь с Вами маленькой командочкой, с помощью которой можно удалить старые трассировочные файлы:
adrci exec=&#8221;set home diag/rdbms/&#60;sid&#62;/&#60;SID&#62;; purge -age 1 -type TRACE&#8221;
Очень полезная команда.
]]></description>
			<content:encoded><![CDATA[<p>Поделюсь с Вами маленькой командочкой, с помощью которой можно удалить старые трассировочные файлы:</p>
<p>adrci exec=&#8221;set home diag/rdbms/&lt;sid&gt;/&lt;SID&gt;; purge -age 1 -type TRACE&#8221;</p>
<p>Очень полезная команда.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2010/04/udalenie-trassirovochnyx-fajlov-v-oracle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Создание логического бэкапа с исключением больших таблиц</title>
		<link>http://www.oraclist.ru/2010/02/sozdanie-logicheskogo-bekapa-s-isklyucheniem-bolshix-tablic/</link>
		<comments>http://www.oraclist.ru/2010/02/sozdanie-logicheskogo-bekapa-s-isklyucheniem-bolshix-tablic/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 06:35:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[администрирование]]></category>

		<category><![CDATA[dump]]></category>

		<category><![CDATA[exp]]></category>

		<category><![CDATA[логический экспорт]]></category>

		<guid isPermaLink="false">http://www.oraclist.ru/?p=46</guid>
		<description><![CDATA[Здравствуйте, сегодня я напишу как я делал логический дамп базы, исключая очень большие таблицы с архивными данными (которые мне в данном случае были не нужны, или которые  можно перетянуть потом, т.к. они не являются необходимыми для работы системы).
Нужно исключить таблицы :
ARH_FAULT_DATA_HISTORY
ARH_FAULT_ALL
FAULT_DATA_HISTORY
LRP_FILE
Создаем процедуру.
CREATE OR REPLACE FUNCTION exclude_table(
p_obj_schema IN VARCHAR2,
p_obj_name   IN VARCHAR2
)
RETURN VARCHAR2
IS
v_predicate VARCHAR2(10);
BEGIN
IF sys_context(
&#8216;USERENV&#8217;,
&#8216;SESSION_USER&#8217;
) = &#8216;SYSTEM&#8217;
THEN
v_predicate [...]]]></description>
			<content:encoded><![CDATA[<p>Здравствуйте, сегодня я напишу как я делал логический дамп базы, исключая очень большие таблицы с архивными данными (которые мне в данном случае были не нужны, или которые  можно перетянуть потом, т.к. они не являются необходимыми для работы системы).</p>
<p><span id="more-46"></span>Нужно исключить таблицы :<br />
ARH_FAULT_DATA_HISTORY<br />
ARH_FAULT_ALL<br />
FAULT_DATA_HISTORY<br />
LRP_FILE</p>
<p>Создаем процедуру.<br />
CREATE OR REPLACE FUNCTION exclude_table(<br />
p_obj_schema IN VARCHAR2,<br />
p_obj_name   IN VARCHAR2<br />
)<br />
RETURN VARCHAR2<br />
IS<br />
v_predicate VARCHAR2(10);<br />
BEGIN<br />
IF sys_context(<br />
&#8216;USERENV&#8217;,<br />
&#8216;SESSION_USER&#8217;<br />
) = &#8216;SYSTEM&#8217;<br />
THEN<br />
v_predicate := &#8216;1=2&#8242;;<br />
ELSE<br />
v_predicate := &#8221;;<br />
END IF;</p>
<p>RETURN v_predicate;<br />
END exclude_table;</p>
<p>Добавляем политики<br />
begin<br />
dbms_rls.add_policy(&#8217;ESCORT&#8217;,'ARH_FAULT_DATA_HISTORY&#8217;,'SKIP_ARH_FAULT_DATA_HISTORY&#8217;,'SYS&#8217;,'EXCLUDE_TABLE&#8217;);<br />
dbms_rls.add_policy(&#8217;ESCORT&#8217;,'ARH_FAULT_ALL&#8217;,'SKIP_ARH_FAULT_ALL&#8217;,'SYS&#8217;,'EXCLUDE_TABLE&#8217;);<br />
dbms_rls.add_policy(&#8217;ESCORT&#8217;,'FAULT_DATA_HISTORY&#8217;,'SKIP_FAULT_DATA_HISTORY&#8217;,'SYS&#8217;,'EXCLUDE_TABLE&#8217;);<br />
dbms_rls.add_policy(&#8217;ESCORT&#8217;,'LRP_FILE&#8217;,'SKIP_LRP_FILE&#8217;,'SYS&#8217;,'EXCLUDE_TABLE&#8217;);<br />
end;</p>
<p>Проверка<br />
select * from all_policies p where p.OBJECT_OWNER=&#8217;ESCORT&#8217;</p>
<p>Создание экспорта:<br />
exp system/ПАРОЛЬ@NIS file=dumpfile.dmp log=esma_center_exp.log   owner=(AIS_REPL_TEST,ESCORT,AIS_REPL,AIS_SYS,ESCORT_SINHR,ESCORT_SINHR_EXEC,SER_MON,ESCORT_GIS_CHANGE,AIS_HISTORY,AIS_RES,NETFLOW,TRSNET_DEV,AIS_DISP,FGV,AIS_TAB,APP$KUNP,ESCORT_GIS_CHANGE_RESTORE,PERFSTAT,AIS_SYS_IMP,AIS_RPL,AIS_POLLING,AIS_TEST,BRAIN,AIS_AGO,AIS_CTP,AIS_DR,REPL_TTK_ESMA,AIS_HIT,AIS_PSC)</p>
<p>При экспорте - данные из указанных таблиц не доступны, поэтому они не экспортируются в дамп.<br />
Удаление политик<br />
begin<br />
dbms_rls.drop_policy(&#8217;ESCORT&#8217;,'ARH_FAULT_DATA_HISTORY&#8217;,'SKIP_ARH_FAULT_DATA_HISTORY&#8217;);<br />
dbms_rls.add_policy(&#8217;ESCORT&#8217;,'ARH_FAULT_ALL&#8217;,'SKIP_ARH_FAULT_ALL&#8217;);<br />
dbms_rls.add_policy(&#8217;ESCORT&#8217;,'FAULT_DATA_HISTORY&#8217;,'SKIP_FAULT_DATA_HISTORY&#8217;);<br />
dbms_rls.add_policy(&#8217;ESCORT&#8217;,'LRP_FILE&#8217;,'SKIP_LRP_FILE&#8217;);<br />
end;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2010/02/sozdanie-logicheskogo-bekapa-s-isklyucheniem-bolshix-tablic/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Как программно убить все активные сессии веб-сервера апаче?</title>
		<link>http://www.oraclist.ru/2009/09/kak-programmno-ubit-vse-aktivnye-sessii-veb-servera-apache/</link>
		<comments>http://www.oraclist.ru/2009/09/kak-programmno-ubit-vse-aktivnye-sessii-veb-servera-apache/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 07:25:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[администрирование]]></category>

		<category><![CDATA[sessions]]></category>

		<guid isPermaLink="false">http://oraclist.ru/?p=43</guid>
		<description><![CDATA[Не знаю у кого как, а у нас периодически случаются такие моменты, когда база под нагрузкой начинает вдруг тупить - количество активных сессий начинает расти, расти, сервер начинает загибаться, ничего не открыается и не работает. Для таких случаев бывает полезно просто покилять все активные сессии веб-сервера и тогда в 95% случаев работоспособность восстанавливается.
Для этого может [...]]]></description>
			<content:encoded><![CDATA[<p>Не знаю у кого как, а у нас периодически случаются такие моменты, когда база под нагрузкой начинает вдруг тупить - количество активных сессий начинает расти, расти, сервер начинает загибаться, ничего не открыается и не работает. Для таких случаев бывает полезно просто покилять все активные сессии веб-сервера и тогда в 95% случаев работоспособность восстанавливается.</p>
<p>Для этого может пригодиться следующая процедура:</p>
<p>declare<br />
&#8211; Local variables here<br />
i integer;<br />
begin<br />
for j in (select &#8216;ALTER SYSTEM KILL SESSION &#8221;&#8217; || t.SID || &#8216;, &#8216; ||<br />
t.SERIAL# || &#8221;&#8221; as str<br />
from v$session t<br />
where t.STATUS = &#8216;ACTIVE&#8217;<br />
and t.PROGRAM like &#8216;httpd@%&#8217;) loop<br />
execute immediate j.str;<br />
end loop;<br />
end;</p>
<p>На здоровье. <img src='http://www.oraclist.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2009/09/kak-programmno-ubit-vse-aktivnye-sessii-veb-servera-apache/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Чтение/запись из BLOB полей в Oracle</title>
		<link>http://www.oraclist.ru/2009/05/chteniezapis-iz-blob-polej-v-oracle/</link>
		<comments>http://www.oraclist.ru/2009/05/chteniezapis-iz-blob-polej-v-oracle/#comments</comments>
		<pubDate>Thu, 14 May 2009 12:09:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Заметки]]></category>

		<category><![CDATA[blob]]></category>

		<guid isPermaLink="false">http://oraclist.ru/?p=39</guid>
		<description><![CDATA[Иногда необходимо читать и писать из Blob полей, вот как это можно делать:
Чтение:
CREATE OR REPLACE PROCEDURE Read_Text_From_BLOB (
    p_id IN NUMBER) IS

    lob_loc  BLOB;

BEGIN

    DBMS_OUTPUT.ENABLE(100000);

    SELECT lob_text INTO lob_loc
    FROM   test_blob
    WHERE  id [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда необходимо читать и писать из Blob полей, вот как это можно делать:</p>
<p><strong><span style="text-decoration: underline;">Чтение</span></strong>:</p>
<pre><strong><strong>CREATE OR REPLACE PROCEDURE Read_Text_From_BLOB (
    p_id IN NUMBER) IS

    lob_loc  BLOB;

BEGIN

    DBMS_OUTPUT.ENABLE(100000);

    SELECT lob_text INTO lob_loc
    FROM   test_blob
    WHERE  id = p_id;

    DBMS_OUTPUT.PUT_LINE('THE LENGTH IS    : ' || DBMS_LOB.GETLENGTH(lob_loc));
    DBMS_OUTPUT.PUT_LINE(
        'THE BLOB IS READ : ' ||
        UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(lob_loc, 200, 1))
    );

END;
/</strong></strong></pre>
<p><span style="text-decoration: underline;"><strong>Запись:</strong></span></p>
<pre><strong><strong>CREATE OR REPLACE PROCEDURE Write_Text_To_BLOB (
      p_id     IN NUMBER
    , p_buffer IN VARCHAR2)

IS
      lob_loc BLOB;

BEGIN

    INSERT INTO test_blob (id, lob_text, timestamp)
        VALUES (p_id, empty_blob(), sysdate)
        RETURNING lob_text INTO lob_loc;

    -- DBMS_LOB.WRITEAPPEND(lob_loc, UTL_RAW.LENGTH(p_buffer), p_buffer);
    DBMS_LOB.WRITE(lob_loc, LENGTH(p_buffer), 1, UTL_RAW.CAST_TO_RAW(p_buffer));

END;
/</strong></strong></pre>
<p>Источник: http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_11.shtml</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oraclist.ru/2009/05/chteniezapis-iz-blob-polej-v-oracle/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

