Como baixar e carregar database SQL como arquivo .sql usando php?

Eu preciso de um código php que baixa e carrega um arquivo de database.

ou seja, eu tenho essas accounts , information e data bancos de data .

Cópia de segurança:

Preciso de uma ajuda para baixar data banco de data como arquivo .sql . E para sua informação extra, esse database contém 5 tabelas. Quero baixar tudo em um único arquivo.

Restaurar:

Também devo carregar o mesmo arquivo .sql para fins de restauração. Ele deve replace o banco de data dados disponível.

EDITAR

Eu sei que é possível via phpmyadmin e não posso usar isso, pois vou permitir que meus clientes baixem o arquivo sql. E não posso dar-lhes minha senha phpmyadmin.

E mais, não é essencial que eu precise fazê-lo através do arquivo .sql , pode ser de qualquer formato que seja bom e fácil de fazer backup e restaurar o database.

Obrigado.

   

É mais fácil se você não usa php para isso. Não gosto de usar o comando exec, mas …

 exec("mysqldump -u USER -p PASSWORD --databases accounts information data > /YOURHOME/dumpfile.sql"); 

Eu comprimiria esse arquivo:

 exec("tar czvf /YOURHOME/dumpfile.sql.tar.gz /YOURHOME/dumpfile.sql"); 

E, em seguida, faça eco do arquivo ou faça o que quiser.

Sugiro que você escreva um script bash que faça o que escrevi antes. Poderia enviar o despejo para outro servidor ou o que quiser. Use php para isso é um pouco estranho.

Para exportar o uso do database

 function export_tables($host,$user,$pass,$name, $tables=false, $backup_name=false ) { $link = mysqli_connect($host,$user,$pass,$name); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } mysqli_select_db($link,$name); mysqli_query($link,"SET NAMES 'utf8'"); //get all of the tables if($tables === false) { $tables = array(); $result = mysqli_query($link,'SHOW TABLES'); while($row = mysqli_fetch_row($result)) { $tables[] = $row[0]; } } else { $tables = is_array($tables) ? $tables : explode(',',$tables); } $return=''; //cycle through foreach($tables as $table) { $result = mysqli_query($link,'SELECT * FROM '.$table); $num_fields = mysqli_num_fields($result); $row2 = mysqli_fetch_row(mysqli_query($link, 'SHOW CREATE TABLE '.$table)); $return.= "\n\n".$row2[1].";\n\n"; for ($i = 0; $i < $num_fields; $i++) { $st_counter= 0; while($row = mysqli_fetch_row($result)) { //create new command if when starts and after 100 command cycle if ($st_counter%100 == 0 || $st_counter == 0 ) { $return.= "\nINSERT INTO ".$table." VALUES"; } $return.="\n("; for($j=0; $j<$num_fields; $j++) { $row[$j] = addslashes($row[$j]); $row[$j] = str_replace("\n","\\n",$row[$j]); if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; } if ($j<($num_fields-1)) { $return.= ','; } } $return.=")"; //create new command if when starts and after 100 command cycle (but detect this 1 cycle earlier !) if ( ($st_counter+1)%100 == 0 && $st_counter != 0 ) { $return.= ";"; } else { $return.= ","; } //+++++++ $st_counter = $st_counter +1 ; } //as we cant detect WHILE loop end, so, just detect, if last command ends with comma(,) then replace it with semicolon(;) if (substr($return, -1) == ',') {$return = substr($return, 0, -1). ';'; } } $return.="\n\n\n"; } //save file $backup_name = $backup_name ? $backup_name : $name."___(".date('Hi-s')."_".date('dm-Y').")__rand".rand(1,11111111).'.sql'; file_put_contents($backup_name,$return); die('SUCCESS. Download BACKUP file: '.$backup_name.' 

After download,
Delete it! '); } if (!empty($_GET['delete_filee'])){ chdir(dirname(__file__)); if (unlink($_GET['delete_filee'])) {die('file_deleted');} else {die("file doesnt exist");} }

e execute usando

 export_tables("localhost","username","password","db_name"); 

