Nasıl PHP yedek MySQL veritabanı için?

7 Cevap php

Ben internetten bu öğretici var. Ama ben bile aracılığıyla bir MySQL veritabanı yedekleme PHP nasıl olacağı konusunda temel bir anlayış yok.

Using PHP to Backup MySQL Databases

Ben onu çalışma böylece ben bir referans olarak kullanabileceğiniz bazı siteler tavsiye edebilir misiniz?

7 Cevap

Eğer PHP yedekleme komutları çalıştırmak mümkün olmakla birlikte, gerçekten PHP ile ilgisi yok. Bu MySQL hakkında herşey.

Ben senin veritabanını yedeklemek için mysqldump programını kullanarak öneririm. Belgeler burada bulunabilir: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html.

Mysqldump temel kullanımıdır

mysqldump -u user_name -p name-of-database >file_to_write_to.sql

Daha sonra gibi bir komut ile yedeği geri yükleyebilirsiniz

mysql -u user_name -p <file_to_read_from.sql

Eğer cron erişimi var mı? Ben bir cron işi olarak mysqldump çalışan bir PHP komut dosyası yapma öneririm. Bu gibi bir şey olurdu

<?php

$filename='database_backup_'.date('G_a_m_d_y').'.sql';

$result=exec('mysqldump database_name --password=your_pass --user=root --single-transaction >/var/backups/'.$filename,$output);

if($output==''){/* no output is good */}
else {/* we have something to log the output here*/}

Mysqldump mevcut değilse, eşya SELECT INTO OUTFILE ve LOAD DATA INFILE komutlarını kullanarak, başka bir yöntemi tarif etmektedir. PHP tek bağlantısı veritabanına bağlanmak ve SQL komutlarını çalıştırmak için PHP kullanıyorsanız olmasıdır. Ayrıca komut satırı MySQL programı, MySQL monitörden bu yapabilirdi.

Bu, tek bir komut ile bir SQL dosyası yazma ve geri zamanı geldiğinde yükleme / onu infaz konum, oldukça basit.

Sen çıkışdosyası içine select dokümanlar bulabilirsiniz here (sadece çıkışdosyası için sayfayı arama). LOAD DATA INFILE aslında bu tersidir. here dokümanlar için bkz.

Here mysqldump ya da mysql komutları kullanarak değil MySQL veritabanı yedeklemeleri gerçekleştirmek için saf bir PHP sınıfı: Backing up MySQL databases with pure PHP

Eğer php script veritabanı yedekleme istiyorsanız, örneğin bir sınıf MySQL arama sağlar kullanabilirsiniz. Bu sınıf PDO (veritabanına bağlantısı işlemek hangi php sınıfında inşa) kullanacaktır. Bu sınıf, bu gibi görünebilir:

<?php /*defined in your exampleconfig.php*/
define('DBUSER','root');
define('DBPASS','');
define('SERVERHOST','localhost');
?>

<?php /*defined in examplemyclass.php*/
    class MySql{
        private $dbc;
        private $user;
        private $pass;
        private $dbname;
        private $host;

        function __construct($host="localhost", $dbname="your_databse_name_here", $user="your_username", $pass="your_password"){
            $this->user = $user;
            $this->pass = $pass;
            $this->dbname = $dbname;
            $this->host = $host;
            $opt = array(
               PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
               PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
            );
            try{
                $this->dbc = new PDO('mysql:host='.$this->host.';dbname='.$this->dbname.';charset=utf8', $user, $pass, $opt);
            }
            catch(PDOException $e){
                 echo $e->getMessage();
                 echo "There was a problem with connection to db check credenctials";
            }
        } /*end function*/


        public function backup_tables($tables = '*'){  /* backup the db OR just a table */
            $host=$this->host;
            $user=$this->user;
            $pass=$this->pass;
            $dbname=$this->dbname;
            $data = "";
            //get all of the tables
            if($tables == '*')
            {
                $tables = array();
                $result = $this->dbc->prepare('SHOW TABLES'); 
                $result->execute();                         
                while($row = $result->fetch(PDO::FETCH_NUM)) 
                { 
                    $tables[] = $row[0]; 
                }
            }
            else
            {
                $tables = is_array($tables) ? $tables : explode(',',$tables);
            }
            //cycle through
            foreach($tables as $table)
            {
                $resultcount = $this->dbc->prepare('SELECT count(*) FROM '.$table);
                $resultcount->execute();
                $num_fields = $resultcount->fetch(PDO::FETCH_NUM);
                $num_fields = $num_fields[0];

                $result = $this->dbc->prepare('SELECT * FROM '.$table);
                $result->execute();
                $data.= 'DROP TABLE '.$table.';';

                $result2 = $this->dbc->prepare('SHOW CREATE TABLE '.$table);    
                $result2->execute();                            
                $row2 = $result2->fetch(PDO::FETCH_NUM);
                $data.= "\n\n".$row2[1].";\n\n";

                for ($i = 0; $i < $num_fields; $i++) 
                {
                    while($row = $result->fetch(PDO::FETCH_NUM))
                    { 
                        $data.= 'INSERT INTO '.$table.' VALUES(';
                        for($j=0; $j<$num_fields; $j++) 
                        {
                            $row[$j] = addslashes($row[$j]); 
                            $row[$j] = str_replace("\n","\\n",$row[$j]);
                            if (isset($row[$j])) { $data.= '"'.$row[$j].'"' ; } else { $data.= '""'; }
                            if ($j<($num_fields-1)) { $data.= ','; }
                        }
                        $data.= ");\n";
                    }
                }
                $data.="\n\n\n";
            }
            //save filename
            $filename = 'db-backup-'.time().'-'.(implode(",",$tables)).'.sql';
            $this->writeUTF8filename($filename,$data);
        /*USE EXAMPLE
           $connection = new MySql(SERVERHOST,"your_db_name",DBUSER, DBPASS);
           $connection->backup_tables(); //OR backup_tables("posts");
           $connection->closeConnection();
        */
        } /*end function*/


        private function writeUTF8filename($filenamename,$content){  /* save as utf8 encoding */
            $f=fopen($filenamename,"w+"); 
            # Now UTF-8 - Add byte order mark 
            fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
            fwrite($f,$content); 
            fclose($f); 
        /*USE EXAMPLE this is only used by public function above...
            $this->writeUTF8filename($filename,$data);
        */
        } /*end function*/


        public function recoverDB($file_to_load){
            echo "write some code to load and proccedd .sql file in here ...";
        /*USE EXAMPLE this is only used by public function above...
            recoverDB("some_buck_up_file.sql");
        */
        } /*end function*/


        public function closeConnection(){
            $this->dbc = null;
        //EXAMPLE OF USE 
        /*$connection->closeConnection();*/
        }/*end function*/


    } /*END OF CLASS*/
    ?>

