/**
* @작가 야누
* @copyright Copyright (c) 2012 yanue.net
* @version 1.1
* 작성일 : 2012년 5월 21일
업데이트 시기 : 2012년 10월 6일
업데이트 지침: 1. sql에서 작은따옴표와 큰따옴표를 가져올 수 없는 문제를 해결하려면 sql을 가져올 때 sql 파일에서 '--' 주석을 제거하세요.
2. 단일 행을 읽은 후 sql을 직접 실행합니다. sql 문을 배열로 다시 결합한 다음 배열에서 sql을 읽고 가져오지 않아도 효율성이 향상됩니다.
* 참고: 볼륨 파일은 _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')
*------------------------------------------------ - ------------
*/
클래스 DbManage {
var $db; // 데이터베이스 연결
var $database; // 사용된 데이터베이스
var $sqldir; // 데이터베이스 백업 폴더
// 개행 문자
비공개 $ds = "n"
// SQL을 저장할 변수
공개 $sqlContent = ""
//각 SQL 문의 끝 문자
공개 $sqlEnd = ";"
/**
* 初始화
*
* @param string $host
* @param string $username
* @param 문자열 $password
* @param 문자열 $database
* @param string $charset
*/
함수 __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') {
$this->호스트 = $호스트
$this->사용자 이름 = $사용자 이름
$this->password = $password
$this->데이터베이스 = $database
$this->charset = $charset
set_time_limit(0);//시간 제한 없음
@ob_end_flush()
// 데이터베이스에 연결
$this->db = @mysql_connect ( $this->host, $this->username, $this->password ) 또는 die( '
Mysql 연결 오류: '.mysql_error().'
')
//사용할 데이터베이스 선택
mysql_select_db ( $this->database, $this->db ) 또는 die('
Mysql 연결 오류:' .mysql_error().'
')
// 데이터베이스 인코딩 방법
mysql_query( 'SET NAMES' . $this->charset, $this->db
}
/*
* * 새로운 쿼리 데이터베이스 테이블이 추가되었습니다
*/
함수 getTables() {
$res = mysql_query ( "테이블 표시"
$tables = 배열()
while ( $row = mysql_fetch_array ( $res ) ) {
$tables [] = $row [0]
}
$table 반환
}
/*
* *
*------------------데이터베이스 백업 시작---- ------------------------------------- ----
*/
/**
* 데이터베이스 백업
* 매개변수: 백업할 테이블(선택 사항), 백업 디렉터리(선택 사항, 기본값은 백업), 볼륨 크기(선택 사항, 기본값은 2000, 즉 2M)
* *
* @param $string $dir
* @param int $size
* @param $string $tablename
*/
함수 백업($tablename = '', $dir, $size) {
$dir = $dir ? $dir : './백업/'
//디렉토리 생성
If (! is_dir ( $dir )) {
mkdir ( $dir, 0777, true ) 또는 die ( '폴더 생성 실패' );
}
$크기 = $크기 ? $크기 : 2048
$sql = ''
// 특정 테이블만 백업
If (!emptyempty ( $tablename )) {
If(@mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$tablename."'")) == 1) {
} else {
$this->_showMsg('테이블-
' . $tablename .'-존재하지 않습니다. 확인하세요!',true);
죽다()
}
$this->_showMsg('테이블 백업 중
' . $tablename.'');
// 덤프 정보 삽입
$sql = $this->_retrieve()
;
// 테이블 구조 정보 삽입
$sql .= $this->_insert_table_structure ( $tablename );
// 데이터 삽입
$data = mysql_query ( "select * from " . $tablename );
// 파일 이름의 첫 번째 부분
$filename = 날짜( 'YmdHis' ) . $tablename;
// 필드 수
$num_fields = mysql_num_fields ($data)
// 지지 볼륨 >
$p = 1
// 각 레코드를 반복합니다
while ( $record = mysql_fetch_array ( $data ) ) {
//단일 레코드
$sql .= $this->_insert_record ( $tablename, $num_fields, $record
//볼륨 크기보다 크면 파일 쓰기
If (strlen ( $sql ) >= $size * 1024) {
$파일 = $파일명 . "_v" . ".sql";
If ($this->_write_file ($sql, $file, $dir)) {
$this->_showMsg("Table-
" . $tablename . "-Volume-
" . $p . "-데이터 백업 완료, 파일 백업 [
" .$dir . $file ." ]");
~
~
|
~
>
//$sql 변수를 비우도록 재설정하고 변수 크기를 다시 계산합니다.
$sql = ""
~
}
//즉시 데이터 지우기
설정 해제($data,$record)
// SQL의 크기가 충분하지 않습니다.
if ($sql != "") {
$파일명 .= "_v" . $p
If ($this->_write_file ($sql, $filename, $dir)) {
$this->_showMsg( "Table-
" . $tablename . "-Volume-
" . $p . "-데이터 백업 완료, 파일 백업 [
" .$dir . $filename ." ]");
} else {
$this->_showMsg("백업 볼륨-
" . $p . "-실패함
")
거짓 반환
~
}
$this->_showMsg("축하합니다!
백업 성공");
} else {
$this->_showMsg('백업 중')
// 모든 테이블 백업
If ($tables = mysql_query ( " " . $this->database 의 테이블 상태 표시 )) {
$ This-& gt; _Showmsg ("데이터베이스 구조 읽기에 성공했습니다!");
} else {
$this->_showMsg("데이터베이스 구조를 읽지 못했습니다!");
종료( 0 );
}
// 덤프 정보 삽입
$sql .= $this->_retrieve ()
// 파일 이름의 첫 번째 부분
$filename = 날짜( 'YmdHis' )
// 모든 테이블 찾기
$tables = mysql_query ( '테이블 표시' );
// 지지 볼륨 >
$p = 1
// 모든 테이블을 반복
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 );
// 각 레코드를 반복합니다
while ($ 레코드 = 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)) {
$this->_showMsg("-볼륨-
" . $p . "-데이터 백업 완료, 파일 백업[
".$dir.$ 파일." ]")
~
$this->_showMsg("볼륨-
" . $p . "-백업 실패!",true);
|
~
>
>
//$sql 변수를 비우도록 재설정하고 변수 크기를 다시 계산합니다.
$sql = ""
~ ~
}
// SQL의 크기가 충분하지 않습니다.
if ($sql != "") {
$파일명 .= "_v" . $p
If ($this->_write_file ($sql, $filename, $dir)) {
$this->_showMsg("-볼륨-
" . $p . "-데이터 백업 완료, 파일 백업[
".$dir.$ 파일 이름." ]");
} else {
$this->_showMsg("볼륨-
" . $p . "-백업 실패",true);
거짓 반환
~
}
$this->_showMsg("축하합니다!
백업 성공");
}
}
// 시간에 맞춰 정보 출력
비공개 함수 _showMsg($msg,$err=false){
$err = $err ? "
오류:"
echo "
".$err ."
";
플러시();
}
/**
* 기본 데이터베이스 백업 정보 삽입
* *
* @return 문자열
*/
비공개 함수 _retrieve() {
$값 = ''
$value .= '--' . $this->ds;
$value .= '-- MySQL 데이터베이스 덤프' $this->ds;
$value .= '-- DbManage 클래스, yanue에 의해 생성됨 ' .
$value .= '-- http://yanue.net ' . $this->ds;
$value .= '--' . $this->ds;
$value .= '-- 호스트: ' . $this->ds;
$value .= '-- 날짜 생성: ' . 날짜( 'm' ) . 날짜( 'H: i' ) . $this->ds
$value .= '-- MySQL 버전: ' . $this->ds;
$value .= '-- PHP 버전: ' . phpversion () .
$value .= $this->ds
$value .= '--' . $this->ds;
$value .= '-- 데이터베이스: `' . $this->데이터베이스 '`' . $this->ds;
$value .= '--' . $this->ds
$value .= '------------------- ----- ------------';
$value .= $this->ds
$값 반환
}
/**
* 테이블 구조 삽입
* *
* @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_escape_string ( $record [$i] ) . "'");
$comma = ","
}
$insert .= ");" .
$insert 반환
}
/**
* 파일에 쓰기
* *
* @param 문자열 $sql
* @param 문자열 $filename
* @param 문자열 $dir
* @return 부울
*/
전용 함수 _write_file($sql, $filename, $dir) {
$dir = $dir ? $dir : './백업/'
//디렉토리 생성
If (! is_dir ( $dir )) {
mkdir( $dir, 0777, true );
}
$re = 참
If (! @$fp = fopen ( $dir . $filename, "w " )) {
$re = 거짓
$this->_showMsg("SQL 파일을 열지 못했습니다!",true);
}
If (! @fwrite ( $fp, $sql )) {
$re = 거짓
$this->_showMsg("SQL 파일을 쓰지 못했습니다. 파일이 쓰기 가능한지 확인하세요.",true);
}
If (! @fclose ( $fp )) {
$re = 거짓
$this->_showMsg("SQL 파일을 닫지 못했습니다!",true);
}
$re 반환
}
/*
* *
* --------------- 위: 데이터베이스 내보내기 ----------- 구분선 - --- -------다음: 데이터베이스 가져오기------------------
*/
/**
* 백업 데이터 가져오기
* 설명 : 볼륨 파일 형식 20120516211738_all_v1.sql
*파라미터 : 파일경로(필수)
* *
* @param 문자열 $sqlfile
*/
함수 복원($sqlfile) {
// 파일이 존재하는지 확인
If (!file_exists ( $sqlfile )) {
$this->_showMsg("sql 파일이 존재하지 않습니다. 확인해주세요", true);
종료();
}
$this->잠금( $this->데이터베이스
// 데이터베이스 저장 위치 가져오기
$sqlpath = 경로 정보($sqlfile)
$this->sqldir = $sqlpath ['dirname']
|
$volume = 폭발( "_v", $sqlfile )
$volume_path = $volume [0]
$this->_showMsg("프로그램이 종료되지 않도록 브라우저를 새로고침하거나 닫지 마세요. 주의하지 않으면 데이터베이스 구조가 손상될 수 있습니다.");
$this->_showMsg("백업 데이터를 가져오는 중입니다. 잠시 기다려 주세요!");
If (비어 있음 ( $volume [1] )) {
$this->_showMsg ( "SQL 가져오기:
" . $sqlfile . '');
// 스크롤 없음
If ($this->_import ( $sqlfile )) {
$ This-& gt; _ShowMSG ("데이터베이스 가져오기 성공!");
} else {
$this->_showMsg('데이터베이스 가져오기 실패!', true)
종료()
}
} else {
// 스크롤이 있으면 현재가 현재 롤이고 나머지 스크롤은 사이클에 의해 수행됩니다.
$volume_id = 폭발( ".sq", $volume [1] )
//현재 볼륨은 $volume_id
$volume_id = intval ( $volume_id [0] )
while ( $volume_id ) {
$tmpfile = $volume_path . "_v" . $volume_id
// 다른 볼륨이 존재하므로 계속 실행
If (파일_존재( $tmpfile )) {
// 가져오기 메소드 실행
$this->msg .= "$volume_id 볼륨 가져오기:
' $tmpfile .
If ($this->_import ($tmpfile)) {
~ $volume_id = $volume_id :1;
Exit ( "볼륨 가져오기: " . $tmpfile . '실패! 데이터베이스 구조가 손상되었을 수 있습니다! 볼륨 1에서 가져오기를 시도하십시오.' );
~
} else {
$ This-& gt; = "이 하위 백업이 성공적으로 도입되었습니다! & Lt; br /& gt;";
반품
~
$volume_id
}
}if (비어 있음( $volume [1] )) {
$this->_showMsg ( "SQL 가져오기: " . $sqlfile . '');
// 스크롤 없음
If ($this->_import ( $sqlfile )) {
$ This-& gt; _ShowMSG ("데이터베이스 가져오기 성공!");
} else {
$this->_showMsg('데이터베이스 가져오기 실패!', true)
종료()
}
} else {
// 스크롤이 있으면 현재가 현재 롤이고 나머지 스크롤은 사이클에 의해 수행됩니다.
$volume_id = 폭발( ".sq", $volume [1] )
//현재 볼륨은 $volume_id
$volume_id = intval ( $volume_id [0] )
while ( $volume_id ) {
$tmpfile = $volume_path . "_v" . $volume_id
// 다른 볼륨이 존재하므로 계속 실행
If (파일_존재( $tmpfile )) {
// 가져오기 메소드 실행
$this->msg .= "$volume_id 볼륨 가져오기: ' $tmpfile .
If ($this->_import ($tmpfile)) {
~
$volume_id = $volume_id :1;
Exit ( "볼륨 가져오기: " . $tmpfile . '실패! 데이터베이스 구조가 손상되었을 수 있습니다! 볼륨 1에서 가져오기를 시도하십시오.' );
~
} else {
$ This-& gt; = "이 하위 백업이 성공적으로 도입되었습니다! & Lt; br /& gt;";
반품
~
$volume_id
}
}
}
/**
* SQL을 데이터베이스로 가져오기(일반 가져오기)
* *
* @param 문자열 $sqlfile
* @return 부울
*/
전용 함수 _import($sqlfile) {
//sql 파일에 포함된 sql 문 배열
$sqls = 배열()
$f = fopen( $sqlfile, "rb" )
//테이블 버퍼 변수 생성
$create_table = ''
while ( ! feof ( $f ) ) {
// SQL의 각 행을 읽습니다
$line = fgets ( $f );
// 생성된 테이블을 완전한 SQL 문으로 합성하는 단계입니다
// 끝에 ';'(즉, 완전한 SQL 문, 여기에 삽입 문)이 포함되지 않고, 'ENGINE='(즉, 테이블을 생성하는 마지막 문장)이 포함되지 않은 경우
If (! preg_match ( '/;/', $line ) || preg_match ( '/ENGINE=/', $line )) {
// 이 SQL 문과 생성된 테이블을 SQL 연결로 저장
$create_table .= $line
// 테이블 생성의 마지막 문장이 포함된 경우
If (preg_match ( '/ENGINE=/', $create_table)) {
//sql문을 실행하여 테이블 생성
$this->_insert_into($create_table)
//현재 테이블을 지우고 다음 테이블 생성 준비
$create_table = ''
~
// 이번에는 건너뛰세요
계속하세요
}
//SQL문 실행
$this->_insert_into($line)
}
fclose( $f );
true를 반환합니다.
}
//단일 SQL 문 삽입
전용 함수 _insert_into($sql){
If (!mysql_query ( Trim ( $sql ) )) {
$this->msg .= mysql_error
거짓 반환
}
}
/*
* ------------------데이터베이스 가져오기 끝--------------- - -----------------
*/
//데이터베이스 연결 닫기
개인 함수 close() {
mysql_close($this->db)
}
// 백업 또는 가져오기 중 오류를 방지하기 위해 데이터베이스를 잠급니다.
개인 기능 잠금($tablename, $op = "WRITE") {
If (mysql_query ( "lock tables " . $tablename . " " . $op ))
true를 반환합니다.
그 외
거짓 반환
}
// 잠금 해제
개인 함수 잠금 해제() {
if (mysql_query ( "테이블 잠금 해제" ))
true를 반환합니다.
그 외
거짓 반환
}
//파괴
함수 __destruct() {
If($this->db){
mysql_query("테이블 잠금 해제", $this->db
mysql_close($this->db)
}
}
}
?>