para importar o uso da base de dados

 function import_tables($host,$user,$pass,$dbname,$sql_file, $clear_or_not=false ) { if (!file_exists($sql_file)) { die('Input the SQL filename correctly! ');} // Connect to MySQL server //$link = mysqli_connect($host,$user,$pass,$name); //mysqli_select_db($link,$mysqli); $mysqli = new mysqli($host, $user, $pass, $dbname); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } if($clear_or_not) { $zzzzzz = $mysqli->query('SET foreign_key_checks = 0'); if ($result = $mysqli->query("SHOW TABLES")) { while($row = $result->fetch_array(MYSQLI_NUM)) { $mysqli->query('DROP TABLE IF EXISTS '.$row[0]); } } $zzzzzz = $mysqli->query('SET foreign_key_checks = 1'); } $mysqli->query("SET NAMES 'utf8'"); // Temporary variable, used to store current query $templine = ''; // Read in entire file $lines = file($sql_file); // Loop through each line foreach ($lines as $line) { // Skip it if it's a comment if (substr($line, 0, 2) == '--' || $line == '') continue; // Add this line to the current segment $templine .= $line; // If it has a semicolon at the end, it's the end of the query if (substr(trim($line), -1, 1) == ';') { // Perform the query $mysqli->query($templine) or print('Error performing query \'' . $templine . '\': ' . $mysqli->error . '

'); // Reset temp variable to empty $templine = ''; } } echo 'Tables imported successfully. '; }

e para executá-lo use:

 import_tables("localhost","username","pasword","db_name","my_filename.sql", true); //this will delete all exiting tables, and writes the imported database import_tables("localhost","username","pasword","db_name","my_filename.sql", false); //dont delete the exiting tables, just add those, which doesnt exist 

Fonte:

Experimentei todas as respostas. Mas este código seguinte me ajudou.

BACK-UP :

db_export.php o seguinte código em db_export.php :

 ##################### // CONFIGURATIONS // ##################### // Define the name of the backup directory define('BACKUP_DIR', './myBackups' ) ; // Define Database Credentials define('HOST', 'localhost' ) ; define('USER', 'root' ) ; define('PASSWORD', 'password' ) ; define('DB_NAME', 'database_name' ) ; $files = scandir(BACKUP_DIR); if(count($files) > 2) { for ($i=2; $i < count($files); $i++) { unlink(BACKUP_DIR."/".$files[$i]); } } /* Define the filename for the sql file If you plan to upload the file to Amazon's S3 service , use only lower-case letters */ $fileName = 'mysqlbackup--' . date('dm-Y') . '@'.date('his').'.sql' ; // Set execution time limit if(function_exists('max_execution_time')) { if( ini_get('max_execution_time') > 0 ) set_time_limit(0) ; } ########################### //END OF CONFIGURATIONS// ########################### // Check if directory is already created and has the proper permissions if (!file_exists(BACKUP_DIR)) mkdir(BACKUP_DIR , 0700) ; if (!is_writable(BACKUP_DIR)) chmod(BACKUP_DIR , 0700) ; // Create an ".htaccess" file , it will restrict direct accss to the backup-directory . //$content = 'deny from all' ; //$file = new SplFileObject(BACKUP_DIR . '/.htaccess', "w") ; //$file->fwrite($content) ; $mysqli = new mysqli(HOST , USER , PASSWORD , DB_NAME) ; if (mysqli_connect_errno()) { printf("Connect failed: %s", mysqli_connect_error()); exit(); } // Introduction information // $return = ""; $return .= "--\n"; $return .= "-- A Mysql Backup System \n"; $return .= "--\n"; $return .= '-- Export created: ' . date("Y/m/d") . ' on ' . date("h:i") . "\n\n\n"; $return = "--\n"; $return .= "-- Database : " . DB_NAME . "\n"; $return .= "--\n"; $return .= "-- --------------------------------------------------\n"; $return .= "-- ---------------------------------------------------\n"; $return .= 'SET AUTOCOMMIT = 0 ;' ."\n" ; $return .= 'SET FOREIGN_KEY_CHECKS=0 ;' ."\n" ; $tables = array() ; // Exploring what tables this database has $result = $mysqli->query('SHOW TABLES' ) ; // Cycle through "$result" and put content into an array while ($row = $result->fetch_row()) $tables[] = $row[0] ; // Cycle through each table foreach($tables as $table) { // Get content of each table $result = $mysqli->query('SELECT * FROM '. $table) ; // Get number of fields (columns) of each table $num_fields = $mysqli->field_count ; // Add table information $return .= "--\n" ; $return .= '-- Tabel structure for table `' . $table . '`' . "\n" ; $return .= "--\n" ; $return.= 'DROP TABLE IF EXISTS `'.$table.'`;' . "\n" ; // Get the table-shema $shema = $mysqli->query('SHOW CREATE TABLE '.$table) ; // Extract table shema $tableshema = $shema->fetch_row() ; // Append table-shema into code $return.= $tableshema[1].";" . "\n\n" ; // Cycle through each table-row while($rowdata = $result->fetch_row()) { // Prepare code that will insert data into table $return .= 'INSERT INTO `'.$table .'` VALUES ( ' ; // Extract data of each row for($i=0; $i< $num_fields; $i++) $return .= '"'.$rowdata[$i] . "\"," ; // Let's remove the last comma $return = substr("$return", 0, -1) ; $return .= ");" ."\n" ; } $return .= "\n\n" ; } // Close the connection $mysqli->close() ; $return .= 'SET FOREIGN_KEY_CHECKS = 1 ; ' . "\n" ; $return .= 'COMMIT ; ' . "\n" ; $return .= 'SET AUTOCOMMIT = 1 ; ' . "\n" ; //$file = file_put_contents($fileName , $return) ; $zip = new ZipArchive() ; $resOpen = $zip->open(BACKUP_DIR . '/' .$fileName.".zip" , ZIPARCHIVE::CREATE) ; if( $resOpen ) $zip->addFromString( $fileName , "$return" ) ; $zip->close() ; $fileSize = get_file_size_unit(filesize(BACKUP_DIR . "/". $fileName . '.zip')) ; $message = < <BACKUP ready, the archive has the name of :  $fileName  and it's file-size is : $fileSize . 
Click here to Download msg; echo $message ; // Function to append proper Unit after file-size . function get_file_size_unit($file_size){ switch (true) { case ($file_size/1024 < 1) : return intval($file_size ) ." Bytes" ; break; case ($file_size/1024 >= 1 && $file_size/(1024*1024) < 1) : return intval($file_size/1024) ." KB" ; break; default: return intval($file_size/(1024*1024)) ." MB" ; } }

RESTAURANDO

Eu acho que é vulnerável ao carregamento do database para os clientes. Aprendi com esse comentário . Obrigado, Henrik .


Outras respostas e comentários:

Por sinal, obrigado a todos os comentários ,

Rocket Hazmat , Ares Draguna , Mihai , urso , brandelizer , Mike Brant , lolka_bolka (hahaha nice one!), Bill Karwin (igualmente bom como lolka) e especialmente Henrik .

Além disso, obrigado todas as respostas por,

Luzan , Serpes , Henrik , Bill Karwin , Adam Fischer , Carysun e Herman Nz .

Todos os comentários e respostas foram úteis e valiosos em uma ou outra situação.

Obrigado .


Eu sugeriria usar a camada dibi DB. Você pode baixar aqui: https://github.com/dg/dibi

Do que apenas use como:

 dibi::connect(); dibi::loadFile( 'dump.sql' ); //Can be read as a compressed file: dibi::loadFile( 'compress.zlib://dump.sql.gz' ); 

Experimente isso para baixar:

  
Path to export

ex: public_html/dbbackup/database.sql



< ?php $mysqldbname ="database"; $usrname ="username"; $mypassz ="password"; $remhost ="localhost"; $exportpath = strip_tags($_POST["txtpath"]); //ex: $exportpath ="public_html/dbbackup/dbsample.sql"; if (isset($_POST["cmddownld"])){ if (empty($_POST["txtpath"])){ echo "Unclear path!"; } else{ $cmdrun="mysqldump --opt -h" .$remhost ." -u" .$usrname ." -p" .$mypassz ." " .$mysqldbname ." > ~/" .$exportpath; exec($cmdrun,$outpath,$worked); switch($worked){ case 0: echo "Database " .$mysqldbname ." successfully exported to ~/" .$exportpath .""; break; case 1: echo "Error occured: " .$mysqldbname ." to ~/" .$exportpath .""; break; case 2: echo "There must be a mistake with your db login"; break; } } } ?>

Eu não acho que todos os usuários podem executar a function ‘exec’ no servidor onde seus projetos foram executados. Como você já possui a conta mysql, bem como a permissão de executar o site da php. Por que não tentar instalar o phpmyadmin no servidor web. Pode satisfazê-lo com vários tipos de funcionalidades. Também escrito em php.

Cópia de segurança

Você pode gerar um arquivo de despejo sql com o comando shell mysqldump .

 mysqldump -u USER -p PASSWORD DATABASE > dump.sql 

Se você usar o exemplo, você precisará replace as palavras em letras maiúsculas.

Restaurar

A restauração de um arquivo sql pode ser feita usando o comando shell mysql .

 mysql -u USER -p PASSWORD < dump.sql 

Chamar comandos de shell em PHP

Dentro do PHP, os comandos do shell podem ser chamados com a function exec () :

 exec("mysqldump -u USER -p PASSWORD DATABASE > dump.sql"); // backup exec("mysql -u USER -p PASSWORD < dump.sql"); // restore 

Aspectos de segurança

Você só deve permitir que usuários confiáveis ​​restaurem a partir de arquivos sql. Se você tiver apenas um usuário mysql para acessar todos os seus bancos de dados, restaurar diretamente de um arquivo sql não tem muito mais melhoria de segurança com o uso de phpmyadmin. O uso de um pacote de hospedagem com a capacidade de gerenciar usuários mysql é uma boa solução. Caso contrário, você deve verificar um arquivo sql carregado antes de restaurar deste arquivo.

No seguinte, você encontrará três sugestões sobre como você pode verificar um arquivo carregado. Todas as sugestões baseiam-se no pressuposto de que você usa um arquivo sql, que foi gerado no servidor.

  1. Crie uma assinatura digital no download e valide a assinatura no upload. Com certeza, você deve carregar a assinatura digital juntamente com o sql.

  2. Armazene um valor de hash do sql baixado no servidor e verifique se existe esse valor de hash no upload. Usar uma ID para os arquivos sql pode ser útil.

  3. Salve todos os arquivos sql no servidor e permita apenas restaurações desses arquivos. Os carregamentos já não eram necessários.