PHP:如何根据给定的时间段备份mysql数据库(egg:最近6个月)

This code is used to backup mysql database. I want to modify the code given below as it performs taking backup according to the given time period .expecting your help.

Class DBBackup {
    /**
     *
     * The host you will connect
     * @var String
     */
    private $host;



/**
     *
     * The driver you will use to connect
     * @var String
     */
    private $driver;
    /**
     *
     * The user you will use to connect to a database
     * @var String
     */
    private $user;
    /**
     *
     * The password you will use to connect to a database
     * @var String
     */
    private $password;
    /**
     *
     * The database you will use to connect
     * @var String
     */
    private $dbName;
    /**
     *
     * String to connect to the database using PDO
     * @var String
     */
    private $dsn;

    /**
     *
     * Array with the tables of the database
     * @var Array
     */
    private $tables = array();

    /**
     *
     * Hold the connection
     * @var ObjectConnection
     */
    private $handler;
    /**
     *
     * Array to hold the errors
     * @var Array
     */
    private $error = array();

    /**
     *
     * The result string. String with all queries
     * @var String
     */
    private $final;

    /**
     *
     * The main function
     * @method DBBackup
     * @uses Constructor
     * @param Array $args{host, driver, user, password, database}
     * @example $db = new DBBackup(array('host'=>'my_host', 'driver'=>'bd_type(mysql)', 'user'=>'db_user', 'password'=>'db_password', 'database'=>'db_name'));
     */
    public function DBBackup($args){
        if(!$args['host']) $this->error[] = 'Parameter host missing';
        if(!$args['user']) $this->error[] = 'Parameter user missing';
        if(!isset($args['password'])) $this->error[] = 'Parameter password missing';
        if(!$args['database']) $this->error[] = 'Parameter database missing';
        if(!$args['driver']) $this->error[] = 'Parameter driver missing';

        if(count($this->error)>0){
            return;
        }

        $this->host = $args['host'];
        $this->driver = $args['driver'];
        $this->user = $args['user'];
        $this->password = $args['password'];
        $this->dbName = $args['database'];

        $this->final = 'CREATE DATABASE ' . $this->dbName.";

";

        if($this->host=='localhost'){
            // We have a little issue in unix systems when you set the host as localhost
            $this->host = '127.0.0.1';
        }
        $this->dsn = $this->driver.':host='.$this->host.';dbname='.$this->dbName;

        $this->connect();
        $this->getTables();
        $this->generate();
    }

    /**
     *
     * Call this function to get the database backup
     * @example DBBackup::backup();
     */
    public function backup(){
        //return $this->final;
        if(count($this->error)>0){
            return array('error'=>true, 'msg'=>$this->error);
        }
        return array('error'=>false, 'msg'=>$this->final);
    }

    /**
     *
     * Generate backup string
     * @uses Private use
     */
    private function generate(){
        foreach ($this->tables as $tbl) {
            $this->final .= '--CREATING TABLE '.$tbl['name']."
";
            $this->final .= $tbl['create'] . ";

";
            $this->final .= '--INSERTING DATA INTO '.$tbl['name']."
";
            $this->final .= $tbl['data']."


";
        }
        $this->final .= '-- THE END'."

";
    }

    /**
     *
     * Connect to a database
     * @uses Private use
     */
    private function connect(){
        try {
            $this->handler = new PDO($this->dsn, $this->user, $this->password);
        } catch (PDOException $e) {
            $this->handler = null;
            $this->error[] = $e->getMessage();
            return false;
        }
    }

    /**
     *
     * Get the list of tables
     * @uses Private use
     */
    private function getTables(){
        try {
            $stmt = $this->handler->query('SHOW TABLES');
            $tbs = $stmt->fetchAll();
            $i=0;
            foreach($tbs as $table){
                $this->tables[$i]['name'] = $table[0];
                $this->tables[$i]['create'] = $this->getColumns($table[0]);
                $this->tables[$i]['data'] = $this->getData($table[0]);
                $i++;
            }
            unset($stmt);
            unset($tbs);
            unset($i);

            return true;
        } catch (PDOException $e) {
            $this->handler = null;
            $this->error[] = $e->getMessage();
            return false;
        }
    }

    /**
     *
     * Get the list of Columns
     * @uses Private use
     */
    private function getColumns($tableName){
        try {
            $stmt = $this->handler->query('SHOW CREATE TABLE '.$tableName);
            $q = $stmt->fetchAll();
            $q[0][1] = preg_replace("/AUTO_INCREMENT=[\w]*./", '', $q[0][1]);
            return $q[0][1];
        } catch (PDOException $e){
            $this->handler = null;
            $this->error[] = $e->getMessage();
            return false;
        }
    }

    /**
     *
     * Get the insert data of tables
     * @uses Private use
     */
    private function getData($tableName){
        try {
            $stmt = $this->handler->query('SELECT * FROM '.$tableName);
            $q = $stmt->fetchAll(PDO::FETCH_NUM);
            $data = '';
            foreach ($q as $pieces){
                foreach($pieces as &$value){
                    $value = htmlentities(addslashes($value));
                }
                $data .= 'INSERT INTO '. $tableName .' VALUES (\'' . implode('\',\'', $pieces) . '\');'."
";
            }
            return $data;
        } catch (PDOException $e){
            $this->handler = null;
            $this->error[] = $e->getMessage();
            return false;
        }
    }
}
?>

Use crontab (chrono table) to perfoms it :

  • just must create a simple php file what use your class.
  • define the time period on the server side (using crontab -e command) and call the file

Note: you must got a ssh access to the server.

More information here.