Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jnejunior

backup dinâmico de banco de dados

Recommended Posts

salve pessoal.

 

estava navegando no fórum, achei um script de backup do Fabio Lody (Ele é fera em Photoshop), então dei uma estilizada e implementada, espero que gostem, se alguém melhorar o código favor postar aqui pra galera e pra mim também.. rsrs

 

<?php
set_time_limit(0);
$con = mysql_connect('localhost', 'root', '');
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
	<meta charset="UTF-8">
	<title>Back-up Banco de Dados</title>		
<style type="text/css">
* {margin: 0; padding: 0;}

#geral {background: #dedede; margin: 20px auto; padding: 10px; width: 1024px;}

form {margin: 0 auto; width: 1000px;}
fieldset {border: 1px solid #666; margin: 0 0 30px 0;}
legend {background: #ad2424; color: #fff; font: 20px Arial, Helvetica, sans-serif; margin: 0 15px; padding: 5px;}
select {border: 1px solid #666; font: 13px Arial, Helvetica, sans-serif; margin: 25px 14px 25px 15px; padding: 4px 3px;}
input {background: #ad2424; border: 1px solid #ad0000; color: #fff; cursor: pointer; font: bold 11px Arial, Helvetica, sans-serif; padding: 6px 5px;}
textarea {border: 1px solid #666; height: 500px; margin: 15px auto; padding: 5px; resize: vertical; width: 990px;}

h1 {color: #333; font: 18px "Trebuchet ms", Verdana, sans-serif; margin: 10px 0;}
p {color: #222; font: 12px "Trebuchet ms", Verdana, sans-serif;}
</style>
</head>
<body>
	<section id="geral">			
		<form method="post" action="" name="form">
			<fieldset>
				<legend>Sistema de Back-up Dinâmico</legend>
				<select name="banco">
					<option value="n">Escolha o Banco de Dados</option>
					<?php				
						$qrBancos = mysql_query('SHOW DATABASES') or die (mysql_error());
						$contaBancos = mysql_num_rows($qrBancos);

						if($contaBancos > 0){
							while($linhaBancos = mysql_fetch_array($qrBancos)){
								$nomeBancos = $linhaBancos[0];						
								echo '<option value="'.$nomeBancos.'">'.$nomeBancos.'</option>';						
								echo $nomeBancos.'<br/>';
							}
						} else {
							echo '<option value="">Sem banco de dados!</option>';														
						}
					?>
					<input type="submit" name="gerar" value="Gerar SQL" />
				</select>
			</fieldset>			
		<?php
			if(isset($_POST['gerar'])){
				if($_POST['banco'] == 'n'){
					echo 'Selecione um banco de dados!';
				} else {				
					$bd = $_POST['banco'];
					$qrTabelas = @mysql_list_tables($bd);
					$contaTabelas = mysql_num_rows($qrTabelas);

					echo '<h1>SQL Gerado com sucesso!</h1>';
					echo "<p>Banco selecionado: $bd</p>";
					echo "<p>Número de tabelas: $contaTabelas</p>";					

					mysql_select_db($bd);

					$tabelas = mysql_query('SHOW TABLE STATUS');

					while($l = mysql_fetch_assoc($tabelas)){
						$tabela[$l["Name"]] = $l["Auto_increment"];
					}

					$backup  = "";
					$tabelas = @mysql_list_tables($bd);

					while($tab = mysql_fetch_row($tabelas)){
						$backup .= "--\n-- Estrutura da Tabela `$tab[0]` \n--\n\nDROP TABLE IF EXISTS `$tab[0]`;\n";
						$res = mysql_query("SHOW CREATE TABLE $tab[0]");

						while($all = mysql_fetch_assoc($res)){
							$str = $all['Create Table'];
							$str = str_replace('  ', "\t", $str);

							if(!empty($tabela[$tab[0]])){
								$backup .= $str.";\n\n";
							} else {
								$backup .= $str.";\n\n";
							}
						}

						$data = mysql_query("SELECT * FROM $tab[0]");

						if(mysql_num_rows($data)){
							$backup .= "--\n-- Extraindo dados da tabela `$tab[0]` \n--\n\n";
						}

						while($dt = mysql_fetch_row($data)){
							$backup .= "INSERT INTO `$tab[0]` VALUES ($dt[0]";

							for($i = 1; $i < sizeof($dt); $i++){
								$backup .= ", '$dt[$i]'";
							}
							$backup .= ");\n";
						}
						$backup .= "\n\n--\n\n";
					}
					echo '<textarea>';
					echo $backup;
					echo '</textarea>';						
				}
			}
		?>			
		</form>
	</section>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

corrigindo, o mysql vai existir, ele só estará em desuso (deprecated)...

 

já que tu deu a ideia, manda ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

<!doctype html>
<html>
   <head>
       <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
   </head>
   <body>
       <?php
               $PDO = new PDO( 'mysql:host=localhost', 'root', '...' );
               $PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
               $PDO->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
       ?>
       <form method="GET">
           Selecione o banco de dados: <select name="database" onchange="this.form.submit()">
           <?php
               foreach( $PDO->query( 'SHOW DATABASES' )->fetchAll() as $index => $data ){
                   if( $_GET['database'] == $data['Database'] ){
                       echo '<option value="'.$data['Database'].'" selected>', $data['Database'], '</option>';
                   }else{
                       echo '<option value="'.$data['Database'].'">', $data['Database'], '</option>';
                   }
               }
           ?>
           </select><br />
        </form>
        <form method="POST">
                <?php 
                   if( !empty( $_GET['database'] ) ){
                       echo 'Selecione as tabelas: <br /> 
                            <select name="table[]" multiple="multiple">';
                       $Tables = $PDO->query( 'SHOW TABLES FROM `'.$_GET['database'].'`' )->fetchAll();
                       for( $i = 0; $i < sizeOf( $Tables ); ++$i ){
                            foreach( $Tables[ $i ] as $index => $data ){
                                echo '<option value="'.$data.'">'.$data.'</option>';
                            }
                       }
                       echo '</select><br />';
                       echo '<input type="submit" value="Fazer Backup" name="backup">';
                   }
                ?> 
       </form>
       <?php
               echo '<pre>';
               if( isset( $_POST['backup'] ) ){
                   $PDO->query( 'USE `'.$_GET['database'].'`' );
                   echo '<textarea cols="150" rows="60">';
                   foreach( $_POST['table'] as $index => $data ){
                        $create = $PDO->query( 'SHOW CREATE TABLE `'.$data.'`' )->fetchAll();
                        foreach( $create as $createTable){
                            echo $createTable[ 'Create Table' ], "\n\n";
                        }
                        $select = $PDO->query( 'SELECT * FROM `'.$data.'`' )->fetchAll();
                        for( $i = 0; $i < sizeOf( $select ); ++$i ){
                             foreach( $select[ $i ] as $field => $value ){
                                 $fields[] = '`'.$field.'`';
                                 if( !is_numeric( $value ) ){
                                     $values[] = sprintf( "'%s'", $value );
                                 }else{
                                     $values[] = intval( $value );
                                 }
                             }
                             printf( 'INSERT INTO `%s`( %s ) VALUES ( %s )', $data, implode( ',', $fields ), implode( ',', $values ) );
                             echo "\n";
                        }
                   }
                   echo '</textarea>';
               }
       ?>
   </body>
</html>

 

Não deu tempo de revisar..

 

Fica legal, se pegar as procedures, porque no create code não consta ..

tem que pegar do information_schema, depois eu faço:

e retornar +/- isso aqui:

DROP PROCEDURE IF EXISTS `getCompradores`;
DELIMITER $$
CREATE PROCEDURE `getCompradores`(IN `pid` MEDIUMINT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
   SELECT CONCAT( `usuarios`.`nome`, ' ', `usuarios`.`sobrenome` ) as `nome`,
   `produtos`.`nome`, CONCAT( `categorias`.`categoria`, '/', `subcategorias`.subcategoria ) as `categoria`,
   `produtos`.`foto`, `compradores`.`data` as `dataDaCompra`, COUNT(*) as `totalCompras`
   FROM `compradores` INNER JOIN `usuarios` ON `compradores`.cid = `usuarios`.uid 
   INNER JOIN `produtos` ON `compradores`.pid = `produtos`.pid  INNER JOIN `categorias` 
   ON `produtos`.categoria = `categorias`.cid  INNER JOIN `subcategorias` 
   ON `produtos`.subcategoria = `subcategorias`.scid WHERE `compradores`.pid = pid
   GROUP BY `usuarios`.uid ORDER BY `usuarios`.nome DESC;
END $$
DELIMITER ;

 

No caso, procedure, triggers, views, events, functions ..

essa procedure acima é de um banco de dados do e-commerce que estou fazendo

mais o retorno deve ser +/- isso aí, tente pegar agora o SQL dessas funções, aí fica mais maneiro ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey, estava testando o script aqui, e notei que há um erro, quando ele extrai os dados do banco aparece assim:

 

INSERT INTO `nivel`( `idNivel` ) VALUES ( 1 )

INSERT INTO `nivel`( `idNivel`,`nivel` ) VALUES ( 1,'administrador' )

INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel` ) VALUES ( 1,'administrador',2 )

INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel`,`nivel` ) VALUES ( 1,'administrador',2,'editor' )

INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel`,`nivel`,`idNivel` ) VALUES ( 1,'administrador',2,'editor',3 )

INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel`,`nivel`,`idNivel`,`nivel` ) VALUES ( 1,'administrador',2,'editor',3,'membro' )

 

já tentei de todo jeito, mas não estou no mesmo nível que você...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Corrigido.

 

 

<!doctype html>
<html>
   <head>
       <meta http-equiv="content-type" content="text/html; charset=utf-8" />
   </head>
   <body>
       <?php
               $PDO = new PDO( 'mysql:host=localhost', 'root', '' );
               $PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
               $PDO->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
       ?>
       <form method="GET">
           Selecione o banco de dados: <select name="database" onchange="this.form.submit()">
           <?php
               foreach( $PDO->query( 'SHOW DATABASES' )->fetchAll() as $index => $data ){
                   if( $_GET['database'] == $data['Database'] ){
                       echo '<option value="'.$data['Database'].'" selected>', $data['Database'], '</option>';
                   }else{
                       echo '<option value="'.$data['Database'].'">', $data['Database'], '</option>';
                   }
               }
           ?>
           </select><br />
        </form>
        <form method="POST">
                <?php 
                   if( !empty( $_GET['database'] ) ){
                       echo 'Selecione as tabelas: <br /> 
                            <select name="table[]" multiple="multiple">';
                       $Tables = $PDO->query( 'SHOW TABLES FROM `'.$_GET['database'].'`' )->fetchAll();
                       for( $i = 0; $i < sizeOf( $Tables ); ++$i ){
                            foreach( $Tables[ $i ] as $index => $data ){
                                echo '<option value="'.$data.'">'.$data.'</option>';
                            }
                       }
                       echo '</select><br />';
                       echo '<input type="submit" value="Fazer Backup" name="backup">';
                   }
                ?> 
       </form>
       <?php
               echo '<pre>';
               if( isset( $_POST['backup'] ) ){
                   $PDO->query( 'USE `'.$_GET['database'].'`' );
                   echo '<textarea cols="150" rows="60">';
                   foreach( $_POST['table'] as $index => $data ){
                        $create = $PDO->query( 'SHOW CREATE TABLE `'.$data.'`' )->fetchAll();
                        foreach( $create as $createTable){
                            echo $createTable[ 'Create Table' ], ";\n\n";
                        }
                        $select = $PDO->query( 'SELECT * FROM `'.$data.'`' )->fetchAll();
                        for( $i = 0; $i < sizeOf( $select ); ++$i ){
                             foreach( $select[ $i ] as $field => $value ){
                                 $fields[ $field ] = '`'.$field.'`';
                                 if( !is_numeric( $value ) ){
                                     $values[  ] = sprintf( "'%s'", $value );
                                 }else{
                                     $values[  ] = ( float ) $value;
                                 }
                             }
                             $result[ ] = sprintf( '( %s )', implode( ', ', $values ) );
                             unset( $values );
                        }
                        printf( "INSERT INTO `%s`( %s ) \nVALUES \n%s;\n\n", $data, implode( ',', $fields ), implode( ", \n", $result ) );
		unset( $result, $fields );
                   }
                   echo '</textarea>';
               }
       ?>
   </body>
</html>

 

 

 

Atualizado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos Coelho, eu testei o script, e ainda não esta correto, quando tu seleciona uma tabela funciona certinho, mas se tu seleciona mais de uma sai assim, veja a saída quando selecionei duas tabelas...

 

CREATE TABLE `nivel` (   `idNivel` int(11) NOT NULL AUTO_INCREMENT,   `nivel` varchar(13) DEFAULT NULL,   PRIMARY KEY (`idNivel`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;  INSERT INTO `nivel`( `idNivel`,`nivel` )  VALUES  ( 1, 'administrador' ),  ( 2, 'editor' ),  ( 3, 'membro' );CREATE TABLE `tutorial` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `nome` varchar(50) NOT NULL DEFAULT '',   `sobrenome` varchar(50) NOT NULL DEFAULT '',   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;  INSERT INTO `tutorial`( `idNivel`,`nivel`,`id`,`nome`,`sobrenome` )  VALUES  ( 1, 'administrador' ),  ( 2, 'editor' ),  ( 3, 'membro' ),  ( 2, 'pedro', 'neto' ),  ( 3, 'Ana', 'Banana' ),  ( 4, 'Junior', 'Eberhardt' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

jnejunior, realmente cara, não entendo o que você arruma ...

ambos os scripts estão funcionando corretamente, testei a versão atualizada do Carlos, e funcionou perfeitamente

CREATE TABLE `categorias` (
 `cid` smallint(6) NOT NULL AUTO_INCREMENT,
 `categoria` varchar(25) NOT NULL,
 `criada` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`cid`),
 UNIQUE KEY `categoria` (`categoria`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 CHECKSUM=1 ROW_FORMAT=DYNAMIC;

INSERT INTO `categorias`( `cid`,`categoria`,`criada` ) 
VALUES 
( 1, 'teste', '2011-06-12 16:04:30' );

CREATE TABLE `subcategorias` (
 `scid` smallint(6) NOT NULL AUTO_INCREMENT,
 `cid` smallint(6) NOT NULL,
 `subcategoria` varchar(18) NOT NULL,
 `criada` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`scid`),
 UNIQUE KEY `subcategoria` (`subcategoria`),
 KEY `fkcat` (`cid`),
 CONSTRAINT `fkcat` FOREIGN KEY (`cid`) REFERENCES `categorias` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 CHECKSUM=1 ROW_FORMAT=DYNAMIC;

INSERT INTO `subcategorias`( `scid`,`cid`,`subcategoria`,`criada` ) 
VALUES 
( 1, 1, 'testeSub', '2011-06-12 16:05:17' ), 
( 2, 1, 'testeSub2', '2011-06-19 14:42:26' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

só atualizando o post, com ajuda do Andrey adicionei função para zipar o sql, que quiser ta ai...

 

<!DOCTYPE HTML> <html lang="pt-BR"> 	<head> 		<meta charset="UTF-8"> 		<title>Back-up Banco de Dados</title>		 		<style type="text/css"> 			* {margin: 0; padding: 0;}  			#geral {background: #dedede; margin: 20px auto; padding: 10px; width: 1024px;}  			form {margin: 0 auto; width: 1000px;} 			fieldset {border: 1px solid #666; margin: 0 0 30px 0;} 			legend {background: #ad2424; color: #fff; font: 20px Arial, Helvetica, sans-serif; margin: 0 15px; padding: 5px;} 			select {border: 1px solid #666; font: 13px Arial, Helvetica, sans-serif; margin: 25px 14px 25px 15px; padding: 4px 3px;} 			input {background: #ad2424; border: 1px solid #ad0000; color: #fff; cursor: pointer; font: bold 11px Arial, Helvetica, sans-serif; padding: 6px 5px;} 			textarea {border: 1px solid #666; height: 500px; margin: 15px 10px 15px 10px; padding: 5px; resize: vertical; width: 992px;} 			 			.tabelas {width: 196px;} 			 			h1 {color: #333; font: 18px "Trebuchet ms", Verdana, sans-serif; margin: 10px 0;} 			p {color: #222; font: 12px "Trebuchet ms", Verdana, sans-serif; margin-left: 15px;} 		</style> 	</head> 	<body> 		<section id="geral"> 			<?php 				setlocale(LC_ALL, "pt_BR", "pt_BR.iso-8859-1", "pt_BR.utf-8", "portuguese"); 				date_default_timezone_set('America/Sao_Paulo'); 				 				$PDO = new PDO('mysql:host=localhost', 'root', ''); 				$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 				$PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 			?> 			<form method="get"> 				<fieldset> 					<legend>Sistema de Back-up Dinâmico</legend> 					<select name="baseDados" onchange="this.form.submit()"> 						<option>Selecione o banco de dados</option> 							<?php 								foreach ($PDO->query( 'SHOW DATABASES' )->fetchAll() as $indice => $dados){ 									if ($_GET['baseDados'] == $dados['Database']){ 										echo '<option value="'.$dados['Database'].'" selected>', $dados['Database'], '</option>'; 									} else { 										echo '<option value="'.$dados['Database'].'">', $dados['Database'], '</option>'; 									} 								} 							?> 					</select>				 			</form> 			<form method="post"> 				<?php  					if (!empty($_GET['baseDados'])){						 						echo '<p>Selecione uma ou mais tabelas:</p>';  						echo '<select name="tabela[]" multiple="multiple" class="tabelas">'; 						$Tables = $PDO->query( 'SHOW TABLES FROM `'.$_GET['baseDados'].'`' )->fetchAll();  						for ($i = 0; $i < sizeOf($Tables); ++$i){ 							foreach($Tables[$i] as $indice => $dados){ 								echo '<option value="'.$dados.'">'.$dados.'</option>'; 							} 						}  						echo '</select>'; 						echo '<input type="submit" value="Gerar SQL" name="gerar_sql">'; 					} 				?> 				</fieldset> 			</form> 			<?php 				if(isset($_POST['gerar_sql'])) { 					$PDO->query('USE `'.$_GET['baseDados'].'`'); 					 					if(!isset($_POST['tabela'])){ 						echo 'Selecione uma ou mais tabelas!!!'; 					} else { 						 						echo '<textarea>'; 						echo $zlib[] = "-- Banco de dados: `" .$_GET['baseDados']. "`"; 						echo $zlib[] .= "\n-- Criação: " .strftime('%d %b %Y às %H:%M', strtotime(date('d-m-Y H:i'))); 						 						foreach($_POST['tabela'] as $indice => $dados){ 							$criar = $PDO->query('SHOW CREATE TABLE `'.$dados.'`')->fetchAll(); 							 							foreach($criar as $criarTabela) { 								echo $zlib[] .= "\n\n\n\n--\n-- Estrutura da tabela `$dados` \n--\n\n"; 								echo $zlib[] .= "DROP TABLE IF EXISTS `$dados`; \n"; 								echo $zlib[] .= $criarTabela['Create Table']. ";\n\n"; 							} 							 							$selecao = $PDO->query('SELECT * FROM `'.$dados.'`')->fetchAll(); 							 							for($i = 0; $i < sizeof($selecao); ++$i){ 								foreach($selecao[$i] as $campo => $valor) { 									$campos[$campo] = '`'.$campo.'`'; 									 									if(!is_numeric($valor)){ 										$valores[] = sprintf("'%s'", $valor); 									} else { 										$valores[] = (float) $valor; 									} 								} 								 								$resultado[] = sprintf('(%s)', implode(', ', $valores)); 								unset($valores);						 							} 							 							echo $zlib[] .= "\n--\n-- Extraindo dados da tabela `$dados` \n--\n\n"; 							echo $zlib[] .= sprintf("INSERT INTO `%s` (%s) VALUES \n%s;", $dados, implode(', ', $campos), implode(",\n", $resultado)); 							unset($resultado, $campos); 						} 						echo '</textarea>'; 						 						// comprimindo a sql 						$zipDados = gzencode(implode('', $zlib), 9); 						$abrir = fopen("bkp_{$_GET['baseDados']}_".date('d-m-Y').".sql.gz", 'w'); 						fwrite($abrir, $zipDados); 						fclose($abrir); 					}					 				} 			?>			 		</section> 	</body> </html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.