一個不錯的MYSQL資料庫備份類,PHP版,一個檔案,精簡版
<?php 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=20480) { $dir = $dir ? $dir : './'; // 建立目錄 if (! is_dir ( $dir )) { @mkdir ( $dir, 0777, true ) or die ( '建立資料夾失敗' ); } $size = $size ? $size : 1024*20; $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; } // 析構 function __destruct() { if($this->db){ mysql_query ( "unlock tables", $this->db ); mysql_close ( $this->db ); } } } $db = new DbManage("localhost","root","root","dbname"); $db->backup("","",""); ?>
相關推薦
一個不錯的MYSQL資料庫備份類,PHP版,一個檔案,精簡版
<?php class DbManage { var $db; // 資料庫連線 var $database; // 所用資料庫 var $sqldir; // 資料庫備份資料夾 // 換行符 private $ds = "\n
PHP自己封裝一個原生mysql資料庫工具類--進階常用類仿PDO模式
<?php header('content-type:text/html;charset=utf-8'); error_reporting(E_ALL ^ E_DEPRECATED); // 設計一個mysql資料庫操作類 $config=array( 'hos
PHP自己封裝一個原生mysql資料庫工具類--基礎類
程式碼都是剛從自己編輯器上拷貝下來的,可以直接複製黏貼執行。 <?php header('content-type:text/html;charset=utf-8'); error_reporting(E_ALL ^ E_DEPRECATED); // 設計一個mysql資料庫操作類 $
PHP自己封裝一個原生mysql資料庫工具類--進階常用類
<?php header('content-type:text/html;charset=utf-8'); error_reporting(E_ALL ^ E_DEPRECATED); // 設計一個mysql資料庫操作類 $config=array( 'h
推薦一個PHP的MySQL資料庫備份還原類
在GitHub上發現的一個PHP的MySQL資料庫備份還原類,寫的不錯,目測用的人似乎不多,好東西就推廣一下哈 匯出後的sql檔案格式如下: -- -- MySQL database dump -- Created by DBManage class, Po
MySQL資料庫操作類(PHP實現,支援連貫操作)
<?php /** * Author: helen * CreateTime: 2016/4/12 20:14 * description: 資料庫操作類(僅對接MySQL資料庫,主要利用MySQLi函式) */ class Database{ //MySQL主機地址 priv
php mysql資料庫操作類,功能很強大
<?php /* * mysql資料庫 DB類 * @package db * @author yytcpt(無影) * @version 2008-03-27 * @copyrigth http://www.d5s.cn/ */ class db { var $c
MySQL使用者管理,常用SQL語句,MySQL資料庫備份與恢復
[toc] MySQL使用者管理,常用SQL語句,MySQL資料庫備份與恢復 擴充套件 SQL語句教程 http://www.runoob.com/sql/sql-tutorial.html 什麼是事務?事務的特性有哪些? http://blog.csdn.net/yenange/article/deta
MySQL使用者管理,常用MySQL語句、MySQL資料庫備份恢復
12月6日任務 13.4 mysql使用者管理 13.5 常用sql語句 13.6 mysql資料庫備份恢復 13.4 mysql使用者管理 grant all on *.* to 'user1' identified by 'passw
php mysql資料庫備份2
用php程式碼實現資料庫備份可以使網站的管理變得非常便捷,我們可以直接進後臺操作就能完成資料庫的備份。 關鍵技術: 1. 首先要得到該資料庫中有哪些表,所用函式 mysql_list_tables(),然後可以將獲取的所有表名存到一個數組。 2. show c
php的Mysql資料庫連線類
<?php/** * mysql資料庫連線類 */ class Mysql{ private $db_host; //資料庫主機 private $db_user; //資料庫使用者名稱 private $db_pwd; //資料庫密碼 private $
原創|高逼格企業級MySQL資料庫備份方案,原來是這樣....
很多人,這裡說的是運維工程師們,一提到寫某某方案,很是頭疼。不是上某度一統搜尋,就是同樣一句話在N個群全部群發一遍:“有沒有某某方案,可以共享一下的嗎??求助,各位大佬們”,估計十有八九,全部石沉大海,杳無音訊。 其實,到底是真的很難,還是說你沒有完全掌握整個備份思路的整理?一個方案
2020重新出發,MySql基礎,MySql資料庫備份與恢復
@[toc] # MySQL資料庫備份與恢復 儘管採取了一些管理措施來保證資料庫的安全,但是在不確定的意外情況下,總是有可能造成資料的損失。 - 例如,意外的停電,不小心的操作失誤等都可能造成資料的丟失。 所以為了保證資料的安全,我們需要定期對資料進行備份。如果資料庫中的資料出現了錯誤,就需要使用備份好
Mysql資料庫備份與還原(簡易)
一、資料備份 1、使用mysqldump命令備份 mysqldump命令將資料庫中的資料備份成一個文字檔案。表的結構和表中的資料將儲存在生成的文字檔案中。 mysqldump命令的工作原理很簡單。它先查出需要備份的表的結構,再在文字檔案中生成一個CREATE語句。然後,將表中
shell 練習(07)——MySQL 資料庫備份
1. 題目 設計一個 shell 指令碼來備份資料庫,首先在本地伺服器上儲存一份資料,然後再遠端拷貝一份,本地儲存一週的資料,遠端儲存一個月。 假定,我們已經知道了 mysql root 賬戶密碼,要備份的資料庫為 wenming ,本地備份目錄為 /data/backup/mysql,遠端伺服器 ip
MySQL資料庫備份&還原-LINUX
MySQL資料庫備份&還原-LINUX 手動備份: 1. 備份一個數據庫mysqldump -hhostname -uusername -pmypwd databasename > /path to backup/bakname.sql 備份並壓縮mysqldump -
MySQL資料庫備份與還原
1、mysql資料庫的備份和還原 * 第一種使用視覺化工具進行備份和還原 * 第二種使用sql語句進行備份和還原 - mysql資料庫的備份 -- 語句 mysqldump -u
mysql資料庫備份工具:Xtrabackup的使用例子。
大資料量備份與還原,始終是個難點。當MYSQL超10G,用mysqldump來匯出就比較慢了。這裡介紹一個強大的開源工具Xtrabackup。 Xtrabackup簡介 Xtrabackup是由percona提供的mysql資料庫備份工具,據官方介紹,這也是世界上惟一一
linux上 mysql資料庫備份與還原 (xtrabackup工具安裝與使用)
由於我安裝的mysql5.7是最新的版本,而一些老的xtrabackup版本已經不相容,所以在這裡我下載最新的xtrabackup工具 注:我這裡沒有應用全備和整備,而是用了部分備份,即一個數據庫的備份和恢復 環境: centos7 mysql
精簡mysql資料庫備份檔案 - windows定時任務
此前一篇文章,寫了一個通過windows定時任務,執行mysql資料庫備份的指令碼。 點此進入上一篇文章->通過windows伺服器定時任務,定時備份mysql資料庫。 50多個G的資料庫備份完成sql大概在20G,通過壓縮後大概在2G左右。 長時間進行後硬碟吃不消。所以做了一