backup & restore database

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    backup & restore database

    This package can be used to backup and restore MySQL databases.

    It can generate a backup file that contain SQL statements to create all the database tables and insert its table record data.

    The class can also read a previously generated backup file and execute the SQL in the file to restore the original database tables and record data.

    Code:
    <?php
    
    /**
     * @author yas500('mohamedigm@gmail.com','mohamedigm@yahoo.com')
     * @copyright 2009
     * @Date 24 April
     * @Phpversion 5.2.8
     */
     
     						/** // // // // // // // // // // // // // // ||
     						// this class is used for backup and          ||
     						// restore mysql server databases or entire   ||
     						// server , can compress backup ,send         ||
     						// to ftp server ,restore from compress again ||
     						*/
     
     
    
    set_time_limit('0');
    error_reporting(E_ALL);
    
    
    abstract class BackupRestore
    {
    	protected $link;
    	protected $db=array();
    	protected $table=array();
    	protected $text="";
    	private $debug='0';
    	private $msg=array();
    	
    		/**
    	function construct for logging to database server
    	*/
    	
    	final public function __construct($host='localhost',$user='root',$pass='')
    	{
    		set_error_handler(array($this,'handleError'));
    		
    		try{
    		$this->connect($host,$user,$pass);	
    		}
    		catch (exception $e){
    			trigger_error($e->getMessage(),E_USER_ERROR);
    		}
    	}
    	
    	final private function __destruct()
    	{
    		if ($this->msg){
    		foreach ($era as $rr){
    			echo "<b>Note</b>".$rr."<br>";
    			}                          
    		}
    		else
    		{
    			echo "The mission successfully complete.";
    		}
    		            //SHOW ERROR NOTES TO USER AFTER END
    	}
    	
    	final public function handleError($errno,$errmsg,$errfile,$errline)
    	{
            
    		
            if ($this->debug == '0'){
    			switch ($errno){
    				case E_USER_ERROR:
    				case E_WARNING:
    				echo $errmsg;
    				exit();
    				break;
    				
    				case E_USER_WARNING:
    				case E_USER_NOTICE:
    				$this->msg[]=$errmsg;
    				return true;
    				break;
    				
    				case E_NOTICE:
    				case E_STRICT:
    				return true;
    				break;
    				
    				default:
    				echo "UNKNOWN ERROR OCCURED";
    				exit();
    			}
    		}
    		
    		if ($this->debug == '1'){
    		$errmsg=(strpos($errmsg,'Mysql'))? mysql_error():$errmsg;
    		echo "<b>".$errno."</b>: ".$errmsg." <b>LINE: ".$errline."</b>"."<br><b><i>In file</i></b> ".$errfile."<hr>";
    		exit();
    		}
    	}
    	
    	
    	final private function connect($host,$user,$pass)
    	{
    	
    	if (! $this->link= mysql_connect($host,$user,$pass))
    	throw new exception ("Mysql:couldn't connect to database server or invalid inforamtion");
    	}
    	
    	
    	// if you have multiple dbs enter them in that sequence
    	// $db1,$db2,..
    	// or leave it and it will backup the entire server databases
    	
    	final public function setDbs($db='*')
    	{
    		$db=trim($db);
    		if (empty($db) || $db == '*'){
    			$list=mysql_list_dbs($this->link);
    			$rows=mysql_num_rows($list);
    			if($rows == 0){
    				trigger_error("Mysql:THERE IS NO DATABASES ON THE SERVER!!",E_USER_ERROR);
    			}
    			for($i=0;$i<$rows;$i++){
    				$this->db[]=mysql_tablename($list,$i);
    			}
    		}
    		else{
    			$db=explode(",",$db);
    			$this->db=$db;
    		}
    	}
    	
    	/**
    	// this method will be for selecting tables or ignore it and
    	// it will backup all tables
    	*/
    	
    	final public function selectTable($table='*')
    	{
    		$table=trim($table);
    		if($table == '')
    		$table='*';
    		if (! $table=="*" && count($this->db) > '1'){
    			trigger_error("you can't specify tables if you want more than one db",E_USER_ERROR);
    		}
    		
    		if ($table == "*"){
    			foreach ($this->db as $name){
    				$list=mysql_list_tables($name);
    				$rows=mysql_num_rows($list);
    				for($i=0;$i<$rows;$i++){
    					$this->table[$name][]=mysql_tablename($list,$i);
    				}
    			}
    		}
    		else{
    			$table=explode(",",$table);
    			foreach($table as $tb){
    				$this->table[$this->db['0']][]=$tb;
    			}
    		}
    	
    	}
    	
    	/**
    	// method for selecting the query required
     	// for backup
     	// this is ahabit for me to store all queries required in amethod and call it
    	*/
    	
    	final protected function selectQuery($type)
    	{
    		$query=array(1=>"SHOW CREATE DATABASE ","SHOW CREATE TABLE ","INSERT INTO ","DROP DATABASE IF EXISTS ","DROP TABLE IF EXISTS ","SELECT * FROM ");
    		return $query[$type];
    	}
    	
    	/**
    	method for validate file before restore database
    	*/
    	
    	final protected function getFile($file)
    	{
    		$this->text="";
    		switch ($file){
    			case (!file_exists($file)):
    			trigger_error("File doesn't exist!!",E_USER_ERROR);
    			return false;
    			break;
    			case (!is_file($file)):
    			trigger_error("This not valid file",E_USER_ERROR);
    			return false;
    			break;
    			case (!is_readable($file)):
    			trigger_error("Can't get access to the file!!",E_USER_ERROR);
    			return false;
    			break;
    			case (! ereg("\.sql$",$file) && ! ereg("\.gz$",$file) && ! ereg("\.txt$",$file)):
    			trigger_error("This is not avalid file name.",E_USER_ERROR);
    			break;
    			return false;
    			default:
    			if(ereg("\.gz$",$file)){
    				if(!$gz=gzopen($file,'rb'))
    				trigger_error("couldn't open compressed file",E_USER_ERROR);
    				gzrewind($gz);
    				while(!gzeof($gz)){
    					$this->text.=gzgets($gz);
    				}
    				gzclose($gz);
    			}
    			else
    			{
    				if(!$fp=fopen($file,'rb'))
    				trigger_error("Couldn't read from the file",E_USER_ERROR);
    				flock($fp,'1');;
    				while(!feof($fp)){
    					$this->text.=fgets($fp);
    				}
    				flock($fp,'3');
    				fclose($fp);
    				
    			}
    			if($er=error_get_last()){
    				trigger_error($er['type'].":".$er['message'],E_USER_WARNING);
    			}
    			return true;
    		}
    		
    	}
    	
    	/**
    		this method is for prepare file that be backuped
    		//
    	*/
    	
    	final protected function setFile($txt,$cmp,$ftp,$fhost,$fuser,$fpass,$fport)
    	{
    		$recognize="";
    		foreach ($this->db as $rec){
    		$recognize.=$rec."_";
    		}
    		$recognize=ereg_replace("_$","",$recognize);   //for naming file backuped
    
    		// this the preferred for me format for naming files
    		$file='backup@'.$recognize."@".date('Y-M-d',time()).'.sql';
    		if(!$fp=fopen($file,'wb'))
    		{
    			trigger_error("You may have no enough rights on server",E_USER_ERROR);
    		}
    		flock($fp,'2');
    		fwrite($fp,$txt);
    		flock($fp,'3');
    		fclose($fp);
    		
    		if ($cmp == '1'){
    			$file=$file.".gz";
    			if(! $gz=gzopen($file,'wb'))
    			trigger_error("Script failed to compress backuped file.",E_USER_NOTICE);
    			gzwrite($gz,$txt);
    			gzclose($gz);
    		}
    		
    		if($ftp == '1'){
    			if(! $conn=ftp_connect($fhost,$fport))
    		trigger_error("this is not avalid ftp server or make sure you type it well",E_USER_ERROR);
    			$log=ftp_login($conn,$fuser,$fpass);
    			if(!$log)trigger_error("Username or Password is not correct",E_USER_ERROR);
    			$put=ftp_put($conn,$file,$file,FTP_BINARY);
    			if(!$put){
    				trigger_error("Couldn't upload file to remote server",E_USER_WARNING);
    			}
    			ftp_close($conn);
    			
    		}
    		else{
    			$this->downBackup($file);
    		}	
    		return true;
    	}
    	
    	
    	// download backuped file
    	
    	final private function downBackup($file)
    	{
    		header("Content-Description:File Transfer");;
    		header('Content-Transfer-Encoding: binary');
    		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       		header('Pragma: public');
       		header('Content-Disposition: attachment; filename='.basename($file));
       		header('Content-Type: application/octet-stream');
        	header('Content-Length: ' . filesize($file));
        	ob_clean();
        	flush();
        	readfile($file);
    	}
    	
    	abstract protected function backupData($cmp='0',$ftp='0',$fhost='',$fpass='',$fport='21');
    	
    	abstract protected function restoreSql($file);
    
    }
    
    
    
    
    final class Backuprestoresql extends BackupRestore
    {
    	
    	const HEADERS='***********************
    Y    A    S    5   0  0 
    ***********************';               // mohamed ghareeb mohamed saeed signature
    	const FIELDSEP=';';                 // seperate between queries
    	
    	
    	/* this method for backup
    	// you can specify more options like compression (0,1) , send through ftp to server (0,1)
    	//
    	*/
    	
    	public function backupData($cmp='0',$ftp='0',$fhost='',$fuser='anonymous',$fpass='mohamedigm@gmail.com',$fport='21')
    	{
    		
    		if($ftp == '1'){
    			if (empty($fhost)){
    			trigger_error("You must specify ftp host name as you select ftp option",E_USER_ERROR);
    		}
    			if(strpos($fhost,"ftp://")){
    				str_replace("ftp://","",$fhost);
    			}
    		}
    		
    		$this->text="";
    		$this->text.=self::HEADERS;
    	
    		/**
    		this will begin save database to file
    		*/
    		foreach($this->db as $key){
    		$result=mysql_query($this->selectQuery('1')."$key",$this->link);
    		while($row=mysql_fetch_row($result)){
    			$this->text.="\r\n".$this->selectQuery('4')."$key".self::FIELDSEP.$row['1'];
    		}
    		
    		// this will save tables related to that database
    		mysql_select_db($key);
    		foreach($this->table[$key] as $select){
    			if(! count($this->table[$key]) == '0'){
    			$result=mysql_query($this->selectQuery('2').$select,$this->link);
    			while($row=mysql_fetch_row($result)){
    			$this->text.=self::FIELDSEP.$this->selectQuery('5').$select.self::FIELDSEP.$row['1'];
    				
    				// fetch fields values in the tables
    				$result2=mysql_query($this->selectQuery('6').$select,$this->link);
    				while($row2=mysql_fetch_row($result2)){
    					$txt="";
    					foreach ($row2 as $val){
    						$val=mysql_real_escape_string($val,$this->link);
    						$txt.="'".$val."'".",";
    						if($val == mysql_real_escape_string($row2[count($row2)-1])){
    							$txt=ereg_replace(",$","",$txt);
    						}
    					// save field values as insertion query 
    					}
    				$this->text.=self::FIELDSEP.$this->selectQuery('3').$select." VALUES(".$txt.")";					
    			}
    				@ mysql_free_result($result2);	
    				}
    			}
    						
    		}
    		
    		//* finish database Dump *//
    		$this->text.="\r\n### ".$key." DATABASE DUMP COMPLETED ###";
    		}
    		mysql_close($this->link);
    		
    		if(!$this->setFile($this->text,$cmp,$ftp,$fhost,$fuser,$fpass,$fport))
    		trigger_error("Something goes wrong with file creation",E_USER_ERROR);
    		
    		
    		return true;               // all things is done correctly
    	}
    	
    	/**
    	this method for restore server database
    	//
    	*/
    	
    	public function restoreSql($file)
    	{
    		if($this->getFile($file)){
    		$this->text=str_replace(self::HEADERS,"",$this->text);   // ignore header
    	$this->text=preg_replace("/###.* DATABASE DUMP COMPLETED ###/",self::FIELDSEP,$this->text);
    	// ignore database dump complete message
    
    		foreach ($tt=explode(self::FIELDSEP,$this->text) as $query){
    			if (empty($query))
    			continue;
    			$rs=mysql_query($query,$this->link);
    			if(!$rs){
    				trigger_error("Mysql:problem with aquery",E_USER_NOTICE);
    			}
    			
    			if (strstr($query,"CREATE DATABASE")){
    				$seldb=substr($query,strpos($query,'`')+1,strlen($query));
    				$seldb=substr($seldb,'0',strpos($seldb,"`"));
    				mysql_select_db($seldb,$this->link);
    				//**
    				// could use query with "use database " and the name of database
    				//**
    			}
    
    		}
    	}
    	else
    	exit();
    	mysql_close($this->link);
    	return true;
    	}
    	
    }
    
    
    
    
    
    //*****  EXAMPLES *****//
    
    /** FOR BACKUP FILE  **/
    /**
     || $obj=new Backuprestoresql()   // you can specify information of your server or make it
     								  // default as localhost and user root with no pass
     || $obj->setDbs()              // leave it blank or * and it will backup entire server
     								  // or specify dbs "more one db1,db2,..."
     								// caution :: make sure you have rights to write on dbs you choose
     || $obj->selectTable()         // leave it blank or * and it will backup all tables
     								  // or specify tables "more one table1,table2,..."
     || $obj->backupData()     // here will be the backup you can choose compression (0,1)
     								  // ftp (0,1) if you specify ftp you must specify at least host
    */
    
    
    
    /** FOR RESTORE FROM FILE  **/
    /**
     || $obj=new Backuprestoresql()   // you can specify information of your server or make it
     								  // default as localhost and user root with no pass
     || $obj->restoreSql('file path') // specify location of your file accepted extension sql,gz,txt
    */
    
    
    
    
    
    ?>
    ________________
    Jacques
    jacques@gw-designs.co.za
    http://coding.biz.tm
    Come join and lets make it a place to learn all the noobies how to code
    __________________

    NEVER FORGET TO CLICK THE TANX BUTTON IF U LIKE WHAT IM SHARING OR HELPING WITH
Working...
X