Utilização do procedimento de cópia de segurança para realizar cópia de segurança em linha O procedimento SYSCS_UTIL.SYSCS_BACKUP_DATABASE é utilizado para criar a cópia de segurança do banco de dados em um local especificado. Procedimento de cópia de segurançaProcedimento do sistema SYSCS_BACKUP_DATABASE()

O procedimento SYSCS_UTIL.SYSCS_BACKUP_DATABASE recebe como argumento uma cadeia de caracteres representando o local onde será armazenada a cópia de segurança do banco de dados. Normalmente é fornecido o caminho completo para o diretório de cópia de segurança (os caminhos relativos são interpretados como sendo relativos ao diretório corrente, e não ao diretório derby.system.home).

Por exemplo, para especificar o local de cópia de segurança c:/minhascopias/2005-06-01 para um banco de dados que se encontra aberto no momento, deve ser utilizada a seguinte declaração (são utilizadas barras inclinadas para frente como separadores do caminho nos comandos SQL):

CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('c:/minhascopias/2005-06-01')

O procedimento SYSCS_UTIL.SYSCS_BACKUP_DATABASE() coloca o banco de dados em um estado no qual este pode ser copiado com segurança, depois copia o diretório de banco de dados original por completo (incluindo os arquivos de dados, arquivos de log de transação em linha e os arquivos jar) para o diretório de cópia de segurança especificado. Os arquivos que não estão dentro do diretório de banco de dados original (por exemplo, derby.properties) não são copiados.

O exemplo a seguir mostra como fazer a cópia de segurança de um banco de dados em um diretório cujo nome reflete a data corrente:

public static void backUpDatabase(Connection conn)throws SQLException { // Obter a data de hoje como como uma cadeia de caracteres: java.text.SimpleDateFormat dataHoje = new java.text.SimpleDateFormat("yyyy-MM-dd"); String diretorioCopia = "c:/minhascopias/" + dataHoje.format((java.util.Calendar.getInstance()).getTime()); CallableStatement cs = conn.prepareCall("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE(?)"); cs.setString(1, diretorioCopia); cs.execute(); cs.close(); System.out.println("cópia de segurança colocada no diretório "+diretorioCopia); }

Para um banco de dados cuja cópia de segurança foi realizada em 2005-06-01, os comandos anteriores copiariam o banco de dados corrente para o diretório com o mesmo nome em c:\minhascopias\2005-06-01.

As transações não efetivadas não aparecem na cópia de segurança do banco de dados.

Não devem ser feitas cópias de segurança de bancos de dados diferentes, mas com mesmo nome, no mesmo diretório de cópia de segurança. Se já existir um banco de dados com o mesmo nome no diretório de cópia de segurança, é assumido como sendo uma versão antiga e sobrescrito.

O procedimento SYSCS_UTIL.SYSCS_BACKUP_DATABASE emitirá uma mensagem de erro se existirem operações não registradas (unlogged) na mesma transação do procedimento de cópia de segurança.

Caso exista no sistema, quando a cópia de segurança iniciar, operações não registradas em andamento em outras transações, este procedimento ficará bloqueado até que estas transações completem, antes de realizar a cópia de segurança.

O Derby converte, automaticamente, as operações não registradas para o modo registrado, quando estas são iniciadas quando a cópia de segurança está em andamento (exceto as operações que fazem manutenção de arquivos jar de aplicativos no banco de dados). Os procedimentos que instalam, substituem e removem arquivos jar no banco de dados são bloqueados quando a cópia de segurança está em andamento.

Se não for desejado que a cópia de segurança fique bloqueada até que as operações não registradas em outras transações completem, deve ser utilizado o procedimento SYSCS_UTIL.SYSCS_BACKUP_DATABASE_NOWAIT. Esse procedimento emite um erro logo no início da cópia de segurança caso existam transações em andamento com operações não registradas, em vez de aguardar estas transações completarem.