Home Backend Development PHP Tutorial php实现mysql数据库备份类_php实例

php实现mysql数据库备份类_php实例

Jun 07, 2016 pm 05:26 PM
mysql php

1、实例化DbBak需要告诉它两件事:数据服务器在哪里($connectid)、备份到哪个目录($backupDir): 

require_once('DbBak.php');    
require_once('TableBak.php');    
$connectid = mysql_connect('localhost','root','123456');    
$backupDir = 'data';    
$DbBak = new DbBak($connectid,$backupDir);    

2、然后就可以开始备份数据库了,你不仅能够指定备份那个数据库,而且能详细设置只备份那几个表:
   2.1如果你想备份mybbs库中的所有表,只要这样: 

$DbBak->backupDb('mybbs');    

2.2如果你只想备份mybbs库中的board、face、friendlist表,可以用一个一维数组指定:

$DbBak->backupDb('mybbs',array('board','face','friendsite'));    

2.3如果只想备份一个表,比如board表:
$DbBak->backupDb('mybbs','board');    
3,数据恢复:
对于2.1、2.1、2.3三种情况,只要相应的修改下语句,把backupDb换成restoreDb就能实现数据恢复了:

$DbBak->restoreDb('mybbs');   
SQL代码
$DbBak->restoreDb('mybbs',array('board','face','friendsite'));   
PHP代码
$DbBak->restoreDb('mybbs','board');   
PHP代码
require_once('TableBak.php');    
class DbBak {    
var $_mysql_link_id;    
var $_dataDir;    
var $_tableList;    
var $_TableBak;    

function DbBak($_mysql_link_id,$dataDir)    
{    
( (!is_string($dataDir)) || strlen($dataDir)==0) && die('error:$datadir is not a string');    
!is_dir($dataDir) && mkdir($dataDir);    
$this->_dataDir = $dataDir;    
$this->_mysql_link_id = $_mysql_link_id;    
}    

function backupDb($dbName,$tableName=null)    
{    
( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName must be a string value');    
//step1:选择数据库:    
mysql_select_db($dbName);    
//step2:创建数据库备份目录    
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;    
!is_dir($dbDir) && mkdir($dbDir);    
//step3:得到数据库所有表名 并开始备份表    
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir);    
if(is_null($tableName)){//backup all table in the db    
$this->_backupAllTable($dbName);    
return;    
}    
if(is_string($tableName)){    
(strlen($tableName)==0) && die('....');    
$this->_backupOneTable($dbName,$tableName);    
return;    
}    
if (is_array($tableName)){    
foreach ($tableName as $table){    
( (!is_string($table)) || strlen($table)==0 ) && die('....');    
}    
$this->_backupSomeTalbe($dbName,$tableName);    
return;    
}    
}    

function restoreDb($dbName,$tableName=null){    
( (!is_string($dbName)) || strlen($dbName)==0 ) && die('$dbName must be a string value');    
//step1:检查是否存在数据库 并连接:    
@mysql_select_db($dbName) || die("the database $dbName dose not exists");    
//step2:检查是否存在数据库备份目录    
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;    
!is_dir($dbDir) && die("$dbDir not exists");    
//step3:start restore    
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir);    
if(is_null($tableName)){//backup all table in the db    
$this->_restoreAllTable($dbName);    
return;    
}    
if(is_string($tableName)){    
(strlen($tableName)==0) && die('....');    
$this->_restoreOneTable($dbName,$tableName);    
return;    
}    
if (is_array($tableName)){    
foreach ($tableName as $table){    
( (!is_string($table)) || strlen($table)==0 ) && die('....');    
}    
$this->_restoreSomeTalbe($dbName,$tableName);    
return;    
}    
}    

function _getTableList($dbName)    
{    
$tableList = array();    
$result=mysql_list_tables($dbName,$this->_mysql_link_id);    
for ($i = 0; $i         array_push($tableList,mysql_tablename($result, $i));    
}    
mysql_free_result($result);    
return $tableList;    
}    

function _backupAllTable($dbName)    
{    
foreach ($this->_getTableList($dbName) as $tableName){    
$this->_TableBak->backupTable($tableName);    
}    
}    

function _backupOneTable($dbName,$tableName)    
{    
!in_array($tableName,$this->_getTableList($dbName)) && die("指定的表名$tableName在数据库中不存在");    
$this->_TableBak->backupTable($tableName);    
}    

function _backupSomeTalbe($dbName,$TableNameList)    
{    
foreach ($TableNameList as $tableName){    
!in_array($tableName,$this->_getTableList($dbName)) && die("指定的表名$tableName在数据库中不存在");    
}    
foreach ($TableNameList as $tableName){    
$this->_TableBak->backupTable($tableName);    
}    
}    

