طريقة سهلة لتصدير جدول SQL دون الوصول إلى الخادم أو phpMyADMIN

StackOverflow https://stackoverflow.com/questions/81934

سؤال

أحتاج إلى طريقة لتصدير البيانات بسهولة ثم استيرادها في جدول MySQL من خادم بعيد إلى خادم منزلي.ليس لدي إمكانية الوصول المباشر إلى الخادم، ولم يتم تثبيت أي أدوات مساعدة مثل phpMyAdmin.ومع ذلك، لدي القدرة على وضع نصوص PHP على الخادم.

كيف يمكنني الحصول على البيانات؟

أطرح هذا السؤال فقط لتسجيل طريقتي للقيام بذلك

هل كانت مفيدة؟

المحلول

يمكنك استخدام 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);

نصائح أخرى

لقد قمت بذلك عن طريق التصدير إلى ملف 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;
}

يجب عليك أيضا أن تنظر phpMinAdmin وهو ملف واحد فقط، لذلك من السهل تحميله وإعداده.

حل العمل (أحدث إصدار في:تصدير.php + استيراد.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;
}

إذا كان لديك إمكانية الوصول إلى FTP/SFTP، فيمكنك المضي قدمًا وتحميل phpMyAdmin بنفسك.

أنا أستخدم هذه الحزمة الصغيرة لإنشاء نسخ احتياطية آلية لـ mysql من خادم ليس لدي سوى وصول FTP إليه:
http://www.taw24.de/download/pafiledb.php?PHPSESSID=b48001ea004aacd86f5643a72feb2829&action=viewfile&fid=43&id=1
الموقع باللغة الألمانية ولكن التنزيل يحتوي على بعض الوثائق الإنجليزية أيضًا.

يُظهر Google السريع هذا أيضًا، لكنني لم أستخدمه بنفسي:
http://snipplr.com/view/173/mysql-dump/

قد تفكر في النظر إلى: http://www.webyog.comهذه أداة رائعة لإدارة واجهة المستخدم الرسومية، ولديها ميزة رائعة حقًا لنفق HTTP (لست متأكدًا مما إذا كان هذا في المؤسسة فقط والذي يكلف بضعة دولارات).

تقوم بشكل أساسي بتحميل البرنامج النصي الذي يقدمونه إلى مساحة الويب الخاصة بك (برنامج php النصي) وتوجيه مدير sqlyog إليه ويمكنك الوصول إلى قاعدة (قواعد) البيانات.ويستخدم هذا البرنامج النصي لتوجيه/توكيل الطلبات/الاستعلامات بين العميل المنزلي والخادم.

أعرف شخصًا واحدًا على الأقل يستخدم هذه الطريقة وحقق نتائج رائعة.

هنا أ 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);
    }
}

?>

أستخدم mysqldump عبر سطر الأوامر:

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

ثم تقوم فقط بتنزيل الملف الناتج ويتم ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top