PDA

Ver la Versión Completa : Copia de seguridad Firebird desde PHP


subzero
02-11-2011, 15:53:15
Hola.

Alguno a tenido la oportunidad de realizar copia de seguridad de una base de datos en firebird desde php, he recurrido al manual de php pero el codigo que muestra no funciona:

$resource_service_handle = ibase_service_attach ('localhost', 'username', 'password');

ibase_backup($resource_service_handle, 'source_database', 'destination_file');

ibase_service_detach ($resource_service_handle);

Y lo he cambiado por:

$resource_service_handle = ibase_service_attach (DB_NAME, DB_USERNAME, DB_PASSWORD) or die(ibase_errmsg());

ibase_backup($resource_service_handle, DB_NAME, PATH_BK.SD."copia_.fbk") or die(ibase_errmsg());

ibase_service_detach ($resource_service_handle);

Donde las constantes estan definidas y funcionan (dan acceso a la aplicacion). El error que me retorna es

localhost:/opt/lampp/htdocs/aplicacion_local/bd/basedatos.fdb
SYSDBA
masterkey
localhost:/opt/lampp/htdocs/aplicacion_local/bakups/copia_.fbk

Warning: ibase_service_attach() [function.ibase-service-attach]: Cannot attach to services manager service opt/lampp/htdocs/aplicacion_local/bd/basedatos.fdb:service_mgr is not defined in /opt/lampp/htdocs/aplicacion_local/controllers/backup.php on line 9

Warning: ibase_backup() expects parameter 1 to be resource, boolean given in /opt/lampp/htdocs/aplicacion_local/controllers/backup.php on line 11

Warning: ibase_service_detach() expects parameter 1 to be resource, boolean given in /opt/lampp/htdocs/aplicacion_local/controllers/backup.php on line 13

De antemano muchas gracias!

duilioisola
02-11-2011, 16:04:28
Primero y principal: No se casi nada de PHP.

Veo que tu defines:
localhost:/opt/lampp/htdocs/aplicacion_local/bd/basedatos.fdb
y el error dice que no se puede conectar a:
opt/lampp/htdocs/aplicacion_local/bd/basedatos.fdb

Comprueba que las variables que tienes llegan a la función con los valores correctos.
Supongo que podrás poner algo asi como un ShowMessage(DB_NAME) antes de la función.

subzero
02-11-2011, 17:34:37
Gracias por su respuesta, enseguida voy a revisar, y comento como fue

subzero
02-11-2011, 18:38:08
bueno probe algo mas

if (($service = ibase_service_attach(DB_SERVER, DB_USERNAME, DB_PASSWORD)) != FALSE) {
//retrieve server info
$server_info = ibase_server_info($service, IBASE_SVC_SERVER_VERSION)
. ' / '
. ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);

ibase_backup($service, DB_NAME, DB_SERVER.":".PATH_BK.SD."basededatos_.fbk") or die(ibase_errmsg());

//detach from server (disconnect)
ibase_service_detach($service);
}
else {
$ib_error = ibase_errmsg();
}

echo $server_info;

Donde:

DB_NAME : localhost:/opt/lampp/htdocs/aplicacion/bd/basededatos.fdb
DB_USERNAME : SYSDBA
DB_PASSWORD : masterkey
PATH_BK : /opt/lampp/htdocs/aplicacion/bakups
DB_SERVER : localhost:/opt/lampp/htdocs/aplicacion/bakups/basededatos_.fbk

la cuestion es que no me genera error como tampoco crea el archivo de la copia de seguridad.

Agradezco la ayuda que me puedan brindar

duilioisola
02-11-2011, 19:13:50
ibase_backup($service, DB_NAME, DB_SERVER.":".PATH_BK.SD."basededatos_.fbk") or die(ibase_errmsg());
En esta línea veo algo raro:

Se llama a la función ibase_backup y supongo que le pasas el parámetro origen y destino.