function _restoreAllTable($dbName)    
{    
//step1:检查是否存在所有数据表的备份文件 以及是否可写:    
foreach ($this->_getTableList($dbName) as $tableName){    
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR    
            . $dbName.DIRECTORY_SEPARATOR    
               . $tableName.DIRECTORY_SEPARATOR    
            . $tableName.'.sql';    
!is_writeable ($tableBakFile) && die("$tableBakFile not exists or unwirteable");    
}    
//step2:start restore    
foreach ($this->_getTableList($dbName) as $tableName){    
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR    
               . $dbName.DIRECTORY_SEPARATOR    
               . $tableName.DIRECTORY_SEPARATOR    
               . $tableName.'.sql';    
$this->_TableBak->restoreTable($tableName,$tableBakFile);    
}    
}    

function _restoreOneTable($dbName,$tableName)    
{    
//step1:检查是否存在数据表:    
!in_array($tableName,$this->_getTableList($dbName)) && die("指定的表名$tableName在数据库中不存在");    
//step2:检查是否存在数据表备份文件 以及是否可写:    
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR    
         . $dbName.DIRECTORY_SEPARATOR    
      . $tableName.DIRECTORY_SEPARATOR    
         . $tableName.'.sql';    
!is_writeable ($tableBakFile) && die("$tableBakFile not exists or unwirteable");    
//step3:start restore    
$this->_TableBak->restoreTable($tableName,$tableBakFile);    
}    
function _restoreSomeTalbe($dbName,$TableNameList)    
{    
//step1:检查是否存在数据表:    
foreach ($TableNameList as $tableName){    
!in_array($tableName,$this->_getTableList($dbName)) && die("指定的表名$tableName在数据库中不存在");    
}    
//step2:检查是否存在数据表备份文件 以及是否可写:    
foreach ($TableNameList as $tableName){    
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR    
               . $dbName.DIRECTORY_SEPARATOR    
               . $tableName.DIRECTORY_SEPARATOR    
               . $tableName.'.sql';    
!is_writeable ($tableBakFile) && die("$tableBakFile not exists or unwirteable");    
}    
//step3:start restore:    
foreach ($TableNameList as $tableName){    
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR    
               . $dbName.DIRECTORY_SEPARATOR    
               . $tableName.DIRECTORY_SEPARATOR    
               . $tableName.'.sql';    
$this->_TableBak->restoreTable($tableName,$tableBakFile);    
}    
}    
}    
?>     

复制代码 代码如下:

//只有DbBak才能调用这个类     
class TableBak{     
var $_mysql_link_id;     
var $_dbDir;     
//private $_DbManager;     
function TableBak($mysql_link_id,$dbDir)     
{     
$this->_mysql_link_id = $mysql_link_id;     
$this->_dbDir = $dbDir;     
}     

function backupTable($tableName)     
{     
//step1:创建表的备份目录名:     
$tableDir = $this->_dbDir.DIRECTORY_SEPARATOR.$tableName;     
!is_dir($tableDir) && mkdir($tableDir);     
//step2:开始备份:     
$this->_backupTable($tableName,$tableDir);     
}     

function restoreTable($tableName,$tableBakFile)     
{     
set_time_limit(0);     
$fileArray = @file($tableBakFile) or die("can open file $tableBakFile");     
$num = count($fileArray);     
mysql_unbuffered_query("DELETE FROM $tableName");     
$sql = $fileArray[0];     
for ($i=1;$imysql_unbuffered_query($sql.$fileArray[$i]) or (die (mysql_error()));     
}     
return true;     
}     

function _getFieldInfo($tableName){     
$fieldInfo = array();     
$sql="SELECT * FROM $tableName LIMIT 1";     
$result = mysql_query($sql,$this->_mysql_link_id);     
$num_field=mysql_num_fields($result);     
for($i=0;$i$field_name=mysql_field_name($result,$i);     
$field_type=mysql_field_type($result,$i);     
$fieldInfo[$field_name] = $field_type;     
}     
mysql_free_result($result);     
return $fieldInfo;     
}     
function _quoteRow($fieldInfo,$row){     
foreach ($row as $field_name=>$field_value){     
$field_value=strval($field_value);     
switch($fieldInfo[$field_name]){       
case "blob":     $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;         
case "string": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;       
case "date":     $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;       
case "datetime": $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;       
case "time":     $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;       
case "unknown":   $row[$field_name] = "'".mysql_escape_string($field_value)."'";break;         
case "int":     $row[$field_name] = intval($field_value); break;     
case "real":     $row[$field_name] = intval($field_value); break;     
case "timestamp":$row[$field_name] = intval($field_value); break;     
default:     $row[$field_name] = intval($field_value); break;     
}     
}     
return $row;     
}     
function _backupTable($tableName,$tableDir)     
{     
//取得表的字段类型:     
$fieldInfo = $this->_getFieldInfo($tableName);     

//step1:构造INSERT语句前半部分 并写入文件:     
$fields = array_keys($fieldInfo);     
$fields = implode(',',$fields);     
$sqltext="INSERT INTO $tableName($fields)VALUES \r\n";     
$datafile = $tableDir.DIRECTORY_SEPARATOR.$tableName.'.sql';     
(!$handle = fopen($datafile,'w')) && die("can not open file $datafile");     
(!fwrite($handle, $sqltext))   && die("can not write data to file $datafile");     
fclose($handle);     

//step2:取得数据 并写入文件:     
//取出表资源:     
set_time_limit(0);     
$sql = "select * from $tableName";     
$result = mysql_query($sql,$this->_mysql_link_id);     
//打开数据备份文件:$tableName.xml     
$datafile = $tableDir.DIRECTORY_SEPARATOR.$tableName.'.sql';     
(!$handle = fopen($datafile,'a')) && die("can not open file $datafile");     
//逐条取得表记录并写入文件:     
while ($row = mysql_fetch_assoc($result)) {     
$row = $this->_quoteRow($fieldInfo,$row);      
$record='(' . implode(',',$row) . ");\r\n";     
(!fwrite($handle, $record))   && die("can not write data to file $datafile");     
}     
mysql_free_result($result);     
//关闭文件:     
fclose($handle);     

return true;     
}     

}     
?>   
 

