Migração de banco de dados Oracle-migração de espaço de tabela TTS (migração de espaço de tabela de transmissão heterogênea TTS HP-UX para Redhat Linux 7.7)

1 mesa de transmissão

Existem dois tipos de espaços de tabela de transmissão de plataforma cruzada heterogêneos

  1. Use o MOS para fornecer o kit de ferramentas rman_xttconvert para migração online, comumente referido como xtts.
  2. O espaço de tabela é definido como Somente leitura offline, convertido por meio do RMAN combinado com exp / imp expdp / impdp export e importe metadados para migração.
  3. 12c apresenta o uso de backup para transferência de espaço de tabela de plataforma cruzada. Da mesma forma que a maioria das etapas no segundo método acima, o método de backup RMAN pode fazer uso total da compactação RMAN para reduzir o tamanho do arquivo e reduzir o tempo somente leitura

Introdução de 2 versões

  1. Fonte: volume de dados de armazenamento HP-UX Oracle 11.2.0.3 ASM de 30 TB
  2. Fim de destino: RHEL 7.7 Oracle 11.2.0.3 armazenamento NAS

3 Monte NFS

A biblioteca de origem é de 30 TB, HP-UX e Linux montam o disco de armazenamento NAS da biblioteca de destino por meio de NFS e convertem diretamente os arquivos de dados para o armazenamento NAS final, economizando tempo de cópia.

HP-UX

mount -F nfs hard, bg, proto = tcp, rsize = 32768, wsize = 32768, nointr, noac, forcedirectio, llock xx.xx.xx.xx: / data / nfs / tts

Linux:

mount -t nfs -o hard, bg, nolock xx.xx.xx.xx: / data / nfs / data

2.2 Consultar se a plataforma de origem e a plataforma de destino são conversíveis

select * from v $ transportable_platform;
 PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
------------ ----------------------------------- - --------------
...
           4 HP-UX IA (64 bits) Grande
...
          13 Linux x86 64 bits Pequeno
...

--Pode ser visto que pode ser convertido, mas como o endianismo é diferente, ele precisa ser convertido.

selecione platform_id, platform_name de v $ database;
 PLATFORM_ID PLATFORM_NAME       
------------ --------------------
           4 HP-UX IA (64 bits)   

3. Preparação para migração

3.1 Extraia o espaço de tabela que precisa ser convertido

Uma vez que esta é toda a migração do banco de dados, exceto para alguns espaços de tabela do sistema, todos os outros precisam ser convertidos

  1. Verifique se os usuários do sistema sysaux possuem objetos não-sys e alguns componentes

selecione proprietário
       , nome_tabela
       ,
 nome_espaço_tabela de dba_tables
 onde o proprietário não está em ('SYS', 'SYSTEM', 'OUTLN', 'SCOTT')
        e nome_espaço_tabela em ('SYSTEM', 'SYSAUX', 'USERS');

De acordo com o objeto de consulta, decida se você precisa processar esses espaços de tabela. Se o espaço de tabela de usuários contiver objetos não-sys, você precisará excluir o espaço de tabela de usuários no lado de destino e converter os usuários do banco de dados de origem juntos. Esta consulta os usuários o espaço da mesa também precisa ser convertido em conjunto

  1. Obtenha a lista de espaços de tabela que precisam ser migrados

