<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SAVEPOINT &#187; Informática</title>
	<atom:link href="http://www.midstorm.org/~telles/category/informatica/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.midstorm.org/~telles</link>
	<description>Ideas not commited yet!</description>
	<lastBuildDate>Thu, 26 Aug 2010 19:10:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>O quanto você está ferrado com seu SGDB</title>
		<link>http://www.midstorm.org/~telles/2010/08/26/o-quanto-voce-esta-ferrado-com-seu-sgdb/</link>
		<comments>http://www.midstorm.org/~telles/2010/08/26/o-quanto-voce-esta-ferrado-com-seu-sgdb/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 19:10:21 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=677</guid>
		<description><![CDATA[Sem comentários, entre no site e teste você mesmo: http://howfuckedismydatabase.com/ Indicação do Marcelo Costa na lista do pgbr-geral.]]></description>
			<content:encoded><![CDATA[<p>Sem comentários, entre no site e teste você mesmo:</p>
<h3><a href="http://howfuckedismydatabase.com/">http://howfuckedismydatabase.com/</a></h3>
<address>Indicação do Marcelo Costa na lista do pgbr-geral.</address>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/08/26/o-quanto-voce-esta-ferrado-com-seu-sgdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projeto PGXN</title>
		<link>http://www.midstorm.org/~telles/2010/08/13/projeto-pgxn/</link>
		<comments>http://www.midstorm.org/~telles/2010/08/13/projeto-pgxn/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 22:29:57 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=665</guid>
		<description><![CDATA[Todo usuário do PostgreSQL deveria conhecer o PgFoundry, lar de inúmeros projetos e extensões que tornam o nosso banco de dados ainda mais poderoso. Muitos programadores já devem ter ouvido falar do CPAN, um repositório com mais de 20 mil  módulos para o PERL. Pois bem, o pessoal da PGExperts teve a ideia de criar [...]]]></description>
			<content:encoded><![CDATA[<p>Todo usuário do PostgreSQL deveria conhecer o <a href="http://pgfoundry.org/">PgFoundry</a>, lar de inúmeros projetos e extensões que tornam o nosso banco de dados ainda mais poderoso. Muitos programadores já devem ter ouvido falar do <a href="http://www.cpan.org/">CPAN</a>, um repositório com mais de 20 mil  módulos para o <a href="http://www.perl.org/">PERL</a>. Pois bem, o pessoal da PGExperts teve a ideia de criar um repositório no mesmo estilo para o Postgres.</p>
<p>Esta com certeza é uma funcionalidade muito interessante para a comunidade como um todo, além de facilitar a vida de muita gente. Mas é aí que VOCÊ entra. Eles montaram um site e estão pedindo a doação para financiar o desenvolvimento desta ferramenta.</p>
<p>A doação pode ser algo vultoso como USD5000 ou algo simples como 25 dólares. Então você, que sempre diz que gostaria de ajudar a comunidade, mas não tem tempo ou diz que não conhece tão bem assim programação e coisa e tal&#8230; chegou a sua vez de retribuir um pouco e fazer a sua doação.</p>
<p>Um dia nós brasileiros precisamos perder aquela fama de sanguessugas do Software Livre. Eu já fiz, <a href="http://pgxn.org/contributors.html">minha doação</a>, agora é a sua vez. Conheça o projeto e faça a sua parte:</p>
<h3><a href="http://pgxn.org/">PostgreSQL Extension network</a></h3>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/08/13/projeto-pgxn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Enviando e-mail autenticado pelo Oracle</title>
		<link>http://www.midstorm.org/~telles/2010/05/28/enviando-e-mail-autenticado-pelo-oracle/</link>
		<comments>http://www.midstorm.org/~telles/2010/05/28/enviando-e-mail-autenticado-pelo-oracle/#comments</comments>
		<pubDate>Fri, 28 May 2010 18:56:44 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=657</guid>
		<description><![CDATA[Enviar e-mail utilizando PL/SQL dentro do Oracle é realmente uma tarefa razoavelmente simples com o UTL_SMTP ou mesmo com o UTL_TCP. O que não aparece de forma simples na documentação é como mandar um e-mail com usuário e senha autenticados. Bom, não é algo do outro mundo, mas segue aqui um pequeno script que mostra [...]]]></description>
			<content:encoded><![CDATA[<p>Enviar e-mail utilizando PL/SQL dentro do Oracle é realmente uma tarefa razoavelmente simples com o UTL_SMTP ou mesmo com o UTL_TCP. O que não aparece de forma simples na documentação é como mandar um e-mail com usuário e senha autenticados.</p>
<p>Bom, não é algo do outro mundo, mas segue aqui um pequeno script que mostra como fazer isso. Você só precisa editar os parâmetros iniciais e só chamando ele, já temos um teste. Depois é só passar o assunto e mensagem como parâmetro na procedure e você já pode enviar seus alertas para todo mundo.</p>
<p>Segue abaixo o script:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> PROCEDURE envia_email<span style="color: #66cc66;">&#40;</span>
  p_assunto          VARCHAR2      :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Teste de envio'</span><span style="color: #66cc66;">,</span>
  p_mensagem         CLOB          :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Teste'</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">IS</span>
  v_remetente        VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'fabio.telles@midstorm.org'</span>;  <span style="color: #808080; font-style: italic;">-- Remetente</span>
  v_destinatario     VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'cliente@midstorm.org'</span>;       <span style="color: #808080; font-style: italic;">-- Destinatário</span>
  v_destinatario_cc  VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'dba@savepoint.org'</span>;          <span style="color: #808080; font-style: italic;">-- Com cópia</span>
  v_smtp             VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'192.168.0.1'</span>;               <span style="color: #808080; font-style: italic;">-- Endereco IP do SMTP</span>
  v_smtp_user        VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'dba@midstorm.org'</span>;          <span style="color: #808080; font-style: italic;">-- Usuário autenticado no SMTP</span>
  v_smtp_user_pass   VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>  :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'sua_senha'</span>;                 <span style="color: #808080; font-style: italic;">-- Senha do usuário SMTP</span>
  v_conn             utl_smtp<span style="color: #66cc66;">.</span>connection;                          <span style="color: #808080; font-style: italic;">-- Abre conexão SMTP e HTTP</span>
BEGIN
  <span style="color: #808080; font-style: italic;">-- Abre conexão com um Servidor SMTP, porta padrão é 25</span>
  v_conn :<span style="color: #66cc66;">=</span> utl_smtp<span style="color: #66cc66;">.</span>open_connection <span style="color: #66cc66;">&#40;</span>v_smtp<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">25</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>helo <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> v_smtp<span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>command <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'AUTH LOGIN'</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>command <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_varchar2<span style="color: #66cc66;">&#40;</span>utl_encode<span style="color: #66cc66;">.</span>base64_encode<span style="color: #66cc66;">&#40;</span>
    utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>v_smtp_user<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>command <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_varchar2<span style="color: #66cc66;">&#40;</span>utl_encode<span style="color: #66cc66;">.</span>base64_encode<span style="color: #66cc66;">&#40;</span>
    utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>v_smtp_user_pass<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>mail <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&lt;'</span> <span style="color: #66cc66;">||</span> v_remetente <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>rcpt <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&lt;'</span> <span style="color: #66cc66;">||</span> v_destinatario <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>rcpt <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&lt;'</span> <span style="color: #66cc66;">||</span> v_destinatario_cc <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  utl_smtp<span style="color: #66cc66;">.</span>open_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'From:'</span>    <span style="color: #66cc66;">||</span> v_remetente  
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'To:'</span>      <span style="color: #66cc66;">||</span> v_destinatario 
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Cc:'</span>      <span style="color: #66cc66;">||</span> v_destinatario_cc 
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Subject:'</span> <span style="color: #66cc66;">||</span> p_assunto 		
    <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; 
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">' '</span>        <span style="color: #66cc66;">||</span> utl_tcp<span style="color: #66cc66;">.</span>crlf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>write_raw_data<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">,</span> utl_raw<span style="color: #66cc66;">.</span>cast_to_raw<span style="color: #66cc66;">&#40;</span>utl_tcp<span style="color: #66cc66;">.</span>crlf <span style="color: #66cc66;">||</span> p_mensagem<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; 
&nbsp;
  utl_smtp<span style="color: #66cc66;">.</span>CLOSE_DATA<span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
  utl_smtp<span style="color: #66cc66;">.</span>QUIT <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
&nbsp;
EXCEPTION
  WHEN OTHERS THEN
    utl_smtp<span style="color: #66cc66;">.</span>quit <span style="color: #66cc66;">&#40;</span>v_conn<span style="color: #66cc66;">&#41;</span>;
    RAISE_APPLICATION_ERROR<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">-</span><span style="color: #cc66cc;">20011</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Não foi possível enviar o e-mail devido ao seguinte erro: '</span> 
      <span style="color: #66cc66;">||</span> sqlerrm<span style="color: #66cc66;">&#41;</span>;
END ENVIA_EMAIL;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/05/28/enviando-e-mail-autenticado-pelo-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coletando informações de uma base Oracle</title>
		<link>http://www.midstorm.org/~telles/2010/05/13/coletando-informacoes-de-uma-base-oracle/</link>
		<comments>http://www.midstorm.org/~telles/2010/05/13/coletando-informacoes-de-uma-base-oracle/#comments</comments>
		<pubDate>Thu, 13 May 2010 15:16:01 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=633</guid>
		<description><![CDATA[Rápido e rasteiro: Vira e mexe você precisa dar uma geral num banco de dados que você nunca viu antes. Bom, então segue abaixo um pequeno script para lhe ajudar na tarefa. Eu, sei, podia melhorar muito, aceito sugestões, claro. Em todo caso, já dá para começar: SET serveroutput ON SIZE 1000000 FORMAT WRAPPED SET [...]]]></description>
			<content:encoded><![CDATA[<p>Rápido e rasteiro:</p>
<p>Vira e mexe você precisa dar uma geral num banco de dados que você nunca viu antes. Bom, então segue abaixo um pequeno script para lhe ajudar na tarefa. Eu, sei, podia melhorar muito, aceito sugestões, claro. Em todo caso, já dá para começar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SET</span> serveroutput <span style="color: #993333; font-weight: bold;">ON</span> SIZE <span style="color: #cc66cc;">1000000</span> FORMAT WRAPPED
<span style="color: #993333; font-weight: bold;">SET</span> autotrace    OFF
<span style="color: #993333; font-weight: bold;">SET</span> feedback     OFF
<span style="color: #993333; font-weight: bold;">SET</span> wrap         OFF
<span style="color: #993333; font-weight: bold;">SET</span> trimspool    <span style="color: #993333; font-weight: bold;">ON</span>
<span style="color: #993333; font-weight: bold;">SET</span> pagesize     <span style="color: #cc66cc;">100</span>
<span style="color: #993333; font-weight: bold;">SET</span> linesize     <span style="color: #cc66cc;">200</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">ALTER</span> SESSION <span style="color: #993333; font-weight: bold;">SET</span> NLS_DATE_FORMAT <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'DD/MM/YY'</span>;
&nbsp;
DECLARE
  v_media_archive   number;
  v_inst_num        number;
  v_spfile          varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;
  v_version         v$version<span style="color: #66cc66;">.</span>banner%TYPE;
  v_host            v$instance<span style="color: #66cc66;">.</span>host_name%TYPE;
  v_instance        v$instance<span style="color: #66cc66;">.</span>instance_name%TYPE;
  v_thread          v$instance<span style="color: #66cc66;">.</span>thread<span style="color: #808080; font-style: italic;">#%TYPE;</span>
  v_startup_time    v$instance<span style="color: #66cc66;">.</span>startup_time%TYPE;
  v_dbid            v$database<span style="color: #66cc66;">.</span>dbid%TYPE;
  v_name            v$database<span style="color: #66cc66;">.</span>db_unique_name%TYPE;
  v_created         v$database<span style="color: #66cc66;">.</span>created%TYPE;
  v_resetlogs_time  v$database<span style="color: #66cc66;">.</span>resetlogs_time%TYPE;
  v_log_mode        v$database<span style="color: #66cc66;">.</span>log_mode%TYPE;
  v_open_mode       v$database<span style="color: #66cc66;">.</span>open_mode%TYPE;
  v_platform        V$database<span style="color: #66cc66;">.</span>platform_name%TYPE;
&nbsp;
BEGIN
  <span style="color: #993333; font-weight: bold;">SELECT</span> DECODE<span style="color: #66cc66;">&#40;</span>COUNT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'PFILE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SPFILE'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">INTO</span> v_spfile <span style="color: #993333; font-weight: bold;">FROM</span> v$spparameter
    <span style="color: #993333; font-weight: bold;">WHERE</span> isspecified !<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'FALSE'</span>;
  <span style="color: #993333; font-weight: bold;">SELECT</span> banner <span style="color: #993333; font-weight: bold;">INTO</span> v_version <span style="color: #993333; font-weight: bold;">FROM</span> v$version  <span style="color: #993333; font-weight: bold;">WHERE</span> ROWNUM <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">2</span>;
  <span style="color: #993333; font-weight: bold;">SELECT</span> UPPER<span style="color: #66cc66;">&#40;</span>host_name<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> UPPER<span style="color: #66cc66;">&#40;</span>instance_name<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> thread<span style="color: #808080; font-style: italic;">#, startup_time</span>
    <span style="color: #993333; font-weight: bold;">INTO</span> v_host<span style="color: #66cc66;">,</span> v_instance<span style="color: #66cc66;">,</span> v_thread<span style="color: #66cc66;">,</span> v_startup_time
    <span style="color: #993333; font-weight: bold;">FROM</span> gv$instance
  ;
  <span style="color: #993333; font-weight: bold;">SELECT</span> count<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">INTO</span> v_inst_num <span style="color: #993333; font-weight: bold;">FROM</span> gv$instance;
  <span style="color: #993333; font-weight: bold;">SELECT</span> dbid<span style="color: #66cc66;">,</span> db_unique_name<span style="color: #66cc66;">,</span> created<span style="color: #66cc66;">,</span> resetlogs_time<span style="color: #66cc66;">,</span> log_mode<span style="color: #66cc66;">,</span> open_mode<span style="color: #66cc66;">,</span> platform_name
    <span style="color: #993333; font-weight: bold;">INTO</span> v_dbid<span style="color: #66cc66;">,</span> v_name<span style="color: #66cc66;">,</span> v_created<span style="color: #66cc66;">,</span> v_resetlogs_time<span style="color: #66cc66;">,</span> v_log_mode<span style="color: #66cc66;">,</span> v_open_mode<span style="color: #66cc66;">,</span> v_platform
    <span style="color: #993333; font-weight: bold;">FROM</span> v$database
  ;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Informações de '</span> <span style="color: #66cc66;">||</span> v_name<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'========================'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Informações Gerais'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'------------------'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'DBID..................: '</span> <span style="color: #66cc66;">||</span> v_dbid<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Servidor..............: '</span> <span style="color: #66cc66;">||</span> v_host <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' / '</span> <span style="color: #66cc66;">||</span> v_platform<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Versão................: '</span> <span style="color: #66cc66;">||</span> v_version<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Número de intâncias...: '</span> <span style="color: #66cc66;">||</span> v_inst_num<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Instância / Thread....: '</span> <span style="color: #66cc66;">||</span> v_instance <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' / '</span> <span style="color: #66cc66;">||</span> v_thread<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Criado em.............: '</span> <span style="color: #66cc66;">||</span> to_char<span style="color: #66cc66;">&#40;</span>v_created<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DD/MM/YYYY'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Último RESETLOG.......: '</span> <span style="color: #66cc66;">||</span> to_char<span style="color: #66cc66;">&#40;</span>v_resetlogs_time<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DD/MM/YYYY'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Última inicialização..: '</span> <span style="color: #66cc66;">||</span> to_char<span style="color: #66cc66;">&#40;</span>v_startup_time<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DD/MM/YYYY'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Inicializado com......: '</span> <span style="color: #66cc66;">||</span> v_spfile<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Modo ARCHIVE..........: '</span> <span style="color: #66cc66;">||</span> v_log_mode<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Status................: '</span> <span style="color: #66cc66;">||</span> v_open_mode<span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Opções ativas'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'============='</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">FOR</span> options <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> parameter <span style="color: #993333; font-weight: bold;">FROM</span> v$option <span style="color: #993333; font-weight: bold;">WHERE</span> value <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'TRUE'</span><span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>options<span style="color: #66cc66;">.</span>parameter<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Limites utilizados'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'=================='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Inst. | Sessões  | Usuários | CPUs | Cores'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'------|----------|----------|------|------'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">FOR</span> license <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #993333; font-weight: bold;">SELECT</span>
    RPAD<span style="color: #66cc66;">&#40;</span>inst_id<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> inst_id<span style="color: #66cc66;">,</span>
    RPAD<span style="color: #66cc66;">&#40;</span>sessions_max<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> sessions<span style="color: #66cc66;">,</span>
    RPAD<span style="color: #66cc66;">&#40;</span>users_max<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> users<span style="color: #66cc66;">,</span>
    RPAD<span style="color: #66cc66;">&#40;</span>cpu_core_count_highwater<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> cpu<span style="color: #66cc66;">,</span>
    cpu_socket_count_highwater <span style="color: #993333; font-weight: bold;">AS</span> socket
      <span style="color: #993333; font-weight: bold;">FROM</span>  gv$license
      <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> inst_id
  <span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>license<span style="color: #66cc66;">.</span>inst_id <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> license<span style="color: #66cc66;">.</span>sessions <span style="color: #66cc66;">||</span> 
      <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> license<span style="color: #66cc66;">.</span>users <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> license<span style="color: #66cc66;">.</span>cpu <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> license<span style="color: #66cc66;">.</span>socket<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">--SELECT * FROM v$configured_interconnects;</span>
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Localização'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'==========='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Parâmetro            | Valor'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'---------------------|------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> nls <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> RPAD<span style="color: #66cc66;">&#40;</span>description<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> parameter<span style="color: #66cc66;">,</span> property_value
      <span style="color: #993333; font-weight: bold;">FROM</span> database_properties
      <span style="color: #993333; font-weight: bold;">WHERE</span> property_name <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'NLS_CHARACTERSET'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'NLS_DATE_FORMAT'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'NLS_LANGUAGE'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'NLS_NUMERIC_CHARACTERS'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'NLS_TERRITORY'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'DBTIMEZONE'</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>nls<span style="color: #66cc66;">.</span>parameter <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> nls<span style="color: #66cc66;">.</span>property_value<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Memória'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'======='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Parâmetro                 | Valor(MB)'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'--------------------------|----------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> mem <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> RPAD<span style="color: #66cc66;">&#40;</span>name<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">25</span><span style="color: #66cc66;">&#41;</span> parameter<span style="color: #66cc66;">,</span> ROUND<span style="color: #66cc66;">&#40;</span>value<span style="color: #66cc66;">/</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">&#41;</span> valor_mb
      <span style="color: #993333; font-weight: bold;">FROM</span> v$parameter
      <span style="color: #993333; font-weight: bold;">WHERE</span> name <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'db_cache_size'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'large_pool_size'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'java_pool_size'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'sga_max_size'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'shared_pool_size'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'pga_aggregate_target'</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> name
  <span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>mem<span style="color: #66cc66;">.</span>parameter <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> mem<span style="color: #66cc66;">.</span>valor_mb<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'REDO'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'===='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Grupo | Tamanho | Arquivo'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'------|---------|--------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> log <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> f<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">GROUP</span><span style="color: #808080; font-style: italic;"># AS grupo, ROUND(l.bytes/1024/1024) AS tamanho, f.member AS arquivo</span>
      <span style="color: #993333; font-weight: bold;">FROM</span> v$logfile f<span style="color: #66cc66;">,</span> v$log l
      <span style="color: #993333; font-weight: bold;">WHERE</span> f<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">GROUP</span><span style="color: #808080; font-style: italic;"># = l.group#) LOOP</span>
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>lpad<span style="color: #66cc66;">&#40;</span> log<span style="color: #66cc66;">.</span>grupo<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> lpad<span style="color: #66cc66;">&#40;</span>log<span style="color: #66cc66;">.</span>tamanho<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
      <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> log<span style="color: #66cc66;">.</span>arquivo<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Control File'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'============'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> control <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> name <span style="color: #993333; font-weight: bold;">FROM</span> v$controlfile<span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>control<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #993333; font-weight: bold;">IF</span> v_log_mode <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'ARCHIVELOG'</span> THEN
    <span style="color: #993333; font-weight: bold;">SELECT</span> ROUND<span style="color: #66cc66;">&#40;</span>SUM<span style="color: #66cc66;">&#40;</span>blocks <span style="color: #66cc66;">*</span> block_size<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> to_number<span style="color: #66cc66;">&#40;</span> MAX<span style="color: #66cc66;">&#40;</span>first_time<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span>
      MIN<span style="color: #66cc66;">&#40;</span>first_time<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">&#41;</span> media
      <span style="color: #993333; font-weight: bold;">INTO</span> v_media_archive
      <span style="color: #993333; font-weight: bold;">FROM</span> V$ARCHIVED_LOG; 
&nbsp;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'ARCHIVE'</span><span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'======='</span><span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Quantidade média de archive gerado: '</span> <span style="color: #66cc66;">||</span> v_media_archive <span style="color: #66cc66;">||</span>
      <span style="color: #ff0000;">'MB / dia'</span><span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'ID | Status     | Tipo       | Destino    | Arquivo'</span><span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'---|------------|------------|------------|--------'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold;">FOR</span> arch <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
      <span style="color: #993333; font-weight: bold;">SELECT</span> RPAD<span style="color: #66cc66;">&#40;</span>dest_id<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> id<span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">STATUS</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">STATUS</span><span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span>binding<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> tipo<span style="color: #66cc66;">,</span>
        RPAD<span style="color: #66cc66;">&#40;</span>target<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> destino<span style="color: #66cc66;">,</span> destination arquivo
        <span style="color: #993333; font-weight: bold;">FROM</span> v$archive_dest <span style="color: #993333; font-weight: bold;">WHERE</span> destination <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span> LOOP
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>arch<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> arch<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">STATUS</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> arch<span style="color: #66cc66;">.</span>tipo <span style="color: #66cc66;">||</span>
        <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> arch<span style="color: #66cc66;">.</span>destino <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> arch<span style="color: #66cc66;">.</span>arquivo<span style="color: #66cc66;">&#41;</span>;
    END LOOP;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
  END <span style="color: #993333; font-weight: bold;">IF</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Logs do grupo ADMIN'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'==================='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Nome            | Diretório'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'----------------|----------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> admin <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> RPAD<span style="color: #66cc66;">&#40;</span>name<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> log<span style="color: #66cc66;">,</span> value
      <span style="color: #993333; font-weight: bold;">FROM</span> v$parameter
      <span style="color: #993333; font-weight: bold;">WHERE</span> name <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'audit_file_dest'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'background_dump_dest'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'core_dump_dest'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'user_dump_dest'</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> NAME<span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>admin<span style="color: #66cc66;">.</span>log <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> admin<span style="color: #66cc66;">.</span>value<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Configurações de auditoria e segurança'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'======================================'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Parâmetro       | Valor'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'----------------|------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> security <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> RPAD<span style="color: #66cc66;">&#40;</span>name<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> log<span style="color: #66cc66;">,</span> value
      <span style="color: #993333; font-weight: bold;">FROM</span> v$parameter
      <span style="color: #993333; font-weight: bold;">WHERE</span> name <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'audit_trail'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'os_authent_prefix'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'remote_os_authent'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'remote_login_passwordfile'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'utl_file_dir'</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> NAME<span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>security<span style="color: #66cc66;">.</span>log <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> security<span style="color: #66cc66;">.</span>value<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput OFF
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput <span style="color: #993333; font-weight: bold;">ON</span> SIZE <span style="color: #cc66cc;">1000000</span>  FORMAT WRAPPED
&nbsp;
BEGIN
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'JOBs'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'===='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'    Nº | Esquema         | Dur.(min) | BK| Intervalo    '</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'                       | SQL'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'-------|-----------------|-----------|---|--------------'</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'-----------------------|----'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> job <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> LPAD<span style="color: #66cc66;">&#40;</span>job<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> id<span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span>schema_user<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> esquema<span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span>TRUNC<span style="color: #66cc66;">&#40;</span>total_time<span style="color: #66cc66;">/</span><span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span> dur_mi<span style="color: #66cc66;">,</span>
      broken<span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span>interval<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">35</span><span style="color: #66cc66;">&#41;</span> interval<span style="color: #66cc66;">,</span> what
      <span style="color: #993333; font-weight: bold;">FROM</span> dba_jobs
      <span style="color: #993333; font-weight: bold;">WHERE</span> interval !<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'null'</span>
  <span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>job<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> job<span style="color: #66cc66;">.</span>esquema <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> job<span style="color: #66cc66;">.</span>dur_mi <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span>
      <span style="color: #66cc66;">||</span> job<span style="color: #66cc66;">.</span>broken <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> job<span style="color: #66cc66;">.</span>interval <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> job<span style="color: #66cc66;">.</span>what<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput OFF
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput <span style="color: #993333; font-weight: bold;">ON</span> SIZE <span style="color: #cc66cc;">1000000</span>  FORMAT WRAPPED
&nbsp;
BEGIN
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Segmentos por esquema, tablespace e tipo'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'========================================'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Esquema         | Tablespace      | Tipo de Objeto  | QT   | Tam(MB)'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'----------------|-----------------|-----------------|------|--------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> schema <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span>
      RPAD<span style="color: #66cc66;">&#40;</span>owner<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> schema<span style="color: #66cc66;">,</span>
      RPAD<span style="color: #66cc66;">&#40;</span>tablespace_name<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> tablespace<span style="color: #66cc66;">,</span>
      RPAD<span style="color: #66cc66;">&#40;</span>segment_type<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> type<span style="color: #66cc66;">,</span>
      LPAD<span style="color: #66cc66;">&#40;</span>count<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> qt<span style="color: #66cc66;">,</span> LPAD<span style="color: #66cc66;">&#40;</span>ROUND<span style="color: #66cc66;">&#40;</span>SUM<span style="color: #66cc66;">&#40;</span>bytes<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> mb
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_segments
        <span style="color: #993333; font-weight: bold;">WHERE</span> OWNER <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SYS'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'OUTLN'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSTEM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'WMSYS'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'XDB'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SISMON'</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> owner<span style="color: #66cc66;">,</span> tablespace_name<span style="color: #66cc66;">,</span> segment_type
        <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> owner<span style="color: #66cc66;">,</span> tablespace_name<span style="color: #66cc66;">,</span> segment_type<span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>schema<span style="color: #66cc66;">.</span>schema <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> schema<span style="color: #66cc66;">.</span>tablespace <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span>
      <span style="color: #66cc66;">||</span> schema<span style="color: #66cc66;">.</span>type <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> schema<span style="color: #66cc66;">.</span>qt <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> schema<span style="color: #66cc66;">.</span>mb<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput OFF
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput <span style="color: #993333; font-weight: bold;">ON</span> SIZE <span style="color: #cc66cc;">1000000</span>  FORMAT WRAPPED
&nbsp;
BEGIN
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Objetos inválidos por esquema e tipo'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'===================================='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Esquema         | Tipo de Objeto  |  QT'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'----------------|-----------------|----'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> invalid <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> RPAD<span style="color: #66cc66;">&#40;</span>owner<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> esquema<span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span>object_type<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> tipo<span style="color: #66cc66;">,</span> LPAD<span style="color: #66cc66;">&#40;</span>COUNT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> qt
      <span style="color: #993333; font-weight: bold;">FROM</span> dba_objects
      <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #993333; font-weight: bold;">STATUS</span> !<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'VALID'</span>
      <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> owner<span style="color: #66cc66;">,</span> object_type<span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>invalid<span style="color: #66cc66;">.</span>esquema <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> invalid<span style="color: #66cc66;">.</span>tipo <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> invalid<span style="color: #66cc66;">.</span>qt<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput OFF
<span style="color: #993333; font-weight: bold;">SET</span> serveroutput <span style="color: #993333; font-weight: bold;">ON</span> SIZE <span style="color: #cc66cc;">1000000</span> FORMAT WRAPPED FORMAT WRAPPED
&nbsp;
BEGIN
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Diretorios'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'=========='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Esquema         | Nome                           | Diretório'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'----------------|--------------------------------|----------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> directory <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span>
      RPAD<span style="color: #66cc66;">&#40;</span>owner<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> esquema<span style="color: #66cc66;">,</span>
      RPAD<span style="color: #66cc66;">&#40;</span>directory_name<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">30</span><span style="color: #66cc66;">&#41;</span> nome<span style="color: #66cc66;">,</span>
      directory_path <span style="color: #993333; font-weight: bold;">AS</span> path
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_directories <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> owner<span style="color: #66cc66;">,</span> path<span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>directory<span style="color: #66cc66;">.</span>esquema <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> directory<span style="color: #66cc66;">.</span>nome <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span>
      directory<span style="color: #66cc66;">.</span>path<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Database Links'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'=============='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Esquema         | Nome            | Criacao    |'</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">' Esquema remoto  | Host remoto'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'----------------|-----------------|------------|'</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'-----------------|------------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> dblink <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span>
      RPAD<span style="color: #66cc66;">&#40;</span>owner<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> esquema<span style="color: #66cc66;">,</span>
      RPAD<span style="color: #66cc66;">&#40;</span>db_link<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> nome<span style="color: #66cc66;">,</span>
      RPAD<span style="color: #66cc66;">&#40;</span>username<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> esquema_destino<span style="color: #66cc66;">,</span>
      host host_destino<span style="color: #66cc66;">,</span>
      to_char<span style="color: #66cc66;">&#40;</span>created<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DD-MM-YYYY'</span><span style="color: #66cc66;">&#41;</span> criacao
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_db_links <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> host<span style="color: #66cc66;">,</span> owner<span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>dblink<span style="color: #66cc66;">.</span>esquema <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> dblink<span style="color: #66cc66;">.</span>nome <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span>
      dblink<span style="color: #66cc66;">.</span>criacao <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> dblink<span style="color: #66cc66;">.</span>esquema_destino <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> dblink<span style="color: #66cc66;">.</span>host_destino<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Visões Materializadas'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'====================='</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Esquema         | Nome            | Q Len | Atualiz. | DBLink'</span><span style="color: #66cc66;">&#41;</span>;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'----------------|-----------------|-------|----------|-------'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> mview <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> RPAD<span style="color: #66cc66;">&#40;</span>owner<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> esquema<span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span>mview_name<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> nome<span style="color: #66cc66;">,</span> RPAD<span style="color: #66cc66;">&#40;</span>master_link<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> link<span style="color: #66cc66;">,</span>
      LPAD<span style="color: #66cc66;">&#40;</span>query_len<span style="color: #66cc66;">,</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> len<span style="color: #66cc66;">,</span> last_refresh_date <span style="color: #993333; font-weight: bold;">FROM</span> dba_mviews
  <span style="color: #66cc66;">&#41;</span> LOOP
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>mview<span style="color: #66cc66;">.</span>esquema <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> mview<span style="color: #66cc66;">.</span>nome <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> mview<span style="color: #66cc66;">.</span>len <span style="color: #66cc66;">||</span>
      <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> mview<span style="color: #66cc66;">.</span>last_refresh_date <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' | '</span> <span style="color: #66cc66;">||</span> mview<span style="color: #66cc66;">.</span>link<span style="color: #66cc66;">&#41;</span>;
  END LOOP;
  dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
END;
<span style="color: #66cc66;">/</span>
<span style="color: #993333; font-weight: bold;">SET</span> feedback <span style="color: #993333; font-weight: bold;">ON</span>
<span style="color: #993333; font-weight: bold;">SET</span> LINESIZE  <span style="color: #cc66cc;">120</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/05/13/coletando-informacoes-de-uma-base-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PGDay Brasília em 31/05</title>
		<link>http://www.midstorm.org/~telles/2010/05/11/pgday-brasilia-em-3105/</link>
		<comments>http://www.midstorm.org/~telles/2010/05/11/pgday-brasilia-em-3105/#comments</comments>
		<pubDate>Tue, 11 May 2010 15:11:36 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=627</guid>
		<description><![CDATA[Atualização Se inscreva no site do evento, vagas limitadas. Sim,  este ano tem Copa do mundo, eleição, e claro PGCon e PGDay. O blog podia estar parado, mas a comunidade brasileira de PostgreSQL continua a todo o vapor. Já tivemos o PGDay BA, em Ilhéus, e em breve deverá sair a data do PGDay RJ. [...]]]></description>
			<content:encoded><![CDATA[<h2>Atualização</h2>
<h3>Se inscreva no <a href="http://www.postgresql.org.br/eventos/pgday/df/2010">site do evento</a>, vagas limitadas.</h3>
<p>Sim,  este ano tem Copa do mundo, eleição, e claro PGCon e PGDay.</p>
<p>O blog podia estar parado, mas a comunidade brasileira de PostgreSQL continua a todo o vapor. Já tivemos o <a href="http://www.postgresql.org.br/eventos/2010/pgday/ba">PGDay BA</a>, em Ilhéus, e em breve deverá sair a data do PGDay RJ. O próximo será o PGDay DF, em 31/05 no SERPRO. Então fiquem antenados para as inscrições no evento.</p>
<h2>Palestrantes confirmados:</h2>
<ul>
<li><a href="http://www.timbira.com/">Euler Taveira</a></li>
<li>Fábio Telles</li>
<li><a href="http://www.midstorm.org/~fike/weblog/">Fernando Ike</a></li>
<li><a href="http://postgreslogia.wordpress.com/">Leonardo César</a></li>
<li><a href="http://joaocosme.wordpress.com/">João Cosme</a></li>
</ul>
<h2>Nesse eu vou!</h2>
<p>Bom, fui convidado para o evento e se nada der errado (fui escalado para uma migração na data do PGDay BA) estarei lá. Nada, já fiz uma mega amarração no trabalho, o meu chefe vai me substituir! Nesse eu vou mesmo.</p>
<h2>Me ajude a escolher o tema para a palestra no PGDay DF!</h2>
<p>Ocorre que o pessoal me deixou a vontade para escolher o tema da palestra. Eu que sou preguiçoso tenho uma forte tendência a reciclar artigos e palestras anteriores. Claro que para o PGCon Brasil, a gente sempre tras coisa nova, mas com menos de 20 dias para preparar a palestra (é claro que não estar na organização do evento já ajuda muito) a chance de eu dar uma atualizada em uma palestra antiga aumenta.</p>
<p>Então gostaria de saber se alguém tem alguma sugestão para o PGDay DF. Pode ser um artigo aqui do blog, pode ser uma <a href="http://www.slideshare.net/telles">palestra minha no Slide Share</a>, ou pode ser um tema novo. Comentários com sugestões aqui no blog, até o final da semana (que é quando eu vou começar a mexer nisso) são bem vindos. É claro que se eu não mandar logo a descrição da palestra para a organização o povo lá me mata também!</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 9px; width: 1px; height: 1px;">http://postgreslogia.wordpress.com/</div>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/05/11/pgday-brasilia-em-3105/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dump não é backup!</title>
		<link>http://www.midstorm.org/~telles/2010/05/06/dump-nao-e-backup/</link>
		<comments>http://www.midstorm.org/~telles/2010/05/06/dump-nao-e-backup/#comments</comments>
		<pubDate>Thu, 06 May 2010 17:01:21 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=618</guid>
		<description><![CDATA[Não, não é. Pode chorar, pode xingar mas não é. No ano passado fiz uma pesquisa aqui no blog sobre as rotinas de backup utilizados no PostgreSQL. O resultado foi que a maioria esmagadora só utiliza o pg_dump. Veja, eu não tenho absolutamente nada contra o pg_dump. Mas antes de me explicar, vamos pensar&#8230; PARA [...]]]></description>
			<content:encoded><![CDATA[<h2>Não, não é. Pode chorar, pode xingar mas não é.</h2>
<p>No ano passado fiz uma pesquisa aqui no blog sobre as <a href="http://www.midstorm.org/~telles/2009/06/25/pesquisa-sobre-backup-em-postgresql/">rotinas de backup utilizados no PostgreSQL</a>. O resultado foi que a maioria esmagadora só utiliza o <em><strong><a href="http://www.postgresql.org/docs/9.0/static/app-pgdump.html">pg_dump</a></strong></em>. Veja, eu não tenho absolutamente nada contra o <span style="font-weight: normal; font-size: 13px;"><em>pg_dump</em></span><span style="font-weight: normal; font-size: 13px;">. Mas antes de me explicar, vamos pensar&#8230; <strong>PARA QUE SERVEM OS BACKUPS MESMO?</strong></span></p>
<p>Se eu fizer uma pesquisa, 10 entre 10 irão dizer: para se recuperar em caso de desastres! Simples assim, eu faço uma cópia dos dados e caso tudo dê errado eu restauro a minha cópia e volto a trabalhar.</p>
<p>Simples não?</p>
<p><strong>NÃO.</strong></p>
<p>Não tem nada de simples nisso. Vamos avaliar melhor o caso. Primeiro temos que entender o que é &#8220;tudo dê errado&#8221;. Podem acontecer várias coisas diferentes&#8230;</p>
<h3>Quanto tudo dá errado!</h3>
<ol>
<li><strong>Desastre natural</strong><br />
O CPD pegou fogo, inundou (eu já vi acontecer), teve um terremoto, jogaram um avião no prédio&#8230; bom, nestes casos só um stand by em outro prédio (ou outra cidade, outro país) resolve a situação. Mas você bem que poderia guardar os seus backups fora do prédio onde está o CPD, não?</li>
<li><strong>Falha de hardware (exceto os discos)</strong><br />
Um problema no hardware do servidor, que não seja o disco. Neste caso, basta substituir a peça com defeito e voltar a trabalhar, certo? Errado. Quem disse que você tem pentes de memória, fontes, processadores ou mesmo uma placa-mãe sobressalente para substituir naquele servidor. E no caso de você trocar algo como uma placa-mãe, provavelmente vai trocar por outro modelo, o SO pode se desentender com ele e pode exigir algum tipo de ajuste no SO.<br />
Isto leva tempo, mas não exige que se mexa com backup, certo? Errado. Se você não pode esperar até uma nova peça chegar, você vai querer subir o seu banco de dados em outro servidor o mais rápido possível, e aí sim você vai precisar do seu backup.</li>
<li><strong>Falha nos discos</strong><br />
Um problema físico num disco ou no seu storage. Bom, se você utiliza RAID (RAID 0 a princípio não é RAID e se você utiliza RAID 0 para guardar seus dados, saiba que existe um lugar especial no inferno reservado para você) e tem um Hot Spare configurado, você não precisa fazer nada naquele momento. Todo Storage descente não permite a criação de RAID sem o Hot Spare.<br />
Se você tem um storage e paga o seu caríssimo contrato de manutenção, tudo que você terá de fazer e dizer para o técnico do storage entrar e substituir o disco. Em geral quem vai lhe avisar que um disco está com problema é o técnico que chegou para trocar o disco. Os storages devem ser monitorados remotamente pelo fornecedor. Em caso de defeito eles mandam um técnico para resolver o problema ANTES de você notar que perdeu um disco.<br />
Mas, a vida não é perfeita, storages são caros e os contratos de manutenção também. Se você tem um RAID na sua controladora local e teve uma falha em um disco, provavelmente a vida vai continuar e você não vai nem perceber. É aí que mora o perígo. Alguém tem que monitorar os logs do SO para saber que um disco apresentou problema, apesar de tudo continuar funcionando. Se você não perceber isso, então a próxima falha no próximo disco (como os discos são comprados em geral do mesmo lote, eles tem esse péssimo hábito que queimar mais ou menos na mesma época&#8230;) vai gerar uma paralisação total dos banco. Aí você volta para o item 1 e com certeza vai ter de utilizar o seu backup para restaurar os dados. Isso se você não tiver aquela idéia maravilhosa de guardar os seus backups justamente naquele disco / RAID que deu problema. Assim fica a dica: monitore os logs do seu SO e nunca guarde o seu backup no mesmo disco que os seus dados.</li>
<li><strong>Ok, o hardware está ótimo, mas o SO egripou do nada</strong><br />
Pegou um vírus (sem comentários), deu uma tela azul (pode escolher outra cor, o efeito é o mesmo) da morte ou um mesmo um kernel panic. Uma atualização do SO fez com que tudo o mais travasse. O banco de dados não sobe mais. Você pode até tentar reinstalar o SO, limpar o vírus, etc e tal. Mas se isso demorar, você vai querer voltar o backup em outro servidor;</li>
<li><strong>O sistema de arquivos corrompeu</strong><br />
Após uma falta de energia, quando o luz voltou você teve uma grata surpresa: justamente a partição onde os dados estavam se corrompeu. Não vou entrar no mérito sobre qual sistema de arquivos é mais seguro agora. Ok, já vi gente que queria rodar um SGDB num Pen Drive&#8230; FAT não deveria servir para guardar nem base em .mdb! NTFS corrompe muito, mas EXT3, EXT4, ReiserFS, XFS, JFS, UFS, ZFS e outros também corrompem. Se você inventar de fazer um &#8220;ajuste de desempenho&#8221; no ser sistema de arquivos então&#8230;<br />
Bom, se a ferramenta do seu sistema de arquivos não conseguir restaurar os dados em 100%, já viu&#8230; Formate tudo e volte o backup;</li>
<li><strong>Um DBA ou sysadmin desastrado foi lá e apagou/alterou/moveu um arquivo do banco de dados</strong><br />
Vai corromper na hora. Volte o seu backup&#8230; e dê uma bronca ou PNB<strong>*</strong> no funcionário que fez esta besteira. Se foi o seu estagiário que fez isso, então peça demissão. Quem mandou deixar o estagiário chegar perto do seu banco de dados?</li>
<li><strong>O banco de dados corrompeu por uma falha do próprio banco de dados</strong><br />
É raro mas acontece. Você vai ter que verificar os logs do SO e do banco para entender o que aconteceu. Pode ser preciso aplicar um patch no servidor ou implementar um &#8220;workarround&#8221;, mais conhecido como gambiarra. Depois de entender minimamente a causa do problema e tomar providências para que isso não ocorra novamente, você vai ter de voltar o seu backup;</li>
<li><strong>Um usuário desastrado apagou uma tabela ou outro objeto do banco de dados</strong><br />
Primeiro você vai se perguntar: quem deu permissão para o usuário apagar alguma coisa no banco de dados? Se o usuário for um desenvolvedor, ídem. Se for o sysadmin, ídem. Se for o DBA&#8230; bom, sobra a bronca ou PNB<strong>*</strong>. E você vai ter que voltar o seu backup para o momento anterior ao desastre. É um detalhe importante. Tem gente que só nota a besteira dias depois de feita a besteira. Se você voltar o backup feito depois da besteira, vai continuar com o mesmo problema. Identifique quando o problema ocorreu antes de voltar o backup.</li>
</ol>
<h3>Outros usos para o backup</h3>
<p>Você pode utilizar o seu backup para outras coisas além de recuperação de desastres:</p>
<ol>
<li>Mover dados entre bases. Particularmente atualizar dados de homologação com os dados da produção. Operação bastante comum em que se utiliza o backup. Sempre que você quer fazer um teste de performance ou validar uma atualização da aplicação, alguém solicita uma atualização deste tipo.</li>
<li>Auditoria. Você pode guardar backups realizados após fechamentos cíclicos (como mensal ou anual) para efeito de auditoria. Estes backups são em geral guardados por vários anos, pelo menos 5 anos em geral.</li>
<li>Criação de novos ambientes de homologação / teste. É muito comum projetos específicos exigirem análises destrutivas dos dados e para isso utilizarem uma base/esquema separados para isso.</li>
</ol>
<h3>O tal do SLA</h3>
<p>Antes de definir a sua estratégia de backup, você deve determinar qual o seu SLA ou <a href="http://pt.wikipedia.org/wiki/Acordo_de_N%C3%ADvel_de_Servi%C3%A7o">Service Level Agreement</a>. Seja pessimista e defina o quanto você pode suportar em caso de desastre. Não adianta dizer que você quer 100% de alguma coisa. 100% não existe e os famosos &#8220;five nines&#8221; ou 99,999% custam uma verdadeira fortuna. O cofre não pode ser mais caro que o ouro que você guarda. Então pense com realismo (ou pessimismo, como você preferir) nos seguintes limites:</p>
<ul>
<li>Quanto tempo você pode ficar com o banco de dados <strong>indisponível</strong> em caso de parada <strong>não prevista</strong> em <strong>horário comercial</strong>? E se for em <strong>horário não comercial</strong>?</li>
<li>Quanto tempo você pode ficar com o banco de dados <strong>indisponível</strong> em caso de uma parada <strong>prevista</strong> (uma manutenção) em <strong>horário comercial</strong>? E se for em <strong>horário não comercial</strong>?</li>
<li>Respire fundo&#8230;. você pode <strong>perder dados</strong> relativos a quanto <strong>tempo de operação</strong>?</li>
</ul>
<p>Ok, a resposta para as 3 perguntas sempre deveria ser ZERO. Mas como eu já disse, não existe como garantir isso, e chegar perto disso custa muuuito caro. Cada uma das suas respostas vai te levar para uma estratégia de backup diferente.</p>
<h3>Tempo necessário para restaurar um backup em caso de desastre.</h3>
<p>Este é um ponto crítico que poucos sabem responder. Então vejamos como calcular isso. O tempo vai variar muito conforme alguns fatores:</p>
<ul>
<li>Você já testou uma restauração completa do backup?</li>
<li>Você tem equipe disponível no local para fazer a restauração?</li>
<li>Você tem equipe disponível para fazer a restauração fora do horário comercial?</li>
<li>As pessoas disponíveis para fazer a restauração fora do horário comercial tem acesso remoto ao servidor?</li>
<li>Você tem o procedimento de restauração documentado em papel?</li>
<li>A documentação está atualizada?</li>
<li>Você tem hardware de contingência disponível?</li>
</ul>
<div>Vamos ao cálculo:</div>
<div>
<ul>
<li>Tempo de restauração do hardware. Se você tem peças sobressalentes e equipe adequada, isso deve ser rápido, mas tem gente que sai no meio de um feriado buscando uma peça para comprar. Se for um órgão público então&#8230; O ideal é ter um servidor de Stand by para o banco de dados. Isso vai lhe poupar de toda a dor de cabeça de ir atrás de hardware;</li>
<li>Tempo para restaurar o SO. Se você tiver que reinstalar o SO num novo servidor, quanto tempo isso leva? A documentação da instalação está disponível e atualizada? As mídias de instalação na mesma versão do servidor de produção estão disponíveis? Equipe para a instalação disponível?  Novamente, um servidor de stand by vai lhe poupar este tipo de dor de cabeça e fazer você pular esta parte.</li>
<li>Tempo para restaurar o SGDB. Se você tiver que reinstalar o PostgreSQL num servidor novo, quanto tempo isso leva? E as mesmas considerações para o SO são válidas. E novamente o Stand by é uma opção que pula esta etapa.</li>
<li>Quanto tempo leva para restaurar o backup (alguns chamam isso de &#8220;restore&#8221;) para o disco do servidor. Se você utiliza fita, isso pode levar um tempo considerável. Se antes de copiar para a fita você faz uma cópia para outro servidor, pode ser mais rápido. Se o backup for grande, uma rede gigabit ou uma conexão Fibre Channel numa BAN (Backup Area Network) pode fazer toda a diferença. Sim, backup custa bem mais caro do que parece. Sim, mais uma vez o stand by permite a você pular esta etapa, para a maioria dos casos (se você precisa voltar o backup de uma versão mais antiga, o stand by não vai resolver o seu problema)</li>
<li>Quanto tempo leva para fazer a recuperação do banco de dados a partir do backup (alguns chamam isso de &#8220;recover&#8221;). Aqui a sua estratégia de backup vai fazer toda a diferença. Vamos falar mais longamente sobre este aspecto logo mais.</li>
</ul>
</div>
<p>Bom, supondo que você tenha uma base de até 1GB, sem muitas demandas de desempenho, tudo fica simples. Você pode instalar o PostgreSQL em qualquer servidor com um pouco de folga no desempenho e alguns GB de espaço em disco sobrando em subir um dump guardado em outro servidor. Pode não levar mais do que uns 30 minutos para fazer tudo. Neste caso o <em><strong>pg_dump</strong></em> parece fazer sentido.</p>
<p>Agora se você precisar subir um novo servidor dedicado para abrigar uma base com 100GB, então você terá problemas com o <strong><em>pg_dump</em></strong>. Importar um dump para criar uma base de 100GB deve levar várias horas. Se a base tiver alguma tabela muito grande, você poderá precisar fazer ajustes específicos para conseguir recriar seus índices. Se a base tiver algo em torno de 500GB por exemplo, isso pode levar dias. Mesmo com a paralelização do processo, se você souber fazer isso com cuidado.</p>
<h3>Como evitar a perda de dados?</h3>
<p>Outro problema com o <strong>pg_dump</strong>. Quanto tempo de operação em produção você está disposto a perder? Suponha que você faça o backup toda madrugada, e seu desastre ocorra no final da tarde. Se você voltar o seu backup, você vai perder todas as alterações realizadas ao longo do dia. Isso é muito grave e intolerável para a maioria dos ambientes <a href="http://pt.wikipedia.org/wiki/OLTP">OLTP</a>. É claro que você pode realizar o pg_dump mais de uma vez por dia, mas fazer isso em horário comercial costuma ter um impacto muito negativo na performance. Quais as soluções para contornar este problema?</p>
<ul>
<li>Replicação: existem N ferramentas de replicação. Algumas síncronas, outras assíncronas. Existe uma excelente documentação sobre os principais <a href="http://www.postgresql.org/docs/9.0/static/different-replication-solutions.html">tipos de replicação</a> para PostgreSQL. De qualquer forma, podemos categoriza-las em:
<ul>
<li>As ferramentas síncronas garantem a perda ZERO de dados. Cada vez que um COMMIT é realizado no servidor de produção, outro COMMIT é realizado na réplica. Somente após o COMMIT ser realizado com sucesso na base de produção e na réplica é que a operação prossegue. Resultado: ZERO em perda de dados e um gargalo de performance terrível. Para conseguir ter uma performance razoável com replicação síncrona, você vai ter que gastar muito em hardware e em ajustes de performance.</li>
<li>As ferramentas assíncronas não garantem ZERO de perda de dados, todos possuem algum atraso na sincronia entre o servidor de produção e a réplica.</li>
</ul>
</li>
<li>Point In Time Recovery: é uma técnica que consistem em fazer uma cópia do WAL (Write Ahead Log) do PostgreSQL e utilizar estas cópias para atualizar um backup até um horário específico. O PITR é uma técnica consagrada em todos os SGDBs sérios do mercado. Você não precisa instalar nenhum software extra para faze-lo funcionar. O PITR também não penaliza o desempenho do seu servidor, uma vez que o WAL já é gerado normalmente. O único overhead é a cópia deles. Você também pode ajustar o intervalo máximo entre as cópias do WAL, o que lhe permite um ajuste do período máximo de perda de dados que você terá com o PITR (ele é assíncrono então não garante perda ZERO de dados).</li>
</ul>
<p>Se você escolher logo uma estratégia de replicação, pense em primeiro lugar no Stand by. Com o lançamento da versão 9.0 o Stand by sofreu melhorias importantes e tudo indica que a próxima versão terá mais melhorias ainda. Combinar um Stand By com outras técnicas de backup é a melhor forma de se proteger contra a perda de dados e o downtime. Você estará utilizando uma solução nativa, relativamente simples, bem testada e documentada, com baixo impacto em performance e com um custo realmente baixo em comparação com outras alternativas.</p>
<h3>Backup físico, o primeiro passo.</h3>
<p>É claro que apesar de recomendar o uso do stand by, ele não é algo tão simples e barato assim. Você precisa de um servidor com capacidade semelhante ao de produção para suportar a mesma carga, lembre-se disto.  Novamente, existe excelente documentação sobre <a href="http://www.postgresql.org/docs/9.0/static/warm-standby.html">como criar um standby</a>. Você também precisa aprender com perfeição a fazer backups físicos e saber restaurá-los de forma adequada.</p>
<p>Existem dois tipos de backup físico, o frio e o quente. O frio é feito com o banco de dados desativado. Você copia todos os arquivos do banco (inclusive os de configuração) e depois reativa o banco de dados. Este método é muito simples e seguro, mas tem aquele problema básico: você precisa tirar o banco de dados do ar. Se você não tem janela para isto ou o seu sistema é 24X7, então você terá que recorrer ao backup quente. O quente é um pouco mais complicado,  pois exige que você avise o PostgreSQL quando vai começar a copiar os arquivos e quando terminou. Ele também EXIGE que você faça a cópia dos logs do WAL, utilizando o parâmetro &#8220;<a href="http://www.postgresql.org/docs/9.0/static/continuous-archiving.html#BACKUP-ARCHIVING-WAL">archive_command</a>&#8220;. Não vou me alongar sobre o assunto aqui. Leia a documentação atentamente sobre isso.</p>
<p>Depois que você se tornar um expert em fazer backups e recuperações de backups físicos quentes, já estará de quebra fazendo o PITR de forma natural e estará pronto para fazer o seu Stand By, que utiliza o backup quente como princípio para a sua criação.</p>
<h3>Então eu não preciso mais do <em>pg_dump</em>?</h3>
<p>Precisa sim. Não para a recuperação de desastres, mas para os outros casos mencionados. Suponhamos que você precisa restaurar um backup feito há 8 anos atrás. Provavelmente o servidor onde este backup foi gerado não existe mais. Talvez  o DBA que criou o procedimento  de backup não trabalhe mais na empresa. Certamente o SO e a versão do SGDB mudaram, pode ser que você não tenha mais versões compatíveis disponíveis. Então o backup físico não é indicado para estas situações. Ele é adequado para recuperação de desastres, mas não para reter backups por um longo período. Com um backup feito pelo <strong><em>pg_dump</em></strong>, você pode migrar os dados para outra versão do PostgreSQL ou até mesmo para outro SGDB.</p>
<p>E tem mais um detalhe, backups físicos são monolíticos. Você precisa restaurar o banco de dados no mesmo SO, com a mesma versão do PostgreSQL, com a mesma estrutura de diretórios, o mesmo sistema de arquivos e além de tudo precisa restaurar o banco de dados inteiro. Suponhamos que você só precise de algumas tabelas, o <strong><em>pg_dump</em></strong> oferece todo o tipo de flexibilidade para restaurar apenas uma parte dos dados.</p>
<h3>Estratégia de backup.</h3>
<p>Ok, o <strong><em>pg_dump</em></strong> não é <em><strong><span style="color: #ff0000;">O</span></strong></em> backup, ele é <span style="color: #ff0000;"><em><strong>parte</strong></em></span> de uma estratégia de backup. Você precisa do <strong><em>pg_dump</em></strong> para gerar backups esporádicos e guarda-los por um longo período. Para a recuperação de desastres você deve ter um backup físico (quente ou frio), cópia dos logs do WAL e cópia dos arquivos de configuração. Você não precisa guardar o backup físico pro muito tempo, alguns dias é razoável. Depende de quanto você deseja voltar no tempo se necessário, e de quanto você confia na sua mídia de armazenamento. Lembre-se da máxima: quem tem um backup não tem nada. Faça o backup físico uma vez por dia e não sobreescreva o backup do dia anterior. Você pode fazer o backup físico para o disco em outro servidor e gravar este backup em fita diferentes todos os dias por exemplo.  Já <strong>a cópia do WAL é feita automaticamente, mas deve ser copiada para fora do servidor também, se não imediatamente no comando do &#8220;archive_command&#8221;, faça isso em intervalos curtos para evitar a perda de dados em caso de desastres.</strong></p>
<h3>Conclusões :</h3>
<pre>(atualizado em 17/05/2010)</pre>
<ul>
<li>Backup não é simples, mesmo em bancos de dados pequenos;</li>
<li>Backup exige estudo, dedicação e disciplina;</li>
<li>Backup não deve ser responsabilidade de estagiários, deve ser criado e verificado diariamente por pessoas qualificadas e de confiança;</li>
<li>Backup é caro: os recursos de hardware são caros e os recursos humanos também;</li>
<li>Nunca diga que você está 100% seguro, você não está;</li>
<li>Você pode e deve estimar o tempo para se recuperar de desastres e qual o SLA que você pode entregar com os recursos disponíveis. Documente isso e protocole a entrega deste documento junto ao seu superior. Sim, isto pode salvar o seu emprego e de toda a sua equipe junto. Sua família agradece.</li>
</ul>
<h3>Atualização:</h3>
<p><strong><span style="font-weight: normal;">Em tempo, existe uma nova ferramenta para backup incremental chamada <a href="http://code.google.com/p/pg-rman/">pg_rman</a>. Sim, é um clone do RMAN do Oracle para o PostgreSQL. A ferramenta é relativamente nova, mas parece que o projeto está bastante ativo. Alguém aí já testou?</span></strong></p>
<p><em><strong>OBS</strong>: Gostaria de dedicar este humilde texto à todos aqueles que me contrataram para recuperar seus bancos de dados (desculpe, somente àqueles que não me deram calote depois, os que não pagaram vão para o mesmo lugar daqueles que utilizam RAID 0). Àqueles que sofreram durante madrugadas intermináveis com a pressão  de não saber se a empresa voltaria a funcionar no dia seguinte e todas as conseqüências que daí decorrem.</em></p>
<p><strong>*</strong> PNB = Pé Na Bunda, demissão mesmo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/05/06/dump-nao-e-backup/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Movendo usuários entre bases II</title>
		<link>http://www.midstorm.org/~telles/2010/05/05/movendo-usuarios-entre-bases-ii/</link>
		<comments>http://www.midstorm.org/~telles/2010/05/05/movendo-usuarios-entre-bases-ii/#comments</comments>
		<pubDate>Wed, 05 May 2010 16:18:33 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=611</guid>
		<description><![CDATA[Há tempos atrás eu postei este script tosco para extrair usuários com suas respectivas senhas no Oracle. Eu sei, no PostgreSQL, basta um &#8216;pg_dumpall -r&#8217; e tudo se resolve, mas no Oracle, você tem um pouco mais de trabalho, ainda mais se não quiser utilizar o ultra-super-mega-boga-hyper-duper-master-blaster-heavy-metal Database Control, também conhecido como Enterprise Manager e [...]]]></description>
			<content:encoded><![CDATA[<p>Há tempos atrás eu postei <a href="http://www.midstorm.org/~telles/2007/06/06/movendo-usuarios-entre-bases/">este script</a> tosco para extrair usuários com suas respectivas senhas no Oracle. Eu sei, no PostgreSQL, basta um &#8216;pg_dumpall -r&#8217; e tudo se resolve, mas no Oracle, você tem um pouco mais de trabalho, ainda mais se não quiser utilizar o ultra-super-mega-boga-hyper-duper-master-blaster-heavy-metal Database Control, também conhecido como Enterprise Manager e mais uma dúzia de apelidos.</p>
<p>Bom, o script a seguir cria um arquivo com os usuários, grupos (ok, o nome certo é &#8216;roles&#8217;), permissões em tabelas, privilégios de sistema, roles, quotas de tablespace e mais alguma coisa. Se você precisa atualizar bases entre versões diferentes (como do 9i para o 10g ou para o 11g), ou entre Sistemas Operacionais diferentes (se você tem o Oracle Enterprise dá para usar o conceito de <a href="http://download.oracle.com/docs/cd/E11882_01/backup.112/e10642/rcmxplat.htm#CHDFHBFI">tablespace transportável</a>).</p>
<p>Enfim, todo DBA sabe utilizar as ferramentas de geração de Dump (exp ou expdp) e importação de Dump (imp, impdp). E quase todos costumam importar os dados por esquema e não tudo de uma vez (full=y).  E como sempre, antes de importar o esquema, o usuário deve existir da base de destino.</p>
<p>Chega de blá, blá, blá. Segue o script:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">--</span>
<span style="color: #808080; font-style: italic;">-- mov_user.sql</span>
<span style="color: #808080; font-style: italic;">--</span>
<span style="color: #808080; font-style: italic;">-- Exporta usuários roles e privilegios.</span>
<span style="color: #808080; font-style: italic;">--</span>
<span style="color: #808080; font-style: italic;">--</span>
<span style="color: #808080; font-style: italic;">-- Criado por Fábio Telles Rodriguez</span>
<span style="color: #808080; font-style: italic;">--</span>
<span style="color: #808080; font-style: italic;">-- Última atualização: 05/05/2010</span>
<span style="color: #808080; font-style: italic;">--</span>
<span style="color: #808080; font-style: italic;">--</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- Ajusta parâmetros de visualização do SQL*Plus</span>
<span style="color: #993333; font-weight: bold;">SET</span> DEFINE OFF
<span style="color: #993333; font-weight: bold;">SET</span> PAGESIZE <span style="color: #cc66cc;">0</span>
<span style="color: #993333; font-weight: bold;">SET</span> WRAP      <span style="color: #993333; font-weight: bold;">ON</span>
<span style="color: #993333; font-weight: bold;">SET</span> TRIMSPOOL <span style="color: #993333; font-weight: bold;">ON</span>
<span style="color: #993333; font-weight: bold;">SET</span> SERVEROUTPUT <span style="color: #993333; font-weight: bold;">ON</span>
<span style="color: #993333; font-weight: bold;">SET</span> VERIFY OFF
<span style="color: #993333; font-weight: bold;">SET</span> FEED OFF
<span style="color: #993333; font-weight: bold;">SET</span> HEADING OFF
<span style="color: #993333; font-weight: bold;">SET</span> LINESIZE  <span style="color: #cc66cc;">120</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- Gera arquivo em mov_user.sql</span>
SPOOL mov_user_<span style="color: #66cc66;">.</span>sql
&nbsp;
<span style="color: #808080; font-style: italic;">-- Verifica se está conectado com o usuário SYS</span>
WHENEVER SQLERROR EXIT;
&nbsp;
DECLARE
  v_user varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
BEGIN
  <span style="color: #993333; font-weight: bold;">SELECT</span> user <span style="color: #993333; font-weight: bold;">INTO</span> v_user <span style="color: #993333; font-weight: bold;">FROM</span> dual <span style="color: #993333; font-weight: bold;">WHERE</span> user <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'SYS'</span>;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">-</span><span style="color: #cc66cc;">20000</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'ERRO! Você deve estar conectado como SYS para rodar este script!!!'</span><span style="color: #66cc66;">&#41;</span>;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- Cria profiles, e altera o DEFAULT</span>
BEGIN
  <span style="color: #993333; font-weight: bold;">FOR</span> profile <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">DISTINCT</span> profile <span style="color: #993333; font-weight: bold;">FROM</span> dba_profiles<span style="color: #66cc66;">&#41;</span> LOOP
    <span style="color: #993333; font-weight: bold;">IF</span> profile<span style="color: #66cc66;">.</span>profile <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'DEFAULT'</span> THEN
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'ALTER PROFILE '</span> <span style="color: #66cc66;">||</span> profile<span style="color: #66cc66;">.</span>profile <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' LIMIT'</span><span style="color: #66cc66;">&#41;</span>;    
    ELSE
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'CREATE PROFILE '</span> <span style="color: #66cc66;">||</span> profile<span style="color: #66cc66;">.</span>profile <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' LIMIT'</span><span style="color: #66cc66;">&#41;</span>;
    END <span style="color: #993333; font-weight: bold;">IF</span>;  
    <span style="color: #993333; font-weight: bold;">FOR</span> prof_limit <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span>
      <span style="color: #993333; font-weight: bold;">SELECT</span> resource_name<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">LIMIT</span> 
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_profiles 
        <span style="color: #993333; font-weight: bold;">WHERE</span> 
          profile <span style="color: #66cc66;">=</span> profile<span style="color: #66cc66;">.</span>profile <span style="color: #993333; font-weight: bold;">AND</span> 
          <span style="color: #993333; font-weight: bold;">LIMIT</span> !<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'DEFAULT'</span><span style="color: #66cc66;">&#41;</span> LOOP
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'    '</span> <span style="color: #66cc66;">||</span> prof_limit<span style="color: #66cc66;">.</span>resource_name <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' '</span> <span style="color: #66cc66;">||</span> prof_limit<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">LIMIT</span><span style="color: #66cc66;">&#41;</span>;
    END LOOP;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">';'</span><span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
  END LOOP;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">--Cria usuários</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'CREATE USER &quot;'</span> <span style="color: #66cc66;">||</span> username <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;'</span>
    DECODE <span style="color: #66cc66;">&#40;</span>password<span style="color: #66cc66;">,</span>
            <span style="color: #ff0000;">'EXTERNAL'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' IDENTIFIED EXTERNALLY'</span><span style="color: #66cc66;">,</span>
            <span style="color: #ff0000;">'GLOBAL'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' IDENTIFIED GLOBALLY AS '</span><span style="color: #ff0000;">''</span> <span style="color: #66cc66;">||</span> external_name<span style="color: #66cc66;">,</span>
            <span style="color: #ff0000;">' IDENTIFIED BY VALUES '</span><span style="color: #ff0000;">''</span> <span style="color: #66cc66;">||</span> password <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">''</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> CHR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'    DEFAULT TABLESPACE '</span> <span style="color: #66cc66;">||</span> default_tablespace <span style="color: #66cc66;">||</span> CHR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'    TEMPORARY TABLESPACE '</span> <span style="color: #66cc66;">||</span> temporary_tablespace <span style="color: #66cc66;">||</span> CHR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'    PROFILE '</span> <span style="color: #66cc66;">||</span> profile <span style="color: #66cc66;">||</span> CHR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    DECODE <span style="color: #66cc66;">&#40;</span>account_status<span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'OPEN'</span><span style="color: #66cc66;">,</span>                           <span style="color: #ff0000;">'    ACCOUNT UNLOCK;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'LOCKED'</span><span style="color: #66cc66;">,</span>                         <span style="color: #ff0000;">'    ACCOUNT LOCK;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'LOCKED(TIMED)'</span><span style="color: #66cc66;">,</span>                  <span style="color: #ff0000;">'    ACCOUNT LOCK;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'EXPIRED &amp; LOCKED'</span><span style="color: #66cc66;">,</span>               <span style="color: #ff0000;">'    ACCOUNT LOCK PASSWORD EXPIRE;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'EXPIRED &amp; LOCKED(TIMED)'</span><span style="color: #66cc66;">,</span>        <span style="color: #ff0000;">'    ACCOUNT LOCK PASSWORD EXPIRE;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'EXPIRED(GRACE) &amp; LOCKED'</span><span style="color: #66cc66;">,</span>        <span style="color: #ff0000;">'    ACCOUNT LOCK PASSWORD EXPIRE;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'EXPIRED(GRACE) &amp; LOCKED(TIMED)'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'    ACCOUNT LOCK PASSWORD EXPIRE;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'EXPIRED'</span><span style="color: #66cc66;">,</span>                        <span style="color: #ff0000;">'    ACCOUNT UNLOCK PASSWORD EXPIRE;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'EXPIRED(GRACE)'</span><span style="color: #66cc66;">,</span>                 <span style="color: #ff0000;">'    ACCOUNT UNLOCK PASSWORD EXPIRE;'</span><span style="color: #66cc66;">&#41;</span> mov_user
  <span style="color: #993333; font-weight: bold;">FROM</span> dba_users
  <span style="color: #993333; font-weight: bold;">WHERE</span>
    default_tablespace <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'EXAMPLE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DRSYS'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'CWMLITE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ODM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'XDB'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSTEM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSAUX'</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> default_tablespace<span style="color: #66cc66;">,</span> username
;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Concede quotas para usuários</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'ALTER USER '</span> <span style="color: #66cc66;">||</span> LOWER<span style="color: #66cc66;">&#40;</span>username<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">' QUOTA UNLIMITED ON '</span> <span style="color: #66cc66;">||</span> LOWER<span style="color: #66cc66;">&#40;</span>tablespace_name<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">';'</span>
  <span style="color: #993333; font-weight: bold;">FROM</span> dba_ts_quotas;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Especifica planos de recursos para usuários</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'EXEC DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING'</span> <span style="color: #66cc66;">||</span> CHR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'(DBMS_RESOURCE_MANAGER.ORACLE_USER, '</span><span style="color: #ff0000;">''</span> <span style="color: #66cc66;">||</span> LOWER<span style="color: #66cc66;">&#40;</span>username<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">''</span><span style="color: #ff0000;">', '</span><span style="color: #ff0000;">''</span> <span style="color: #66cc66;">||</span> LOWER <span style="color: #66cc66;">&#40;</span>INITIAL_RSRC_CONSUMER_GROUP<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">''</span><span style="color: #ff0000;">');'</span>
  <span style="color: #993333; font-weight: bold;">FROM</span> dba_users
  <span style="color: #993333; font-weight: bold;">WHERE</span>
    default_tablespace <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'EXAMPLE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DRSYS'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'CWMLITE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ODM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'XDB'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSTEM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSAUX'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span>
    LOWER <span style="color: #66cc66;">&#40;</span>INITIAL_RSRC_CONSUMER_GROUP<span style="color: #66cc66;">&#41;</span> !<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'default_consumer_group'</span>
  <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> default_tablespace<span style="color: #66cc66;">,</span> username
;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Cria ROLEs</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'CREATE ROLE &quot;'</span> <span style="color: #66cc66;">||</span> name <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot; '</span> <span style="color: #66cc66;">||</span>
    DECODE <span style="color: #66cc66;">&#40;</span>password<span style="color: #66cc66;">,</span>
        <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'NOT IDENTIFIED;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'EXTERNAL'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' IDENTIFIED EXTERNALLY;'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">'GLOBAL'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' IDENTIFIED GLOBALLY'</span><span style="color: #66cc66;">,</span>
        <span style="color: #ff0000;">' IDENTIFIED BY VALUES '</span><span style="color: #ff0000;">''</span> <span style="color: #66cc66;">||</span> password <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">''</span><span style="color: #ff0000;">';'</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">FROM</span> sys<span style="color: #66cc66;">.</span>user$
  <span style="color: #993333; font-weight: bold;">WHERE</span>
    type<span style="color: #808080; font-style: italic;"># = 0 AND</span>
    name <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'PUBLIC'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'_NEXT_USER'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'AQ_ADMINISTRATOR_ROLE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'AQ_USER_ROLE'</span><span style="color: #66cc66;">,</span>
      <span style="color: #ff0000;">'AUTHENTICATEDUSER'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'CONNECT'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'CTXAPP'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'DBA'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'DELETE_CATALOG_ROLE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'EJBCLIENT'</span><span style="color: #66cc66;">,</span>
      <span style="color: #ff0000;">'EXECUTE_CATALOG_ROLE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'EXP_FULL_DATABASE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'GATHER_SYSTEM_STATISTICS'</span><span style="color: #66cc66;">,</span>
      <span style="color: #ff0000;">'GLOBAL_AQ_USER_ROLE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'HS_ADMIN_ROLE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'IMP_FULL_DATABASE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'JAVADEBUGPRIV'</span><span style="color: #66cc66;">,</span>
      <span style="color: #ff0000;">'JAVAIDPRIV'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'JAVASYSPRIV'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'JAVAUSERPRIV'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'JAVA_ADMIN'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'JAVA_DEPLOY'</span><span style="color: #66cc66;">,</span>
      <span style="color: #ff0000;">'LOGSTDBY_ADMINISTRATOR'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'MGMT_USER'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'OEM_ADVISOR'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'OEM_MONITOR'</span><span style="color: #66cc66;">,</span>
      <span style="color: #ff0000;">'PLUSTRACE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'RECOVERY_CATALOG_OWNER'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'RESOURCE'</span><span style="color: #66cc66;">,</span>  <span style="color: #ff0000;">'SCHEDULER_ADMIN'</span><span style="color: #66cc66;">,</span>
      <span style="color: #ff0000;">'SELECT_CATALOG_ROLE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'SNMPAGENT'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'WM_ADMIN_ROLE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'XDBADMIN'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'XDBWEBSERVICES'</span><span style="color: #66cc66;">&#41;</span>
;
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Gera GRANTs em roles</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'GRANT '</span> <span style="color: #66cc66;">||</span> granted_role <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' TO &quot;'</span> <span style="color: #66cc66;">||</span> grantee <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;'</span> <span style="color: #66cc66;">||</span>
        DECODE<span style="color: #66cc66;">&#40;</span>admin_option<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'YES'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'WITH ADMIN OPTION;'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">';'</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">FROM</span> dba_role_privs p<span style="color: #66cc66;">,</span> dba_users u
  <span style="color: #993333; font-weight: bold;">WHERE</span>
    u<span style="color: #66cc66;">.</span>username <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span>grantee <span style="color: #993333; font-weight: bold;">AND</span>
    u<span style="color: #66cc66;">.</span>default_tablespace <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'EXAMPLE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DRSYS'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'CWMLITE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ODM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'XDB'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSTEM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSAUX'</span><span style="color: #66cc66;">&#41;</span>
;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Altera roles que não são padrão</span>
DECLARE
  v_non_default   NUMBER;
BEGIN
  <span style="color: #993333; font-weight: bold;">SELECT</span> COUNT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">INTO</span> v_non_default
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_role_privs <span style="color: #993333; font-weight: bold;">WHERE</span> default_role <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'NO'</span>;
  <span style="color: #993333; font-weight: bold;">IF</span> v_non_default <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> THEN
    <span style="color: #993333; font-weight: bold;">FOR</span> u <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">DISTINCT</span> grantee
                <span style="color: #993333; font-weight: bold;">FROM</span> dba_role_privs
        <span style="color: #993333; font-weight: bold;">WHERE</span> default_role <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'NO'</span>
        <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> grantee<span style="color: #66cc66;">&#41;</span>
    LOOP
      DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'ALTER USER '</span> <span style="color: #66cc66;">||</span> LOWER<span style="color: #66cc66;">&#40;</span>u<span style="color: #66cc66;">.</span>grantee<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' DEFAULT ROLE ALL EXCEPT '</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #993333; font-weight: bold;">SELECT</span> count<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">INTO</span> v_non_default
        <span style="color: #993333; font-weight: bold;">FROM</span> dba_role_privs
        <span style="color: #993333; font-weight: bold;">WHERE</span> grantee <span style="color: #66cc66;">=</span> u<span style="color: #66cc66;">.</span>grantee <span style="color: #993333; font-weight: bold;">AND</span> default_role <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'NO'</span>;
      <span style="color: #993333; font-weight: bold;">FOR</span> r <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> rownum<span style="color: #66cc66;">,</span> granted_role
                  <span style="color: #993333; font-weight: bold;">FROM</span> dba_role_privs
                  <span style="color: #993333; font-weight: bold;">WHERE</span> grantee <span style="color: #66cc66;">=</span> u<span style="color: #66cc66;">.</span>grantee <span style="color: #993333; font-weight: bold;">AND</span> default_role <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'NO'</span><span style="color: #66cc66;">&#41;</span>
      LOOP
        DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT<span style="color: #66cc66;">&#40;</span>LOWER<span style="color: #66cc66;">&#40;</span>r<span style="color: #66cc66;">.</span>granted_role<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #993333; font-weight: bold;">IF</span> r<span style="color: #66cc66;">.</span>rownum !<span style="color: #66cc66;">=</span> v_non_default THEN
          DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">','</span><span style="color: #66cc66;">&#41;</span>;
        END <span style="color: #993333; font-weight: bold;">IF</span>;
      END LOOP;
      DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT_LINE<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">';'</span><span style="color: #66cc66;">&#41;</span>;
    END LOOP;
  END <span style="color: #993333; font-weight: bold;">IF</span>;
END;
<span style="color: #66cc66;">/</span>
&nbsp;
<span style="color: #808080; font-style: italic;">-- Gera GRANTs em privilégios de sistema</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'GRANT '</span> <span style="color: #66cc66;">||</span> privilege <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">' TO &quot;'</span> <span style="color: #66cc66;">||</span> grantee <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;'</span> <span style="color: #66cc66;">||</span>
        DECODE<span style="color: #66cc66;">&#40;</span>admin_option<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'YES'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'WITH ADMIN OPTION;'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">';'</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">FROM</span> dba_sys_privs p<span style="color: #66cc66;">,</span> dba_users u
  <span style="color: #993333; font-weight: bold;">WHERE</span>
    u<span style="color: #66cc66;">.</span>username <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span>grantee <span style="color: #993333; font-weight: bold;">AND</span>
    u<span style="color: #66cc66;">.</span>default_tablespace <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'EXAMPLE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DRSYS'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'CWMLITE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ODM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'XDB'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSTEM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SYSAUX'</span><span style="color: #66cc66;">&#41;</span>
;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Gera GRANTs em objetos</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'GRANT '</span> <span style="color: #66cc66;">||</span> privilege <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">' ON '</span> <span style="color: #66cc66;">||</span> DECODE<span style="color: #66cc66;">&#40;</span>privilege<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'READ'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DIRECTORY '</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'WRITE'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'DIRECTORY '</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> 
    <span style="color: #ff0000;">'&quot;'</span> <span style="color: #66cc66;">||</span> owner <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;.&quot;'</span> <span style="color: #66cc66;">||</span> table_name <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'&quot; TO &quot;'</span> <span style="color: #66cc66;">||</span> grantee <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;'</span> <span style="color: #66cc66;">||</span>
    DECODE<span style="color: #66cc66;">&#40;</span>grantable<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'YES'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' WITH GRANT OPTION'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' '</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
    DECODE<span style="color: #66cc66;">&#40;</span>hierarchy<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'YES'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">' WITH HIERARCHY OPTION;'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">';'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> gr
  <span style="color: #993333; font-weight: bold;">FROM</span> dba_tab_privs p<span style="color: #66cc66;">,</span> dba_users u
  <span style="color: #993333; font-weight: bold;">WHERE</span>
    u<span style="color: #66cc66;">.</span>username <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span>grantee <span style="color: #993333; font-weight: bold;">AND</span>
<span style="color: #808080; font-style: italic;">--    u.default_tablespace NOT IN ('EXAMPLE','DRSYS','CWMLITE','ODM','XDB','SYSTEM','SYSAUX')</span>
u<span style="color: #66cc66;">.</span>USERNAME  <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'DBAMV'</span>
;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Gera GRANTs em colunas</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #ff0000;">'GRANT '</span> <span style="color: #66cc66;">||</span> privilege <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'(&quot;'</span> <span style="color: #66cc66;">||</span> column_name <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;)'</span> <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">' ON &quot;'</span> <span style="color: #66cc66;">||</span> owner <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;.&quot;'</span> <span style="color: #66cc66;">||</span> table_name <span style="color: #66cc66;">||</span>
    <span style="color: #ff0000;">'&quot; TO &quot;'</span> <span style="color: #66cc66;">||</span> grantee <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'&quot;'</span> <span style="color: #66cc66;">||</span>
    DECODE<span style="color: #66cc66;">&#40;</span>grantable<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'YES'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">' WITH GRANT OPTION;'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">';'</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">FROM</span> dba_col_privs;
&nbsp;
&nbsp;
SPOOL OFF</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2010/05/05/movendo-usuarios-entre-bases-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>COMMIT</title>
		<link>http://www.midstorm.org/~telles/2009/10/25/commit/</link>
		<comments>http://www.midstorm.org/~telles/2009/10/25/commit/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 10:37:24 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Bruce Momjian]]></category>
		<category><![CDATA[PGCon Brasil 2009]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=608</guid>
		<description><![CDATA[O sol nascendo aqui na Unicamp é um espetáculo que vale a pena ser visto. Aqui da piscina do hotel eu acordei cedo para colocar as idéias no lugar. Ainde temos muito trabalho pela frente. Colocar as palestras no site, acertar toda a parte burocrática e acertar um problema ou outro. Mas ontem terminamos o [...]]]></description>
			<content:encoded><![CDATA[<p>O sol nascendo aqui na Unicamp é um espetáculo que vale a pena ser visto. Aqui da piscina do hotel eu acordei cedo para colocar as idéias no lugar. Ainde temos muito trabalho pela frente. Colocar as palestras no site, acertar toda a parte burocrática e acertar um problema ou outro.</p>
<p>Mas ontem terminamos o evento. Como sempre, muitos problemas, muito mais do que os participantes do evento possam imaginar. Muitos erros, mas também muito aprendizado com os erros das edições anteriores.</p>
<p>Novos patrocinadores, novos palestrantes, novos temas, novos organizadores, novos participantes, novos clientes, novas idéias. Sim. Muita coisa nova. Sobre tudo, novos amigos, novas perspectivas, novos horizontes.</p>
<p>Se o primeiro PGCon Brasil, em 2007, foi um marco em termos de organização da comunidade, hoje, em 2009 temos um novo marco. As pessoas bateram à  nossa porta, entraram no evento, subiram no palco e disseram: &#8220;Hey, nós estamos utilizando o PostgreSQL em missão crítica aqui, precisamos da ajuda de vocês&#8221;. Sim, o PostgreSQL está crescendo e tomando de assalto grandes CPDs. Não é mais algo que entra pela porta dos fundos. Muita gente já testou, já sabe que funciona e também conhece suas peculiaridades. Já temos casos de implantações grandes rodando há alguns anos. Não é mais uma aventura, é uma realidade.</p>
<p>Sim, muita gente não sabe disso. Temos muito o que caminhar. Mas quem acompanha as listas de discussão (<a href="http://listas.postgresql.org.br/cgi-bin/mailman/listinfo">você AINDA não acompanha?</a>), o <a href="http://planeta.postgresql.org.br/">planeta</a> e principalmente acompanha os nossos <a href="http://www.postgresql.org.br/eventos">eventos</a> sabe que as coisas estão mudando. Pare para pensar como eram as coisas há 5 anos atrás?</p>
<p>Bom, ontem eu vi porquê valeu a pena esperar 3 anos para trazer o <a href="http://momjian.us/">Bruce Momjian</a> para o Brasil: em um dado momento ele contou um pouco da história do PostgreSQL e da sua história no PostgreSQL. De como ele começou a se dedicar ao projeto e de como aquilo inicialmente afetou a sua família e as suas finanças pessoais. Mas de repente, algo estranho começa a acontecer&#8230;. as pessoas começaram a utilizar o Postgres no Japão! Sim, em ambientes de produção. Estas pessoas criaram uma comunidade, com artigos, documentação, livros, profissionais qualificados e se tornaram o primeiro mercado a efetivamente utilizar o PostgreSQL para valer. A dedicação por anos de trabalho parece ter valido a pena.</p>
<p>Para mim isto tem um significado muito especial. Todos que me conhecem sabem que eu ainda não me sustento trabalhando com PostgreSQL. Mas já fazem alguns anos que eu tenho mantido algum tipo de contribuição para a comunidade brasileira. Sim, tem muita gente que começou muito antes e fez muito mais do que eu. Mas para mim e para muitos outros a questão é acreditar no projeto, acreditar nas pessoas. Cada vez que conheço um novo desenvolvedor do time central do Postgres eu fico mais empolgado. Pois são pessoas facinantes que estão desenvolvendo o Postgres. São pessoas que não são apenas desenvolvedores extraordinários. São pessoas com uma cultura e uma visão de mundo fantástica. É fantástico poder conversar com estas pessoas e saber que existem mais loucos pelo mundo. Que estes loucos fazem a diferença no mundo e que talvez você possa até fazer parte disso tudo, de dar a sua parte para construir um mundo mais próximo daquilo que você acredita que ele deveria ser.</p>
<p>YES, WE CAN!!!</p>
<p>IS DONE</p>
<p>IS JUST THE BEGINING&#8230;</p>
<p>Ok, devo postar mais sobre o evento, as fotos, as palestras, as pessoas, e outras coisas que rolaram no PGCon Brasil 2009, mas o dia já está claro e a água da piscina parece estar ótima&#8230; <img src='http://www.midstorm.org/~telles/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/10/25/commit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Inscrições para o PGCon Brasil 2009 abrem em 16/09</title>
		<link>http://www.midstorm.org/~telles/2009/09/15/inscricoes-para-o-pgcon-brasil-2009-abrem-em-1609/</link>
		<comments>http://www.midstorm.org/~telles/2009/09/15/inscricoes-para-o-pgcon-brasil-2009-abrem-em-1609/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 22:51:07 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PGCon Brasil 2009]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=600</guid>
		<description><![CDATA[As inscrições para o PGCon Brasil 2009 estarão abertas a partir de 16/09. Garanta já sua inscrição!!! Aproveite e baixe também o cartaz do evento aqui.]]></description>
			<content:encoded><![CDATA[<p><a href="http://pgcon.postgresql.org.br"><img class="aligncenter" title="PGCon Brasil 2009" src="http://pgcon.postgresql.org.br/2009/img/pgcon2009_horizontal_small.gif" alt="" width="432" height="60" /></a></p>
<p>As inscrições para o PGCon Brasil 2009 estarão abertas a partir de 16/09.</p>
<h2><a href="http://pgcon.postgresql.org.br/2009/inscricoes.php">Garanta já sua inscrição!!!</a></h2>
<h2></h2>
<h2></h2>
<h3>Aproveite e baixe também o cartaz do evento <a href="http://pgcon.postgresql.org.br/2009/divulgue.php">aqui</a>.</h3>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/09/15/inscricoes-para-o-pgcon-brasil-2009-abrem-em-1609/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Concurso &#8220;O elefante está entre nós&#8221;</title>
		<link>http://www.midstorm.org/~telles/2009/08/22/concurso-o-elefante-esta-entre-nos/</link>
		<comments>http://www.midstorm.org/~telles/2009/08/22/concurso-o-elefante-esta-entre-nos/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 10:54:33 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PGCon Brasil 2009]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=595</guid>
		<description><![CDATA[Não, não é uma piada sem graça para me incentivar a perder peso. A história começou mais ou menos assim: Eu estava conversando por e-mail com o Sr. Bruce Momjian (um daqueles desenvolvedores do PostgreSQL que por algum motivo todo mundo já ouviu falar na comunidade&#8230;) sobre a possibilidade dele trazer alguns brindes dos EUA [...]]]></description>
			<content:encoded><![CDATA[<p>Não, não é uma piada sem graça para me incentivar a perder peso. A história começou mais ou menos assim: Eu estava conversando por e-mail com o Sr. Bruce Momjian (um daqueles desenvolvedores do PostgreSQL que por algum motivo todo mundo já ouviu falar na comunidade&#8230;) sobre a possibilidade dele trazer alguns brindes dos EUA para o PGCon Brasil 2009.  Ele me disse que era melhor ver com o Sr. Josh Berkus, e eis que encontrei ele no mesmo dia no IRC, lá no #postgresql.</p>
<p>Eu estava interessado em conseguir uns 100 pendrives personalizados com o nome do PostgreSQL. Ano passado o David Fetter trouxe uns e eles evaporaram instantaneamente quando o pessoal ficou sabendo. Sim, eu tenho um.  Bom, o Josh disse que cada pendrive custava USD 8,00. Seria um pouco mais barato do que o preço aqui no Brasil, mas o Josh já me adiantou que só tem uns 50. Aí ele me disse algo interessante: &#8220;Me arranje algo melhor que simplesmente distribuir os pendrives para todo mundo que eu posso lhe conseguir eles de graça para você. E outra pessoa no canal deu a ideia: &#8220;Me mostre a sua melhor consulta SQL e ganhe um pendrive&#8221;.</p>
<p>O Josh parece que gostou da idéia e eu mais ainda. Aí comecei a rascunhar e pensar em como organizar isso. Pensei logo em algumas categorias para participar:</p>
<ul>
<li>Consulta ou script;</li>
<li>Artigo;</li>
<li>Artigo traduzido;</li>
<li>História em quadrinhos;</li>
<li>Estudo de caso;</li>
</ul>
<p>A ideia é mais ou menos assim: sabe aquela consulta que você criou para verificar o desempenho do banco? Aquele script de backup que ficou bacana? Ou aqueles testes que você ficou de publicar em algum lugar o resultado? Ah&#8230; tem também aquele artigo em inglês que um monte de gente adoraria ler em português. Bom, acho que deu para pegar o espírito da idéia. Você manda para nós o seu material, tem grandes chances de ganhar o seu pendrive e a comunidade ganha material novo para colocar na Internet. Todo mundo acaba ganhando.</p>
<h2>Vá na página do concurso &#8220;<a href="http://pgcon.postgresql.org.br/2009/concurso.php">O elefante está entre nós</a>&#8221; no site do <a href="http://pgcon.postgresql.org.br">PGCon Brasil 2009</a> e participe!</h2>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/08/22/concurso-o-elefante-esta-entre-nos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Saiu a grade do PGCon Brasil 2009!!!</title>
		<link>http://www.midstorm.org/~telles/2009/08/10/saiu-a-grade-do-pgcon-brasil-2009/</link>
		<comments>http://www.midstorm.org/~telles/2009/08/10/saiu-a-grade-do-pgcon-brasil-2009/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 19:13:18 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PGCon Brasil 2009]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=587</guid>
		<description><![CDATA[Sim, sim, é verdade! A grade oficial está no ar!!! Vá lá dar uma olhada e me diga o que você acha&#8230; Vou contar um pouco dos bastidores do evento: Foram ao todo 40 propostas na chamada de trabalhos; 2 Palestrantes internacionais convidados; 65 pessoas votaram nas propostas e disseram quais eram as suas prediletas; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pgcon.postgresql.org.br"> </a><a href="http://pgcon.postgresql.org.br"><img class="alignnone" title="PGCon Brasil 2009" src="http://pgcon.postgresql.org.br/2009/img/pgcon2009_horizontal_small.gif" alt="" width="432" height="60" /></a></p>
<h2>Sim, sim, é verdade! A <a href="http://pgcon.postgresql.org.br/2009/programacao.php">grade oficial</a> está no ar!!!</h2>
<p>Vá lá dar uma olhada e me diga o que você acha&#8230;</p>
<p>Vou contar um pouco dos bastidores do evento:</p>
<ul>
<li>Foram ao todo 40 propostas na chamada de trabalhos;</li>
<li>2 Palestrantes internacionais convidados;</li>
<li>65 pessoas votaram nas propostas e disseram quais eram as suas prediletas;</li>
<li>3 pessoas na banca avaliadora fizeram a seleção final das palestras;</li>
<li>4 tutoriais aprovados;</li>
<li>3 palestras avançadas;</li>
<li>4 Hacker Talks (palestras para quem deseja conhecer e  contribuir com o código do PostgreSQL);</li>
<li>11 palestras normais;</li>
<li>12 Lithning Talks  (palestras curtas de até 5 minutos cada);</li>
<li>3 salas simultâneas.</li>
</ul>
<p>Bom, outras novidades estão por vir, inscrições, concurso, patrocínios, divulgação, tudo a caminho. Até o final do mês o evento deverá estar com quase todos os detalhes fechados.  Em breve traremos mais detalhes&#8230; em breve!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/08/10/saiu-a-grade-do-pgcon-brasil-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pesquisa sobre lembranças para o PGCon Brasil 2009</title>
		<link>http://www.midstorm.org/~telles/2009/08/05/pesquisa-sobre-lembrancas-para-o-pgcon-brasil-2009/</link>
		<comments>http://www.midstorm.org/~telles/2009/08/05/pesquisa-sobre-lembrancas-para-o-pgcon-brasil-2009/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 18:58:52 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PGCon Brasil 2009]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=584</guid>
		<description><![CDATA[Andei fazendo algumas pesquisas de lembranças que poderíamos mandar fazer para o PGCon Brasil 2009. Infelizmente isto custa dinheiro e todos os fornecedores só fecham negócio com uma quantidade mínima de cerca de 100 peças. Diante deste tipo de dificuldade, resolvi fazer esta pesquisa para ver se há algum produto que interessaria mais a comunidade [...]]]></description>
			<content:encoded><![CDATA[<p>Andei fazendo algumas pesquisas de lembranças que poderíamos mandar fazer para o PGCon Brasil 2009. Infelizmente isto custa dinheiro e todos os fornecedores só fecham negócio com uma quantidade mínima de cerca de 100 peças.</p>
<p>Diante deste tipo de dificuldade, resolvi fazer esta pesquisa para ver se há algum produto que interessaria mais a comunidade e se teríamos pedidos suficientes para cobrir as despesas com isto.</p>
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/08/05/pesquisa-sobre-lembrancas-para-o-pgcon-brasil-2009/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A lenda da Replicação Multimaster Síncrona em bases distribuídas</title>
		<link>http://www.midstorm.org/~telles/2009/07/06/a-lenda-da-replicacao-multimaster-sincrona-em-bases-distribuidas/</link>
		<comments>http://www.midstorm.org/~telles/2009/07/06/a-lenda-da-replicacao-multimaster-sincrona-em-bases-distribuidas/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 20:15:10 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[replication]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=573</guid>
		<description><![CDATA[A história é conhecida e vira e mexe aparece alguém perguntando sobre isso. Bom, você tem uma mesma aplicação rodando em lugares geograficamente distintos. Podem ser países diferentes, podem ser estados, cidades ou até mesmo bairros diferentes, o problema é praticamente o mesmo. Imagine uma cadeia de empresas, todas elas rodando o mesmo aplicativo. Você [...]]]></description>
			<content:encoded><![CDATA[<p>A história é conhecida e vira e mexe aparece alguém perguntando sobre isso. Bom, você tem uma mesma aplicação rodando em lugares geograficamente distintos. Podem ser países diferentes, podem ser estados, cidades ou até mesmo bairros diferentes, o problema é praticamente o mesmo. Imagine uma cadeia de empresas, todas elas rodando o mesmo aplicativo.</p>
<p>Você pode chegar nesta situação quando era apenas uma matriz que abriu uma filial. O banco de dados ficava só na matriz e a filial acessa o banco de dados remotamente, via Internet, conexão via rádio, linha privativa, etc. O problema é que a conexão com a filial tinha a mania de cair e quando isso acontece é como se acabasse a luz. Se pensarmos numa empresa que utiliza apenas a conexão da Telefônica aqui em SP, dá para imaginar o desespero.</p>
<p>Então a solução ideal se chama replicação multimaster síncrona: você tem alguns bancos de dados, cada um em um local diferente. Cada atualização realizada numa das bases é automaticamente replicada para as demais e vice-versa. Qualquer base pode sofrer atualizações. Uma vez realizada, ela é visível instantaneamente em todas as bases. Se você der um rollback em uma transação, o rollback será realizado de forma idêntica em todos os nós. Ou seja, tem de garantir o <a href="http://pt.wikipedia.org/wiki/ACID">ACID</a> em todos os nós, como se estivesse em apenas um banco de dados. Existe um recurso no PostgreSQL que visa garantir este comportamento, ele se chama <a href="http://www.postgresql.org/docs/8.4/static/sql-prepare-transaction.html">commit em duas fases</a> e está disponível a partir da versão 8.1 do PostgreSQL. O commit em duas fases é muito importante por realmente garantir a consistência através de todos os nós. Ele <strong>não</strong> resolve problemas como o uso intensivo de SEQUÊNCIAS ou o a equivalência de um TIMESTAMP com precisão absoluta, mas resolve o problema de ter um commit ou rollback sincronizado em todos os nós. Deve-se entender que o Commit em duas fases é implemento como comandos SQL e não como uma aplicação. Portanto a sua aplicação tem de ser desenhada específicamente para utiliza-lo.</p>
<p>Há uma solução no universo PostgreSQL conhecida como PGCluster, que<strong> não</strong> utiliza o commit em duas fases mas faz a replicação multimaster assíncrona através de um serviço de balanceamento de carga e outro serviço de replicação. E vai além disso, se a comunicação com um dos nós cair, ele sincroniza o nó quando ele volta a se comunicar com os demais. Não é ótimo?</p>
<p>Sim, o PGCluster é uma ideia muito interessante, mas não como uma solução de banco de dados distribuído. Cada alteração no banco de dados dispara uma atualização em cada nós que precisa ser confirmada em um por um e depois da confirmação, liberada em todos eles. Isto significa que o que seria feito em X tempo em um único nó, será feito em  2XNL tempo onde N é o número de nós envolvidos na replicação e L é a latência da rede. Isto significa que se os nós não estiverem dispostos lado a lado numa rede local de alta velocidade, a perda de desempenho é absolutamente intolerável.</p>
<p>Mesmo que você utilize fibras ópticas de última geração para interligar seus servidores localizados em lugares distintos, você sofrerá com uma limitação: a velocidade da luz. Até que se prove ao contrário, nada viaja a uma velocidade superior a da luz, inclusive a informação. E nas idas e vindas do commit em duas fazes, a velocidade da luz começa a ser relevante. Ou seja, o PGCluster só é funcional como solução de alta disponibilidade, para servidores que ficam todos no mesmo CPD. Ainda assim há uma perda de performance considerável em cada atualização do banco de dados (nas leituras a distribuídas da carga propcia uma melhora de desempenho). Para encerrar o assunto, vale lembrar que o PGCluster é uma solução complexa de instalar (são no mínimo 3 nós + o balanceador de carga + o replicador), sua última versão foi lançada em 02/2008 e não é uma solução realmente bem aceita pelos desenvolvedores do PostgreSQL.</p>
<p>Sim o commit em duas fases pode ser utilizado com sucesso para bancos de dados distribuídos, mas para sincronizar apenas algumas operações e não a base inteira. Se você pesquisar bastante sobre o assunto, irá esbarrar em outras soluções:</p>
<ul>
<li>Houve algum tempo, se pensou numa forma nova para implementar uma replicação multimaster síncrona num projeto batizado como Slony II que rapidamente foi abandonado por ser considerado complexo demais e inviável na prática.</li>
<li>O PGCluster II  é uma tentativa de implementar algo semelhante ao Oracle RAC, que também é uma solução de alta disponibilidade e exige que todos os nós fiquem no mesmo local (eles tem de compartilhar o mesmo storage). Pelo que consta o PGCluter II ainda não teve nenhuma versão oficial lançada e não sei se ainda tem algum desenvolvimento ativo.</li>
<li>O <a href="http://bucardo.org/">Bucardo</a> é uma solução já em produção, mas não é síncrona, ou seja, ela admite um atraso entre as atualizações em cada nó o que exige regras de resolução de conflito quando um mesmo registro é atualizados em diferentes nós. Ou seja, não garante nem tem como garantir o ACID. O Bucardo é indicado para sincronizar uma base principal com outras bases  com pouco volume de atualização, como no caso de forças de vendas que tem uma base isolada no notebook de cada vendedor.</li>
</ul>
<p>Bom, mas então como resolvemos o problema das filiais??? Duas abordagens distintas:</p>
<ul>
<li>Resolva o seu problema com o link e mantenha todos os seus dados numa única base. Pode parecer besteira, mas ainda é a solução mais utilizada por grandes empresas que podem investir na redundância de links de alta velocidade e alta disponibilidade;</li>
<li>Não integrar todos os dados em uma única base. Faça com que  cada filial tenha apenas uma fatia dos dados e ponto final. Uma variação mais eficiente é fazer com que uma chamada por informações que se encontram em outro servidor sejam desviadas  para o servidor correto. Isto se chama particionamento horizontal ou cluster shared nothing e é uma técnica bastante complexa, mas muito eficiente. Uma forma de implementar isto no PostgreSQL é utlizando o <a href="http://pgfoundry.org/projects/plproxy/">PL/Proxy</a> do Skytools.</li>
</ul>
<p>As duas abordagens podem parecer um tanto radicais para você? Bom, eu diria que 90% dos grandes bancos utilizam exatamente estas abordagens:  possuem cerca de 3 ou 4 sites (digamos que em SP, DF e PE) cada uma respondendo por todas as transações da sua região. Há um investimento pesado para conectar todos os terminais no site da sua região. Se você precisar de informações de um site em outra região, a conexão é desviada para o site correto.</p>
<p>Estas são as duas formas óbvias de encarar o problema: centralizar tudo numa única base, ou dividir logo todos os dados em bases isoladas. Isto é tudo o que você pode fazer sem ter que mexer na lógica da aplicação. No entanto, se você está disposto a mexer na sua aplicação, particularmente na modelagem desta, então existe sim um meio termo. A primeira coisa a se fazer é dividir as tabelas em partes conforme as regras de negócio para a sua atualização:</p>
<ol>
<li>Tabelas que não são atualizadas ou que são atualizadas raramente: inclua aqui tabelas de parâmetros e coisas do tipo. Se você puder realizar as atualizações em apenas um local então você pode fazer com elas caiam no segundo caso:</li>
<li>Tabelas que são atualizadas apenas em um nó como a matriz e são consultadas por todas as outras filiais;</li>
<li>Tabelas onde cada filial é responsável pela atualização de apenas um punhado de registros, sendo que cada filial não pode alterar os registros da outra filial;</li>
<li>Tabelas onde cada filial deve poder atualizar qualquer registro da tabela, independente de qual filial seja.</li>
</ol>
<ul>
<li>Tudo que estiver nos casos 1 e 2 podem sofrer uma replicação multi/master, que é um pouco menos complexa e possui algumas boas ferramentas para implementar como o <a href="http://www.slony.info/">Slony I</a> e o <a href="http://pgfoundry.org/projects/skytools/">Londiste</a>. A ideia é simples, você atualiza as informações em uma única base e as informações são replicadas para os demais nós.</li>
<li>Tudo que estiver no 3º caso deve ser modificado para cair no 2º caso através do <a href="http://www.postgresql.org/docs/8.4/static/ddl-partitioning.html">particionamento de tabelas</a>. Assim você divide uma única tabela em uma tabela pai e várias outras tabelas filhas, uma para cada filial. As atualizações só serão feitos na tabela relativa a filial onde ele está e as suas atualizações são replicadas para as demais filiais. O particionamento de tabelas no PostgreSQL é um pouco chato de ser feito (melhorou um pouco no 8.4 mas no 8.5 está prometida uma revolução), mas é bastante flexível, portanto, depois de particionar as tabelas, você cai numa situação onde a replicação master/slave pode ser aplicada novamente;</li>
<li>Se você tiver o azar de cair no 4º caso , então você não terá outra alternativa senão utilizar o commit em duas fazes. Em geral, com uma boa modelagem você consegue fugir deste tipo de situação ao máximo, mas quando não for realmente possível, a ferramenta é esta. Note que nos casos 2 e 3, não estou falando de replicação síncrona. Se você realmente precisar de transações síncronas, com ACID entre todos os nós, o commit em duas fases é a sua única opção.</li>
</ul>
<p>Como você pode perceber, não existe solução fácil. Mas, feliz são os desenvolvedores que criam suas aplicações já pensando neste tipo de solução. É claro que hoje se utiliza muito SOA, REST e outras tecnologias para trafegar informações entre aplicações. Outros se aventuram com o envio de TXT, ou XML para lá e para cá das mais diversas formas. Há ainda aqueles que criam uma teia de <a href="http://www.postgresql.org/docs/8.4/static/dblink.html">DBLink</a>s para interligar as bases. Eu como DBA não sou especialista neste tipo de solução, mas acredito que elas sirvam para resolver outro tipo de problema. Um exemplo clássico seria a disponibilização de informações ou serviços de uma aplicação para outra aplicação diferente e não para a replicação de informações dentro de uma mesma aplicação. Trocar informações entre aplicações é muito diferente de replicar informações em bases distribuidas. A chave do problema sempre estará nas diferenças entre <strong>síncrono</strong> e <strong>assíncrono</strong>, e <strong>master/slave</strong> e<strong> multimaster</strong>.</p>
<p>Bom, eu acho que é só por enquanto. Se alguém conhecer outro tipo de solução que não seja baseada em nenhum dos casos aqui ou se tiver uma experiência que refute os argumentos que apresentei aqui, por favor deixe um comentário abaixo para trocarmos umas figurinhas, ok?</p>
<ul>
<li>Para saber mais sobre os diferentes tipos de Cluster e Replicação, veja neste blog o texto: <a href="http://www.midstorm.org/~telles/2007/08/24/cluster-replicacao/">Cluster != Replicação</a>.</li>
<li>Para saber mais sobre soluções de alta disponibilidade e balanceamento de carva, veja o texto da documentação oficial: <a href="http://www.postgresql.org/docs/8.4/static/high-availability.html">High Availability, Load Balancing, and Replication</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/07/06/a-lenda-da-replicacao-multimaster-sincrona-em-bases-distribuidas/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Lançado o PostgreSQL 8.4!!!</title>
		<link>http://www.midstorm.org/~telles/2009/07/01/lancado-o-postgresql-8-4/</link>
		<comments>http://www.midstorm.org/~telles/2009/07/01/lancado-o-postgresql-8-4/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 20:28:14 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=570</guid>
		<description><![CDATA[Sim senhores, muitas novidades e hora de preparar o calendário de migrações para a nova versão oficial do PostgreSQL, o banco de dados livre mais avançado do mundo. Vejam a nota oficial de lançamento em pt_BR.]]></description>
			<content:encoded><![CDATA[<p>Sim senhores, muitas novidades e hora de preparar o calendário de migrações para a nova versão oficial do PostgreSQL, o banco de dados livre mais avançado do mundo.</p>
<h2>Vejam a <a href="http://www.postgresql.org/about/press/presskit84.html.br">nota oficial de lançamento em pt_BR</a>.</h2>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/07/01/lancado-o-postgresql-8-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pesquisa sobre backup em PostgreSQL</title>
		<link>http://www.midstorm.org/~telles/2009/06/25/pesquisa-sobre-backup-em-postgresql/</link>
		<comments>http://www.midstorm.org/~telles/2009/06/25/pesquisa-sobre-backup-em-postgresql/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 12:21:51 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[pool]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=564</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/06/25/pesquisa-sobre-backup-em-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pesquisa sobre o uso do PostgreSQL no Brasil</title>
		<link>http://www.midstorm.org/~telles/2009/06/17/pesquisa-sobre-o-uso-do-postgresql-no-brasil/</link>
		<comments>http://www.midstorm.org/~telles/2009/06/17/pesquisa-sobre-o-uso-do-postgresql-no-brasil/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 14:50:22 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=552</guid>
		<description><![CDATA[Ouvi uma piada contada no PGCon Brasil 2007 que eu nunca esqueço: &#8220;O PostgreSQL é a amante dos bancos de dados. Todo mundo usa, mas quase ninguém confessa em público&#8221;. Ok, a piada pode te levar a comparações mais curiosas, mas a verdade é nua e crua: o Brasil é um dos países que mais [...]]]></description>
			<content:encoded><![CDATA[<p>Ouvi uma piada contada no <a href="http://pgcon.postgresql.org.br/2007/index.html">PGCon Brasil 2007</a> que eu nunca esqueço: <em>&#8220;O PostgreSQL é a amante dos bancos de dados. Todo mundo usa, mas quase ninguém confessa em público&#8221;</em>. Ok, a piada pode te levar a comparações mais curiosas, mas a verdade é nua e crua: o Brasil é um dos países que mais utiliza o PostgreSQL, mas ninguém sabe onde. Sim, sabemos de inúmeros casos onde a empresa tem contratos que a proíbem até de divulgar que utilizam o PostgreSQL. Então, passados mais de um ano e após a prova cabal de que o Google Docs realmente funciona, resolvi fazer a coisa da forma mais simples possível: não leva nem 5 minutos para responder a pesquisa e deve gerar dados com um pouco do perfil dos usuários do PostgreSQL no Brasil.</p>
<h3>Preencha a pesquisa agora <strong><a href="https://spreadsheets.google.com/viewform?formkey=cnlreFpqOFhZVzlNQkhSSHRkb0duV3c6MA..">aqui</a></strong>.</h3>
<h3>Mini FAQ</h3>
<ul>
<li> Sim, vamos públicar o resultado no final.</li>
<li>Não, não sei quando ainda, mas deve levar pelo menos um mês.</li>
<li>Não, não vamos divulgar nomes de empresas e pessoas que preencheram a pesquisa.</li>
<li>Sim, A chamada para a pesquisa foi <a href="http://www.postgresql.org.br/node/61">divulgada</a> hoje no <a href="http://www.postgresql.org.br">site oficial da comunidade</a> e é lá que vamos publicar os resultados em breve.</li>
<li>Sim, você pode e deve divulgar a pesquisa para aquele seu cliente que você sabe que utiliza PostgreSQL.</li>
<li>Sim, você pode e deve divulgar a pesquisa em sites, blogs, listas de discução, etc.</li>
<li>Sim, vamos fazer uma pesquisa qualitativa com mas detalhes sobre casos de uso brasileiros. Em breve&#8230;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/06/17/pesquisa-sobre-o-uso-do-postgresql-no-brasil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enquetes no SAVEPOINT</title>
		<link>http://www.midstorm.org/~telles/2009/06/14/enquetes-no-savepoint/</link>
		<comments>http://www.midstorm.org/~telles/2009/06/14/enquetes-no-savepoint/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 01:51:54 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[poll]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=546</guid>
		<description><![CDATA[Bom, eu bem sei que não ando postando novos artigos por aqui. Mas, enquanto os longos artigos não voltam, vamos mexendo numa coisa aqui e outra ali. Dei uma boa melhorada na galeria de imagens: Agora resolvi brincar com as enquetes. Não sei se vai vingar. Depende mesmo do número de pessoas que vão votar. [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, eu bem sei que não ando postando novos artigos por aqui. Mas, enquanto os longos artigos não voltam, vamos mexendo numa coisa aqui e outra ali. Dei uma boa melhorada na galeria de imagens:</p>

<div class="ngg-galleryoverview" id="ngg-gallery-4-546">

	<!-- Slideshow link -->
	<div class="slideshowlink">
		<a class="slideshowlink" href="http://www.midstorm.org/~telles/2009/06/14/enquetes-no-savepoint/?show=slide">
			[Show as slideshow]		</a>
	</div>

	<!-- Piclense link -->
	<div class="piclenselink">
		<a class="piclenselink" href="javascript:PicLensLite.start({feedUrl:'http://www.midstorm.org/~telles/wp-content/plugins/nextgen-gallery/xml/media-rss.php?gid=4&amp;mode=gallery'});">
			[View with PicLens]		</a>
	</div>
	
	<!-- Thumbnails -->
		
	<div id="ngg-image-66" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/Igreja II.jpg" title=" " class="shutterset_set_4" >
								<img title="Igreja II.jpg" alt="Igreja II.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_Igreja II.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-67" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/PE - nascer do sol em Boa Viagem.jpg" title=" " class="shutterset_set_4" >
								<img title="PE - nascer do sol em Boa Viagem.jpg" alt="PE - nascer do sol em Boa Viagem.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_PE - nascer do sol em Boa Viagem.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-68" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/Sapo.jpg" title=" " class="shutterset_set_4" >
								<img title="Sapo.jpg" alt="Sapo.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_Sapo.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-69" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/Varal.jpg" title=" " class="shutterset_set_4" >
								<img title="Varal.jpg" alt="Varal.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_Varal.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-70" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/avenida.jpg" title=" " class="shutterset_set_4" >
								<img title="avenida.jpg" alt="avenida.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_avenida.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-71" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/casinha.jpg" title=" " class="shutterset_set_4" >
								<img title="casinha.jpg" alt="casinha.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_casinha.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-72" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/ibira.jpg" title=" " class="shutterset_set_4" >
								<img title="ibira.jpg" alt="ibira.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_ibira.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-73" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/janela.jpg" title=" " class="shutterset_set_4" >
								<img title="janela.jpg" alt="janela.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_janela.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-74" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/onde.jpg" title=" " class="shutterset_set_4" >
								<img title="onde.jpg" alt="onde.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_onde.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-75" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/raio.jpg" title=" " class="shutterset_set_4" >
								<img title="raio.jpg" alt="raio.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_raio.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-76" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/tecladoII.jpg" title=" " class="shutterset_set_4" >
								<img title="tecladoII.jpg" alt="tecladoII.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_tecladoII.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-77" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/violao.jpg" title=" " class="shutterset_set_4" >
								<img title="violao.jpg" alt="violao.jpg" src="http://www.midstorm.org/~telles/fotos/albums/coisas_diferentes/thumbs/thumbs_violao.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>


<p>Agora resolvi brincar com as enquetes. Não sei se vai vingar. Depende mesmo do número de pessoas que vão votar. Se tiver um número razoável, prometo ir atualizando por aqui.</p>
<p>Segue a primeira, que não poderia ser muito diferente. Em breve, algumas mais polêmicas devem se seguir. Aguardo os votos do pessoal.</p>
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/06/14/enquetes-no-savepoint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aberta a chamada de trabalhos para o PGCon Brasil 2009</title>
		<link>http://www.midstorm.org/~telles/2009/05/31/aberta-a-chamada-de-trabalhos-para-o-pgcon-brasil-2009/</link>
		<comments>http://www.midstorm.org/~telles/2009/05/31/aberta-a-chamada-de-trabalhos-para-o-pgcon-brasil-2009/#comments</comments>
		<pubDate>Sun, 31 May 2009 23:32:12 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PGCon Brasil 2009]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=536</guid>
		<description><![CDATA[Sim senhores, agora é oficial e a corrida para o evento começou para valer. Esté aberta até 30/06/2009 a chamada de trabalhos para o PGCon Brasil 2009. Na nossa 3ª edição do evento, temos mais novidades nesta área: serão 4 modalidades diferentes (palestra, palestra avançada, tutorial e hacker talk). Se a chamada de trabalhos for [...]]]></description>
			<content:encoded><![CDATA[<p>Sim senhores, agora é oficial e a corrida para o evento começou para valer. Esté aberta até 30/06/2009 a <a href="http://pgcon.postgresql.org.br/2009/chamadas.php">chamada de trabalhos</a> para o <a href="http://pgcon.postgresql.org.br/2009">PGCon Brasil 2009</a>. Na nossa 3ª edição do evento, temos mais novidades nesta área: serão 4 modalidades diferentes (palestra, palestra avançada, tutorial e hacker talk). Se a chamada de trabalhos for um sucesso absoluto e tudo der certo, vamos passar pelo dilema terrível de ter que escolher os melhores trabalhos.</p>
<p>Aí as novidades continuam. O método de escolha foi muito debatido na comunidade. Haviam duas propostas em pauta:</p>
<ul>
<li>Votação direta pelos membros da comunidade (ou inscritos nas listas). A votação garante que o evento vá de encontro com os interesses dos participantes o que é fundamental para a satisfação dos participantes.</li>
<li>O uso de uma banca avaliadora composta por 3 pessoas respeitadas da comunidade. Em 2007 foram os Srs. <a href="http://fumadordetabaco.blogspot.com/">Diogo Biazus</a> e <a href="http://www.timbira.com/">Euler Taveira</a>. Em 2008 foram os Srs. <a href="http://postgreslogia.wordpress.com/">Leonardo César</a>, <a href="http://guedesoft.net/blog/">Dickson Guedes</a> e <a href="http://www.midstorm.org/~telles">eu</a>. Em 2008 se chegou ao consenso de que uma comissão com número ímpar seria interessante para não haver empates e que deveriamos alternar as pessoas envolvidas nesta banca. Para 2009 escolhemos os Srs. Luis Fernando Bueno,<a href="http://dutras.blogspot.com/"> Leandro Dutra</a> e <a href="http://www.midstorm.org/~fike/weblog/">Fernando Ike</a>. A vantagem de usar uma comissão é a simplicidade e agilidade do processo e a capacidade de balancear temas e garantir a qualidade, uma vez que são pessoas que conhecem bastante de PostgreSQL no Brasil. Uma coisa interessante da comissão é a possibilidade de trazer temas novos, evitando que as mesmas palestras se repitam todos os anos.</li>
</ul>
<p>Na dúvida ficamos com os dois. Haverá uma votação on-line entre os membros da lista <a href="https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral">PGBR-Geral</a>. Esta votação irá apontar para as palestras mais populares e os temas mais solicitados e então uma comissão avaliadora composta de 3 pessoas fará uma seleção final.</p>
<p>Mas ainda temos cartas na manga: se houver um número muito grande de propostas, abriremos uma exposição de painéis (cartazes explicativos que são pendurados nos corredores do saguão com a presença de seus autores), como é comum se fazer em eventos acadêmicos. Desta forma, poderemos contemplar a participação de mais pessoas. Mas esperem, o melhor fica para o final! Vamos repetir o clima animado no final do evento de 2008: os Lightning Talks vão voltar! Na última semana antes do evento estaremos abrindo as incrições (que vão até o final do primeiro dia do evento) para as apresentações relâmpago, com duração máxima de 5 minutos cada.</p>
<p>Então senhores, se você já está trabalhando há algum tempo com PostgreSQL, envie sua proposta. Se você tem várias ideias, mande várias propostas. Escolha o formato mais adequado e mande para nós. Há inúmeros temas que você pode abordar. Este ano teremos mais espaço, 2 auditórios e uma sala VIP, então vale a pena compartilhar conosco um pouco da sua experiência. Você não precisa ser um gênio, basta apenas ter testado alguma coisa interessante e chegado a alguma conclusão no caminho. Muita gente acha que não tem nada de interessante para falar&#8230; eu digo que ao acompanhar a lista, tem um montão de gente respondendo e-mails que eu adoraria ver subir no palco e dividir um pouco mais do que sabe conosco. Vejo um zilhão de dúvidas que se repetem e dúvidas que mereciam um tutorial inteiro para explicar melhor como fazer.</p>
<p>Se você está realmente sem idéias, eu vou dar algumas (tem muuuuito mais, claro!) sugestões:</p>
<ul>
<li>Técnicas para carga de grande volume de dados e ETL;</li>
<li>Desempenho, segurança e uso de Discos e Sistemas de Arquivos;</li>
<li>Testes com novos sistemas de arquivos como EXT4, ZFS, quem sabe BTRFS&#8230;</li>
<li>GUCs e dicas de configurações de parâmetros;</li>
<li>Segurança de aplicações usando PostgreSQL: técnicas para autenticar usuários e evitar SQL Injection;</li>
<li>Uso de Full Text Search;</li>
<li>PostGIS;</li>
<li>Uso de PostgreSQL em aplicações de suporte a decisão (BI);</li>
<li>Técnicas de Backup físico e lógico, ou melhor: técnicas de restauração!</li>
<li>Como encontrar SQLs lentos e reescrevê-los;</li>
<li>Como monitorar o uso de recursos com as novas funções, visões, opções de log e ferramentas do PostgreSQL;</li>
<li>Como criar índices realmente úteis e remover índices inúteis;</li>
<li>Utilizando técnicas de replicação multimaster assíncronas;</li>
<li>Comparação de diferentes técnicas de replicação: onde eu uso o que?</li>
<li>Tudo que você queria saber sobre internacionalização e localização e tinha vergonha de perguntar;</li>
<li><span style="font-size: small;">Refatoração de banco de dados sem perder a cabeça ou o emprego!<br />
</span></li>
<li>Migração para PostgreSQL (a partir de Oracle, MySQL, DB2, SQL Server, o que for);</li>
<li>Versionamento de banco de dados: gerenciando a mudança com responsabilidade!</li>
<li>Técnicas de auditoria e monitoramento de usuários;</li>
<li>Desempenho com responsabilidade: descubra o ponto G do PG&#8230;</li>
<li>Casos de sucesso, sim, queremos saber quem está usando o PostgreSQL por aí!</li>
<li>Casos de insucesso e dicas para evitar entrar em grandes roubadas. Tambem poderia ser: &#8220;Eu não disse que esse negócio de banco de dados livre não prestava&#8230;&#8221; (fala sério, alguém tem que fazer esta um dia)</li>
<li>Conhecendo um pouco do código fonte do PostgreSQL e funções SPI;</li>
<li>Ferramentas para modelagem e documentação de DDL para PostgreSQL (tem alguém me devendo essa)</li>
<li>10 Coisas que ainda não funcionam bem no PostgreSQL,mas que estão em vias de se resolver (ou não) e como contornar estes problemas;</li>
<li>Os desafios em ambientes transacionais pesados e com grande volumes de dados;</li>
<li>PostgreSQL em aplicações científicas. Em 2008 aprovamos uma palestra de banco de dados para dados biológicos que cancelou na última hora, uma pena.</li>
<li>Modelagem utilizando tipos, vetores, domínios, funções de agragação e outros bichos;</li>
<li>Consultas recursivas com Common Table Expressions;</li>
<li>Cálculos complexos com Windowing Functions;</li>
<li>Stand By rápido e rasteiro.</li>
<li>A caixa de ferramentas do DBA: consultas e formas de se trabalhar para tornar a vida do DBA mais simples e produtiva;</li>
<li>Os 12 pecados do desenvolvedor que começa a utilizar o PostgreSQL pela primeira vez;</li>
<li>PostgreSQL para adminstradores de sistema: montando um servidor seguro, rápido e fácil de administrar;</li>
</ul>
<p>Bom, estas são apenas algumas sugestões, existem várias outras que não pensei agora. Sugestões? De qualquer forma, estamos muito querendo ver novas caras do PGCon Brasil este ano, agora é só escrever e mandar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/05/31/aberta-a-chamada-de-trabalhos-para-o-pgcon-brasil-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[pgbr-geral] Campanha dos 5 pontos para melhorar o nível da lista</title>
		<link>http://www.midstorm.org/~telles/2009/05/12/pgbr-geral-campanha-dos-5-pontos-para-melhorar-o-nivel-da-lista/</link>
		<comments>http://www.midstorm.org/~telles/2009/05/12/pgbr-geral-campanha-dos-5-pontos-para-melhorar-o-nivel-da-lista/#comments</comments>
		<pubDate>Tue, 12 May 2009 17:48:33 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Software Livre]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=530</guid>
		<description><![CDATA[Tem dias que a gente não deveria começar o dia lendo e-mails idiotas: veja o resultado na lista do PostgreSQL PGBR-Geral. Me pareceu que não sou só eu que estou cançado de ver isso on-line. É bem verdade que a resposta do Sr. Roberto Mello me acordou para a dura realidade do &#8220;Never ending September&#8220;. [...]]]></description>
			<content:encoded><![CDATA[<p>Tem dias que a gente não deveria começar o dia lendo e-mails idiotas: veja o resultado na lista do PostgreSQL <a href="http://listas.postgresql.org.br/pipermail/pgbr-geral/2009-May/015419.html">PGBR-Geral</a>. Me pareceu que não sou só eu que estou cançado de ver isso on-line. É bem verdade que a resposta do Sr. <a href="http://listas.postgresql.org.br/pipermail/pgbr-geral/2009-May/015428.html">Roberto Mello</a> me acordou para a dura realidade do &#8220;<a href="http://en.wikipedia.org/wiki/Eternal_September">Never ending September</a>&#8220;. Mas fica abaixo o registro.</p>
<p>Senhores, eu sei que muitos que estão utilizando o PostgreSQL são novatos, estudantes e entusiastas. Sei que não é de bom tom tratar estas pessoas de forma seca e dura, pois são pessoas que futuramente vão apoiar a comunidade e utilizar o PostgreSQL em cenários mais sérios e coisa e tal. Mas hoje me deu os 5 minutos de fúria.</p>
<p>Vamos escrever melhor gente? Eu seu que não sou uma pessoa que contribui ativamente aqui na lista. Não respondo muita coisa. Mas venhamos e convenhamos, o nível das perguntas (e muitas vezes das<br />
respostas e comentários também) desanima qualquer pessoa letrada que se esforça para se comunicar adequadamente.</p>
<p>Antes de disparar com a metralhadora para todos os lados, eu quero<br />
dizer: entendo que os erros de ortografia e de digitação fazem parte da nossa vida. Eu mesmo cometo erros terríveis no meu blog e nos e-mails. A língua portuguesa é chata mesmo. Quando estou ajudando o<br />
meu filho de 6 anos a fazer a lição de casa eu percebo como as regras<br />
são confusas: G e J, c, ç, ss, z ou c e q, m ou n, r ou rr, e por aí vai. Mas inventaram os corretores ortográficos e eles estão aí para nos livrar da peste, da fome e da danação.</p>
<p>Proponho lançar uma campanha de 5 pontos aqui (a exemplo de zilhões de campanhas semelhantes em trilhões de listas por aí):</p>
<ol>
<li> O nome do banco de dados livre mais avançado do mundo é &#8216;PostgreSQL&#8217; ou simplesmente &#8216;postgres&#8217;. Sim, você pode escrever sem acentos e sem letras maiúsculas. Pode até abreviar para PG numa lista mais informal como a nossa. Mas não use nenhuma outra forma, ok? É como mandar um cartão de dia dos namorados com o nome da garota escrito errado. Na dúvida repita em voz alta para não errar mais:  postgres, postgres, postgres. Dá um bom mantra, é relaxante, tente novamente: postgres, postgres, postgres&#8230;</li>
<li>Guarde o miguxes para os seus amigos do tempo do ensino fundamental. Se você escreve ou até fala assim, guarde este segredo terrível para você e aqueles que praticam isso. Não abrevie palavras como se estivesse num chat e principalmente não utilize expressões escritas propositalmente erradas. Conheço muita gente da velha guarda que sente dificuldade em ler menssagens assim. O resultado? Não respondem. Eu não respondo mais e sei de gente muito boa que também não responde.</li>
<li>Descrevam o problema! Gente, nós não conhecemos o seu  ambiente, não vemos os erros que estão acontecendo na sua tela e não sabemos o que você fez. Nós não vamos adivinhar se você não contar. Dizer simplesmente: &#8220;estou com um problema no postgres e nada funciona aqui&#8221; pode conter o nome do banco de dados escrito corretamente, pode até fazer um bom uso da língua portuguesa, mas não nos diz nada. Se você se sente apenas frustrado e quer desabafar, recomendo uma boa cerveja, ver desenhos animados na TV ou até mesmo conversar com alguém no IRC. Mas dizer que não funciona e não citar o contexto não vai lhe ajudar.</li>
<li>Se o seu chefe/professor mandou você fazer um trabalho com PostgreSQL para ontem e você precisa de alguém que faça uma parte do trabalho para você, a lista será um ótimo lugar para você encontrar um profissional que lhe cobrará um preço justo pelos seus trabalhos. Não, não vamos fazer o trabalho de graça por você. Por favor não peça.</li>
<li>Uma boa pergunta é metade do caminho para encontrar a resposta. Se você leu a documentação, pesquisou na Internet, testou e não conseguiu fazer o que você queria, você deve ter uma dúvida. Gaste um tempo na elaboração da pergunta. Pense um pouco.
<ul>
<li>Se você leu um monte de documentações (principalmente a oficial) e não entendeu nada, seu problema é de compreensão de texto. Estude inglês ou português e principalmente leia mais. Um livro por mês seria uma boa meta para você. Mas pelo menos 2 bons livros por ano é o mínimo que um cidadão alfabetizado deveria se habituar a ler. Revistas em quadrinhos são muito legais (eu adoro) mas não contam aqui.</li>
<li>Se você testou vários how-tos e receitas de bolo prontas e nada funcionou, vá ler a documentação oficial antes de sair perguntando. Um bom tutorial sempre tem referências. Leia as referências. Ocorre que um tutorial se refere a uma situação específica. Pode não ser o seu caso. Você pode precisar de adaptações. Para quem tem uma boa base de conhecimento (por exemplo, para quem leu a tal da documentação&#8230;) o tutorial é muito interessante. Para quem cai de paraquedas, costuma ser um desastre.</li>
<li>Se você pesquisou um bocado e leu um bocado e conseguiu evoluir até um certo ponto e depois travou. Você deve ter uma genuína dúvida. Mande um e-mail para nós. Escreva bem, descreva o seu processo e nós lhe ajudaremos. Mas antes de enviar o e-mail, lembre-se que você gastou um tempão para chegar onde está. Se você souber exatamente o que você não está entendendo e souber materializar sua dúvida em forma de um texto, seu problema estará muito próximo da solução. É muito comum se passarem 5 ou 10 e-mails numa lista até que as pessoas entendam precisamente o que você quer saber. Pergunte bem e você terá uma boa resposta. Mais que isso, você será respeitado pelo seu esforço em pesquisar antes e também pela sua capacidade de elaboração de questões relevantes.</li>
</ul>
</li>
</ol>
<p>Há alguns anos atrás, quando o PostgreSQL começou a ganhar mais visibilidade no Brasil (no lançamento do PostgreSQL 8.0 para ser mais exato), houve uma grande tensão na lista por causa da invasão dos miguxos, analfabetos digitais e até folgados mesmo que caiam diariamente de paraquedas na lista. Eu não acho que espantar esta turma nos ajudará em alguma coisa. Mas se as pessoas vem à lista para aprender alguma coisa, espero aqui estar dando a minha contribuição pedagógica. Sim, eu sou um brasileiro e não desisto nunca!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/05/12/pgbr-geral-campanha-dos-5-pontos-para-melhorar-o-nivel-da-lista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PGDays pelo Brasil afora!</title>
		<link>http://www.midstorm.org/~telles/2009/05/12/pgdays-pelo-brasil-afora/</link>
		<comments>http://www.midstorm.org/~telles/2009/05/12/pgdays-pelo-brasil-afora/#comments</comments>
		<pubDate>Tue, 12 May 2009 15:46:54 +0000</pubDate>
		<dc:creator>Telles</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.midstorm.org/~telles/?p=517</guid>
		<description><![CDATA[Senhores, o que parecia uma mera proposta de fim de evento se transformou numa maratona. 5 eventos em cerca de 2 meses: Brasília &#8211; DF, São Paulo &#8211; SP, Porto Velho e Ji Paraná &#8211; RO, Porto Alegre &#8211; RS e por fim Florianópolis &#8211; SC. A melhor parte: eu não tive que mover uma [...]]]></description>
			<content:encoded><![CDATA[<p>Senhores, o que parecia uma mera proposta de fim de evento se transformou numa maratona. 5 eventos em cerca de 2 meses: Brasília &#8211; DF, São Paulo &#8211; SP, Porto Velho e Ji Paraná &#8211; RO, Porto Alegre &#8211; RS e por fim Florianópolis &#8211; SC. A melhor parte: eu não tive que mover uma palha para tudo isso acontecer! Isso mesmo, várias pessoas se dispondo a organizar eventos regionalmente.  E digo mais, por pouco não ocorrem eventos no Paraná, Rio de Janeiro e Ceará também. Quem sabe em 2010?</p>
<p>Bom, apesar de não ter contribuído com a organização, eu acabei aceitando o convite feito no próprio PGCon 2008 de ir para Rondônia. Então eu e o Sr. Euler Taveira fomos de avião para lá. O Sr. Euler, diga-se de passagem virou arroz de festa e está indo a quase todos os PGDays. Só não vai para SC por um motivo simples: vai estar no canadá no PGCon internacional nesta data.</p>
<p>Cada evento traz consigo características próprias: em DF, o Sr. Jair Silva mostrou um pouco do mega ambiente corporativo da Caixa Econômica Federal utilizando PostgreSQl e houve também um longo tutorial sobre replicação com o Sr. Dickson Guedes. Em SP, foram 6 palestras com a grade mais diversificada até o momento. Em RO, foi o maior público até agora. Não tenho os números ainda, mas se juntarmos os dois dias de evento em Porto Velho e Ji Paraná certamente contaremos com algo na casa das 300 pessoas. No RS temos uma renovação nos palestrantes, tendo 3 pessoas que não palestraram em nenhum PGCon Brasil na grade. Por fim, teremos o PGDay SC que ainda não tem a grade fechada, mas é o primeiro a estrear um sistemas de inscrições integrado no próprio site da comunidade.</p>
<p>Enfim, muita coisa boa rolando. O povo do FISL 10 já avisou que quase todas as propostas de palestras sobre banco de dados são para PostgreSQL. Não é muita novidade para nós&#8230; ano passado também foi assim. De qualquer forma, eu diria que a comunidade tem realmente se destacado nos últimos tempos.</p>
<p>Meus parabéns a todos os organizadores!</p>
<p>Não achou nenhum link? Tudo o que você quer saber sobre eventos da comunidade brasileira de PostgreSQL está <a href="http://www.postgresql.org.br/eventos">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.midstorm.org/~telles/2009/05/12/pgdays-pelo-brasil-afora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
