Estou tentando gerar um arquivo de exportação em .txt de uma tabela do meu MySQL.
Meu código de exemplo é o seguinte:
[code] select RPAD(sspc.dsHistorico,255,’ ‘),
LPAD(sspc.tpDocumento,2,’ '),
LPAD(sspc.nrDocumento,20,0)
from tabela sspc
INTO OUTFILE ‘c:/totem/prestacoes.txt’ FIELDS TERMINATED BY ‘|’ LINES TERMINATED BY ‘\r\n’
[/code]
O problema é o seguinte:
O arquivo gera sem problemas algumas linhas.. porém outras o pipe "|" é retraído no campo sspc.dsHistorico uma ou duas colunas, eu acho que o mysql se perde pois o campo possui 255 caracteres e é do tipo VARCHAR(255), tentei mudar para CHAR(255) mas nao resolve.....
// executa o comando
Process processo = Runtime.getRuntime().exec( sbComando.toString() );
// cria os stream gobblers, um para o stream de entrada e um para o
// stream de erro. os gobblers vão consumir os streams do processo
StreamGobbler sgInput = new StreamGobbler(
processo.getInputStream(), “input”, new File( arquivo ) );
StreamGobbler sgError = new StreamGobbler(
processo.getErrorStream(), “error” );
// cria uma thread para cada stream gobbler e as inicia
new Thread( sgInput ).start();
new Thread( sgError ).start();
}
/**
Exporta para um arquivo os dados de todas as bases de dados.
@param arquivo Caminho do arquivo que deve ser gerado com a
saída da exportação.
@param usuario Usuário usado para conectar na base.
public static void main( String[] args ) throws Exception {
// exporta as tabelas "tabelaX" e "tabelaY" da base "minha_base" para o
// arquivo "C:/tabelaXeYMinhaBase.sql"
dump( "C:/tabelaXeYMinhaBase.sql", "root", "root", "minha_base", "tabelaX", "tabelaY" );
// exporta a base "minha_base" para o arquivo "C:/minhaBase.sql"
dump( "C:/minhaBase.sql", "root", "root", "minha_base" );
// exporta todas as bases de dados para o arquivo "C:/todasAsBases.sql"
dumpAll( "C:/todasAsBases.sql", "root", "root" );
public StreamGobbler( InputStream is, String type ) { this.is = is;
this.type = type;
}
public StreamGobbler( InputStream is, String type, File file )
throws IOException { this.is = is;
this.type = type;
this.fw = new FileWriter( file );
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
while ( ( line = br.readLine() ) != null ) {
if ( fw != null ) {
fw.write( line + “\n” );
} else {
System.out.println( type + “>” + line );
}
}
if ( fw != null ) {
fw.close();
}
} catch ( IOException ioe ) {
ioe.printStackTrace();
}
}
}[/code]
Coloquei a classe StreamGobbler no mesmo arquivo para simplificar, mas seria legal vc implementá-la como uma classe pública em outro arquivo.
Se tiver alguma dúvida quanto à implementação é só falar.
Se quiser ter mais controle sobre o mysqldump, dê uma olhada na documentação dele, ai você pode inserir mais parâmetros no método dump.
// executa o comando
Process processo = Runtime.getRuntime().exec( sbComando.toString() );
// cria os stream gobblers, um para o stream de entrada e um para o
// stream de erro. os gobblers vão consumir os streams do processo
StreamGobbler sgInput = new StreamGobbler(
processo.getInputStream(), “input”, new File( arquivo ) );
StreamGobbler sgError = new StreamGobbler(
processo.getErrorStream(), “error” );
// cria uma thread para cada stream gobbler e as inicia
new Thread( sgInput ).start();
new Thread( sgError ).start();
}
/**
Exporta para um arquivo os dados de todas as bases de dados.
@param arquivo Caminho do arquivo que deve ser gerado com a
saída da exportação.
@param usuario Usuário usado para conectar na base.
public static void main( String[] args ) throws Exception {
// exporta as tabelas "tabelaX" e "tabelaY" da base "minha_base" para o
// arquivo "C:/tabelaXeYMinhaBase.sql"
dump( "C:/tabelaXeYMinhaBase.sql", "root", "root", "minha_base", "tabelaX", "tabelaY" );
// exporta a base "minha_base" para o arquivo "C:/minhaBase.sql"
dump( "C:/minhaBase.sql", "root", "root", "minha_base" );
// exporta todas as bases de dados para o arquivo "C:/todasAsBases.sql"
dumpAll( "C:/todasAsBases.sql", "root", "root" );
public StreamGobbler( InputStream is, String type ) { this.is = is;
this.type = type;
}
public StreamGobbler( InputStream is, String type, File file )
throws IOException { this.is = is;
this.type = type;
this.fw = new FileWriter( file );
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
while ( ( line = br.readLine() ) != null ) {
if ( fw != null ) {
fw.write( line + “\n” );
} else {
System.out.println( type + “>” + line );
}
}
if ( fw != null ) {
fw.close();
}
} catch ( IOException ioe ) {
ioe.printStackTrace();
}
}
}[/code]
Coloquei a classe StreamGobbler no mesmo arquivo para simplificar, mas seria legal vc implementá-la como uma classe pública em outro arquivo.
Se tiver alguma dúvida quanto à implementação é só falar.
Se quiser ter mais controle sobre o mysqldump, dê uma olhada na documentação dele, ai você pode inserir mais parâmetros no método dump.
[]'s
[/quote]
Amigo, to tentando usar sua classe e estou com esse erro. O que pode ser?
java.io.IOException: Cannot run program "mysqldump": CreateProcess error=2, O sistema não pode encontrar o arquivo especificado
at java.lang.ProcessBuilder.start(Unknown Source)
Configure o path do seu SO para enxergar os executáveis do MySQL, ou seja, o caminho para a pasta “bin” da instalação do seu servidor.
Assim o “mysqldump” poderá ser executado em qualquer diretório de seu SO.