如何进行sql备份?

时间:2019-07-03 08:19:43

标签: php mysql

我想备份我的数据库。我正在使用mysqldump,它为我提供了一个空的SQL文件。

<?php
   $dbhost = 'localhost';
   $dbuser = 'root';
   $dbpass = '';
   $dbname = 'motel';
  echo  $backup_file = "motel\\".$dbname . date("Y-m-d-H-i-s") . '.sql';
  echo "<br>".$command = "mysqldump -h$dbhost -u$dbuser -p$dbpass $dbname >$backup_file";

 system($command);
?>

没有错误,没有预期的输出。告诉我我在哪里出错,正如我说的那样,每次运行此代码时我都会得到一个SQL文件,但为空。

3 个答案:

答案 0 :(得分:2)

尝试一下

参加教程:https://chartio.com/resources/tutorials/importing-from-and-exporting-to-files-using-the-mysql-command-line/

从MySQL导出 将MySQL数据库导出到文本文件的最佳工具是mysqldump。

要使用mysqldump,您将需要知道适当的MySQL用户的登录凭据,该用户具有必要的特权以导出相关数据库。

掌握了这些信息后,输入带有相应标志和选项的mysqldump命令:

int fsize;
std::string filebuf( '0', 1024 );

while ( ( fsize = recv( sockfd, filebuf.data( ), filebuf.size( ), 0 ) ) > 0 )
{
     if( std::size_t index{ filebuf.find( "#end", 0 ) }; 
          index != std::string::npos )
     {
         // The line terminator was found so don't call the
         // the receive function again as there should be nothing
         // remaining in the stream to read.
     }
     /*Write the data to your file.*/
     filebuf.clear( );
}
respond("Received file.\n");

正在使用的选项是:

-u标志指示将跟随MySQL用户名。 -p标志指示应提示我们输入与上述用户名关联的密码。 当然,database_name是要导出的数据库的确切名称。 >符号是STDOUT的Unix指令,它允许Unix命令将发出的命令的文本结果输出到另一个位置。在这种情况下,该输出位置是由output_file_path指定的文件路径。 注意:通常建议为output_file_path输入完全限定的路径和文件名,这样就可以在所需的位置生成生成的文件。

例如,要将books数据库作为book_admin用户导出到〜/ backup / database目录,我们可以使用以下命令:

var XLSX = require('xlsx');
var workbook = XLSX.readFile('./test.xlsx');
var sheet_name_list = workbook.SheetNames;
let columnHeaders = [];
for (var sheetIndex = 0; sheetIndex < sheet_name_list.length; sheetIndex++) {
    var worksheet = workbook.Sheets[sheet_name_list[sheetIndex]];
    for (let key in worksheet) {
        let regEx = new RegExp("^\(\\w\)\(1\){1}$");
        if (regEx.test(key) == true) {
            columnHeaders.push(worksheet[key].v);
        }
    }
}

输入密码: 在出现以上提示时输入密码后,此命令将在相应目录中创建带有.sql后缀(完全可选,但建议)的备份文件。

默认情况下,mysqldump不会保存试图修改实际数据库存在的命令。相反,默认情况下,仅保存实际表(及其各自的数据),因此将为以后使用此文件导入做准备。如果您需要导出(然后重新创建)更多数据库的功能,请阅读官方文档中的--databases标志。

答案 1 :(得分:0)

只需尝试以下php代码,这会将您的数据库备份到特定的文件夹中

 <?php

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '******';
$dbname = "db";
$tables = '*';

function backup_tables($host, $user, $pass, $dbname, $tables = '*') {
    $link = mysqli_connect($host, $user, $pass, $dbname);
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
        exit;
    }
    mysqli_query($link, "SET NAMES 'utf8'");
    if ($tables == '*') {
        $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 = '';
    foreach ($tables as $table) {
        $result = mysqli_query($link, 'SELECT * FROM ' . $table);
        $num_fields = mysqli_num_fields($result);
        $num_rows = mysqli_num_rows($result);
        $return.= 'DROP TABLE IF EXISTS ' . $table . ';';
        $row2 = mysqli_fetch_row(mysqli_query($link, 'SHOW CREATE TABLE ' . $table));
        $return.= "

" . $row2[1] . ";

";
        $counter = 1;
        for ($i = 0;$i < $num_fields;$i++) {
            while ($row = mysqli_fetch_row($result)) {
                if ($counter == 1) {
                    $return.= 'INSERT INTO ' . $table . ' VALUES(';
                } else {
                    $return.= '(';
                }
                for ($j = 0;$j < $num_fields;$j++) {
                    $row[$j] = addslashes($row[$j]);
                    $row[$j] = str_replace("
", "
", $row[$j]);
                    if (isset($row[$j])) {
                        $return.= '"' . $row[$j] . '"';
                    } else {
                        $return.= '""';
                    }
                    if ($j < ($num_fields - 1)) {
                        $return.= ',';
                    }
                }
                if ($num_rows == $counter) {
                    $return.= ");
";
                } else {
                    $return.= "),
";
                }
                ++$counter;
            }
        }
        $return.= "


";
    }
    date_default_timezone_set('Asia/Kolkata');
   $date=date('Y-m-d'); 

 $target_dir="E:\DbBackup\ $date";  

if(!is_dir($target_dir))    {   

mkdir($target_dir,0777);

}   
$fileName = $target_dir.'\db-backup.sql'; 

  $handle = fopen($fileName, 'w+');  
 fwrite($handle, $return);   
}
?>

调用函数:-

backup_tables($dbhost, $dbuser, $dbpass, $dbname, $tables);

答案 2 :(得分:0)

您可能需要为mysqldump.exe设置完整二进制路径的系统无法识别mysqldump命令

注意:在我的情况下,c:\ wamp64 \ bin \ mysql \ mysql5.7.26 \ bin

根据您的情况验证正确的路径,同时检查输出文件的路径

  <?php
   $dbhost = 'localhost';
   $dbuser = 'root';
   $dbpass = '';
   $dbname = 'motel';
   $backup_file = $dbname . date("Y-m-d-H-i-s") . '.sql';

  /*******
    if password is empty then no need to use password within command line 
    (if password present then only add --password=your_pass)
    Add mysql bin path to work mysqldump properlly and also set oputput file path 
    ******/
    $cmd  = "c: & cd c:\wamp64\bin\mysql\mysql5.7.26\bin & mysqldump.exe --user=$dbuser --host=$dbhost  $dbname> c:\wamp64\www\motel\\$backup_file";
   echo $cmd;

 system($command);
?>