备份mybbs数据库:

SQL代码
//example 1 backup:    
require_once('DbBak.php');    
require_once('TableBak.php');    
$connectid = mysql_connect('localhost','root','123456');    
$backupDir = 'data';    
$DbBak = new DbBak($connectid,$backupDir);    
$DbBak->backupDb('mybbs');    

恢复mybbs数据库: 

复制代码 代码如下:

require_once('DbBak.php');     
require_once('TableBak.php');     
$connectid = mysql_connect('localhost','root','123456');     
$backupDir = 'data';     
$DbBak = new DbBak($connectid,$backupDir);     
$DbBak->restoreDb('mybbs'); 
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1269
29
C# Tutorial
1249
24
Explain the purpose of foreign keys in MySQL. Explain the purpose of foreign keys in MySQL. Apr 25, 2025 am 12:17 AM

In MySQL, the function of foreign keys is to establish the relationship between tables and ensure the consistency and integrity of the data. Foreign keys maintain the effectiveness of data through reference integrity checks and cascading operations. Pay attention to performance optimization and avoid common errors when using them.

Compare and contrast MySQL and MariaDB. Compare and contrast MySQL and MariaDB. Apr 26, 2025 am 12:08 AM

The main difference between MySQL and MariaDB is performance, functionality and license: 1. MySQL is developed by Oracle, and MariaDB is its fork. 2. MariaDB may perform better in high load environments. 3.MariaDB provides more storage engines and functions. 4.MySQL adopts a dual license, and MariaDB is completely open source. The existing infrastructure, performance requirements, functional requirements and license costs should be taken into account when choosing.

What happens if session_start() is called multiple times? What happens if session_start() is called multiple times? Apr 25, 2025 am 12:06 AM

Multiple calls to session_start() will result in warning messages and possible data overwrites. 1) PHP will issue a warning, prompting that the session has been started. 2) It may cause unexpected overwriting of session data. 3) Use session_status() to check the session status to avoid repeated calls.

MySQL: The Database, phpMyAdmin: The Management Interface MySQL: The Database, phpMyAdmin: The Management Interface Apr 29, 2025 am 12:44 AM

MySQL and phpMyAdmin can be effectively managed through the following steps: 1. Create and delete database: Just click in phpMyAdmin to complete. 2. Manage tables: You can create tables, modify structures, and add indexes. 3. Data operation: Supports inserting, updating, deleting data and executing SQL queries. 4. Import and export data: Supports SQL, CSV, XML and other formats. 5. Optimization and monitoring: Use the OPTIMIZETABLE command to optimize tables and use query analyzers and monitoring tools to solve performance problems.

Composer: Aiding PHP Development Through AI Composer: Aiding PHP Development Through AI Apr 29, 2025 am 12:27 AM

AI can help optimize the use of Composer. Specific methods include: 1. Dependency management optimization: AI analyzes dependencies, recommends the best version combination, and reduces conflicts. 2. Automated code generation: AI generates composer.json files that conform to best practices. 3. Improve code quality: AI detects potential problems, provides optimization suggestions, and improves code quality. These methods are implemented through machine learning and natural language processing technologies to help developers improve efficiency and code quality.

What is the significance of the session_start() function? What is the significance of the session_start() function? May 03, 2025 am 12:18 AM

session_start()iscrucialinPHPformanagingusersessions.1)Itinitiatesanewsessionifnoneexists,2)resumesanexistingsession,and3)setsasessioncookieforcontinuityacrossrequests,enablingapplicationslikeuserauthenticationandpersonalizedcontent.

How to uninstall MySQL and clean residual files How to uninstall MySQL and clean residual files Apr 29, 2025 pm 04:03 PM

To safely and thoroughly uninstall MySQL and clean all residual files, follow the following steps: 1. Stop MySQL service; 2. Uninstall MySQL packages; 3. Clean configuration files and data directories; 4. Verify that the uninstallation is thorough.

Steps to add and delete fields to MySQL tables Steps to add and delete fields to MySQL tables Apr 29, 2025 pm 04:15 PM

In MySQL, add fields using ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column, delete fields using ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop. When adding fields, you need to specify a location to optimize query performance and data structure; before deleting fields, you need to confirm that the operation is irreversible; modifying table structure using online DDL, backup data, test environment, and low-load time periods is performance optimization and best practice.

See all articles