Também já escrevi sobre isso antesORACLEArtigo sobre novos recursos sobre 11G, agoraORACLEO 11g se tornou mainstreamORACLEVersão do banco de dados, entenda e aprendaORACLEOs novos recursos do 11G são cruciais, e eu tambémORACLEPara os iniciantes das novas funcionalidades do 11G, gostaria de compartilhar aqui meu processo de aprendizado e experiência.
Este artigo registra principalmente que:ORACLEUm novo recurso do 11g que permite que bloqueadores DDL aguardem bloqueios DML, tema também compartilhado pelo Sr. Zhang Leyi (kamus) no evento ACOUG em 30 de junho.
Em versões anteriores ao 11g, por padrão, bloqueios DDL não esperam por bloqueios DML, e se você realizar operações DDL em uma tabela com bloqueios DML, ela retornará imediatamente uma falha (exceto pela mesma SESSÃO), vamos fazer um experimento simples, inserir dados na tabela STREAM em SESSION1, não submeta, nesse momento a tabela STREAM terá um bloqueio DML, e executar a operação TRUNCATE Table STREAM em SESSION2, retornando imediatamente uma falha:
SESSION1 >inserir no stream selecione * do dbdream; 10 linhas criadas. SESSION2 >encurtar fluxo de mesas; truncar fluxo de tabela * ERRO na linha 1: ORA-00054: resource busy and acquire com NOWAIT especificado ou timeout expirado na versão 11g,ORACLEIntroduzido DDL_LOCK_TIMEOUT parâmetro, permitindo que bloqueios DDL aguardem por bloqueios DML, que controlam o tempo para bloqueios DDL aguardarem bloqueios DML, em segundos, o valor padrão é 0, ou seja, bloqueios DDL não esperam por bloqueios DML, o valor máximo é 1 milhão, ou seja, 11,5 dias, esse parâmetro pode ser definido globalmente ou no nível SESSÃO.
SESSION2 >parâmetro de mostrar ddl_lock_timeout NOME TIPO VALOR ----------------------- ----------- ------ ddl_lock_timeout inteiro 0 SESSION2 >alterar conjunto de sessão ddl_lock_timeout=2000000; ERRO: ORA-00068: valor inválido 2000000 para o parâmetro ddl_lock_timeout, deve estar entre 0 e 1000000 O seguinte demonstra o efeito do seguinte parâmetro DDL_LOCK_TIMEOUT, e também toma a tabela STREAM acima como exemplo, a tabela STREAM atual ainda possui um bloqueio DML, no SESSION2 será DDL_LOCK_ TIMEOUT é definido para 60 segundos, e então a operação TRUNCATE é executada, e a falha não será retornada imediatamente, mas esperará por 60 segundos, e se o bloqueio DL da tabela STREAM não for liberado dentro de 60 segundos, retornará a falha.
SESSION2 >alter conjunto de sessão ddl_lock_timeout=60; Sessão alterada. SESSION2 >definir o tempo no fluxo SESSION2 >truncar da tabela; --Neste ponto, SESSION2 suspende, espera SESSION1 libere o bloqueio DML em até 60 segundos, retorna falhado após 60 segundos trunca o fluxo da tabela * ERRO na linha 1: ORA-00054: resource busy and acquire com NOWAIT especificado ou timeout expirado Elapsed: 00:01:00.01 O surgimento de DDL_LOCK_TIMEOUT parâmetros simplifica muito a operação dos DBAs, por exemplo, queremos adicionar um campo a uma tabela, mas essa tabela tem muitas operações DML, e não podemos usar o método ALTER SYSTEM KILL SESSION para encerrar essas operações, então, se quisermos adicionar campos a essa tabela, precisamos realizar a operação de adicionar campos inúmeras vezes, ou escrever scripts para fazer esse trabalho, e agora temos DDL_ LOCK_TIMEOUT parâmetro, só precisamos definir o valor desse parâmetro um pouco maior, e não precisamos nos preocupar em executar SQL, vamos demonstrar esse processo abaixo.
SESSION2 adicionar campos:
SESSION2 >alterar table stream adicionar jpg_path varchar2(255) padrão '/home/Oráculo/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >comprometido; Commit completo. SESSION2 >alterar table stream adicionar jpg_path varchar2(255) padrão '/home/Oráculo/'; Table altered. SESSION2 >select * from stream; ID IDENTIFIER PIC_NO JPG_PATH ---------- --------------- ------ --------------- 1 18-0220-003 1 /home/Oráculo/ 2 18-0221-003 1 /home/Oráculo/ 3 18-0221-003 2 /home/Oráculo/ 4 18-0221-003 3 /home/Oráculo/ 5 18-0223-005 1 /home/Oráculo/ 6 18-0223-005 2 /home/Oráculo/ 7 18-0223-005 3 /home/Oráculo/ 8 18-0223-005 4 /home/Oráculo/ 9 18-0223-005 5 /home/Oráculo/ 10 18-0223-005 6 /home/Oráculo/ 10 rows selected.
|