Łatwy sposób na eksport tabeli SQL bez dostępu do serwera lub phpMyADMIN

Potrzebuję sposobu na łatwy eksport, a następnie import danych w tabeli MySQL ze zdalnego serwera na mój serwer domowy. Nie mam bezpośredniego dostępu do serwera i nie są zainstalowane żadne narzędzia, takie jak phpMyAdmin. Mam jednak możliwość umieszczania skryptów PHP na serwerze.

Jak uzyskać dane?

zadaję to pytanie wyłącznie po to, aby nagrać mój sposób na zrobienie tego

Author: OMG Ponies, 2008-09-17

8 answers

Możesz użyć SQL do tego:

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

Następnie po prostu wskaż przeglądarkę lub klienta FTP na katalog/plik (backups/mytable.sql). Jest to również dobry sposób na tworzenie przyrostowych kopii zapasowych, biorąc pod uwagę na przykład sygnaturę czasową nazwy pliku.

Aby przywrócić go do bazy danych z tego pliku, możesz użyć:

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

Inną opcją jest użycie PHP do wywołania polecenia systemowego na serwerze i uruchomienia "mysqldump":

$file = 'backups/mytable.sql';
system("mysqldump --opt -h ##databaseserver## -u ##username## -p ##password## ##database | gzip > ".$file);
 38
Author: lewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 19:23:30

Zrobiłem to, eksportując do CSV, a następnie importując za pomocą dowolnego dostępnego narzędzia. Bardzo podoba mi się użycie strumienia wyjściowego php://.

$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;
}
 17
Author: Jrgns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 10:48:24

Powinieneś również rozważyć phpMinAdmin który jest tylko jednym plikiem, więc łatwo go załadować i skonfigurować.

 11
Author: Shinhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 21:31:44

Rozwiązanie robocze (najnowsza wersja na: eksport.php + Import.php )

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

Kod:

//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;
}
 8
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 07:42:57

Jeśli masz dostęp do FTP/SFTP, możesz po prostu przesłać phpMyAdmin samodzielnie.

Używam tego małego pakietu do tworzenia automatycznych kopii zapasowych mysql z serwera, do którego mam dostęp tylko FTP to:
http://www.taw24.de/download/pafiledb.php?PHPSESSID=b48001ea004aacd86f5643a72feb2829&action=viewfile&fid=43&id=1
Strona jest w języku niemieckim, ale plik do pobrania zawiera również angielską dokumentację.

Szybkie google też to wyświetla, ale nie używałem go myself:
http://snipplr.com/view/173/mysql-dump/

 3
Author: Lasar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 11:02:57

Możesz rozważyć patrząc na: http://www.webyog.com Jest to świetne narzędzie administracyjne GUI i mają naprawdę schludną funkcję tunelowania HTTP (nie jestem pewien, czy jest to tylko w przedsiębiorstwie, które kosztuje kilka dolców).

Zasadniczo wgrywasz skrypt, który dostarczają do Twojej przestrzeni Web (skrypt php) i kierujesz do niego menedżera sqlyog i możesz uzyskać dostęp do bazy danych. Używa tego skryptu do tunelowania / proxy żądań / zapytań między Klientem domowym a serwerem.

I know at co najmniej 1 osoba, która korzysta z tej metody z świetnymi wynikami.

 3
Author: DreamWerx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 16:57:40

Oto skrypt PHP, który stworzyłem kopię zapasową wszystkich tabel w Twojej bazie danych. Opiera się na tym http://davidwalsh.name/backup-mysql-database-php z pewnymi ulepszeniami. Przede wszystkim poprawnie skonfiguruje foreign key restrictions.

W mojej konfiguracji skrypt będzie działał w określonym dniu tygodnia, powiedzmy w poniedziałek. Jeśli plik nie został uruchomiony w poniedziałek, nadal będzie działał we wtorek (na przykład), tworząc plik .sql z datą poprzedniego poniedziałku, kiedy miał zostać uruchomiony. Będzie Wymaż .sql Plik sprzed 4 tygodni, aby zawsze przechowywał ostatnie 4 kopie zapasowe. Oto kod:

<?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);
    }
}

?>
 2
Author: Vali Munteanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 13:09:40

Używam mysqldump poprzez wiersz poleceń:

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

Następnie wystarczy pobrać plik wynikowy i gotowe.

 -1
Author: SeanDowney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 16:22:38