推薦一個PHP的MySQL資料庫備份還原類
在GitHub上發現的一個PHP的MySQL資料庫備份還原類,寫的不錯,目測用的人似乎不多,好東西就推廣一下哈
匯出後的sql檔案格式如下:
--
-- MySQL database dump
-- Created by DBManage class, Power By yanue.
-- http://www.yanue.net
--
-- 主機: localhost
-- 生成日期: 2012 年 10 月 06 日 22:32
-- MySQL版本: 5.1.50-community
-- PHP 版本: 5.3.9-ZS5.6.0
--
-- 資料庫: `test`
--
-- -------------------------------------------------------
--
-- 表的結構aa
--
DROP TABLE IF EXISTS `aa`;
CREATE TABLE `aa` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`content` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
--
-- 轉存表中的資料 aa
--
INSERT INTO `aa` VALUES('1','<p id="test"><span class='hahh' style="line-height:;">我是測試資料 呵呵</span></p>');
下面是類程式碼:
*----------------------------------------------------------------------
*/
class DbManage {
var $db; // 資料庫連線
var $database; // 所用資料庫
var $sqldir; // 資料庫備份資料夾
// 換行符
private $ds = "\n";
// 儲存SQL的變數
public $sqlContent = "";
// 每條sql語句的結尾符
public $sqlEnd = ";";
/**
* 初始化
*
* @param string $host
* @param string $username
* @param string $password
* @param string $database
* @param string $charset
*/
function __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') {
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $database;
$this->charset = $charset;
set_time_limit(0);//無時間限制
@ob_end_flush();
// 連線資料庫
$this->db = @mysql_connect ( $this->host, $this->username, $this->password ) or die( '<p class="dbDebug"><span class="err">Mysql Connect Error : </span>'.mysql_error().'</p>');
// 選擇使用哪個資料庫
mysql_select_db ( $this->database, $this->db ) or die('<p class="dbDebug"><span class="err">Mysql Connect Error:</span>'.mysql_error().'</p>');
// 資料庫編碼方式
mysql_query ( 'SET NAMES ' . $this->charset, $this->db );
}
/*
* 新增查詢資料庫表
*/
function getTables() {
$res = mysql_query ( "SHOW TABLES" );
$tables = array ();
while ( $row = mysql_fetch_array ( $res ) ) {
$tables [] = $row [0];
}
return $tables;
}
/*
*
* ------------------------------------------資料庫備份start----------------------------------------------------------
*/
/**
* 資料庫備份
* 引數:備份哪個表(可選),備份目錄(可選,預設為backup),分卷大小(可選,預設2000,即2M)
*
* @param $string $dir
* @param int $size
* @param $string $tablename
*/
function backup($tablename = '', $dir, $size) {
$dir = $dir ? $dir : './backup/';
// 建立目錄
if (! is_dir ( $dir )) {
mkdir ( $dir, 0777, true ) or die ( '建立資料夾失敗' );
}
$size = $size ? $size : 2048;
$sql = '';
// 只備份某個表
if (! empty ( $tablename )) {
if(@mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$tablename."'")) == 1) {
} else {
$this->_showMsg('表-<b>' . $tablename .'</b>-不存在,請檢查!',true);
die();
}
$this->_showMsg('正在備份表 <span class="imp">' . $tablename.'</span>');
// 插入dump資訊
$sql = $this->_retrieve ();
// 插入表結構資訊
$sql .= $this->_insert_table_structure ( $tablename );
// 插入資料
$data = mysql_query ( "select * from " . $tablename );
// 檔名前面部分
$filename = date ( '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) {
$file = $filename . "_v" . $p . ".sql";
if ($this->_write_file ( $sql, $file, $dir )) {
$this->_showMsg("表-<b>" . $tablename . "</b>-卷-<b>" . $p . "</b>-資料備份完成,備份檔案 [ <span class='imp'>" .$dir . $file ."</span> ]");
} else {
$this->_showMsg("備份表 -<b>" . $tablename . "</b>- 失敗",true);
return false;
}
// 下一個分卷
$p ++;
// 重置$sql變數為空,重新計算該變數大小
$sql = "";
}
}
// 及時清除資料
unset($data,$record);
// sql大小不夠分卷大小
if ($sql != "") {
$filename .= "_v" . $p . ".sql";
if ($this->_write_file ( $sql, $filename, $dir )) {
$this->_showMsg( "表-<b>" . $tablename . "</b>-卷-<b>" . $p . "</b>-資料備份完成,備份檔案 [ <span class='imp'>" .$dir . $filename ."</span> ]");
} else {
$this->_showMsg("備份卷-<b>" . $p . "</b>-失敗<br />");
return false;
}
}
$this->_showMsg("恭喜您! <span class='imp'>備份成功</span>");
} else {
$this->_showMsg('正在備份');
// 備份全部表
if ($tables = mysql_query ( "show table status from " . $this->database )) {
$this->_showMsg("讀取資料庫結構成功!");
} else {
$this->_showMsg("讀取資料庫結構失敗!");
exit ( 0 );
}
// 插入dump資訊
$sql .= $this->_retrieve ();
// 檔名前面部分
$filename = date ( 'YmdHis' ) . "_all";
// 查出所有表
$tables = mysql_query ( 'SHOW TABLES' );
// 第幾分卷
$p = 1;
// 迴圈所有表
while ( $table = mysql_fetch_array ( $tables ) ) {
// 獲取表名
$tablename = $table [0];
// 獲取表結構
$sql .= $this->_insert_table_structure ( $tablename );
$data = mysql_query ( "select * from " . $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) {
$file = $filename . "_v" . $p . ".sql";
// 寫入檔案
if ($this->_write_file ( $sql, $file, $dir )) {
$this->_showMsg("-卷-<b>" . $p . "</b>-資料備份完成,備份檔案 [ <span class='imp'>".$dir.$file."</span> ]");
} else {
$this->_showMsg("卷-<b>" . $p . "</b>-備份失敗!",true);
return false;
}
// 下一個分卷
$p ++;
// 重置$sql變數為空,重新計算該變數大小
$sql = "";
}
}
}
// sql大小不夠分卷大小
if ($sql != "") {
$filename .= "_v" . $p . ".sql";
if ($this->_write_file ( $sql, $filename, $dir )) {
$this->_showMsg("-卷-<b>" . $p . "</b>-資料備份完成,備份檔案 [ <span class='imp'>".$dir.$filename."</span> ]");
} else {
$this->_showMsg("卷-<b>" . $p . "</b>-備份失敗",true);
return false;
}
}
$this->_showMsg("恭喜您! <span class='imp'>備份成功</span>");
}
}
// 及時輸出資訊
private function _showMsg($msg,$err=false){
$err = $err ? "<span class='err'>ERROR:</span>" : '' ;
echo "<p class='dbDebug'>".$err . $msg."</p>";
flush();
}
/**
* 插入資料庫備份基礎資訊
*
* @return string
*/
private function _retrieve() {
$value = '';
$value .= '--' . $this->ds;
$value .= '-- MySQL database dump' . $this->ds;
$value .= '-- Created by DbManage class, Power By yanue. ' . $this->ds;
$value .= '-- http://yanue.net ' . $this->ds;
$value .= '--' . $this->ds;
$value .= '-- 主機: ' . $this->host . $this->ds;
$value .= '-- 生成日期: ' . date ( 'Y' ) . ' 年 ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . $this->ds;
$value .= '-- MySQL版本: ' . mysql_get_server_info () . $this->ds;
$value .= '-- PHP 版本: ' . phpversion () . $this->ds;
$value .= $this->ds;
$value .= '--' . $this->ds;
$value .= '-- 資料庫: `' . $this->database . '`' . $this->ds;
$value .= '--' . $this->ds . $this->ds;
$value .= '-- -------------------------------------------------------';
$value .= $this->ds . $this->ds;
return $value;
}
/**
* 插入表結構
*
* @param unknown_type $table
* @return string
*/
private function _insert_table_structure($table) {
$sql = '';
$sql .= "--" . $this->ds;
$sql .= "-- 表的結構" . $table . $this->ds;
$sql .= "--" . $this->ds . $this->ds;
// 如果存在則刪除表
$sql .= "DROP TABLE IF EXISTS `" . $table . '`' . $this->sqlEnd . $this->ds;
// 獲取詳細表資訊
$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 .= "-- 轉存表中的資料 " . $table . $this->ds;
$sql .= "--" . $this->ds;
$sql .= $this->ds;
return $sql;
}
/**
* 插入單條記錄
*
* @param string $table
* @param int $num_fields
* @param array $record
* @return string
*/
private function _insert_record($table, $num_fields, $record) {
// sql欄位逗號分割
$insert = '';
$comma = "";
$insert .= "INSERT INTO `" . $table . "` VALUES(";
// 迴圈每個子段下面的內容
for($i = 0; $i < $num_fields; $i ++) {
$insert .= ($comma . "'" . mysql_escape_string ( $record [$i] ) . "'");
$comma = ",";
}
$insert .= ");" . $this->ds;
return $insert;
}
/**
* 寫入檔案
*
* @param string $sql
* @param string $filename
* @param string $dir
* @return boolean
*/
private function _write_file($sql, $filename, $dir) {
$dir = $dir ? $dir : './backup/';
// 建立目錄
if (! is_dir ( $dir )) {
mkdir ( $dir, 0777, true );
}
$re = true;
if (! @$fp = fopen ( $dir . $filename, "w+" )) {
$re = false;
$this->_showMsg("開啟sql檔案失敗!",true);
}
if (! @fwrite ( $fp, $sql )) {
$re = false;
$this->_showMsg("寫入sql檔案失敗,請檔案是否可寫",true);
}
if (! @fclose ( $fp )) {
$re = false;
$this->_showMsg("關閉sql檔案失敗!",true);
}
return $re;
}
/*
*
* -------------------------------上:資料庫匯出-----------分割線----------下:資料庫匯入--------------------------------
*/
/**
* 匯入備份資料
* 說明:分卷檔案格式20120516211738_all_v1.sql
* 引數:檔案路徑(必填)
*
* @param string $sqlfile
*/
function restore($sqlfile) {
// 檢測檔案是否存在
if (! file_exists ( $sqlfile )) {
$this->_showMsg("sql檔案不存在!請檢查",true);
exit ();
}
$this->lock ( $this->database );
// 獲取資料庫儲存位置
$sqlpath = pathinfo ( $sqlfile );
$this->sqldir = $sqlpath ['dirname'];
// 檢測是否包含分卷,將類似20120516211738_all_v1.sql從_v分開,有則說明有分卷
$volume = explode ( "_v", $sqlfile );
$volume_path = $volume [0];
$this->_showMsg("請勿重新整理及關閉瀏覽器以防止程式被中止,如有不慎!將導致資料庫結構受損");
$this->_showMsg("正在匯入備份資料,請稍等!");
if (empty ( $volume [1] )) {
$this->_showMsg ( "正在匯入sql:<span class='imp'>" . $sqlfile . '</span>');
// 沒有分卷
if ($this->_import ( $sqlfile )) {
$this->_showMsg( "資料庫匯入成功!");
} else {
$this->_showMsg('資料庫匯入失敗!',true);
exit ();
}
} else {
// 存在分卷,則獲取當前是第幾分卷,迴圈執行餘下分卷
$volume_id = explode ( ".sq", $volume [1] );
// 當前分卷為$volume_id
$volume_id = intval ( $volume_id [0] );
while ( $volume_id ) {
$tmpfile = $volume_path . "_v" . $volume_id . ".sql";
// 存在其他分卷,繼續執行
if (file_exists ( $tmpfile )) {
// 執行匯入方法
$this->msg .= "正在匯入分卷 $volume_id :<span style='color:#f00;'>" . $tmpfile . '</span><br />';
if ($this->_import ( $tmpfile )) {
} else {
$volume_id = $volume_id ? $volume_id :1;
exit ( "匯入分卷:<span style='color:#f00;'>" . $tmpfile . '</span>失敗!可能是資料庫結構已損壞!請嘗試從分卷1開始匯入' );
}
} else {
$this->msg .= "此分卷備份全部匯入成功!<br />";
return;
}
$volume_id ++;
}
}if (empty ( $volume [1] )) {
$this->_showMsg ( "正在匯入sql:<span class='imp'>" . $sqlfile . '</span>');
// 沒有分卷
if ($this->_import ( $sqlfile )) {
$this->_showMsg( "資料庫匯入成功!");
} else {
$this->_showMsg('資料庫匯入失敗!',true);
exit ();
}
} else {
// 存在分卷,則獲取當前是第幾分卷,迴圈執行餘下分卷
$volume_id = explode ( ".sq", $volume [1] );
// 當前分卷為$volume_id
$volume_id = intval ( $volume_id [0] );
while ( $volume_id ) {
$tmpfile = $volume_path . "_v" . $volume_id . ".sql";
// 存在其他分卷,繼續執行
if (file_exists ( $tmpfile )) {
// 執行匯入方法
$this->msg .= "正在匯入分卷 $volume_id :<span style='color:#f00;'>" . $tmpfile . '</span><br />';
if ($this->_import ( $tmpfile )) {
} else {
$volume_id = $volume_id ? $volume_id :1;
exit ( "匯入分卷:<span style='color:#f00;'>" . $tmpfile . '</span>失敗!可能是資料庫結構已損壞!請嘗試從分卷1開始匯入' );
}
} else {
$this->msg .= "此分卷備份全部匯入成功!<br />";
return;
}
$volume_id ++;
}
}
}
/**
* 將sql匯入到資料庫(普通匯入)
*
* @param string $sqlfile
* @return boolean
*/
private function _import($sqlfile) {
// sql檔案包含的sql語句陣列
$sqls = array ();
$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 = '';
}
// 跳過本次
continue;
}
//執行sql語句
$this->_insert_into($line);
}
fclose ( $f );
return true;
}
//插入單條sql語句
private function _insert_into($sql){
if (! mysql_query ( trim ( $sql ) )) {
$this->msg .= mysql_error ();
return false;
}
}
/*
* -------------------------------資料庫匯入end---------------------------------
*/
// 關閉資料庫連線
private function close() {
mysql_close ( $this->db );
}
// 鎖定資料庫,以免備份或匯入時出錯
private function lock($tablename, $op = "WRITE") {
if (mysql_query ( "lock tables " . $tablename . " " . $op ))
return true;
else
return false;
}
// 解鎖
private function unlock() {
if (mysql_query ( "unlock tables" ))
return true;
else
return false;
[}](http://www.yanue.net/archives/174.html)
// 析構
function __destruct() {
if($this->db){
mysql_query ( "unlock tables", $this->db );
mysql_close ( $this->db );
}
}
}
?>
相關推薦
推薦一個PHP的MySQL資料庫備份還原類
在GitHub上發現的一個PHP的MySQL資料庫備份還原類,寫的不錯,目測用的人似乎不多,好東西就推廣一下哈 匯出後的sql檔案格式如下: -- -- MySQL database dump -- Created by DBManage class, Po
兩種資料庫備份還原對比
tablename: T 第一種: -- 備份及遷移資料 create table T_bk as select * from T; -- 刪除原有表及還原表名 drop ta
jdbc寫一個訪問資料庫的工具類
操作的工具類 package com.zjw.jdbc2; /** * jdbc操作的工具類 * @author Administrator * */ import java.sql.Connection; import java.sql.DriverManager; import
PostgreSQL資料庫備份還原指令碼
本文對資料庫進行的操作主要用到的是PG自帶的pg_dumpall、pg_dump、psql這幾個命令 備份還原過程: 1:備份全域性物件 2: 備份某一個數據庫 3:還原全域性物件 4:還原備份的資料庫 備份詳細過程:
docker方便使用的工具簡之資料庫備份還原
MySQL資料備份percona-xtrabackup工具 備份 #docker run --rm -v /back:/back -v /var/lib/mysql:/var/lib/mysql:ro -it yfix/percona-xtrabackup bash 使用innoback
達夢資料庫備份還原
1、資料庫備份還原 --備份 backup database full to BAK201812050 bakfile 'E:\soft\dmdbms\data\DAMENG\bak\BAK201812050.bak' compressed; --還原 dmrestore ini_path=E
Navicat Premium實現mysql資料庫備份/還原
Navicat Premium 是一個非常好用的資料庫(支援 MySQL、SQLite、Oracle、SQL Server 及 PostgreSQL 等資料庫)的圖形化工具,今天我們主要是講解如何用Navicat(Navicat Premium ,或者Navicat
SQL Server資料庫備份還原時,提示“資料庫正在使用”的解決辦法
問題描述: SQL Server資料庫備份還原後,在資料庫名稱後會出現“受限制訪問”字樣 解決辦法: 右鍵點選資料庫
java sql編輯器 動態報表 資料庫備份還原
2. 按鈕管理:自定義按鈕管理,維護按鈕許可權標識等3. 選單管理:無限級別自定義選單,自定義選單圖示,業務選單和系統選單分離,選單狀態顯示隱藏(遞迴處理)4. 資料字典:無限級別,支援多級別無限分類。內設編號,排序等5. 日誌管理:記錄使用者登入退出和一些重要操作記錄6. 線上管理:we
sql server資料庫備份還原後,出現“物件名無效”問題解決辦法
今天真的碰到了這個盲點問題,按照此部落格順利解決了. 留檔並轉載: 問題描述: 在把遠端伺服器上的資料庫備份還原到本地機後, 給一個"登入"關聯一個"使用者"時(使用者對映),發生錯誤: “錯誤15023:當前資料庫中已存在使用者或角色” 問題分析:在遷移測試平臺數據庫
SQL Server 資料庫備份還原和資料恢復
認識資料庫備份和事務日誌備份 資料庫備份與日誌備份是資料庫維護的日常工作,備份的目的是在於當資料庫出現故障或者遭到破壞時可以根據備份的資料庫及事務日誌檔案還原到最近的時間點將損失降到最低點。 資料庫備份 資料庫備份可以手動備份和語句備份 一.手動備份資料庫 1.滑鼠右鍵選擇你要進行備份的資料
用Sql Server 2000的資料庫備份還原到Sql Server 2005中的資料庫
現在手中有Sql Server 2000中的資料庫備份檔案(如果此備份檔案沒有後綴名*.bak或*.trn,請追加相應的字尾名),欲將此檔案還原到Sql Server 2005中,還原時突然報錯,為此在網上搜索了有關文章,金慶的專欄中有一篇《SQL2005備份還原問題 》講解到了,但個人感覺不是
mysql 我常用的命令 資料庫備份還原等
>mysql -u root -p >show databases; >show variables like '%datadir%'; // 檢視資料檔案所在目錄 > create database openfire; // 建立一個名為ope
mysql資料庫備份還原
1.備份 使用mysqldump命令可以備份資料庫 建立db1資料庫,在其中建立student資料表 +----+------+------+ | id | name | age | +--
一個不錯的MYSQL資料庫備份類,PHP版,一個檔案,精簡版
<?php class DbManage { var $db; // 資料庫連線 var $database; // 所用資料庫 var $sqldir; // 資料庫備份資料夾 // 換行符 private $ds = "\n
Mysql備份還原資料庫之mysqldump例項及引數詳細說明
Mysql備份還原資料庫之mysqldump例項及引數詳細說明 我們在運營專案的過程中肯定會遇到備份資料庫,還原資料庫的情況,我們一般用一下兩種方式來處理: 1.使用into outfile 和 load data infile匯入匯出備份資料 這種方法的好處是,匯出
Oracle資料庫匯入匯出 imp/exp備份還原
Oracle資料匯入匯出imp/exp Oracle資料匯入匯出imp/exp 在cmd的dos命令提示符下執行,而不是在sqlplus裡面,但是格式一定要類似於: imp/exp 使用者名稱/密碼@serv
SQL Server資料庫備份檔案還原到不同的資料庫xjh測試可以-https://www.yigujin.cn/1269.html
SQL Server 2005 備份檔案還原到新資料庫 2017年07月10日 17:41:49 閱讀 267 次 評論 2 條 上次的『刪除SQLServer2005歷史資料之工作小結』一文中說到由於特殊原因需要刪除某系統的歷史資料,在刪除
mongo資料庫遷移和備份還原
想要將資料庫1的40條記錄插入到資料庫2中去,用工具只能一條一條的插入,發現可以寫一個簡單的程式來解決這個問題 原作者地址:mongoDB如何複製collection裡的資料到另一個collection方法總結 方法一: db.test(複製源表).find().forEach(
SQL Server 2008之master資料庫備份和還原
知識部分系統資料庫:SQL Server 2008 R2預設包括四個系統資料庫,分別是master、model、msdb、tempdb。其中master資料庫用以記錄所有系統級別的資訊、所有的登陸賬戶和系統配置設定。同時記錄所有其他的資料庫資訊,其中包括資料庫檔案的位置,同時還記錄所有SQL Server的初