이 기사의 예에서는 PHP에서 MySQL 데이터베이스 백업 및 복원 클래스를 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
PHP를 사용하여 mysql 데이터베이스를 백업하는 매우 간단한 클래스 파일입니다. dbmange에서 연결 주소, 사용자 이름 및 데이터베이스만 구성하면 됩니다. 코드는 다음과 같습니다. :
/**
* 작성일 : 2012년 5월 21일
*
* 참고: 볼륨 파일은 _v1.sql(20120522021241_all_v1.sql)로 끝납니다
* 기능: mysql 데이터베이스 볼륨 백업 구현, 백업할 테이블 선택, 단일 sql 파일 및 볼륨 sql 가져오기 구현
* 사용방법 :
*
* ------1. 데이터베이스 백업(내보내기) --------------------- -- -----------
//호스트, 사용자 이름, 비밀번호, 데이터베이스 이름, 데이터베이스 인코딩입니다
$db = 새 DBManage( 'localhost', 'root', 'root', 'test', 'utf8' )
// 매개변수: 백업할 테이블(선택 사항), 백업 디렉터리(선택 사항, 기본값은 백업), 볼륨 크기(선택 사항, 기본값은 2000, 즉 2M)
$db->백업()
* ------2. 데이터베이스 복구(가져오기) ----------- -----------
//호스트, 사용자 이름, 비밀번호, 데이터베이스 이름, 데이터베이스 인코딩입니다
$db = 새 DBManage( 'localhost', 'root', 'root', 'test', 'utf8' )
//매개변수: SQL 파일
$db->복원('./backup/20120516211738_all_v1.sql')
*------------------------------------------------ - ------------
*/
클래스 DB관리
{
var $db; // 데이터베이스 연결
var $database; // 사용된 데이터베이스
var $sqldir; // 데이터베이스 백업 폴더
var $레코드
// 줄바꿈 문자
비공개 $ds = "n"
// SQL을 저장할 변수
공개 $sqlContent = ""
// 각 SQL 문의 끝 문자
공개 $sqlEnd = ";"
/**
* 初始화
*
* @param 문자열 $host
* @param 문자열 $username
* @param 문자열 $password
* @param 문자열 $thisatabase
* @param 문자열 $charset
*/
함수 __construct($host = 'localhost', $username = 'root', $password = '', $thisatabase = 'test', $charset = 'utf8')
{
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $thisatabase;
$this->charset = $charset;
>
$this->db = mysql_connect ( $this->host, $this->username, $this->password ) 또는 die ( "데이터베이스 연결에 실패했습니다." );
// 사용할 데이터베이스 선택
mysql_select_db ( $this->database, $this->db ) 또는 die ( "데이터베이스를 열 수 없습니다"
// 데이터베이스 인코딩 방법
mysql_query( 'SET NAMES' . $this->charset, $this->db
}
/*
*------------------데이터베이스 백업 시작---- ------------------------------------- ----
*/
/**
* 데이터베이스 백업
* 매개변수: 백업할 테이블(선택 사항), 백업 디렉터리(선택 사항, 기본값은 백업), 볼륨 크기(선택 사항, 기본값은 2000, 즉 2M)
* *
* @param $string $dir
* @param int $size
* @param $string $tablename
*/
함수 백업($tablename = '', $dir = '', $size = 2000)
{
//$dir = $dir ? $dir : '백업/'
//$크기 = $크기 ? $크기 : 2000;
$sql = '';
// 특정 테이블만 백업
If (!emptyempty ( $tablename ))
~
echo '테이블 백업 중' . '
';
// 덤프 정보 삽입
$sql = $this->_retrieve()
//테이블 구조 정보 삽입
$sql .= $this->_insert_table_structure ( $tablename );
|
$data = mysql_query ( "select * from " . $tablename );
| 파일 이름의 일부
$filename = 날짜( 'YmdHis' ) . $tablename;
// 필드 수
$num_fields = mysql_num_fields ($data);
> 사용
// 각 레코드를 반복합니다.
while ( $record = mysql_fetch_array ( $data ) )
// 단일 레코드
$sql .= $this->_insert_record ( $tablename, $num_fields, $record );
/
If (strlen ( $sql ) >= $size * 1000)
~
$파일 = $파일명 . "_v" . ".sql";
If ($this->_write_file ($sql, $file, $dir))
~
echo "table-" . $tablename . "-volume-" . $p . "-데이터 백업이 완료되고 백업 파일이 생성됩니다$dir$filename 범위>< ;br />";
~
또 다른
~
echo "백업 테이블-" . $tablename . "-실패
";
~
// 다음 하위 롤 >>
~ // $sql 변수를 비우도록 재설정하고 다시 계산합니다. 변수의 크기
$sql = ""
~
~
// SQL의 크기가 충분하지 않습니다.
If ($sql != "")
$파일명 .= "_v" . $p
If ($this->_write_file ($sql, $filename, $dir))
~
echo "table-" . $tablename . "-volume-" . $p . "-데이터 백업이 완료되고 백업 파일이 생성됩니다$dir$filename 범위>< ;br />";
~
또 다른
~
~ 에코 "백업 볼륨-"과 함께 . "-실패
";
~
~
~
else
{ // 모든 테이블 백업
If ($tables = mysql_query ( "show table status from " . $this->database ))
echo "데이터베이스 구조를 성공적으로 읽었습니다!
";
~
또 다른
~ ~ .
~
// 덤프 정보 삽입
$sql .= $this->_retrieve()
| 파일 이름의 일부
$filename = 날짜( 'YmdHis' ) "_all";
// 모든 테이블 찾기
$tables = mysql_query ( '테이블 표시' );
> 사용
// 모든 테이블을 반복
while ( $table = mysql_fetch_array ( $tables ) )
// 테이블 이름 가져오기 $테이블이름 = $테이블 [0]
// 테이블 구조 가져오기
~ | sql .= $this->_insert_table_structure ($tablename);
$data = mysql_query ( "select * from " . $tablename );
$num_fields = mysql_num_fields ($data);
// 각 레코드를 반복합니다
동안($ 레코드 = MySQL_FETCH_ARAY($ 데이터))
~
~ |
~ ~ $sql .= $this->_insert_record ($tablename, $num_fields, $record);
~ // 볼륨 크기보다 크면 파일을 쓰십시오.
If (strlen ( $sql ) >= $size * 1000)
~
$파일 = $파일명 . "_v" . ".sql";
// 파일 쓰기
If ($this->_write_file ($sql, $file, $dir))
~
echo "-볼륨-" . $p . "-데이터 백업 완료, 백업 파일 생성$dir$file
"; >
~
또 다른
~
echo "백업 볼륨-" . $p "-실패
";
~
// 다음 하위 롤 >
~
~ ~ // $sql 변수를 빈 상태로 재설정하고 변수 크기를 다시 계산합니다.
$sql = "";
~
~~
// SQL의 크기가 충분하지 않습니다.
If ($sql != "")
$파일명 .= "_v" . $p
If ($this->_write_file ($sql, $filename, $dir))
~
Echo "-". $ P. "-데이터 백업이 완료되었습니다. 백업 파일 생성 & lt; 스팬 스타일 = 'color:#f00;' $ dir $ filename & lt; br /& gt;"; >>
~
또 다른
~
~ 에코 "백업 볼륨-"과 함께 . "-실패
";
~
~
~
}
/**
* 기본 데이터베이스 백업 정보 삽입
* *
* @return 문자열
*/
비공개 함수 _retrieve() {
$value = '';
$value .= '--' . $this->ds;
$value .= '-- $this->ds;
$value .= '-- DBManage 클래스에 의해 생성됨, $this->ds; ' .
$value .= '-- http://yanue.net ' . $this->ds;
$value .= '--' . $this->ds;
$value .= '-- 호스트: ' . $this->ds;
$value .= '-- 날짜 생성: ' . 날짜( 'm' ) . 날짜( 'H: i' ) . $this->ds
$value .= '-- MySQL 버전: ' . mysql_get_server_info () $this->ds;
$value .= '-- PHP 버전: ' . $this->ds;
$value .= $this->ds;
$value .= '--' . $this->ds;
$value .= '-- 데이터베이스: `' . $this->데이터베이스 '`' . $this->ds;
$value .= '--' . $this->ds
$value .= '------------------- ----- ------------';
$value .= $this->ds
$value 반환;
}
/**
* 테이블 구조 삽입
* *
* @param 알 수 없는_유형 $테이블
* @return 문자열
*/
전용 함수 _insert_table_structure($table) {
$sql = '';
$sql .= "--" . $this->ds;
$sql .= "--테이블 구조" . $this->ds; $sql .= "--" . $this->ds
// 테이블이 존재하면 삭제
$sql .= "존재하는 경우 테이블 삭제" . $this->sqlEnd
// 자세한 테이블 정보 얻기
$res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' );
$row = mysql_fetch_array ($res);
$sql .= $row [1];
$sql .= $this->sqlEnd .$this->ds;
// 추가하다
$sql .= $this->ds;
$sql .= "--" . $this->ds;
$sql .= "-- 테이블의 데이터 전송 " . $this->ds;
$sql .= "--" . $this->ds;
$sql .= $this->ds;
$sql 반환;
}
/**
* 단일 레코드 삽입
* *
* @param 문자열 $table
* @param int $num_fields
* @param 배열 $record
* @return 문자열
*/
비공개 함수 _insert_record($table, $num_fields, $record) {
// 쉼표로 구분된 SQL 필드
$insert = $comma = "";
$insert .= "INSERT INTO `" . $table . "` VALUES(";
// 각 하위 섹션 아래에서 콘텐츠를 반복합니다.
for($i = 0; $i
$insert .= ($comma . "'" .mysql_real_escape_string ( $record [$i] ) . "'");
$comma = ",";
~
$insert .= ");" .
$insert 반환;
}
/**
* 파일에 쓰기
* *
* @param 문자열 $sql
* @param 문자열 $filename
* @param 문자열 $dir
* @return 부울
*/
전용 함수 _write_file($sql, $filename, $dir) {
$dir = $dir ? $dir : './백업/'
//폴더가 없으면 생성하세요
If (!file_exists ( $dir )) {
mkdir ( $dir );
~
$re = true;
If (! @$fp = fopen ( $dir . $filename, "w " )) {
$re = false;
echo "파일을 열지 못했습니다!";
~
If (! @fwrite ( $fp, $sql )) {
$re = false;
echo "파일을 쓰지 못했습니다. 파일이 쓰기 가능한지 확인하세요.";
~If (! @fclose ( $fp )) {
$re = false;
echo "파일을 닫지 못했습니다!";
~
$re 반환;
}
/*
* *
* --------------- 위: 데이터베이스 내보내기 ----------- 구분선 - --- ------다음: 데이터베이스 가져오기------------------
*/
/**
* 백업 데이터 가져오기
* 설명 : 볼륨 파일 형식 20120516211738_all_v1.sql
*파라미터 : 파일경로(필수)
* *
* @param 문자열 $sqlfile
*/
함수 복원($sqlfile)
{
// 파일이 존재하는지 확인
If (!file_exists ( $sqlfile ))
~
종료("파일이 없습니다. 확인해주세요");
~
$this->lock ( $this->database );
// 데이터베이스 저장 위치 가져오기
$sqlpath = pathinfo ($sqlfile);
$this->sqldir = $sqlpath ['dirname'];
~ >
$volume = 폭발( "_v", $sqlfile );
$volume_path = $volume [0];
echo "프로그램이 종료되는 것을 방지하려면 브라우저를 새로 고치거나 닫지 마세요. 주의하지 않으면 데이터베이스 구조가 손상될 수 있습니다.
";
echo "백업 데이터를 가져오는 중입니다. 잠시 기다려 주세요!
";
If (비어 있음 ( $volume [1] ))
~
echo "sql 가져오기: '
';
> ’ ’ 는 ’로 나누지 않음 ’s ’ to ’ to ’ to ’ to to to to to to to to to to to to to to to to tobe for so so so so so so so,
If ($this->_import ( $sqlfile )) {
echo "데이터베이스를 성공적으로 가져왔습니다!";
~
또 다른
종료( '데이터베이스 가져오기 실패!' );
~
~
else
~
//$volume_id = array();
// 스크롤이 있으면 현재가 현재 롤이고 나머지 스크롤은 사이클에 의해 수행됩니다.
$volume_id = 폭발( ".sq", $volume [1] );
//현재 볼륨은 $volume_id
$volume_id = intval ( $volume_id [0] ); 동안( $volume_id )
$tmpfile = $volume_path . "_v" . $volume_id
// 다른 스크롤이 있으니 계속 실행하세요
If (파일_존재( $tmpfile )) {
|
~ echo "볼륨을 가져오는 중" $tmpfile .
If ($this->_import ($tmpfile))
~
~
또 다른
~
Exit ( "볼륨 가져오기" . $tmpfile . '실패했습니다! 데이터베이스 구조가 손상되었을 수 있습니다! 볼륨 1에서 가져오기를 시도해 보세요.' ) ; >
~
~
또 다른
~
echo "이 볼륨의 모든 백업을 성공적으로 가져왔습니다!
";
반품
~
$volume_id;
~
~
}
/**
* SQL을 데이터베이스로 가져오기(일반 가져오기)
* *
* @param 문자열 $sqlfile
* @return 부울
*/
전용 함수 _import($sqlfile) {
// sql 파일에 포함된 sql 문 배열
$sqls = 배열();
$f = fopen ( $sqlfile, "rb" );
//테이블 버퍼 변수 생성
$create = '';
while ( ! feof ( $f ) ) {
// SQL의 각 줄을 읽습니다
$라인 = fgets($f)
// '--' 등의 설명이 포함되어 있거나 빈 줄인 경우 건너뛰세요
If (trim ( $line ) == '' || preg_match ( '/--*?/', $line, $match )) {
계속하세요
~
~ ~
If (! preg_match ( '/;/', $line, $match ) || preg_match ( '/ENGINE=/', $line, $match )) {
// 이 SQL 문과 생성된 테이블을 SQL 연결로 저장
$create .= $line;
// 테이블 생성의 마지막 문장이 포함된 경우
If (preg_match ( '/ENGINE=/', $create, $match )) {
|
>
//현재 테이블을 지우고 다음 테이블 생성 준비
$create = '';
~
|
계속하세요
~
$sqls [] = $line;
~
fclose ( $f );
// SQL 문 배열을 반복하고 별도로 실행합니다.
foreach ( $sqls를 $sql로 ) {
str_replace ( "n", "", $sql )
If (!mysql_query ( Trim ( $sql ) )) {
에코 mysql_error ()
false 반환;
~
~
true를 반환합니다.
}
/*
* ------------------데이터베이스 가져오기 끝--------------- - -----------------
*/
//데이터베이스 연결 닫기
개인 함수 close() {
mysql_close($this->db)
}
// 백업 또는 가져오기 중 오류를 방지하기 위해 데이터베이스를 잠급니다.
개인 기능 잠금($tablename, $op = "WRITE") {
If (mysql_query ( "lock tables " . $tablename . " " . $op ))
true를 반환합니다.
else
false 반환;
}
// 잠금 해제
개인 함수 잠금 해제() {
If (mysql_query ( "테이블 잠금 해제" ))
true를 반환합니다.
else
false 반환;
}
//파괴
함수 __destruct() {
mysql_query("테이블 잠금 해제", $this->db
mysql_close($this->db)
}
}
$db = 새 DBManage( 'localhost', 'root', '', 'tao', 'gbk' )
//$db->백업 ('tao_admin')
$db->restore ('./backup/20140228222713_tao_admin_v1.sql')
?>
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.