Origen = DB_NAME = localhost:/opt/lampp/htdocs/aplicacion/bd/basededatos.fdb: ok
Destino = DB_SERVER.":".PATH_BK.SD."basededatos_.fbk" = localhost:/opt/lampp/htdocs/aplicacion/bakups/basededatos_.fbk:/opt/lampp/htdocs/aplicacion/bakups.basededatos_.fbk: ERROR

Además, el backup siempre se hace a un disco local.
Cuando la haces con la línea de comando es

origen = IP:Path/nombre_db
destino = Path/nombre_bk
gbak -t origen destino
Ejemplo:
gbak -t 192.168.1.1:/bases/base.fdb C:\Backups\Backup.FBK


Si quieres que el backup esté en otro lugar, deberás hacerlo al disco local y luego copiarlo

gbak -t 192.168.1.1:/bases/base.fdb C:\Backups\Backup.FBK
copy C:\Backups\Backup.FBK \\ServidorBackup\Backups\Backup.FBK

subzero
02-11-2011, 21:15:18
ok, voy a revisar esto ultimo, realmente agradezco tu interes en ayudarme.

subzero
03-11-2011, 16:36:38
Gacias, hice los cambios sugeridos y quedo algo asi:

$service = ibase_service_attach(localhost,SYSDBA,masterkey);
ibase_backup($service, localhost:/opt/lampp/htdocs/smi_local/bd/basededatos.fdb, localhost:/opt/lampp/htdocs/smi_local/backups/basededatos_.fbk);

se ejectua pero no me muestra ni erros ni crea el archivo del respaldo. Que mas puedo hacer

duilioisola
03-11-2011, 17:09:36
Lo dicho antes: el backup siempre se hace a un disco local

La parte subrayada no es válida.
ibase_backup($service, localhost:/opt/lampp/htdocs/smi_local/bd/basededatos.fdb, localhost:/opt/lampp/htdocs/smi_local/backups/basededatos_.fbk);

Suponiendo

que la dirección de la base origen es correcta
que el php está en el mismo servidor que la base (localhost)
que tiene derechos de escritura a la carpeta /opt/lampp/htdocs/smi_local/backups/
Quedaría así:

ibase_backup($service, localhost:/opt/lampp/htdocs/smi_local/bd/basededatos.fdb, /opt/lampp/htdocs/smi_local/backups/basededatos_.fbk);

subzero
04-11-2011, 01:15:02
Siguiendo las recomendaciones comprombe que:

La base origen es correcta
Php está en el mismo servidor que la base (localhost)
Tiene derechos de escritura a la carpeta /opt/lampp/htdocs/smi_local/backups/

y cambie la ruta tal como me propones pero lo mas raro es que sigue sin generar el archivo resultado.... y lo mas enigmatico es que ningun error.

De todas formas agradezco tu paciencia. sin embargo he seguido consultando pero no he encontrado nada parecido. Sigo tratando

subzero
10-11-2011, 16:11:37
Hasta el momento no he podido lograr generar la copia de seguridad desde php utilizando la funcion ibase_backup, por lo que estoy pensando mejor realizar un ejecutable para copias de seguridad de mi base de datos.

Antes de finalizar quiero agradecer enormente a duilioisola, por su paciencia y por tomar un poco de su tiempo en ayudarme con ideas.

duilioisola
11-11-2011, 09:15:24
ibase_backup($service, DB_NAME, DB_SERVER.":".PATH_BK.SD."basededatos_.fbk") or die(ibase_errmsg());
No se que es la parte "or die(ibase_errmsg());", pero leí que envía un mensaje y sale del script.

Las expresiones lógicas se suelen evaluar solo la parte necesaria. Si la primera parte de una expresión con or es verdadera, el resultado es verdadero, por lo que no se evalúa la siguiente. Si la primera es falsa, se evalúa la siguiente.

Dicho esto, puede que ibase_backup() falle y por lo tanto se llame a die(...) y cierre el script.

Quita esto y deja que salga una exception o el tipo de error que te envíe PHP.