1. DbBak을 인스턴스화하려면 데이터 서버의 위치($connectid)와 백업할 디렉터리($backupDir)라는 두 가지 사항을 알려주어야 합니다.
require_once('DbBak.php')
require_once('TableBak.php');
$connectid = mysql_connect('localhost','root','123456')
$backupDir = 'data'
$DbBak($ connectid,$backupDir) ;
2. 그런 다음 백업할 데이터베이스를 지정할 수 있을 뿐만 아니라 백업할 테이블만 세부적으로 설정할 수도 있습니다.
2.1 mybbs 라이브러리의 모든 테이블을 백업하려면 다음을 수행하세요.
$DbBak->backupDb('mybbs')
2.2 보드, 페이스, 테이블만 백업하려는 경우 mybbs 라이브러리의 friendlist 테이블을 1차원 배열로 지정할 수 있습니다:
$DbBak- >backupDb('mybbs',array('board','face','friendsite')); >2.3 보드 테이블 등 하나의 테이블만 백업하려는 경우:
$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 $_tableList;
function DbBak($_mysql_link_id,$dataDir) _string($dataDir) ) || strlen($dataDir)==0) && die('error:$datadir은 문자열이 아닙니다.')
!is_dir( $dataDir) && mkdir($dataDir);
$this-> ; _datadir = $ datadir;
$ this- & gt; $ tablename = null)
{ ((! IS_STRING ($ dbName)) || strlen($dbName)==0 ) && die('$dbName은 문자열 값이어야 합니다.'); //단계2: 데이터베이스 백업 디렉터리 생성
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName;
!is_dir($dbDir) && mkdir($dbDir)
//3단계: 모든 테이블 이름 가져오기 데이터베이스를 삭제하고 테이블 백업을 시작합니다
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir)
if(is_null($tableName)){//backup all table in 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은 문자열 값이어야 합니다.' );
//단계1: 데이터베이스가 있는지 확인하고 연결합니다. >//단계2: 데이터베이스 백업 디렉터리가 있는지 확인합니다.
$dbDir = $this->_dataDir.DIRECTORY_SEPARATOR.$dbName; !is_dir($dbDir) && die("$dbDir이 존재하지 않음");
//step3:복원 시작
$this->_TableBak = new TableBak($this->_mysql_link_id,$dbDir);
if(is_null($tableName)){//db의 모든 테이블 백업
$this->_restoreAllTable($dbName)
return;
}
if(is_string( $tableName)){
(strlen($tableName)==0) && die('....')
$this->_restoreOneTable($dbName,$tableName)
return ;
}
if (is_array($tableName)){
foreach ($tableName을 $table로){
( (!is_string($table)) || strlen($table)== 0) && die('....');
}
$this->_restoreSomeTalbe($dbName,$tableName) ); >_mysql_link_id); ush( $tableList,mysql_tablename($result, $i));
}
mysql_free_result($result)
return $tableList; $dbName)
{
foreach ($this->_getTableList($dbName) as $tableName){
$this->_TableBak->backupTable($tableName); $tableName)
{
!in_array($tableName,$this->_getTableList($dbName)) && die("지정된 테이블 이름$tableName 데이터베이스에 존재하지 않습니다." );
$this->_TableBak->backupTable($tableName)
}
function _backupSomeTalbe($dbName,$TableNameList) ($TableNameList as $tableName){
!in_array( $tableName,$this->_getTableList($dbName)) && die("지정된 테이블 이름$tableName이 데이터베이스에 존재하지 않습니다.")
}
foreach( $TableNameList as $tableName){
$this->_TableBak->backupTable($tableName);
function _restoreAllTable($dbName)
{
//1단계: 모든 데이터 테이블의 백업 파일이 존재하는지, 쓰기 가능한지 확인:
foreach ($this->_getTableList($dbName ) $tableName으로){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
$dbName.DIRECTORY_SEPARATOR
$tableName.DIRECTORY_SEPARATOR is_writeable ($tableBakFile) && die("$tableBakFile이 존재하지 않거나 쓸 수 없음" ); {
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
$tableName.'.sql'; ;_TableBak->restoreTable($tableName,$ tableBakFile);
}
}
function _restoreOneTable($dbName,$tableName)
{
//1단계: 데이터 테이블이 존재하는지 확인:
!in_array($tableName, $this->_getTableList($dbName)) && die("지정된 테이블 이름$tableName이 데이터베이스에 존재하지 않습니다.");
//2단계: 데이터 테이블 백업 여부 확인 파일이 존재하며 쓰기 가능 여부:
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR
. $tableName.'.sql'
!is_writeable($tableBakFile ) && die("$tableBakFile이 없거나 기록할 수 없음");
//3단계:복원 시작
$this->_TableBak-> ;restoreTable($tableName,$tableBakFile); $tableName으로){
!in_array($tableName,$this->_getTableList($dbName)) && die("지정된 테이블 이름$tableName이 데이터베이스에 없습니다.")
}
///2단계: 데이터 테이블 백업 파일이 있는지, 쓰기 가능한지 확인:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR . $tableName.DIRECTORY_SEPARATOR . 🎜>!is_writeable ($tableBakFile) && die("$tableBakFile이 없거나 쓸 수 없음")
//step3:복원 시작:
foreach ($TableNameList as $tableName){
$tableBakFile = $this->_dataDir.DIRECTORY_SEPARATOR
. $dbName.DIRECTORY_SEPARATOR
. $tableName.DIRECTORY_SEPARATOR
. $테이블이름.'.sql';
$this->_TableBak->restoreTable($tableName,$tableBakFile);
}
}
}
?>
复代码 代码如下:
& lt;? PHP
// DBBAK만 이 클래스를 호출할 수 있습니다.
function TableBak($mysql_link_id,$dbDir)
{
$this->_mysql_link_id = $ mysql_link_id
$this->_dbDir = $dbDir;
}
function backupTable($tableName)
{
//1단계: 테이블의 백업 디렉터리 이름을 만듭니다.
$tableDir = $this->_dbDir.DIRECTORY_SEPARATOR.$tableName;
!is_dir($tableDir) && mkdir($tableDir); > @file($tableBakFile) 또는 die("$tableBakFile 파일을 열 수 있음");
$num = count($fileArray);
mysql_unbuffered_query("DELETE FROM $tableName"); fileArray[0];
for ($i=1;$i<$num-1;$i){
mysql_unbuffered_query( $sql.$fileArray[$i]) 또는 (die (mysql_error()) ); 배열();
$sql="SELECT * FROM $tableName LIMIT 1";
$result = mysql_query($sql,$this->_mysql_link_id)
$num_field=mysql_num_fields($ 결과) ;
$fieldInfo[$field_name] = $field_type;
mysql_free_result($result); fieldInfo,$row) {
$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; '";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);
case "real": $row[$field_name] = intval($field_value)
case "timestamp":$row[$field_name] = intval($field_value);
기본값: $row[$field_name] = intval($field_value)
}
}
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 rn";
$datafile = $tableDir.DIRECTORY_SEPARATOR.$tableName.'.sql'; $handle = fopen($datafile ,'w')) && die("$datafile 파일을 열 수 없습니다.")
(!fwrite($handle, $sqltext)) && die ("$datafile 파일에 데이터를 쓸 수 없습니다.");
fclose($handle);
//2단계: 데이터를 얻고 파일에 씁니다:
//Get 테이블 리소스:
set_time_limit (0);
$sql = "$tableName에서 * 선택";
$result = mysql_query($sql,$this->_mysql_link_id)//Open 데이터 백업 파일: $tableName.xml $datafile");
/ /테이블 레코드를 하나씩 가져와서 파일에 씁니다: ($fieldInfo,$row);
$record= '(' . implode(',',$row) . ");rn";
(!fwrite($handle, $record)) && die ("$datafile< 파일에 데이터를 쓸 수 없습니다. ;/b>");
}
mysql_free_result($result);
//파일을 닫습니다: ;
return true; >require_once('DbBak.php');
require_once ('TableBak.php');
$connectid = mysql_connect('localhost','root','123456')
$backupDir = 'data'
$DbBak($connectid ,$backupDir);
$DbBak->backupDb('mybbs');
코드 복사
코드는 다음과 같습니다.
require_once('DbBak .php'); mysql_connect('localhost','123456');