Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Copiar base de datos de Mysql (https://www.clubdelphi.com/foros/showthread.php?t=11916)

Juan Carlos 29-06-2004 19:57:44

Copiar base de datos de Mysql
 
hola un saludo a todos.

alguien, me prodria decir como copiar una base de datos de mysql, al directorio en donde se encuentran éstas, sin tener que hacerlo de forma manual.

Agredezco de antemano su respuesta

roman 29-06-2004 20:02:12

Si te refieres a copiar el archivo de la base pues puedes hacerlo con CopyFile.

// Saludos

Juan Carlos 29-06-2004 20:09:53

como?
 
disculpa, pero como con copyfile?
ademas como se en que directorio se encuentra instalado mysql, para realizar la copia de archivos.

roman 29-06-2004 20:27:41

Pues CopyFile es una rutina de la api de Windows para copiar archivos, Simplemente tienes que copiar todo el directorio que guarda la base a la nueva ubicación.

El archivo my.ini en el directorio de Windows guarda la información de dónde se localiza el diectorio de datos.

// Saludos

Juan Carlos 30-06-2004 01:59:17

Cambiar atributos de la base de Datos
 
gracias por tu respuesta.
He realizado una aplicación en delphi para que me copie la base de datos, dependiendo del directorio que indique el archivo de my.ini.

Pero tengo otro problema: Al momento de copiar los archivos no hay problema, solo que como la base de datos la quemo en un disco(porque así lo requieren en la escuela) al momento de querer acceder a la base de datos desde mi aplicación me dice que ésta es de solo lectura.

¿Hay alguna forma que desde mi misma aplicacion que copia la base de datos, se puedan modificar los atributos de esta, para que ya no marque el error de solo lectura?

gracias de antemamo
saludos

Sirkius 30-06-2004 07:56:23

¿Quieres decir que la metes en un CD y luego cuando la copias sobre la base de datos original es de sólo lectura?

Juan Carlos 01-07-2004 05:43:21

Si
 
Si asi es, como puedo cambiar los atributos de esta despues de que hayan sido copiados?

gracias!!!

roman 01-07-2004 07:54:53

Cita:

Empezado por Juan Carlos
como puedo cambiar los atributos de esta despues de que hayan sido copiados?

Pues ya te había dado una sugerencia ¿no?

Pero ahí te va:

Código Delphi [-]
(*
  Cambia el atributo de sólo lectura

  Folder - carpeta a cambiar (ruta completa)
  ReadOnly -
    true para poner a todos los archivos de sólo lectura
    false para quitar el atributo a todos los archivos

  La rutina procesa recursivamente todas las subcarpetas
*)
procedure ChangeReadOnlyAttr(Folder: String; ReadOnly: Boolean);
var
  SearchRec: TSearchRec;

begin
  if FindFirst(Folder + '\*.*', faAnyFile, SearchRec) = 0 then
    repeat
      if (SearchRec.Attr and faDirectory) = faDirectory then
      begin
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          ChangeReadOnlyAttr(Folder + '\' + SearchRec.Name, ReadOnly);
      end
      else if ReadOnly then
        FileSetAttr(Folder + '\' + SearchRec.Name, SearchRec.Attr or faReadOnly)
      else
        FileSetAttr(Folder + '\' + SearchRec.Name, SearchRec.Attr and not faReadOnly);
    until FindNext(SearchRec) <> 0;
end;

Y por si te surge la inquietud aquí te va una generalización de la rutina anterior:

Código Delphi [-]
(*
  Pone y/o quita atributos a los archivos de una carpeta
  y todas sus  subcarpetas

  Folder - carpeta a cuyos archivos deseamos cambiar atributos
  SetAttr - combinación de atributos que deseamos poner
  RemoveAttr - combinación de atributos que deseamos quitar
*)
procedure ChangeAttr(Folder: String; SetAttr, RemoveAttr: Integer);
var
  SearchRec: TSearchRec;
  Attributes: Integer;

begin
  if FindFirst(Folder + '\*.*', faAnyFile, SearchRec) = 0 then
    repeat
      if (SearchRec.Attr and faDirectory) = faDirectory then
      begin
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          ChangeAttr(Folder + '\' + SearchRec.Name, SetAttr, RemoveAttr);
      end
      else
      begin
        Attributes := (SearchRec.Attr or SetAttr) and not RemoveAttr;
        FileSetAttr(Folder + '\' + SearchRec.Name, Attributes);
      end;
    until FindNext(SearchRec) <> 0;
end;

La anterior rutina la usarías así:

Código Delphi [-]
// Pone atribúto de sólo lectura y quita los de oculto y de sistema
ChangeAttr(Folder, faReadOnly, faHidden or faSysFile);

// Pone los atributos de sólo lectura y de sistema, no quita ninguno
ChangeAttr(Folder, faHidden or faSysFile, 0);

Creo que eso resuelve tus dudas.

// Saludos

ruina 01-07-2004 11:55:02

Añado algo: tengo muy malas experiencias con "machacar" una Db de mysql, si ha sido abierta y tenemos el servicio corriendo, suele hacer cosas "raras", como copiar solo un cacho y cosas asi.

si sabes que el directorio de tu db existe yo tiraria el servicio:
C:\mysql\bin\mysqladmin -u root shutdown (fuente: manual mysql)

despues copiar la db...

y despues volver a levantar el servicio:
C:\mysql\bin\mysqld --install

Por cierto, si es una db Gorda igual te mola sacar una barra de progreso, en lugar de hacerte tu una puedes usar el Shell para copiarla

Código Delphi [-]
uses ShellAPI
...
   function CopiaTodo(Origen,Destino : String) :{fuente Trucomania}
   LongInt;
   var
     F : TShFileOpStruct;
     sOrigen, sDestino : String;
   begin
     Result := 0;
     sOrigen := Origen + #0;
     sDestino := Destino + #0;
     with F do
     begin
       Wnd   := 0;
       wFunc := FO_COPY;
       pFrom := @sOrigen[1];
       pTo   := @sDestino[1];
       fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION  or FOF_NOCONFIRMMKDIR;
     end;
     Result := ShFileOperation(F);
 end;

roman 01-07-2004 16:46:07

Cita:

Empezado por ruina
Añado algo: tengo muy malas experiencias con "machacar" una Db de mysql, si ha sido abierta y tenemos el servicio corriendo, suele hacer cosas "raras", como copiar solo un cacho y cosas asi.

si sabes que el directorio de tu db existe yo tiraria el servicio:
C:\mysql\bin\mysqladmin -u root shutdown (fuente: manual mysql)

despues copiar la db...

y despues volver a levantar el servicio:
C:\mysql\bin\mysqld --install

De hecho yo no creo que ésta sea la forma adecuada de copiar una base de datos. Para empezar, como bien dices, lo más seguro sería bajar el servidor pero un servidor no se tira así nada más como así ya que pudiera haber muchos servicos que dependan de él. Segundo, las versiones de MySql deberán ser exactamente las mismas. Las pruebas que he hecho a raiz de este hilo para copiar físicamente las tablas han devenido en un derrumbe del servidor al intentar aceder a las copias en el servidor destino.

MySql ya provee una herramienta para el resplado de bases de datos, MySqlDump, y si se requiere hacer por código se puede hacer de muchas fomas como puede ser simplemente el uso de dos datasets que accedan a ambos servidores y utilizar un ciclo para copiar uno a uno los registros o bien sentencias del tipo INSERT INTO OUTFILE y LOAD DATA IN FILE.

// Saludos

Juan Carlos 03-07-2004 03:50:24

Muchas Gracias!!!
 
Les agredezco por su respuestas, han sido de gran ayuda
:D


La franja horaria es GMT +2. Ahora son las 10:36:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi