代码之家  ›  专栏  ›  技术社区  ›  Jrgns

无需访问服务器或phpmyadmin即可轻松导出SQL表

  •  24
  • Jrgns  · 技术社区  · 16 年前

    我需要一种方法来轻松导出MySQL表中的数据,然后从远程服务器导入到我的家庭服务器。我没有直接访问服务器的权限,也没有安装phpmyadmin等实用程序。不过,我有能力将PHP脚本放到服务器上。

    如何获取数据?

    我问这个问题纯粹是为了记录我的方法

    8 回复  |  直到 16 年前
        1
  •  39
  •   John    7 年前

    您可以为此使用SQL:

    $file = 'backups/mytable.sql';
    $result = mysql_query("SELECT * INTO OUTFILE '$file' FROM `##table##`");
    

    然后将浏览器或FTP客户机指向目录/文件(backups/mytable.sql)。这也是一种进行增量备份的好方法,例如,给文件名一个时间戳。

    要从该文件将其恢复到数据库中,可以使用:

    $file = 'backups/mytable.sql';
    $result = mysql_query("LOAD DATA INFILE '$file' INTO TABLE `##table##`");
    

    另一个选项是使用php在服务器上调用系统命令并运行'mysqldump':

    $file = 'backups/mytable.sql';
    system("mysqldump --opt -h ##databaseserver## -u ##username## -p ##password## ##database | gzip > ".$file);
    
        2
  •  18
  •   Jrgns    16 年前

    我通过导出到csv,然后用任何可用的实用程序导入。我非常喜欢使用php://output流。

    $result = $db_con->query('SELECT * FROM `some_table`');
    $fp = fopen('php://output', 'w');
    if ($fp && $result) {
        header('Content-Type: text/csv');
        header('Content-Disposition: attachment; filename="export.csv"');
        while ($row = $result->fetch_array(MYSQLI_NUM)) {
            fputcsv($fp, array_values($row));
        }
        die;
    }
    
        3
  •  11
  •   Shinhan    16 年前

    你也应该考虑 phpMinAdmin 这只是一个文件,所以很容易上传和设置。

        4
  •  8
  •   T.Todua Laurent W.    9 年前

    工作方案 (最新版本: Export.php + Import.php )

    EXPORT_TABLES("localhost","user","pass","db_name");
    

    代码:

    //https://github.com/tazotodua/useful-php-scripts
    function EXPORT_TABLES($host,$user,$pass,$name,  $tables=false, $backup_name=false ){
        $mysqli = new mysqli($host,$user,$pass,$name); $mysqli->select_db($name); $mysqli->query("SET NAMES 'utf8'");
        $queryTables = $mysqli->query('SHOW TABLES'); while($row = $queryTables->fetch_row()) { $target_tables[] = $row[0]; }   if($tables !== false) { $target_tables = array_intersect( $target_tables, $tables); }
        foreach($target_tables as $table){
            $result = $mysqli->query('SELECT * FROM '.$table);  $fields_amount=$result->field_count;  $rows_num=$mysqli->affected_rows;     $res = $mysqli->query('SHOW CREATE TABLE '.$table); $TableMLine=$res->fetch_row();
            $content = (!isset($content) ?  '' : $content) . "\n\n".$TableMLine[1].";\n\n";
            for ($i = 0, $st_counter = 0; $i < $fields_amount;   $i++, $st_counter=0) {
                while($row = $result->fetch_row())  { //when started (and every after 100 command cycle):
                    if ($st_counter%100 == 0 || $st_counter == 0 )  {$content .= "\nINSERT INTO ".$table." VALUES";}
                        $content .= "\n(";
                        for($j=0; $j<$fields_amount; $j++)  { $row[$j] = str_replace("\n","\\n", addslashes($row[$j]) ); if (isset($row[$j])){$content .= '"'.$row[$j].'"' ; }else {$content .= '""';}     if ($j<($fields_amount-1)){$content.= ',';}      }
                        $content .=")";
                    //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler
                    if ( (($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) {$content .= ";";} else {$content .= ",";} $st_counter=$st_counter+1;
                }
            } $content .="\n\n\n";
        }
        $backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql";
        header('Content-Type: application/octet-stream');   header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=\"".$backup_name."\"");  echo $content; exit;
    }
    
        5
  •  3
  •   Lasar    16 年前

    如果你有ftp/sftp访问权,你可以自己上传phpmyadmin。

    我使用这个小软件包从我只有ftp访问权的服务器上进行自动mysql备份:
    http://www.taw24.de/download/pafiledb.php?PHPSESSID=b48001ea004aacd86f5643a72feb2829&action=viewfile&fid=43&id=1
    该网站是德语的,但下载也有一些英语文档。

    一个快速的谷歌也会出现这种情况,但我自己没有使用它:
    http://snipplr.com/view/173/mysql-dump/

        6
  •  3
  •   DreamWerx    16 年前

    你可以考虑看看: http://www.webyog.com 这是一个很好的GUI管理工具,他们有一个非常好的HTTP隧道功能(我不确定这是否只在企业中,它需要花费一些钱)。

    基本上,您可以将它们提供的脚本上传到您的Webspace(PHP脚本)中,并将sqlyog manager指向它,然后您就可以访问数据库了。它使用此脚本在主客户机和服务器之间进行请求/查询的隧道/代理。

    我知道至少有一个人用这种方法取得了很好的效果。

        7
  •  2
  •   Vali Munteanu    9 年前

    这里是一个 PHP 我编写的脚本将备份数据库中的所有表。是基于这个 http://davidwalsh.name/backup-mysql-database-php 还有一些改进。首先,它将正确设置 foreign key restrictions .

    在我的设置中,脚本将在一周中的某一天运行,比如说星期一。如果它没有在星期一运行,它仍然会在星期二运行(例如),创建 .sql 把上个星期一的日期归档,当时它应该运行。它将抹去 SQL 文件来自4周前,因此它始终保留最后4个备份。代码如下:

    <?php
    
    backup_tables();
    
    // backup all tables in db
    function backup_tables()
    {
        $day_of_backup = 'Monday'; //possible values: `Monday` `Tuesday` `Wednesday` `Thursday` `Friday` `Saturday` `Sunday`
        $backup_path = 'databases/'; //make sure it ends with "/"
        $db_host = 'localhost';
        $db_user = 'root';
        $db_pass = '';
        $db_name = 'movies_database_1';
    
        //set the correct date for filename
        if (date('l') == $day_of_backup) {
            $date = date("Y-m-d");
        } else {
            //set $date to the date when last backup had to occur
            $datetime1 = date_create($day_of_backup);
            $date = date("Y-m-d", strtotime($day_of_backup.' -7 days'));
        }
    
        if (!file_exists($backup_path.$date.'-backup'.'.sql')) {
    
            //connect to db
            $link = mysqli_connect($db_host,$db_user,$db_pass);
            mysqli_set_charset($link,'utf8');
            mysqli_select_db($link,$db_name);
    
            //get all of the tables
            $tables = array();
            $result = mysqli_query($link, 'SHOW TABLES');
            while($row = mysqli_fetch_row($result))
            {
                $tables[] = $row[0];
            }
    
            //disable foreign keys (to avoid errors)
            $return = 'SET FOREIGN_KEY_CHECKS=0;' . "\r\n";
            $return.= 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";' . "\r\n";
            $return.= 'SET AUTOCOMMIT=0;' . "\r\n";
            $return.= 'START TRANSACTION;' . "\r\n";
    
            //cycle through
            foreach($tables as $table)
            {
                $result = mysqli_query($link, 'SELECT * FROM '.$table);
                $num_fields = mysqli_num_fields($result);
                $num_rows = mysqli_num_rows($result);
                $i_row = 0;
    
                //$return.= 'DROP TABLE '.$table.';'; 
                $row2 = mysqli_fetch_row(mysqli_query($link,'SHOW CREATE TABLE '.$table));
                $return.= "\n\n".$row2[1].";\n\n"; 
    
                if ($num_rows !== 0) {
                    $row3 = mysqli_fetch_fields($result);
                    $return.= 'INSERT INTO '.$table.'( ';
                    foreach ($row3 as $th) 
                    { 
                        $return.= '`'.$th->name.'`, '; 
                    }
                    $return = substr($return, 0, -2);
                    $return.= ' ) VALUES';
    
                    for ($i = 0; $i < $num_fields; $i++) 
                    {
                        while($row = mysqli_fetch_row($result))
                        {
                            $return.="\n(";
                            for($j=0; $j<$num_fields; $j++) 
                            {
                                $row[$j] = addslashes($row[$j]);
                                $row[$j] = preg_replace("#\n#","\\n",$row[$j]);
                                if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
                                if ($j<($num_fields-1)) { $return.= ','; }
                            }
                            if (++$i_row == $num_rows) {
                                $return.= ");"; // last row
                            } else {
                                $return.= "),"; // not last row
                            }   
                        }
                    }
                }
                $return.="\n\n\n";
            }
    
            // enable foreign keys
            $return .= 'SET FOREIGN_KEY_CHECKS=1;' . "\r\n";
            $return.= 'COMMIT;';
    
            //set file path
            if (!is_dir($backup_path)) {
                mkdir($backup_path, 0755, true);
            }
    
            //delete old file
            $old_date = date("Y-m-d", strtotime('-4 weeks', strtotime($date)));
            $old_file = $backup_path.$old_date.'-backup'.'.sql';
            if (file_exists($old_file)) unlink($old_file);
    
            //save file
            $handle = fopen($backup_path.$date.'-backup'.'.sql','w+');
            fwrite($handle,$return);
            fclose($handle);
        }
    }
    
    ?>
    
        8
  •  -1
  •   SeanDowney    16 年前

    我通过命令行使用mysqldump:

    exec("mysqldump sourceDatabase -uUsername -p'password'  > outputFilename.sql");
    

    然后您只需下载结果文件并完成。