Problema
Quando tentei realizar um export de uma tabela com Data Pump em um Oracle RAC, o expdp apresentou os seguintes erros para alguns dumpfiles:
ORA-39155: error expanding dump file name "/u01/backup/datapump/sh_sales_06.dmp"
ORA-48128: opening of a symbolic link is disallowed
ORA-19505: failed to identify file "/u01/backup/datapump/sh_sales_06.dmp"
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
O resumo final do expdp listou todos os dumpfiles criados:
Master table "SYSTEM"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TABLE_01 is:
/u01/backup/datapump/sh_sales_01.dmp
/u01/backup/datapump/sh_sales_02.dmp
/u01/backup/datapump/sh_sales_03.dmp
/u01/backup/datapump/sh_sales_04.dmp
/u01/backup/datapump/sh_sales_05.dmp
/u01/backup/datapump/sh_sales_06.dmp
/u01/backup/datapump/sh_sales_07.dmp
/u01/backup/datapump/sh_sales_08.dmp
Job "SYSTEM"."SYS_EXPORT_TABLE_01" completed with 76 error(s) at Sat Oct 19 11:52:38 2024 elapsed 0 00:01:13
Verificando no filesystem, notei que todos os dumpfiles existiam, mas metade dos dumpfiles (do 05 ao 08) tinham um tamanho padrão 4096 bytes:
[oracle@c02db01 log]$ ls -l /u01/backup/datapump/
total 5555520
-rw-r--r-- 1 oracle oinstall 150811 Oct 19 11:52 export.log
-rw-r----- 1 oracle oinstall 1436676096 Oct 19 11:52 sh_sales_01.dmp
-rw-r----- 1 oracle oinstall 1426255872 Oct 19 11:52 sh_sales_02.dmp
-rw-r----- 1 oracle oinstall 1424400384 Oct 19 11:52 sh_sales_03.dmp
-rw-r----- 1 oracle oinstall 1401323520 Oct 19 11:52 sh_sales_04.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_05.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_06.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_07.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_08.dmp
Causa
A conexão do DataPump foi criada usando SCAN, mas o Directory utilizado aponta para um filesystem local existente apenas no Node1.
Node 1:
[oracle@c02db01 ~]$ ls -l /u01/backup/datapump
total 5555520
-rw-r--r-- 1 oracle oinstall 150811 Oct 19 11:52 export.log
-rw-r----- 1 oracle oinstall 1436676096 Oct 19 11:52 sh_sales_01.dmp
-rw-r----- 1 oracle oinstall 1426255872 Oct 19 11:52 sh_sales_02.dmp
-rw-r----- 1 oracle oinstall 1424400384 Oct 19 11:52 sh_sales_03.dmp
-rw-r----- 1 oracle oinstall 1401323520 Oct 19 11:52 sh_sales_04.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_05.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_06.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_07.dmp
-rw-r----- 1 oracle oinstall 4096 Oct 19 11:51 sh_sales_08.dmp
Node 2:
[oracle@c02db02 ~]$ ls -l /u01/backup/datapump
ls: cannot access '/u01/backup/datapump': No such file or directory
Quando a conexão realizada via SCAN e utilizado o parâmetro PARALLEL, o DataPump distribui um número balanceado de conexões entre as instâncias do RAC, o que requer um diretório compartilhado entre os nodes, de forma que o mesmo diretório seja acessível por todas as instâncias executando sessão do DataPump.
Solução
Para evitar o erro, podemos mudar a conexão do DataPump para conectar apenas na instância local, ou criar um Directory usando um filesystem compartilhado entre os nodes, como um ACFS ou NFS.
Neste exemplo, eu criei um diretório compartilhado no NFS, conforme abaixo:
[oracle@c02db01 ~]$ df -t nfs4
Filesystem 1K-blocks Used Available Use% Mounted on
olvm:/datastore2/nfs_backup/rman/cluster02 937233408 7482368 929751040 1% /backup
[oracle@c02db02 ~]$ df -t nfs4
Filesystem 1K-blocks Used Available Use% Mounted on
olvm:/datastore2/nfs_backup/rman/cluster02 937233408 7482368 929751040 1% /backup
Criando o diretório no Filesystem:
mkdir -p /backup/datapump/C02PDB1
Criando o Oracle Directory no banco de dados:
SQL> alter session set container = C02PDB1; Session altered. SQL> create or replace directory EXP_DIR as '/backup/datapump/C02PDB1'; Directory created.
Com isso, basta reexecutar o DataPump usando o novo Directory.