selecionar tablespace_name distinto de dba_tablespaces onde tablespace_name não está em ('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'UNDOTBS2')
menos
selecionar tablespace_name distinto de dba_temp_files;

3.2 Verifique se o espaço de tabela a ser transferido é independente

SYS> EXEC SYS.DBMS_TTS.TRANSPORT_SET_CHECK (ts_list => '<TABLESPACE_NAME>', incl_constraints => TRUE); 
SYS> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
------------------ --------------------------------------------------
ORA-39921: Partição padrão (tabela) Espaço de tabela xxx (nome do espaço de tabela) para xxx (nome da tabela) não contido no conjunto transportável.
# Pode ser tratado de acordo com o documento Mos completo
# Em meu ambiente, o espaço de tabela de violação não existe , Também não há segmento correspondente no espaço de tabela.De acordo com o nome do espaço de tabela, após a criação, ele é convertido em conjunto para resolver o problema de erro.

Usando Dbms_tts.transport_set_check resulta em entrada em Transport_set_violations (Doc ID 114915.1)

3.3 O espaço de mesa está definido para somente leitura

selecione 'ALTER TABLESPACE' || TABLESPACE_NAME || ' SOMENTE LEITURA;'
FROM (
    SELECT DISTINCT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE TABLESPACE_NAME NOT IN ('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'UNDOTBS2')
    MINUS
    SELECT DISTINCT TABLESPACE_NAME FROM DBA_TEMP_FILES
)

No processo de configuração para somente leitura, alguns espaços de tabela não podem ser somente leitura e todas as sessões são eliminadas, mas ainda não podem ser somente leitura. O evento de espera de consulta é aguardar outro cancelamento txn-txn,

A espera geralmente é uma transação com estado no estado morto e você precisa aguardar o fim da reversão do smon.Você pode consultar o progresso por meio da instrução a seguir.

SELECT count (*) FROM x $ ktuxe WHERE ktuxesta! = 'INACTIVE' E ktuxecfl LIKE '% DEAD%';   
SELECT ktuxesiz FROM x $ ktuxe ONDE ktuxesta! = 'INACTIVE' E ktuxecfl LIKE '% DEAD%';

4. Conversão de biblioteca de origem e exportação de metadados

4.1 rman convert

Você pode converter o espaço de tabela na extremidade remota ou converter o arquivo de dados na extremidade de destino

#! / bin / sh
# rman converter script
export ORACLE_SID =
v_date = $ (data +% Y% m% d% H% M% S)

echo "Hora de início do trabalho $ {v_date} \ n" >> rman_xtts _ $ {v_date} .log rman
target / >> rman_xtts _ $ {v_date} .log << EOF
run { alocar canal c1 tipo disco; ... converter o espaço de tabela tbs1, tbs2 ... para o formato da plataforma 'Linux x86 64 bits' '/rman/xtts/xtts_%U.dbf'; canal de liberação c1; ... } EOF v_end_date = $ (data +% Y% m% d% H% M% S) echo "Hora de término do trabalho $ {v_date} \ n" >> rman_xtts _ $ {v_date} .log








4.2 metadados de exportação expdp

$ nohup expdp system / 111111 diretório = xtts dumpfile = xtts.dmp parfile = expdp.par logfile = xtts_expdp.log &
$ vi expdp.par
TRANSPORT_TABLESPACES = tbs1
, tbs2
...
, tbsn

Ao exportar metadados, a exportação expdp é muito lenta. Para consultar documentos relacionados, tente o seguinte:

  1. As tentativas de coletar estatísticas de dicionário não melhoraram a eficiência.
  2. De acordo com o documento a seguir, tente usar usuários não-sysdba para exportar, a eficiência foi melhorada.
Slow DataPump Import (IMPDP) For A Partitioned Table (Doc ID 2014960.1)
  1. A versão 11.2.0.3 tem os seguintes bugs, você precisa clicar no patch 13717234.

Bug 13717234 - A exportação de Datapump para transporte é lenta ao lidar com um grande número de objetos (Doc ID 13717234.8)
O Tablespace Expdp de Transporte é Lento ao Manipular Grande Número de Objetos no Banco de Dados (Doc ID 1554570.1)

6. Importação da biblioteca de destino

6.1 Importar metadados e arquivo de dados com impdp

# O seguinte é um exemplo do ambiente de teste, não do ambiente real, o ambiente real apenas usa um caminho e nome diferente
$ impdp \ '\ / as sysdba \' directory = xtts dumpfile = xtts.dmp parfile = xtts.par logfile = impdp_xtts.log

$ Nós xtts.par
TRANSPORT_DATAFILES =
(
'/rman/xtts/xtts_data_D-MESSAY_I-2399541070_TS-XTTS1_FNO-15_04vhgsno.dbf',
'/rman/xtts/xtts_data_D-MESSAY_I-2399541070_TS-XTTS_FNO-14_03vhgsnm.dbf',
'/ rman / xtts / xtts_data_D-MESSAY_I-2399541070_TS-XTTS_FNO-8_02vhgsnl.dbf '
)

Importação: versão 11.2.0.4.0 - produção na sexta-feira, 8 de janeiro, 12:40:24 de 2021

Copyright (c) 1982, 2011, Oracle e / ou suas afiliadas. Todos os direitos reservados.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Produção de 64 bits
com
opções de Particionamento, Real Application Clusters, OLAP, Data Mining e Real Application Testing
Tabela mestre "SYS". "SYS_IMPORT_TRANSPORTABLE_01" carregado / descarregado com sucesso
Iniciando "SYS ". "SYS_IMPORT_TRANSPORTABLE_01": "/ ******** AS SYSDBA" directory = xtts dumpfile = xtts.dmp parfile = xtts.par logfile = impdp_xtts.log 
Processamento tipo de objeto TRANSPORTABLE_EXPORT / PLUGTS_BLK
Processamento tipo de objeto TRANSPORTABLE_EXPORT / TABLE
Processing tipo de objeto TRANSPORTABLE_EXPORT / TABLE_STATISTICS
Processando tipo de objeto TRANSPORTABLE_EXPORT / POST_INSTANCE / PLUGTS_BLK
Tarefa "SYS". "SYS_IMPORT_TRANSPORTABLE_01" concluída com êxito na sexta-feira, 8 de janeiro 12:40:34 2021 decorrido 0 00:00:08
 

6.2 O espaço de mesa está definido para ler e escrever

SYS> alterar tablespace tbs1 ler e escrever;

7. Processamento subsequente da biblioteca de destino

7.1 Crie um espaço de tabela temporário para a biblioteca de destino

Crie o mesmo espaço de tabela que o banco de dados de origem

# O banco de dados de origem consulta se deve usar o grupo de espaço de tabela temporário
SQL> select * from DBA_TABLESPACE_GROUPS;
# O banco de dados de origem gera a instrução de criação SELECT'criar
espaço de tabela temporário '|| TABLESPACE_NAME ||' tempfile '' / path / '|| tablespace_name | | file_id || '.dbf' 'size 32767M;' de dba_temp_files ordenado por tablespace_name;
# Se houver vários arquivos no espaço de tabela, você também precisa modificar a saída acima apropriadamente.

7.2 Capacitação da biblioteca alvo

# 源 库 获取 用户 列表
select username
from dba_users
where username not in ('SYS', 'SYSTEM', 'DBSNMP', 'OUTLN', 'ORACLE_OCM', 'XS $ NULL', 'MDDATA', 'SPATIAL_UFS_ADMIN_USR', ' SPATIAL_CSW_ADMIN_USR ',' MGMT_VIEW ',' APEX_PUBLIC_USER ') E DEFAULT_TABLESPACE NOT IN (' SYSAUX ');

# 源 库 生成 系统 权限 授权 语句
#! / Bin / sh
# sys privs gerar script
para c em user1 user2
do
        sqlplus -S system / oracle >> sys_priv_grants.log << EOF
col PRIVILEGE para a30
col GRANTEE para
a20 col ADMIN_OPT para a15
definir linhas 180
definir tamanho da página 1000
definir eco desligado
definir título desligado
definir feedback desligado
SELECT 'GRANT' || a.PRIVILEGE || ' PARA '||' $ {c} '||'; '
FROM
(
        SELECT *
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE = '$ {c}'
        UNION ALL
        SELECT *
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE IN
             (SELECIONE GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = '$ {c}' E grant_role não está em ('EXP_FULL_DATABASE', 'IMP_FULL_DATABASE'))
) a;
saída;
EOF
feito

# 源 库 生成 对象 权限 授权 语句
#! / Bin / sh
# tab privs gerar script
para c em user1 user2
do
        sqlplus -S system / oracle >> object_grants.log << EOF
definir linhas 180
definir tamanho da página 1000
definir echo off
definir cabeçalho off
set feedback off
col grantee para a15
col owner para a15
col table_name para a30
col grantor para a15
SELECT 'GRANT' || a.PRIVILEGE || ' ON '|| a.owner ||'. "'|| a.table_name ||'" TO '||' $ {c} '||'; '
FROM
(
        SELECT *
        FROM DBA_TAB_PRIVS
        WHERE GRANTEE = '$ {c}'



        ONDE GRANTEE IN
             (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = '$ {c}' e grant_role não está em ('EXP_FULL_DATABASE', 'IMP_FULL_DATABASE'))
) a;
saída;
EOF
feito

7.3 Recuperar autoridade DBA

selecione 'revogar dba de' || nome de usuário || ';'
de dba_users
onde nome de usuário não está em ('SYS', 'SYSTEM', 'DBSNMP', 'OUTLN', 'ORACLE_OCM', 'XS $ NULL', 'MDDATA', 'SPATIAL_UFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_USR', 'MGMT_VIEW', ' APEX_PUBLIC_USER ') AND DEFAULT_TABLESPACE NOT IN (' SYSAUX ')
ORDER BY TEMPORARY_TABLESPACE;

7.4 O espaço de tabela da biblioteca de destino está definido para leitura e gravação

selecione 'ALTER TABLESPACE' || TABLESPACE_NAME || ' LER ESCREVER;'
FROM (
    SELECT DISTINCT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE TABLESPACE_NAME NOT IN ('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'UNDOTBS2')
    MINUS
    SELECT DISTINCT TABLESPACE_NAME FROM DBA_TEMP_FILES
);

SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES;

7.5 Processamento de objetos, como tabelas temporárias globais e procedimentos armazenados de link de banco de dados

Uma vez que apenas os espaços de tabela não do sistema e sysaux são convertidos, também é necessário exportar separadamente objetos de usuário de negócios que não sejam tabelas e índices, como sequências, links db, tabelas temporárias globais, etc. Esses objetos são armazenados no dicionário de dados do espaço de tabela do sistema .


--Source export metadata nohup expdp system / oracle directory = xtts parfile = expdp.par dumpfile = xtts_expdp_% U.dmp cluster = no logfile = xtts_expdp.log &
$ vi expdp.par
content = metadata_only
schemas = user1
, user2
..
, userN

--Target import --alguns
objetos de diretório
nohup impdp system / oracle directory = xtts table_exists_action = append dumpfile = xtts_expdp_% U.dmp logfile = impdp_xtts.log &

No processo de comparação real, os usuários individuais são diferentes nas duas partes a seguir:

1. Parte do lob está faltando na extremidade de destino. Após investigação, essa parte do lob não pertence a nenhuma tabela na extremidade de origem.

2. Parte da extremidade de destino da partição da tabela não está disponível. Após investigação, algumas das partições da lixeira são contadas e a partição do nome da lixeira é excluída. As partições são consistentes. Quando a lixeira é ligada, após o tabela de partição é descartada,

dba_tab_partitions ainda pode consultar a partição no início do BIN excluído, https://www.eygle.com/archives/2017/04/drop_partition_recyclebin.html

7.6 Comparação de dados

  1. Comparação do número do objeto

- Tanto a origem quanto o destino são executados - o
arquivo user_object_count.log será gerado, e a origem e o destino
podem ser comparados. O seguinte método de comparação do número de linhas também pode ser usado para criar uma tabela interna do oracle para comparação
#! / bin / sh
# scripts de contagem de objeto
para c no usuário1 usuário2
do
        sqlplus -S sistema / oracle >> users_object_count.log << EOF
definir echo off
definir título off
definir linhas 180
definir tamanho da página 1000
SELECT DISTINCT OBJECT_TYPE, COUNT (*) FROM dba_objects onde owner = '$ {c}' GROUP BY OBJECT_TYPE ORDER BY 1;
sair;
EOF
feito

- Os seguintes problemas foram encontrados durante a comparação do número de objetos: 1. O número de
partições da tabela é inconsistente. Após investigação, uma parte da tabela de partição foi descartada para a origem. Ao consultar o dba_tab_partitions da tabela de partição descartada, a partição ainda pode ser encontrada, mas o nome é Tudo se torna o início de BIN.
2. O número de partições de índice é inconsistente, também pelos motivos acima mencionados.
3. Algumas visualizações materializadas e visualizações são inválidas devido ao uso de db link, e o db link falha devido à criação da rede. O db link precisa ser migrado manualmente. Abaixo está a aquisição em lote das instruções db link ddl de origem
-para referência,
declara
v_objowner varchar2 (50);
v_objname varchar2 (50); v_test
clob;
cursor c é selecionar o proprietário, db_link de dba_db_links;
começa a
    abrir c;
      loop
    fetch c em v_objowner, v_objname;
        se c% encontrado,
            execute a seleção imediata dbms_metadata.get_ddl (`` DB_LINK '' '||', '' '|| v_objname ||' '', '' '|| v_objowner ||' ''
            dbms_output.put_line (v_test || ';');
        senão
            sair;
        fim se;
      loop final;
    fechar c;
fim;
/

4. Os objetos de diretório
precisam ser criados manualmente no lado de destino.
 

  1. Comparação de linha de dados

- Tanto a origem quanto o destino são executados e, em seguida, a biblioteca de origem table_hash pode ser importada para a biblioteca de destino para passar na verificação da instrução.
- Criar tabela table_hash
sqlplus -S sistema / oracle << EOF
CRIAR TABELA table_hash (proprietário varchar2 (100), nome_tabela varchar2 (100), número tc, chave primária (proprietário, nome_tabela));
EXIT;
EOF

- 计算 所有 表 数据 量
para c em user1 user2
do
        sqlplus -S system / oracle >> user_count.log << EOF
DECLARE
        v_cc number;
        CURSOR v_tbl IS SELECT proprietário, table_name FROM dba_tables WHERE OWNER = '$ {c}';
BEGIN
        FOR c IN v_tbl LOOP
        EXECUTAR IMEDIATA 'SELECT COUNT (*) FROM' || c.owner || '.' || '"' || c.table_name || '"' INTO v_cc;
        INSERT INTO TABLE_HASH VALUES (c.owner, c.table_name, v_cc);
        END LOOP;
        COMPROMETER-SE;
FIM;
/
EXIT;
EOF
feito

- Verificação--
Você pode criar um link de banco de dados de origem no banco de dados de destino para comparação -
Você também pode importar a tabela de dados de comparação de origem no banco de dados de destino para comparação
PROPRIETÁRIO DE COR PARA A20
COL TABLE_NAME PARA A40
SET LINES 200 PAGES 2000  
SELECT DEST. OWNER, DEST.TABLE_NAME, DEST.TC, SOURCE.TC        
FROM TABLE_HASH DEST,
    SOURCE.TABLE_HASH SOURCE
WHERE DEST.OWNER = SOURCE.OWNER
E DEST.TABLE_NAME = SOURCE.TABLE_NAME
AND DEST.TC! = SOURCE.TC;

SELECT * FROM 
    SOURCE.TABLE_HASH SOURCE
    MINUS
SELECT * FROM 
TABLE_HASH DEST;

--Se você deseja calcular o valor de hash e determinar se ele é absolutamente consistente, você precisa usar uma função para cálculo offline ou usar ogg veridata para comparação. O software de cópia SharePlex também tem uma função de comparação

7.7 Compilar objetos inválidos na biblioteca de destino

SQL> EXEC UTL_RECOMP.recomp_parallel (4);
# Consultar se há objetos inválidos e, em seguida, lidar com eles de acordo com os motivos inválidos específicos
SQL> selecionar proprietário, tipo_de_objeto, nome_do_objeto de dba_objects onde status = 'INVALID';

7,8 Colete estatísticas

begin
    dbms_stats.gather_database_stats (estimativa_percent => 5, method_opt => 'para todas as colunas tamanho 1', grau => 16, cascata => verdadeiro, reunir_sys => verdadeiro, reunir_temp => falso, reunir_fixado => verdadeiro);
fim;
/

begin
    dbms_stats.gather_dictionary_stats (method_opt => 'para todas as colunas tamanho 1', grau => 16);
fim;
/

7.9 Ajuste os parâmetros do banco de dados de acordo com a fonte

Ajuste as configurações de parâmetro da biblioteca de destino de acordo com as configurações relevantes dos parâmetros de origem.

7.10 Modificar senha fraca

Modifique a senha fraca dentro do banco de dados e do sistema operacional para atender aos requisitos de segurança.

8. Problemas encontrados durante a migração

A exportação Expdp é muito lenta, tente usar exp para exportar metadados no meio

8.1 exp encontrou um erro ao usar tts para transmitir o espaço de tabela

# Tecnologia de particionamento introduzida após 10g, exp não suporta
EXP-00113: Recurso Novo Método de Particionamento Composto não suportado, tabela não será exportada

# 11g introduziu a tecnologia de particionamento baseada em coluna virtual e coluna virtual
EXP-00107: Recurso (COLUNA VIRTUAL) da coluna xxx na tabela xxx.xxx não é suportado, a tabela não será exportada

# BINARY_DOUBLE BINARY_FLOAT 为 Oracle 10g 引入 的 两种 数据 类型
EXP-00104: tipo de dados (BINARY_DOUBLE) da coluna xxx na tabela xxx.xxx não é suportado, a tabela não será exportada
EXP-00104: tipo de dados (BINARY_FLOAT) da coluna xxx na tabela xxx.xxx não é compatível, a tabela não será exportada

8.2 A exportação Expdp é lenta

Os dados de exportação do Expdp são lentos, passando de 10046 e o ​​julgamento do fenômeno combinado está altamente relacionado às duas perguntas a seguir

Importação Lenta de DataPump (IMPDP) para uma tabela particionada (Doc ID 2014960.1)
# Solução: Necessidade de usar usuários não sysdba para exportar
        
Bug 13717234-Datapump exportar para transporte é lento no manuseio de um grande número de objetos (Doc ID 13717234.8)
Transport Tablespace Expdp é lento ao manipular um grande número de objetos no banco de dados (Doc ID 1554570.1)
# Solução: 11.2.0.3 precisa ser corrigido 13717234

8.3 Algum processamento de metadados

  1. Uma vez que não podemos reiniciar o banco de dados para migração, não podemos definir o banco de dados para somente leitura. Se o banco de dados pode ser configurado para somente leitura, você pode converter diretamente o banco de dados em rman sem converter o espaço de tabela.
  2. O espaço de tabela convert não transfere o espaço de tabela do sistema, portanto, alguns objetos de link de banco de dados e objetos de diretório armazenados no dicionário de dados precisam ser criados manualmente.

Acho que você gosta

Origin blog.csdn.net/oradbm/article/details/113991945
Recomendado
Clasificación