Şimdi olabilir sizin backup.php basit kullanımı bu:

include ('config.php');
include ('myclass.php');
    $connection = new MySql(SERVERHOST,"your_databse_name_here",DBUSER, DBPASS);
    $connection->backup_tables(); /*Save all tables and it values in selected database*/
    $connection->backup_tables("post_table"); /*Saves only table name posts_table from selected database*/
    $connection->closeConnection();

Bu sayfayı ziyaret dosyanızı backuping neden olacağı anlamına gelir ... tabii bu size her zaman güncel olmak için veritabanına her yazı bu yöntemi çağırabilirsiniz :) bu şekilde olmak zorunda değilsin, ancak ben öneriyoruz Yukarıda olduğu gibi yerine zamanla yeni dosyalar oluşturarak tüm zaman (...) az bir dosyaya yazmak.

Yardımcı olur ve iyi şanslar umut! :>

I mysqldump kullanarak tavsiye ve bulduğunuz makalede önerilen gibi php gelen system komutunu kullanabilirsiniz.

Burada, php Yedekleme MySQL veritabanı (İHRACAT) ile benim komple çözüm:

<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbname = 'a_wp_test';

function backup_tables($host,$user,$pass,$name,$tables = '*')
{

    $link = mysql_connect($host,$user,$pass);
    mysql_select_db($name,$link);
    mysql_query("SET NAMES 'utf8'");

    //get all of the tables
    if($tables == '*')
    {
        $tables = array();
        $result = mysql_query('SHOW TABLES');
        while($row = mysql_fetch_row($result))
        {
            $tables[] = $row[0];
        }
    }
    else
    {
        $tables = is_array($tables) ? $tables : explode(',',$tables);
    }
    $return='';
    //cycle through
    foreach($tables as $table)
    {
        $result = mysql_query('SELECT * FROM '.$table);
        $num_fields = mysql_num_fields($result);

        $return.= 'DROP TABLE '.$table.';';
        $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
        $return.= "\n\n".$row2[1].";\n\n";

        for ($i = 0; $i < $num_fields; $i++) 
        {
            while($row = mysql_fetch_row($result))
            {
                $return.= 'INSERT INTO '.$table.' VALUES(';
                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.= ");\n";
            }
        }
        $return.="\n\n\n";
    }

    //save file
    $handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
    fwrite($handle,$return);
    fclose($handle);
}

backup_tables($dbhost,$dbuser,$dbpass,$dbname);
?>

Burada sayfa güvenlik işlevselliği ile verimli bir şekilde bu tek dosya veritabanı yedekleme indir / oluşturmanıza izin verir php dosyasıdır. sadece sizin ortak klasör veya proje klasöründe bu dosya yeri indirmek ve tarayıcı aracılığıyla aramak zorunda.

İndir URL-https://github.com/vkt005/php-mysql-db-backup

Eğer PHPMyAdmin varsa, sadece veritabanı tıklayın ve üstünde "ihracat" sekmesine tıklayın. Sonraki indirme biçimini seçin, bunu olduğu gibi veritabanı indirmek veya sıkıştırılmış formatta ve "go" tıklayabilirsiniz.